#include <MdcTrack.h>
Public Member Functions | |
const MdcLayer * | firstLayer () const |
const MdcLayer * | firstLayer () const |
int | hasCurled () const |
int | hasCurled () const |
const MdcLayer * | lastLayer () const |
const MdcLayer * | lastLayer () const |
MdcTrack (int nsupers, const TrkExchangePar &par, double chisq, TrkContext &, double trackT0) | |
MdcTrack (TrkRecoTrk *aTrack) | |
MdcTrack (int nsupers, const TrkExchangePar &par, double chisq, TrkContext &, double trackT0) | |
MdcTrack (TrkRecoTrk *aTrack) | |
bool | operator== (const MdcTrack &tk) const |
bool | operator== (const MdcTrack &tk) const |
int | projectToR (double radius, BesAngle &phiIntersect, double &arcLength, int lCurl=0) const |
int | projectToR (double radius, BesAngle &phiIntersect, int lCurl=0) const |
int | projectToR (double radius, BesAngle &phiIntersect, double &arcLength, int lCurl=0) const |
int | projectToR (double radius, BesAngle &phiIntersect, int lCurl=0) const |
void | setFirstLayer (const MdcLayer *l) |
void | setFirstLayer (const MdcLayer *l) |
void | setHasCurled (bool c=true) |
void | setHasCurled (bool c=true) |
void | setLastLayer (const MdcLayer *l) |
void | setLastLayer (const MdcLayer *l) |
void | setTrack (TrkRecoTrk *trk) |
void | setTrack (TrkRecoTrk *trk) |
void | storeTrack (int trackId, RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat) |
void | storeTrack (int trackId, RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat) |
const TrkRecoTrk & | track () const |
TrkRecoTrk & | track () |
const TrkRecoTrk & | track () const |
TrkRecoTrk & | track () |
~MdcTrack () | |
~MdcTrack () | |
Private Member Functions | |
MdcTrack (const MdcTrack &) | |
MdcTrack (const MdcTrack &) | |
MdcTrack & | operator= (const MdcTrack &) |
MdcTrack & | operator= (const MdcTrack &) |
Private Attributes | |
const MdcLayer * | _firstLayer |
const MdcLayer * | _firstLayer |
int | _haveCurled |
const MdcLayer * | _lastLayer |
const MdcLayer * | _lastLayer |
TrkRecoTrk * | _theTrack |
TrkRecoTrk * | _theTrack |
|
00040 { 00041 //************************************************************************/ 00042 _theTrack = aTrack; 00043 _firstLayer = _lastLayer = 0; 00044 _haveCurled = 0; 00045 }
|
|
00049 { 00050 //************************************************************************/ 00051 TrkCircleMaker maker; 00052 _theTrack = maker.makeTrack(par, chisq, context, trackT0); 00053 _firstLayer = _lastLayer = 0; 00054 _haveCurled = 0; 00055 }
|
|
00058 { 00059 //************************************************************************/ 00060 delete _theTrack; 00061 }
|
|
|
|
|
|
|
|
|
|
|
|
00031 {return _firstLayer;}
|
|
00031 {return _firstLayer;}
|
|
00030 {return _haveCurled;}
|
|
00030 {return _haveCurled;}
|
|
00032 {return _lastLayer;}
|
|
00032 {return _lastLayer;}
|
|
|
|
|
|
|
|
00135 { 00136 //---------------------------------------------------------------- 00137 00138 return (track() == tk.track()); 00139 }
|
|
|
|
|
|
00096 { 00097 //************************************************************************/ 00098 00099 //return -1 if no intersection 00100 // Only valid for projecting track outwards from point of closest approach 00101 // Returns arclength from POCA 00102 00103 const TrkFit* tkFit = track().fitResult(); 00104 if (tkFit == 0) return -1; 00105 TrkExchangePar par = tkFit->helix(0.0); 00106 double d0 = par.d0(); 00107 double omega = par.omega(); 00108 double phi0 = par.phi0(); 00109 double r2d2 = radius * radius - d0 * d0; 00110 if (r2d2 < 0) return -1; 00111 double rinv = 1./radius; 00112 double k2dinv = 1./(1 + omega * d0); 00113 if (k2dinv < 0.0) return -1; 00114 double arg; 00115 00116 if (!lCurl) { 00117 arg = d0 * rinv + 0.5*omega * rinv * r2d2 * k2dinv; 00118 if (fabs(arg) > 1.0) return -1; 00119 phiIntersect.setRad( phi0 + asin(arg) ); 00120 } 00121 else { 00122 arg = -d0 * rinv - 0.5*omega * rinv * r2d2 * k2dinv; 00123 if (fabs(arg) > 1.0) return -1; 00124 phiIntersect.setRad( phi0 + Constants::pi + asin(arg)); 00125 } 00126 00127 arg = 0.5*omega * sqrt(r2d2 * k2dinv); 00128 arcLength = 2. * asin(arg) / omega; 00129 00130 return 0; 00131 }
|
|
00064 { 00065 //************************************************************************/ 00066 // note that these are currently circle-only routines 00067 00068 //return -1 if no intersection 00069 00070 const TrkFit* tkFit = track().fitResult(); 00071 if (tkFit == 0) return -1; 00072 TrkExchangePar par = tkFit->helix(0.0); 00073 double d0 = par.d0(); 00074 double omega = par.omega(); 00075 double phi0 = par.phi0(); 00076 double r2d2 = radius * radius - d0 * d0; 00077 if (r2d2 < 0) return -1; 00078 double rinv = 1./radius; 00079 double k2dinv = 1./(1 + omega * d0); 00080 if (!lCurl) { 00081 double arg = d0 * rinv + 0.5*omega * rinv * r2d2 * k2dinv; 00082 if (fabs(arg) > 1.0) return -1; 00083 phiIntersect.setRad( phi0 + asin(arg) ); 00084 } 00085 else { 00086 double arg = -d0 * rinv - 0.5*omega * rinv * r2d2 * k2dinv; 00087 if (fabs(arg) > 1.0) return -1; 00088 phiIntersect.setRad( phi0 + Constants::pi + asin(arg) ); 00089 } 00090 00091 return 0; 00092 }
|
|
00035 {_firstLayer = l;}
|
|
00035 {_firstLayer = l;}
|
|
00034 {_haveCurled = c;}
|
|
00034 {_haveCurled = c;}
|
|
00036 {_lastLayer = l;}
|
|
00036 {_lastLayer = l;}
|
|
00029 {_theTrack = trk;}
|
|
00029 {_theTrack = trk;}
|
|
|
|
00143 { 00144 //check the fit succeeded 00145 // if (status().failure()) { return; } 00146 00147 //get the results of the fit to this track 00148 const TrkFit* fitresult = track().fitResult(); 00149 //check the fit worked 00150 if (fitresult == 0) return; 00151 00152 //new a Rec. Track MdcTrack 00153 RecMdcTrack* recMdcTrack = new RecMdcTrack(); 00154 const TrkHitList* aList = track().hits(); 00155 //some track info 00156 const BField& theField = track().bField(); 00157 double Bz = theField.bFieldZ(); 00158 //Fit info 00159 int hitId = 0; 00160 int nHits=0; 00161 int nSt=0; 00162 //int nAct=0; int nSeg=0; 00163 //int maxlay = 0; int minlay = 43; int seg[11];/* 11 slayer */ int segme; 00164 //**************************** 00165 //* active flag open this 00166 //**************************** 00167 //* if (allHit>0){ 00168 //* nHits = aList->nHit();//add inActive hit also 00169 //* }else{ 00170 //* nHits = fitresult->nMdc();// = nActive() 00171 //* } 00172 //**************************** 00173 //for 5.1.0 use all hits 00174 nHits = aList->nHit(); 00175 //**************************** 00176 // use active only 00177 // nHits = fitresult->nMdc();// = nActive() 00178 //**************************** 00179 00180 int q = fitresult->charge(); 00181 double chisq = fitresult->chisq(); 00182 int nDof = fitresult->nDof(); 00183 //track parameters at closest approach to beamline 00184 double fltLenPoca = 0.0; 00185 TrkExchangePar helix = fitresult->helix(fltLenPoca); 00186 double phi0 = helix.phi0(); 00187 double tanDip = helix.tanDip(); 00188 //double z0 = helix.z0(); 00189 double d0 = helix.d0(); 00190 //momenta and position 00191 //CLHEP::Hep3Vector mom = fitresult->momentum(fltLenPoca); 00192 HepPoint3D poca = fitresult->position(fltLenPoca); 00193 00194 double helixPar[5]; 00195 //dro =-d0 00196 helixPar[0] = -d0; 00197 //phi0 = phi0 - pi/2 [0,2pi) 00198 double tphi0 = phi0 - Constants::pi/2.; 00199 if (tphi0 < 0. ) tphi0 += Constants::pi * 2.; 00200 helixPar[1] = tphi0; 00201 //kappa = q/pxy 00202 double pxy = fitresult->pt(); 00203 if (pxy == 0.) helixPar[2] = 0.; 00204 else helixPar[2] = q/fabs(pxy); 00205 //dz = z0 00206 helixPar[3] = helix.z0(); 00207 //tanl 00208 helixPar[4] = tanDip; 00209 //error 00210 //V(Y)=S * V(X) * ST , mS = S , mVy = V(Y) , helix.covariance() = V(X) 00211 HepSymMatrix mS(helix.params().num_row(),0); 00212 mS[0][0]=-1.;//dr0=-d0 00213 mS[1][1]=1.; 00214 mS[2][2]=-333.567/Bz;//pxy -> cpa 00215 mS[3][3]=1.; 00216 mS[4][4]=1.; 00217 HepSymMatrix mVy = helix.covariance().similarity(mS); 00218 double errorMat[15]; 00219 int k = 0; 00220 for (int ie = 0 ; ie < 5 ; ie ++){ 00221 for (int je = ie ; je < 5 ; je ++) { 00222 errorMat[k] = mVy[ie][je]; 00223 k++; 00224 } 00225 } 00226 double p,px,py,pz; 00227 px = pxy * (-sin(helixPar[1])); 00228 py = pxy * cos(helixPar[1]); 00229 pz = pxy * helixPar[4]; 00230 p = sqrt(pxy*pxy + pz*pz); 00231 //theta, phi 00232 double theta = acos(pz/p); 00233 double phi = atan2(py,px); 00234 recMdcTrack->setTrackId(trackId); 00235 recMdcTrack->setHelix(helixPar); 00236 recMdcTrack->setCharge(q); 00237 recMdcTrack->setPxy(pxy); 00238 recMdcTrack->setPx(px); 00239 recMdcTrack->setPy(py); 00240 recMdcTrack->setPz(pz); 00241 recMdcTrack->setP(p); 00242 recMdcTrack->setTheta(theta); 00243 recMdcTrack->setPhi(phi); 00244 recMdcTrack->setPoca(poca); 00245 recMdcTrack->setX(poca.x());//poca 00246 recMdcTrack->setY(poca.y()); 00247 recMdcTrack->setZ(poca.z()); 00248 recMdcTrack->setR(sqrt(poca.x()*poca.x() + poca.y()*poca.y())); 00249 HepPoint3D pivot(0.,0.,0.); 00250 recMdcTrack->setPivot(pivot); 00251 recMdcTrack->setVX0(0.);//pivot 00252 recMdcTrack->setVY0(0.); 00253 recMdcTrack->setVZ0(0.); 00254 recMdcTrack->setError(errorMat); 00255 recMdcTrack->setError(mVy); 00256 recMdcTrack->setChi2(chisq); 00257 recMdcTrack->setNdof(nDof); 00258 recMdcTrack->setStat(tkStat); 00259 recMdcTrack->setNhits(nHits); 00260 //-----------hit list------------- 00261 HitRefVec hitRefVec; 00262 vector<int> vecHits; 00263 //for fiterm 00264 int maxLayerId = -1; 00265 int minLayerId = 43; 00266 double fiTerm = 999.; 00267 const MdcRecoHitOnTrack* fiTermHot = NULL; 00268 TrkHitList::hot_iterator hot = aList->begin(); 00269 for (;hot!=aList->end();hot++){ 00270 const MdcRecoHitOnTrack* recoHot; 00271 recoHot = dynamic_cast<const MdcRecoHitOnTrack*> (&(*hot)); 00272 //if (!recoHot->mdcHit()) return; 00273 RecMdcHit* recMdcHit = new RecMdcHit; 00274 //id 00275 recMdcHit->setId(hitId); 00276 //---------BESIII---------- 00277 //phiWire - phiHit <0 flagLR=0 left driftleft<0 ; 00278 //phiWire - phiHit >0 flagLR=1 right driftright>0; 00279 //flag = 2 ambig; 00280 //-----Babar wireAmbig---- 00281 //-1 -> right, 0 -> don't know, +1 -> left 00282 //+1 phiWire-phiHit<0 Left, 00283 //-1 phiWire-phiHit>0 Right, 00284 //0 don't know 00285 //ambig() w.r.t track direction 00286 //wireAmbig() w.r.t. wire location 00287 double hotWireAmbig = recoHot->wireAmbig(); 00288 double driftDist = fabs(recoHot->drift()); 00289 double sigma = recoHot->hitRms(); 00290 int flagLR=2; 00291 if ( hotWireAmbig == 1){ 00292 flagLR = 0; //left driftDist <0 00293 }else if( hotWireAmbig == -1){ 00294 flagLR = 1; //right driftDist >0 00295 }else if( hotWireAmbig == 0){ 00296 flagLR = 2; //don't know 00297 } 00298 recMdcHit->setFlagLR(flagLR); 00299 recMdcHit->setDriftDistLeft((-1)*driftDist); 00300 recMdcHit->setErrDriftDistLeft(sigma); 00301 recMdcHit->setDriftDistRight(driftDist); 00302 recMdcHit->setErrDriftDistRight(sigma); 00303 //Mdc Id 00304 Identifier mdcId = recoHot->mdcHit()->digi()->identify(); 00305 recMdcHit->setMdcId(mdcId); 00306 //corrected ADC 00307 00308 //contribution to chisquare 00309 //fill chisq 00310 double res=999.,rese=999.; 00311 if (recoHot->resid(res,rese,false)){ 00312 }else{} 00313 double deltaChi=0; 00314 recoHot->getFitStuff(deltaChi);//yzhang open 2010-09-20 00315 recMdcHit->setChisqAdd( deltaChi * deltaChi ); 00316 //set tracks containing this hit 00317 recMdcHit->setTrkId(trackId); 00318 //doca 00319 recMdcHit->setDoca(recoHot->dcaToWire());//sign w.r.t. dirft() FIXME 00320 //entrance angle 00321 00322 recMdcHit->setEntra(recoHot->entranceAngle()); 00323 //z of hit 00324 HepPoint3D pos; Hep3Vector dir; 00325 double fltLen = recoHot->fltLen(); 00326 recoHot->getParentRep()->traj().getInfo(fltLen,pos,dir); 00327 recMdcHit->setZhit(pos.z()); 00328 //corrected TDC temp 00329 if (recoHot->mdcHit()->isCosmicFit() ){ 00330 HepPoint3D poca = recoHot->getParentRep()->position(0.); 00331 if ( pos.y() > poca.y()){ 00332 fltLen *= -1.; 00333 } 00334 } 00335 recMdcHit->setFltLen(fltLen); 00336 double tof = recoHot->getParentRep()->arrivalTime(fltLen); 00337 recMdcHit->setTdc(recoHot->mdcHit()->tdcIndex()); 00338 recMdcHit->setAdc(recoHot->mdcHit()->adcIndex()); 00339 //drift time 00340 recMdcHit->setDriftT(recoHot->mdcHit()->driftTime(tof,pos.z())); 00341 //for fiterm 00342 int layerId = recoHot->mdcHit()->layernumber(); 00343 //int wireId = recoHot->mdcHit()->wirenumber(); 00344 //std::cout<<__FILE__<<" "<<__LINE__<<"("<<layerId<<","<<wireId<<")" 00345 //<<recoHot->entranceAngle()<<std::endl; 00346 if (layerId >= maxLayerId){ 00347 maxLayerId = layerId; 00348 fiTermHot = recoHot; 00349 } 00350 if (layerId < minLayerId){ 00351 minLayerId = layerId; 00352 } 00353 // status flag 00354 if (recoHot->isActive()) { 00355 recMdcHit->setStat(1); 00356 }else{ 00357 recMdcHit->setStat(0); 00358 } 00359 // for 5.1.0 use all hits 00360 if (recoHot->layer()->view()) { 00361 ++nSt; 00362 } 00363 hitList->push_back(recMdcHit); 00364 SmartRef<RecMdcHit> refHit(recMdcHit); 00365 hitRefVec.push_back(refHit); 00366 vecHits.push_back(mdcId.get_value()); 00367 ++hitId; 00368 } 00369 //fi terminal angle 00370 if (fiTermHot!=NULL){ 00371 fiTerm=(1./sqrt(1.+tanDip*tanDip))*fiTermHot->fltLen()*helix.omega(); 00372 } 00373 recMdcTrack->setFiTerm(fiTerm); 00374 // number of stereo hits contained 00375 recMdcTrack->setNster(nSt); 00376 recMdcTrack->setFirstLayer(maxLayerId); 00377 recMdcTrack->setLastLayer(minLayerId); 00378 recMdcTrack->setVecHits(hitRefVec); 00379 trackList->push_back(recMdcTrack); 00380 }//end of storeTrack
|
|
00028 {return *_theTrack;}
|
|
00027 {return *_theTrack;}
|
|
00028 {return *_theTrack;}
|
|
00027 {return *_theTrack;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|