/** @file CbmBuildEventsFromTracksReal.cxx ** @author Valentina Akishina , Maksym Zyzak ** @date 14.03.2017 **/ #include "CbmBuildEventsFromTracksReal.h" #include #include #include #include #include "TClonesArray.h" #include "TStopwatch.h" #include "FairLogger.h" #include "FairRootManager.h" #include "CbmEvent.h" #include "CbmStsHit.h" #include "CbmStsDigi.h" using namespace std; // ===== Constructor ===================================================== CbmBuildEventsFromTracksReal::CbmBuildEventsFromTracksReal() : FairTask("CbmBuildEventsFromTracksReal"), fStsTracks(nullptr), fEvents(nullptr) { } // =========================================================================== // ===== Destructor ====================================================== CbmBuildEventsFromTracksReal::~CbmBuildEventsFromTracksReal() { // fEvents->Delete(); } // =========================================================================== // ===== Task initialisation ============================================= InitStatus CbmBuildEventsFromTracksReal::Init() { // --- Get FairRootManager instance FairRootManager* ioman = FairRootManager::Instance(); assert ( ioman ); fStsTracks=(TClonesArray*) ioman->GetObject("StsTrack"); assert ( fStsTracks ); // Register output array (CbmStsDigi) fEvents = new TClonesArray("CbmEvent",100); ioman->Register("Event", "CbmEvent", fEvents, IsOutputBranchPersistent("Event")); return kSUCCESS; } // =========================================================================== // ===== Task execution ================================================== void CbmBuildEventsFromTracksReal::Exec(Option_t*) { TStopwatch timer; timer.Start(); std::map eventMap; // Clear output array fEvents->Delete(); UInt_t nTracks = fStsTracks->GetEntriesFast(); vector vRTracks_new; vector Index; vector Tracks; vector< vector > timeClusters; int nUsedTracks = 0; for(int iTrack=0; iTrackAt(iTrack); Double_t time = track->GetTime(); Double_t timeEr = track->GetTimeError(); SortTracks structure; structure.Track = *track; structure.index = iTrack; structure.used = 0; if (timeEr > 0 && timeEr == timeEr && time == time) Tracks.push_back(structure); } // std::sort(Tracks.begin(), Tracks.end(), CompareTrackTime); nUsedTracks = 0; vector< vector > clusters; while(nUsedTracks < Tracks.size()) { vector cluster; //find first unused track and create a new cluster for(int iTrack=0; iTrackAt(cluster[iClusterTrack]); float time2 = stsTrack->GetTime(); float timeC2 = stsTrack->GetTimeError(); float dt = fabs(time1 - time2); float error = sqrt(timeC1+ timeC2); ///&&???????????????? if((dt<4*error)&&(dt<8.5) ) { cluster.push_back(Tracks[iTrack].index); Tracks[iTrack].used = true; nUsedTracks++; break; } } } float time_min = 100000000000; float time_max =0; for(int iClusterTrack=0; iClusterTrackAt(cluster[iClusterTrack]); if (time_min>stsTrack->GetTime()) time_min=stsTrack->GetTime(); if (time_maxGetTime()) time_max=stsTrack->GetTime(); } if (cluster.size()>1) clusters.push_back(cluster); } for(int iEvent=0; iEventGetEntriesFast(); // if (clusters[iEvent].size()>1) { event = new ( (*fEvents)[nEvents] ) CbmEvent(iEvent); event->SetStsTracks(clusters[iEvent]); } } timer.Stop(); } ClassImp(CbmBuildEventsFromTracksReal)