CbmRoot
Loading...
Searching...
No Matches
CbmL1GlobalFindTracksEvents.cxx
Go to the documentation of this file.
1/* Copyright (C) 2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Valentina Akishina [committer] */
4
13// Includes from STS
15
16#include "CbmEvent.h"
18#include "CbmStsHit.h"
19#include "CbmStsTrack.h"
21
22#include <cassert>
23
24// Includes from base
25#include "FairField.h"
26#include "FairRootManager.h"
27#include "FairRunAna.h"
28#include "FairRuntimeDb.h"
29
30#include <Logger.h>
31
32// Includes from ROOT
33#include "TClonesArray.h"
34
35// Includes from C++
36#include <iomanip>
37#include <iostream>
38
39using std::fixed;
40using std::left;
41using std::pair;
42using std::right;
43using std::setprecision;
44using std::setw;
45using std::stringstream;
46
47// ----- Standard constructor ------------------------------------------
49 : FairTask("GlobalFindTracksEvents")
50 , fUseMvd(useMvd)
51 , fFinder(finder)
52 , fEvents(nullptr)
53 , fMvdHits(nullptr)
54 , fStsHits(nullptr)
55 , fGlobalTracks(nullptr)
56 , fStsTrackArray(nullptr)
57 , fMuchTrackArray(nullptr)
58 , fTrdTrackArray(nullptr)
59 , fTofTrackArray(nullptr)
60 , fTimer()
61 , fNofEvents(0)
62 , fNofHits(0.)
63 , fNofTracks(0.)
64 , fTime(0.)
65{
66 if (!finder) fFinder = new CbmL1GlobalTrackFinder();
67}
68// -------------------------------------------------------------------------
69
70
71// ----- Destructor ----------------------------------------------------
73{
74 fGlobalTracks->Delete();
75 fStsTrackArray->Delete();
76 fMuchTrackArray->Delete();
77 fTrdTrackArray->Delete();
78 fTofTrackArray->Delete();
79 if (fFinder) delete fFinder;
80}
81// -------------------------------------------------------------------------
82
83
84// ----- Task execution ------------------------------------------------
85void CbmL1GlobalFindTracksEvents::Exec(Option_t* /*opt*/)
86{
87 nHitsTs = 0;
88 nTracksTs = 0;
89
90 // --- Local variables
91 Long64_t nEvents = 0;
92 Long64_t nHits = 0;
93 Long64_t nTracks = 0;
94 pair<UInt_t, UInt_t> result;
95 TStopwatch timer;
96 timer.Start();
97
98 // --- Clear output array
99 fGlobalTracks->Clear("C");
100 fStsTrackArray->Clear("C");
101 fMuchTrackArray->Clear("C");
102 fTrdTrackArray->Clear("C");
103 fTofTrackArray->Clear("C");
104
105
106 // --- Event loop (from event objects)
107 if (fEvents) {
108 nEvents = fEvents->GetEntriesFast();
109 LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events ";
110 for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
111 CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent));
112 result = ProcessEvent(event);
113 nHits += result.first;
114 nTracks += result.second;
115 } //# events
116 } //? event branch present
117
118 else { // Timeslice reconstruction without events
119 result = ProcessEvent(nullptr);
120 nHits = result.first;
121 nTracks = result.second;
122 }
123
124 // --- Timeslice log and statistics
125 timer.Stop();
126 stringstream logOut;
127 logOut << setw(20) << left << GetName() << " [";
128 logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
129 logOut << "TS " << fNofTs;
130 if (fEvents) logOut << ", events " << nEvents;
131 logOut << ", hits " << nHits << ", tracks " << nTracks;
132 LOG(info) << logOut.str();
133 fNofTs++;
134 fNofEvents += nEvents;
135 fNofHits += nHits;
136 fNofTracks += nTracks;
137 fTime += timer.RealTime();
138}
139// -------------------------------------------------------------------------
140
141
142// ----- Initialisation ------------------------------------------------
144{
145
146 LOG(info) << "=====================================";
147 LOG(info) << GetName() << ": initialising";
148
149 // I/O manager
150 FairRootManager* ioman = FairRootManager::Instance();
151 assert(ioman);
152
153 // --- Get input array (Events)
154 fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
155 if (nullptr == fEvents) {
156 LOG(warn) << GetName() << ": No event array! Will process entire tree.";
157 }
158
159 // --- Get input array (StsHits)
160 fStsHits = (TClonesArray*) ioman->GetObject("StsHit");
161 assert(fStsHits);
162
163 // Array of MvdHits
164 if (fUseMvd) {
165 fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit");
166 if (fMvdHits == nullptr) {
167 LOG(error) << GetName() << ": Use of MVD hits selected, but no hit branch present! "
168 << "Tracking will be done without MVD hits.";
169 }
170 else
171 LOG(info) << GetName() << ": including MVD hits in tracking";
172 }
173
174 // Create and register output array for StsTracks
175 fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100);
176 ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack"));
177 fStsTrackArray = new TClonesArray("CbmStsTrack", 100);
178 ioman->Register("StsTrack", "STS", fStsTrackArray, IsOutputBranchPersistent("StsTrack"));
179 fMuchTrackArray = new TClonesArray("CbmMuchTrack", 100);
180 ioman->Register("MuchTrack", "MUCH", fMuchTrackArray, IsOutputBranchPersistent("MuchTrack"));
181 fTrdTrackArray = new TClonesArray("CbmTrdTrack", 100);
182 ioman->Register("TrdTrack", "TRD", fTrdTrackArray, IsOutputBranchPersistent("TrdTrack"));
183 fTofTrackArray = new TClonesArray("CbmTofTrack", 100);
184 ioman->Register("TofTrack", "TOF", fTofTrackArray, IsOutputBranchPersistent("TofTrack"));
185
186 // Check for Track finder
187 if (!fFinder) {
188 LOG(fatal) << GetName() << ": no track finding engine selected!";
189 return kERROR;
190 }
191 LOG(info) << GetName() << ": Use track finder " << fFinder->GetName();
192
193 // Set members of track finder and initialise it
201 fFinder->Init();
202
203 // Screen output
204 LOG(info) << GetName() << ": successfully initialised.";
205 LOG(info) << "=====================================\n";
206
207 return kSUCCESS;
208}
209// -------------------------------------------------------------------------
210
211
212// ----- End-of-run action ---------------------------------------------
214{
215 LOG(info) << "\n=====================================";
216 LOG(info) << GetName() << ": Run summary";
217 LOG(info) << "Time slices : " << fNofTs;
218 LOG(info) << "Hits / TS : " << fixed << setprecision(2) << Double_t(fNofHits) / Double_t(fNofTs);
219 LOG(info) << "Tracks / TS : " << fixed << setprecision(2) << Double_t(fNofTracks) / Double_t(fNofTs);
220 LOG(info) << "Hits per track : " << fNofHits / fNofTracks;
221 LOG(info) << "Time per TS : " << 1000. * fTime / Double_t(fNofTs) << " ms ";
222 if (fEvents) {
223 LOG(info) << "Events processed : " << fNofEvents;
224 LOG(info) << "Hits / event : " << fNofHits / Double_t(fNofEvents);
225 LOG(info) << "Tracks / event : " << fNofTracks / Double_t(fNofEvents);
226 LOG(info) << "Time per event : " << 1000. * fTime / Double_t(fNofEvents) << " ms ";
227 }
228 LOG(info) << "=====================================";
229}
230// -------------------------------------------------------------------------
231
232
233// ------ Process one event --------------------------------------------
235{
236
237 // --- Call track finder
238 fTimer.Start();
239 Int_t nTracks = fFinder->FindTracks(event);
240 fTimer.Stop();
241
242 // --- Event log
243 Int_t eventNumber = (event ? event->GetNumber() : fNofEvents);
244 Int_t nHits = 0;
245 Int_t nHitsMuch = 0;
246 Int_t nHitsTrd = 0;
247 Int_t nHitsTof = 0;
248 if (event) {
249 nHits = 0 < event->GetNofData(ECbmDataType::kStsHit) ? event->GetNofData(ECbmDataType::kStsHit) : 0;
250 nHitsMuch = 0 < event->GetNofData(ECbmDataType::kMuchPixelHit) ? event->GetNofData(ECbmDataType::kMuchPixelHit) : 0;
251 nHitsTrd = 0 < event->GetNofData(ECbmDataType::kTrdHit) ? event->GetNofData(ECbmDataType::kTrdHit) : 0;
252 nHitsTof = 0 < event->GetNofData(ECbmDataType::kTofHit) ? event->GetNofData(ECbmDataType::kTofHit) : 0;
253 }
254 else {
255 nHits = fStsHits->GetEntriesFast();
256 }
257 nHitsTs += nHits;
258 nTracksTs += nTracks;
259
260 LOG(debug) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time "
261 << fixed << setprecision(6) << fTimer.RealTime() << " s, STS hits: " << setw(5) << nHits
262 << ", tracks: " << setw(4) << nTracks << " (TS: STS hits " << setw(7) << nHitsTs << ", tracks " << setw(6)
263 << nTracksTs << ") MUCH " << setw(4) << nHitsMuch << " TRD: " << setw(4) << nHitsTrd << " TOF: " << setw(4)
264 << nHitsTof << " Total: " << setw(5) << (nHits + nHitsMuch + nHitsTrd + nHitsTof);
265
266 return std::make_pair(nHits, nTracks);
267}
268// -------------------------------------------------------------------------
269
270
ClassImp(CbmConverterManager)
Data class for a reconstructed hit in the STS.
Data class for STS tracks.
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
Task class for finding Global, STS, MUCH, TRD and TOF tracks in an event.
CbmL1GlobalFindTracksEvents(CbmL1GlobalTrackFinder *finder=nullptr, Bool_t useMvd=kFALSE)
std::pair< UInt_t, UInt_t > ProcessEvent(CbmEvent *event)
Process one event or timeslice.
TClonesArray * fGlobalTracks
Input array of STS hits.
TClonesArray * fTrdTrackArray
Output array of CbmMuchTracks.
Double_t fTime
Total real time used for good events.
Int_t fNofEvents
Number of events with success.
TClonesArray * fMuchTrackArray
Output array of CbmStsTracks.
TClonesArray * fStsHits
Input array of MVD hits.
TClonesArray * fMvdHits
Array of CbmEvent objects.
TStopwatch fTimer
Output array of CbmTofTracks.
TClonesArray * fTofTrackArray
Output array of CbmTrdTracks.
Double_t fNofTracks
Number of tracks created.
TClonesArray * fStsTrackArray
Output array of CbmGlobalTracks.
void SetGlobalTracksArray(TClonesArray *tracks)
void SetMuchTracksArray(TClonesArray *tracks)
void SetStsTracksArray(TClonesArray *tracks)
void SetTrdTracksArray(TClonesArray *tracks)
virtual Int_t FindTracks(CbmEvent *event)
void SetTofTracksArray(TClonesArray *tracks)
void SetMvdHitArray(TClonesArray *hits)
void SetStsHitArray(TClonesArray *hits)