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")
50 , fTrackingWatch()
51 , fTrackingWithIOWatch()
52{
53}
54
56
58{
60 cout << fDet.ToString();
61
63
64 fTrackingWatch.Reset();
66
67 return kSUCCESS;
68}
69
71{
73 fTrdTracks->Delete();
74 }
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
99 fTrdHits = (TClonesArray*) ioman->GetObject("TrdHit");
100 if (NULL == fTrdHits)
101 if (NULL == fTrdHits) LOG(fatal) << "CbmLitFindGlobalTracksParallel: No TRDHit array!";
102 }
103
104 // MUCH
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
116 fTrdTracks = new TClonesArray("CbmTrdTrack", 100);
117 ioman->Register("TrdTrack", "Trd", fTrdTracks, IsOutputBranchPersistent("TrdTrack"));
118 }
119
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) {
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 }
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
159 vector<lit::parallel::LitScalTrack*> lseeds;
160 vector<lit::parallel::LitScalPixelHit*> lhits;
161 vector<lit::parallel::LitScalTrack*> ltracks;
164 }
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
188 }
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;
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
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.
@ kMuch
Muon detection system.
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.
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 DetermineSetup()
Determines detector presence using TGeoManager.
string ToString() const
Return string representation of class.
bool GetDet(ECbmModuleId detId) const
Return detector presence in setup.
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)