CbmRoot
Loading...
Searching...
No Matches
CbmLitFindGlobalTracksParallel.cxx
Go to the documentation of this file.
1/* Copyright (C) 2013-2020 GSI/JINR-LIT, Darmstadt/Dubna
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Andrey Lebedev [committer], Florian Uhlig */
4
11
12#include "CbmGlobalTrack.h"
13#include "CbmStsTrack.h"
14#include "CbmTrack.h"
15#include "TClonesArray.h"
23
24#include <FairRootManager.h>
25#include <Logger.h>
26
27#include <boost/assign/list_of.hpp>
28
29#include <algorithm>
30#include <iostream>
31#include <set>
32
33using boost::assign::list_of;
34using std::cout;
35using std::endl;
36using std::for_each;
37using std::set;
38
40 : FairTask()
41 , fStsTracks(NULL)
42 , fTrdHits(NULL)
43 , fTrdTracks(NULL)
44 , fMuchPixelHits(NULL)
45 , fMuchTracks(NULL)
46 , fGlobalTracks(NULL)
47 , fTrackingType("nn")
48 , fMergerType("neares_hit")
49 , fFitterType("kalman")
52{
53}
54
56
58{
59 fDet.DetermineSetup();
60 cout << fDet.ToString();
61
63
64 fTrackingWatch.Reset();
66
67 return kSUCCESS;
68}
69
71{
72 if (fDet.GetDet(ECbmModuleId::kTrd)) {
73 fTrdTracks->Delete();
74 }
75 if (fDet.GetDet(ECbmModuleId::kMuch)) {
76 fMuchTracks->Delete();
77 }
78 fGlobalTracks->Delete();
79
80 DoTracking();
81
82 static Int_t eventNo = 0;
83 cout << "CbmLitFindGlobalTracksParallel::Exec eventNo: " << eventNo++ << endl;
84}
85
87
89{
90 FairRootManager* ioman = FairRootManager::Instance();
91 if (NULL == ioman) LOG(fatal) << "CbmLitFindGlobalTracksParallel: FairRootManager is not instantiated";
92
93 // STS
94 fStsTracks = (TClonesArray*) ioman->GetObject("StsTrack");
95 if (NULL == fStsTracks) LOG(fatal) << "CbmLitFindGlobalTracksParallel: No StsTrack array!";
96
97 // TRD
98 if (fDet.GetDet(ECbmModuleId::kTrd)) {
99 fTrdHits = (TClonesArray*) ioman->GetObject("TrdHit");
100 if (NULL == fTrdHits)
101 if (NULL == fTrdHits) LOG(fatal) << "CbmLitFindGlobalTracksParallel: No TRDHit array!";
102 }
103
104 // MUCH
105 if (fDet.GetDet(ECbmModuleId::kMuch)) {
106 fMuchPixelHits = (TClonesArray*) ioman->GetObject("MuchPixelHit");
107 if (NULL == fMuchPixelHits)
108 if (NULL == fMuchPixelHits) LOG(fatal) << "CbmLitFindGlobalTracksParallel: No MuchPixelHit array!";
109 }
110
111 // Create and register track arrays
112 fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100);
113 ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack"));
114
115 if (fDet.GetDet(ECbmModuleId::kTrd)) {
116 fTrdTracks = new TClonesArray("CbmTrdTrack", 100);
117 ioman->Register("TrdTrack", "Trd", fTrdTracks, IsOutputBranchPersistent("TrdTrack"));
118 }
119
120 if (fDet.GetDet(ECbmModuleId::kMuch)) {
121 fMuchTracks = new TClonesArray("CbmMuchTrack", 100);
122 ioman->Register("MuchTrack", "Much", fMuchTracks, IsOutputBranchPersistent("MuchTrack"));
123 }
124}
125
127{
128 static Bool_t firstTime = true;
131 if (firstTime) {
132 if (fDet.GetDet(ECbmModuleId::kTrd)) {
134 finder.SetDetectorLayout(layout);
135 finder.SetNofIterations(1);
136 finder.SetMaxNofMissingHits(list_of(4));
137 finder.SetPDG(list_of(211));
138 finder.SetChiSqStripHitCut(list_of(9.));
139 finder.SetChiSqPixelHitCut(list_of(25.));
140 finder.SetSigmaCoef(list_of(5.));
141 firstTime = false;
142 }
143 if (fDet.GetDet(ECbmModuleId::kMuch)) {
145 finder.SetDetectorLayout(layout);
146 finder.SetNofIterations(1);
147 finder.SetMaxNofMissingHits(list_of(4));
148 finder.SetPDG(list_of(211));
149 finder.SetChiSqStripHitCut(list_of(9.));
150 finder.SetChiSqPixelHitCut(list_of(25.));
151 finder.SetSigmaCoef(list_of(5.));
152 firstTime = false;
153 }
154 }
155
156 fTrackingWithIOWatch.Start(kFALSE);
157
158 // Convert input data
162 if (fDet.GetDet(ECbmModuleId::kTrd)) {
164 }
165 if (fDet.GetDet(ECbmModuleId::kMuch)) {
167 }
168
169 // Convert track seeds
170 Int_t nofSeeds = fStsTracks->GetEntriesFast();
171 for (Int_t iSeed = 0; iSeed < nofSeeds; iSeed++) {
172 CbmStsTrack* stsTrack = static_cast<CbmStsTrack*>(fStsTracks->At(iSeed));
176 lseed->SetParamFirst(lpar);
177 lseeds.push_back(lseed);
178 lseed->SetPreviousTrackId(iSeed);
179 }
180
181 fTrackingWatch.Start(kFALSE);
182 finder.DoFind(lhits, lseeds, ltracks);
183 fTrackingWatch.Stop();
184
185 // Convert to CBMROOT data and construct global tracks
186 if (fDet.GetDet(ECbmModuleId::kTrd)) {
188 }
189 if (fDet.GetDet(ECbmModuleId::kMuch)) {
191 }
193
194 // Clear memory
195 for_each(lseeds.begin(), lseeds.end(), DeleteObject());
196 for_each(ltracks.begin(), ltracks.end(), DeleteObject());
197 for_each(lhits.begin(), lhits.end(), DeleteObject());
198 lseeds.clear();
199 ltracks.clear();
200 lhits.clear();
201
203}
204
206{
207 set<Int_t> stsTracksSet;
208 Int_t globalTrackNo = 0;
209 if (fDet.GetDet(ECbmModuleId::kTrd)) {
210 Int_t nofTrdTracks = fTrdTracks->GetEntriesFast();
211 for (Int_t iTrack = 0; iTrack < nofTrdTracks; iTrack++) {
212 const CbmTrack* trdTrack = static_cast<const CbmTrack*>(fTrdTracks->At(iTrack));
213 CbmGlobalTrack* globalTrack = new ((*fGlobalTracks)[globalTrackNo++]) CbmGlobalTrack();
214 globalTrack->SetStsTrackIndex(trdTrack->GetPreviousTrackId());
215 globalTrack->SetTrdTrackIndex(iTrack);
216 }
217 }
218
219 if (fDet.GetDet(ECbmModuleId::kMuch)) {
220 Int_t nofMuchTracks = fMuchTracks->GetEntriesFast();
221 for (Int_t iTrack = 0; iTrack < nofMuchTracks; iTrack++) {
222 const CbmTrack* trdTrack = static_cast<const CbmTrack*>(fMuchTracks->At(iTrack));
223 CbmGlobalTrack* globalTrack = new ((*fGlobalTracks)[globalTrackNo++]) CbmGlobalTrack();
224 globalTrack->SetStsTrackIndex(trdTrack->GetPreviousTrackId());
225 globalTrack->SetMuchTrackIndex(iTrack);
226 }
227 }
228
229 // Loop over STS tracks in order to create additional CbmGlobalTrack,
230 // consisting of only CbmStsTrack
231 for (Int_t iTrack = 0; iTrack < fStsTracks->GetEntriesFast(); iTrack++) {
232 // if CbmGlobalTrack for STS track was not created, than create one
233 if (stsTracksSet.find(iTrack) == stsTracksSet.end()) {
234 CbmGlobalTrack* globalTrack = new ((*fGlobalTracks)[globalTrackNo++]) CbmGlobalTrack();
235 globalTrack->SetStsTrackIndex(iTrack);
236 }
237 }
238}
239
241{
242 LOG(info) << "CbmLitFindGlobalTracksParallel::PrintStopwatchStatistics:\n "
243 << "tracking without IO: counts=" << fTrackingWatch.Counter()
244 << ", real=" << fTrackingWatch.RealTime() / fTrackingWatch.Counter() << "/" << fTrackingWatch.RealTime()
245 << " s, cpu=" << fTrackingWatch.CpuTime() / fTrackingWatch.Counter() << "/" << fTrackingWatch.CpuTime()
246 << "\n"
247 << "tracking with IO: counts=" << fTrackingWithIOWatch.Counter()
248 << ", real=" << fTrackingWithIOWatch.RealTime() / fTrackingWithIOWatch.Counter() << "/"
249 << fTrackingWithIOWatch.RealTime()
250 << " s, cpu=" << fTrackingWithIOWatch.CpuTime() / fTrackingWithIOWatch.Counter() << "/"
251 << fTrackingWithIOWatch.CpuTime();
252}
253
@ kTrd
Transition Radiation Detector.
Definition CbmDefs.h:51
@ kMuch
Muon detection system.
Definition CbmDefs.h:50
Class for conversion between CBMROOT data classes and littrack parallel data classes.
ClassImp(CbmLitFindGlobalTracksParallel)
CBM task for parallel global track reconstruction.
Tracking geometry constructor.
Data class for STS tracks.
Detector layout class.
Base class for scalar pixel hits.
Scalar track data class.
Parallel implementation of the nearest neighbor tracking algorithm.
int Int_t
bool Bool_t
void SetMuchTrackIndex(int32_t iMuch)
void SetTrdTrackIndex(int32_t iTrd)
void SetStsTrackIndex(int32_t iSts)
static void LitScalTrackArrayToCbmTrdTrackArray(const vector< lit::parallel::LitScalTrack * > &ltracks, TClonesArray *tracks)
Convert array of LitScalTrack to array of CbmTrack.
static void FairTrackParamToLitTrackParamScal(const FairTrackParam *par, lit::parallel::LitTrackParamScal *lpar)
Convert FairTrackParam to LitTrackParamScal.
static void CbmPixelHitArrayToLitScalPixelHitArray(const TClonesArray *hits, vector< lit::parallel::LitScalPixelHit * > &lhits)
Convert CbmPixelHit array to LitScalPixelHit arra.
static void LitScalTrackArrayToCbmMuchTrackArray(const vector< lit::parallel::LitScalTrack * > &ltracks, TClonesArray *tracks)
Convert array of LitScalTrack to array of CbmTrack.
void ReadAndCreateDataBranches()
Reads necessary data branches from the input data files and creates branches for CbmGlobalTrack,...
virtual InitStatus Init()
Inherited from FairTask.
virtual void Finish()
Inherited from FairTask.
virtual void Exec(Option_t *opt)
Inherited from FairTask.
void ConstructGlobalTracks()
Create and fill global tracks.
void DoTracking()
Do the track reconstruction.
void PrintStopwatchStatistics()
Print stopwatch statistics.
static CbmLitTrackingGeometryConstructor * Instance()
Return pointer to singleton object.
void GetMuchLayoutScal(lit::parallel::LitDetectorLayoutScal &layout)
Return MUCH detector layout for parallel MUCH tracking in scalar format.
void GetTrdLayoutScal(lit::parallel::LitDetectorLayoutScal &layout)
Return TRD detector layout for TRD parallel tracking in scalar format.
const FairTrackParam * GetParamLast() const
Definition CbmTrack.h:69
int32_t GetPreviousTrackId() const
Definition CbmTrack.h:67
Scalar track data class.
void SetPreviousTrackId(unsigned short previousTrackId)
Sets previous trackId.
void SetParamFirst(const LitTrackParamScal &param)
Sets first track parameter.
void SetSigmaCoef(const vector< fscal > &sigmaCoef)
void SetChiSqStripHitCut(const vector< fscal > &chiSqStripHitCut)
void SetChiSqPixelHitCut(const vector< fscal > &chiSqPixelHitCut)
void SetDetectorLayout(const LitDetectorLayoutScal &layout)
void DoFind(const vector< lit::parallel::LitScalPixelHit * > &hits, const vector< lit::parallel::LitScalTrack * > &trackSeeds, vector< lit::parallel::LitScalTrack * > &tracks)
Main function for track reconstruction.
void SetNofIterations(int nofIterations)
void SetPDG(const vector< int > &pdg)
void SetMaxNofMissingHits(const vector< int > &maxNofMissingHits)
LitTrackParam< fscal > LitTrackParamScal
Scalar version of LitTrackParam.
LitDetectorLayout< fscal > LitDetectorLayoutScal
Scalar version of LitDetectorLayout.