00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "CLHEP/Matrix/Matrix.h"
00013
00014
00016 #include "TrkExtAlg/Helix.h"
00017
00019
00020
00021
00022 #include "TrkExtAlg/ExtMdcTrack.h"
00023 #include <float.h>
00024
00025 using namespace std;
00026
00027 const double mass[5] = {0.511,105.658,139.57,493.677,938.27203};
00028
00029 ExtMdcTrack::ExtMdcTrack():myMsgFlag(true),myInputTrk("Kal"),myParID(2),myHelixPar(NumHelixPar),myMdcErr(NdimMdcErr,0),myPhiTerm(0.){}
00030
00031 ExtMdcTrack::~ExtMdcTrack(){}
00032
00033 bool ExtMdcTrack::SetMdcRecTrkCol(RecMdcTrackCol * aPointer)
00034 {
00035 myMdcTrackCol = aPointer;
00036 myMdcRecTrkIter = myMdcTrackCol->begin();
00037 myMdcRecTrkIter--;
00038 myInputTrk="Mdc";
00039 return true;
00040 }
00041
00042 bool ExtMdcTrack::SetMdcKalTrkCol(RecMdcKalTrackCol * aPointer)
00043 {
00044 myMdcKalTrackCol = aPointer;
00045 myMdcKalTrkIter = myMdcKalTrackCol->begin();
00046 myMdcKalTrkIter--;
00047 myInputTrk="Kal";
00048 return true;
00049 }
00050
00051 bool ExtMdcTrack::GetOneGoodTrk()
00052 {
00053 if(myMsgFlag) cout<<"ExtMdcTrack::GetOneGoodTrk() begin"<<endl;
00054 if(myInputTrk=="Mdc")
00055 {
00056 myMdcRecTrkIter++;
00057 if(myMdcRecTrkIter!=myMdcTrackCol->end()) return true;
00058 else
00059 {
00060 if(myMsgFlag) cout<<"No more track!"<<endl;
00061 return false;
00062 }
00063 }
00064 else if(myInputTrk=="Kal")
00065 {
00066 myMdcKalTrkIter++;
00067 if(myMdcKalTrkIter!=myMdcKalTrackCol->end()) return true;
00068 else
00069 {
00070 if(myMsgFlag) cout<<"No more track!"<<endl;
00071 return false;
00072 }
00073 }
00074 }
00075
00076
00077 bool ExtMdcTrack::ReadTrk(int pid=2)
00078 {
00079 if(myMsgFlag) cout<<"ExtMdcTrack::ReadTrk() begin"<<endl;
00080 myParID = pid;
00081 if(myInputTrk=="Mdc")
00082 {
00083 if(myMdcRecTrkIter!=myMdcTrackCol->end())
00084 {
00085 RecMdcTrack *aMdcTrack = *myMdcRecTrkIter;
00086
00087 {
00088 if(myMsgFlag) cout<<"Read a good track!"<<endl;
00089
00090
00091 myTrackID = aMdcTrack->trackId();
00092 myHelixPar = aMdcTrack->helix();
00093 myPivot = aMdcTrack->getPivot();
00094 myMdcErr = aMdcTrack->err();
00095
00096 myPhiTerm = aMdcTrack->getFiTerm();
00097 myTrkLength = GetTrackLength();
00098 double p = (GetMomentum()).mag();
00099 double beta = p/sqrt(mass[myParID]*mass[myParID]+p*p);
00100 myTrkTof = myTrkLength/(beta*299.792458);
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 if(myMsgFlag)
00123 {
00124 cout<<"MDC track:"<<myTrackID<<endl;
00125 cout<<"Helix: "<<myHelixPar;
00126 cout<<"pivot: "<<myPivot<<"cm"<<endl;
00127 cout<<"Error: "<<myMdcErr<<endl;
00128
00129
00130
00131
00132
00133
00134
00135 cout<<"Pt: "<<GetPt()<<"GeV/c"<<endl;
00136 cout<<"PhiTerm: "<<myPhiTerm<<endl;
00137
00138 cout<<"trackLength(mm): "<<GetTrackLength()<<endl;
00139
00140 }
00141
00142 return true;
00143 }
00144
00145
00146
00147
00148
00149 }
00150 else
00151 {
00152 if(myMsgFlag) cout<<"No more track!"<<endl;
00153 return false;
00154 }
00155 }
00156 else if(myInputTrk=="Kal")
00157 {
00158 if(myMdcKalTrkIter!=myMdcKalTrackCol->end())
00159 {
00160 RecMdcKalTrack *aMdcKalTrack = *myMdcKalTrkIter;
00161 {
00162 if(myMsgFlag) cout<<"Get a good track!"<<endl;
00163
00164
00165 myTrackID = aMdcKalTrack->getTrackId();
00166 myHelixPar = aMdcKalTrack->getLHelix(myParID);
00167
00168 myPivot = aMdcKalTrack->getLPivot(myParID);
00169 myMdcErr = aMdcKalTrack->getLError(myParID);
00170 myPhiTerm = aMdcKalTrack->getFiTerm(myParID);
00171 myPhiTerm = 0.0;
00172 myTrkLength = aMdcKalTrack->getPathSM(myParID);
00173 myLPosition = aMdcKalTrack->getLPoint(myParID);
00174 myTrkTof = aMdcKalTrack->getTof(myParID);
00175
00176
00177 if(myMsgFlag)
00178 {
00179 cout<<"Kal track:"<<myTrackID<<endl;
00180 cout<<"myParID:"<<myParID<<endl;
00181 cout<<"Helix: "<<myHelixPar;
00182 cout<<"pivot: "<<myPivot<<"cm"<<endl;
00183 cout<<"Error: "<<myMdcErr<<endl;
00184 cout<<"Pt: "<<GetPt()<<"GeV/c"<<endl;
00185 cout<<"PhiTerm: "<<myPhiTerm<<endl;
00186
00187 cout<<"trackLength(cm): "<<myTrkLength<<endl;
00188 cout<<"myTrkTof: "<<myTrkTof<<endl;
00189 cout<<"Last point position: "<<myLPosition<<endl;
00190 }
00191 return true;
00192 }
00193 }
00194 else
00195 {
00196 if(myMsgFlag) cout<<"No more track!"<<endl;
00197 return false;
00198 }
00199 }
00200 }
00201
00202 void ExtMdcTrack::Convert()
00203 {
00204 myHelixPar(1)*=10.;
00205 myHelixPar(3)*=0.001;
00206 myHelixPar(4)*=10.;
00207 myPivot*=10.;
00208 myMdcErr.fast(1,1)*=100.;
00209 myMdcErr.fast(2,1)*=10.;
00210 myMdcErr.fast(3,1)*=0.01;
00211 myMdcErr.fast(3,2)*=0.001;
00212 myMdcErr.fast(3,3)*=0.000001;
00213 myMdcErr.fast(4,1)*=100.;
00214 myMdcErr.fast(4,2)*=10.;
00215 myMdcErr.fast(4,3)*=0.01;
00216 myMdcErr.fast(4,4)*=100.;
00217 myMdcErr.fast(5,1)*=10.;
00218 myMdcErr.fast(5,3)*=0.001;
00219 myMdcErr.fast(5,4)*=10.;
00220 }
00221
00222 RecMdcTrack *ExtMdcTrack::GetMdcRecTrkPtr() const
00223 {
00224 return (*myMdcRecTrkIter);
00225 }
00226
00227 const Hep3Vector ExtMdcTrack::GetPosition() const
00228 {
00229
00230 Ext_Helix aHelix(myPivot,myHelixPar,myMdcErr);
00231 Hep3Vector aPoint = aHelix.x(myPhiTerm);
00232 if(myMsgFlag) cout<<"PhiTerm Position: "<<aPoint<<endl;
00233 aPoint*=10.0;
00234 return (aPoint);
00235
00236
00237
00238
00239
00240 }
00241
00242 const Hep3Vector ExtMdcTrack::GetMomentum() const
00243 {
00244 Ext_Helix aHelix(myPivot,myHelixPar,myMdcErr);
00245 Hep3Vector aMomentum = aHelix.momentum(myPhiTerm);
00246 if(myMsgFlag) cout<<"PhiTerm Momentum: "<<aMomentum<<endl;
00247 aMomentum*=1000.0;
00248 return (aMomentum);
00249 }
00250
00251 const HepSymMatrix ExtMdcTrack::GetErrorMatrix() const
00252 {
00253 Ext_Helix aHelix(myPivot,myHelixPar,myMdcErr);
00254
00255
00256 Hep3Vector aPoint = aHelix.x(myPhiTerm);
00257 double phi0 = aHelix.phi0();
00258 double kappaInv = 1.0/aHelix.kappa();
00259 double cosPhi0 = cos(phi0);
00260 double sinPhi0 = sin(phi0);
00261
00262
00263
00264
00265 double px = aHelix.momentum(myPhiTerm).x();
00266 double py = aHelix.momentum(myPhiTerm).y();
00267 double pz = aHelix.momentum(myPhiTerm).z();
00268
00269
00270 HepMatrix Helix2XpJcb(NdimExtErr,NdimMdcErr,0);
00271
00272 Helix2XpJcb(1,1) = cosPhi0;
00273 Helix2XpJcb(1,2) = myPivot.y()-aPoint.y();
00274 Helix2XpJcb(1,3) = (myPivot.x()-aPoint.x()+myHelixPar(1)*cosPhi0)*kappaInv;
00275 Helix2XpJcb(2,1) = sinPhi0;
00276 Helix2XpJcb(2,2) = aPoint.x()-myPivot.x();
00277 Helix2XpJcb(2,2) = (myPivot.y()-aPoint.y()+myHelixPar(1)*sinPhi0)*kappaInv;
00278 Helix2XpJcb(3,3) = (myPivot.z()-aPoint.z()+myHelixPar(4))*kappaInv;
00279 Helix2XpJcb(3,4) = 1.0;
00280 Helix2XpJcb(3,5) = (aPoint.z()-myPivot.z()-myHelixPar(4))/myHelixPar(5);
00281 Helix2XpJcb(4,2) = -py;
00282 Helix2XpJcb(4,3) = -px * kappaInv;
00283 Helix2XpJcb(5,2) = px;
00284 Helix2XpJcb(5,3) = -py * kappaInv;
00285 Helix2XpJcb(6,3) = -pz * kappaInv;
00286 Helix2XpJcb(6,5) = fabs(kappaInv);
00287
00288
00289
00290
00291
00292 HepSymMatrix aErrorMatrix = aHelix.Ea().similarity(Helix2XpJcb);
00293 if(myMsgFlag) cout<<"PhiTerm Error matrix:"<<aErrorMatrix<<endl;
00294
00295
00296 for(int i=1;i<=6;i++)
00297 {
00298 for(int j=1;j<=i;j++)
00299 {
00300 if(i<=3 && j<=3) aErrorMatrix.fast(i,j)*=100.0;
00301 if(i>=4 && j>=4) aErrorMatrix.fast(i,j)*=1.0e+6;
00302 if(i>=4 && j<=3) aErrorMatrix.fast(i,j)*=10000.0;
00303 }
00304 }
00305
00306 return aErrorMatrix;
00307 }
00308
00309 double ExtMdcTrack::GetTrackLength() const
00310 {
00311 if(myInputTrk=="Mdc") {
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 Ext_Helix aHelix(myPivot,myHelixPar,myMdcErr);
00339 double dPhi = fabs(myPhiTerm);
00340 double tanLambda = aHelix.tanl();
00341 double cosLambdaInv = sqrt(tanLambda*tanLambda + 1.0);
00342 return (10*fabs(aHelix.radius() * dPhi * cosLambdaInv));
00343
00344 }
00345 else if(myInputTrk=="Kal")
00346 {
00347 return 10*myTrkLength;
00348 }
00349 }
00350
00351 double ExtMdcTrack::GetPt() const
00352 {
00353 return (1.0/fabs(myHelixPar[2]));
00354 }
00355
00356 double ExtMdcTrack::GetParticleCharge() const
00357 {
00358 return ((myHelixPar[2]>0.)? 1.0:-1.0);
00359 }