127 if(!flistStsTracks)
return;
130 if(!flistStsTracksMatch)
return;
131 if(!flistMCTracks)
return;
133 vector<CbmStsTrack> vRTracks;
134 int nTracks = flistStsTracks->GetEntries();
135 vRTracks.resize(nTracks);
136 for(
int iTr=0; iTr<nTracks; iTr++)
137 vRTracks[iTr] = *( (
CbmStsTrack*) flistStsTracks->At(iTr));
143 vector<int> vTrackPDG(vRTracks.size(), -1);
146 for(
int iTr=0; iTr<nTracks; iTr++)
149 if(stsTrackMatch -> GetNofMCTracks() == 0)
continue;
158 if (NULL == flsitGlobalTracks) { Fatal(
"KF Particle Finder",
"No GlobalTrack array!"); }
159 if (NULL == flistTofHits) { Fatal(
"KF Particle Finder",
"No TOF hits array!"); }
161 const Double_t m2P = 0.867681;
162 const Double_t m2K = 0.243707;
163 const Double_t m2Pi = 0.019479835;
165 Double_t sP[3][5] = { {0.0243467, -0.00937908, 0.00970666, -0.00063638, 2.42128e-05},
166 {0.00691158, -0.000777367, 0.00671164, -0.000123594, -2.17075e-05},
167 {0.0055599, -0.00327273, 0.00981961, -0.00108836, 7.90106e-05} };
187 const Int_t PdgHypo[4] = {2212, 321, 211, -11};
189 for (Int_t igt = 0; igt < flsitGlobalTracks->GetEntriesFast(); igt++) {
193 if( stsTrackIndex<0 )
continue;
199 FairTrackParam *stsPar = vRTracks[stsTrackIndex].GetParamFirst();
201 stsPar->Momentum(mom);
203 Double_t p = mom.Mag();
204 Int_t q = stsPar->GetQp() > 0 ? 1 : -1;
229 if( !((l>1000.) && (l<1400.)) )
continue;
233 if (tofHitIndex >= 0) {
234 const CbmTofHit* tofHit =
static_cast<const CbmTofHit*
>(flistTofHits->At(tofHitIndex));
235 if(!tofHit)
continue;
241 if( !((time>29.) && (time<50.)) )
continue;
243 Double_t m2 = p*p*(1./((l/time/29.9792458)*(l/time/29.9792458))-1.);
246 sigma[0] = sP[0][0] + sP[0][1]*p + sP[0][2]*p*p + sP[0][3]*p*p*p + sP[0][4]*p*p*p*p;
247 sigma[1] = sP[1][0] + sP[1][1]*p + sP[1][2]*p*p + sP[1][3]*p*p*p + sP[1][4]*p*p*p*p;
248 sigma[2] = sP[2][0] + sP[2][1]*p + sP[2][2]*p*p + sP[2][3]*p*p*p + sP[2][4]*p*p*p*p;
251 dm2[0] =
fabs(m2 - m2P)/sigma[0];
252 dm2[1] =
fabs(m2 - m2K)/sigma[1];
253 dm2[2] =
fabs(m2 - m2Pi)/sigma[2];
256 Double_t dm2min = dm2[2];
275 if(dm2[1] < dm2min) { iPdg = 1; dm2min = dm2[1]; }
276 if(dm2[0] < dm2min) { iPdg = 0; dm2min = dm2[0]; }
278 if(dm2min > 2) iPdg=-1;
282 if(dm2[1] < dm2min) { iPdg = 1; dm2min = dm2[1]; }
283 if((dm2min>3) && (dm2[0] < dm2min)) { iPdg = 0; dm2min = dm2[0]; }
285 if(dm2min > 2) iPdg=-1;
289 vTrackPDG[stsTrackIndex] = q*PdgHypo[iPdg];
302 TStopwatch timerSelect;
305 fChiToPrimVtx.clear();
311 vector<L1FieldRegion> vField;
312 fitter.
GetChiToVertex(vRTracks, vField, fChiToPrimVtx, kfVertex, 3);
316 vector<CbmKFTrack> vKFTrack(nTracks);
317 for(
int iTr=0; iTr<nTracks; iTr++)
328 static double timeSelectCPU=0.;
329 static double timeSelectReal=0.;
331 timeSelectCPU += timerSelect.CpuTime();
332 timeSelectReal += timerSelect.RealTime();
336 std::cout.setf(ios::fixed);
337 std::cout.setf(ios::showpoint);
338 std::cout.precision(9);
339 std::cout <<
" ---- Particle finder --- " << std::endl;
340 std::cout <<
"KF Particle Finder Times:" <<
" Real - "<< timeSelectReal/NEv
341 <<
" CPU - "<< timeSelectCPU/NEv << std::endl << std::endl;
CbmKFParticlesFinder(float cuts[2][3]=0, Int_t usePID=0, const char *name="CbmKFParticlesFinder", const char *title="Cbm KF Particles Finder", Int_t iVerbose=1)
static void FindParticles(std::vector< CbmKFTrack > &vRTracks, std::vector< float > &ChiToPrimVtx, std::vector< L1FieldRegion > &vField, std::vector< KFParticle > &Particles, KFParticleSIMD &PrimVtx, const std::vector< int > &vTrackPDG, const float cuts[2][3]=DefaultCuts)