Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MdcTrack Class Reference

#include <MdcTrack.h>

List of all members.

Public Member Functions

const MdcLayerfirstLayer () const
const MdcLayerfirstLayer () const
int hasCurled () const
int hasCurled () const
const MdcLayerlastLayer () const
const MdcLayerlastLayer () 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 TrkRecoTrktrack () const
TrkRecoTrktrack ()
const TrkRecoTrktrack () const
TrkRecoTrktrack ()
 ~MdcTrack ()
 ~MdcTrack ()

Private Member Functions

 MdcTrack (const MdcTrack &)
 MdcTrack (const MdcTrack &)
MdcTrackoperator= (const MdcTrack &)
MdcTrackoperator= (const MdcTrack &)

Private Attributes

const MdcLayer_firstLayer
const MdcLayer_firstLayer
int _haveCurled
const MdcLayer_lastLayer
const MdcLayer_lastLayer
TrkRecoTrk_theTrack
TrkRecoTrk_theTrack


Constructor & Destructor Documentation

MdcTrack::MdcTrack TrkRecoTrk aTrack  ) 
 

00040                                     {
00041 //************************************************************************/
00042   _theTrack = aTrack;
00043   _firstLayer = _lastLayer = 0;
00044   _haveCurled = 0;
00045 }

MdcTrack::MdcTrack int  nsupers,
const TrkExchangePar par,
double  chisq,
TrkContext ,
double  trackT0
 

00049                                                           {
00050 //************************************************************************/
00051     TrkCircleMaker maker;
00052     _theTrack = maker.makeTrack(par, chisq, context, trackT0);
00053     _firstLayer = _lastLayer = 0;
00054     _haveCurled = 0;
00055 }

MdcTrack::~MdcTrack  ) 
 

00058                     {
00059 //************************************************************************/
00060   delete _theTrack;
00061 }

MdcTrack::MdcTrack const MdcTrack  )  [private]
 

MdcTrack::MdcTrack TrkRecoTrk aTrack  ) 
 

MdcTrack::MdcTrack int  nsupers,
const TrkExchangePar par,
double  chisq,
TrkContext ,
double  trackT0
 

MdcTrack::~MdcTrack  ) 
 

MdcTrack::MdcTrack const MdcTrack  )  [private]
 


Member Function Documentation

const MdcLayer* MdcTrack::firstLayer void   )  const [inline]
 

00031 {return _firstLayer;}

const MdcLayer* MdcTrack::firstLayer void   )  const [inline]
 

00031 {return _firstLayer;}

int MdcTrack::hasCurled  )  const [inline]
 

00030 {return _haveCurled;}

int MdcTrack::hasCurled  )  const [inline]
 

00030 {return _haveCurled;}

const MdcLayer* MdcTrack::lastLayer void   )  const [inline]
 

00032 {return _lastLayer;}

const MdcLayer* MdcTrack::lastLayer void   )  const [inline]
 

00032 {return _lastLayer;}

MdcTrack& MdcTrack::operator= const MdcTrack  )  [private]
 

MdcTrack& MdcTrack::operator= const MdcTrack  )  [private]
 

bool MdcTrack::operator== const MdcTrack tk  )  const
 

bool MdcTrack::operator== const MdcTrack tk  )  const
 

00135                                              {
00136 //----------------------------------------------------------------
00137 
00138   return (track() == tk.track());
00139 }

int MdcTrack::projectToR double  radius,
BesAngle phiIntersect,
double &  arcLength,
int  lCurl = 0
const
 

int MdcTrack::projectToR double  radius,
BesAngle phiIntersect,
int  lCurl = 0
const
 

int MdcTrack::projectToR double  radius,
BesAngle phiIntersect,
double &  arcLength,
int  lCurl = 0
const
 

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 }

int MdcTrack::projectToR double  radius,
BesAngle phiIntersect,
int  lCurl = 0
const
 

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 }

void MdcTrack::setFirstLayer const MdcLayer l  )  [inline]
 

00035 {_firstLayer = l;}

void MdcTrack::setFirstLayer const MdcLayer l  )  [inline]
 

00035 {_firstLayer = l;}

void MdcTrack::setHasCurled bool  c = true  )  [inline]
 

00034 {_haveCurled = c;}

void MdcTrack::setHasCurled bool  c = true  )  [inline]
 

00034 {_haveCurled = c;}

void MdcTrack::setLastLayer const MdcLayer l  )  [inline]
 

00036 {_lastLayer = l;}

void MdcTrack::setLastLayer const MdcLayer l  )  [inline]
 

00036 {_lastLayer = l;}

void MdcTrack::setTrack TrkRecoTrk trk  )  [inline]
 

00029 {_theTrack = trk;}

void MdcTrack::setTrack TrkRecoTrk trk  )  [inline]
 

00029 {_theTrack = trk;}

void MdcTrack::storeTrack int  trackId,
RecMdcTrackCol trackList,
RecMdcHitCol hitList,
int  tkStat
 

void MdcTrack::storeTrack int  trackId,
RecMdcTrackCol trackList,
RecMdcHitCol hitList,
int  tkStat
 

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

const TrkRecoTrk& MdcTrack::track void   )  const [inline]
 

00028 {return *_theTrack;}

TrkRecoTrk& MdcTrack::track void   )  [inline]
 

00027 {return *_theTrack;}

const TrkRecoTrk& MdcTrack::track void   )  const [inline]
 

00028 {return *_theTrack;}

TrkRecoTrk& MdcTrack::track void   )  [inline]
 

00027 {return *_theTrack;}


Member Data Documentation

const MdcLayer* MdcTrack::_firstLayer [private]
 

const MdcLayer* MdcTrack::_firstLayer [private]
 

int MdcTrack::_haveCurled [private]
 

const MdcLayer* MdcTrack::_lastLayer [private]
 

const MdcLayer* MdcTrack::_lastLayer [private]
 

TrkRecoTrk* MdcTrack::_theTrack [private]
 

TrkRecoTrk* MdcTrack::_theTrack [private]
 


The documentation for this class was generated from the following files:
Generated on Wed Feb 2 16:28:59 2011 for BOSS6.5.5 by  doxygen 1.3.9.1