//#define XXX // use timers #include "TaskManager.h" #include "L1AlgoInputSettings.h" #include "InputDataArray.h" #include "L1AlgoInputMCData.h" #include "CbmL1Track.h" #include "CbmKFParticleDatabase.h" #ifdef XXX #include "L1Timer.h" #endif #include "TDHelper.h" void TaskManager::Init( const L1AlgoInputSettings* settings, int verbose ) { fVerbose = verbose; fSettings = settings; fTracker.Init( fSettings->GetSettings() ); fPerf.Init( "../Output/", &fTracker, &fParticles, fVerbose ); } void TaskManager::SetData( const L1AlgoInputData* data, const L1AlgoInputMCData* mcData ) { fData = data; fMCData = mcData; } void TaskManager::Run() { #ifdef XXX // set timers L1CATFIterTimerInfo timer; timer.Add("Total "); timer.Add("TrackFinder"); timer.Add("TrackFiter"); timer.Add("PrimaryVertexFinder"); timer.Add("SecondaryParticlesFinder"); timer.Add("QualityCheck"); static L1CATFIterTimerInfo stimer = timer; TStopwatch ts_all; TStopwatch ts; #endif // XXX // --------- Track Reconstruction ------------- fTracker.SetData( fData->GetStsHits(), fData->GetStsStrips(), fData->GetStsStripsB(), fData->GetStsZPos(), fData->GetSFlag(), fData->GetSFlagB(), fData->GetStsHitsStartIndex(), fData->GetStsHitsStopIndex() ); if (fMCData) { fPerf.SetData( fMCData->GetHitStore(), fMCData->GetStsHits(), fMCData->GetMCPoints(), fMCData->GetMCTracks(), fMCData->GetHitMCRef() ); } #ifdef XXX ts.Start(1); #endif // XXX fTracker.CATrackFinder(); #ifdef XXX ts.Stop(); timer["TrackFinder"] = ts; // ------- Track Fit --------- ts.Start(1); #endif // XXX #if 1 fTracker.L1KFTrackFitter(); // TODO #else fTracker.KFTrackFitter_simple(); #endif #ifdef XXX ts.Stop(); timer["TrackFiter"] = ts; #endif // - Convert Tracks - vector vRTracks; { vRTracks.clear(); int start_hit = 0; // for interation in fTrackervRecoHits[] for (unsigned i = 0; i < fTracker.vTracks.size(); i++){ L1Track it = fTracker.vTracks[i]; CbmL1Track t; for( int k=0; k<15; k++) t.C[k] = it.CFirst[k]; for( int k=0; k<6; k++) t.TLast[k] = it.TLast[k]; for( int k=0; k<15; k++) t.CLast[k] = it.CLast[k]; t.chi2 = it.chi2; t.NDF = it.NDF; t.StsHits.resize(it.NHits); for( int k = 0; k < it.NHits; k++ ){ t.StsHits[k] = fTracker.vRecoHits[start_hit++]; } t.mass = 0.1395679; // pion mass t.is_electron = 0; // float prob = (TDHelper::Chi2IProbability( t.NDF, t.chi2 )); // 10 times slower than track finder! // if (prob < 0.004) continue; vRTracks.push_back(t); } // for vTracks } #if 1 // ----------- Particle Reconstruction ------------- // select tracks vector vSelectedRTracks; for (unsigned i = 0; i < vRTracks.size(); i++){ const CbmL1Track &t = vRTracks[i]; bool ok = 1; for( int k=0; k<6; k++) ok = ok && finite(t.T[k]); for( int k=0; k<15; k++) ok = ok && finite(t.C[k]); ok = ok && finite(t.chi2) && finite(t.NDF); ok = ok && t.C[0]>0 && t.C[2]>0 && t.C[5]>0 && t.C[9]>0 && t.C[14]>0; if (!ok) continue; vSelectedRTracks.push_back(t); } // primary vertex CbmKFVertex pv; fParticles.clear(); fKFParticleFinder.SetHits(fData); fKFParticleFinder.SetAlgo(&fTracker); #ifdef XXX ts.Start(1); #endif // XXX fKFParticleFinder.ConstructPV(vSelectedRTracks,pv); #ifdef XXX ts.Stop(); timer["PrimaryVertexFinder"] = ts; // secondary particles ts.Start(1); #endif // XXX fKFParticleFinder.FindParticles(vSelectedRTracks,fParticles,pv); #ifdef XXX ts.Stop(); timer["SecondaryParticlesFinder"] = ts; #endif #else CbmKFVertex pv; #endif // ------------- QA ------------- #ifdef XXX ts.Start(1); #endif if (fMCData) { fPerf.SetRecoTracks(vRTracks); fPerf.SetPrimaryVertex(pv); fPerf.RunEv(); } #ifdef XXX ts.Stop(); timer["QualityCheck"] = ts; ts_all.Stop(); timer["Total "] = ts_all; if ( fVerbose ) { static int NEvents = 0; NEvents++; stimer += timer; if ( NEvents % 100 == 0 ) { cout << " Timers, ms " << endl; L1CATFIterTimerInfo tmp_timer = stimer/0.001/NEvents; // ms tmp_timer.PrintReal( 1 ); } } #endif // XXX } void TaskManager::PrintEff() { fPerf.PrintEff(); }