CbmRoot
Loading...
Searching...
No Matches
reco/offline/steer/TaskFactory.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Volker Friese [committer] */
4
9
10#include "TaskFactory.h"
11
13#include "CbmBuildEventsIdeal.h"
15#include "CbmFsdHitProducer.h"
16#include "CbmKF.h"
17#include "CbmL1.h"
18#include "CbmL1StsTrackFinder.h"
20#include "CbmMuchFindHitsGem.h"
21#include "CbmMuchGeoScheme.h"
22#include "CbmMvdClusterfinder.h"
23#include "CbmMvdHitfinder.h"
24#include "CbmPVFinderKF.h"
25#include "CbmPsdHitProducer.h"
26#include "CbmRecoSetupManager.h"
27#include "CbmRecoSts.h"
28#include "CbmRecoT0.h"
29#include "CbmRichHitProducer.h"
30#include "CbmRichReconstruction.h"
31#include "CbmSetup.h"
32#include "CbmStsFindTracks.h"
36#include "CbmTrdClusterFinder.h"
37#include "CbmTrdHitProducer.h"
39
40#include <TSystem.h>
41
42
43namespace cbm::reco::offline
44{
45
46
47 // ----- Constructor ----------------------------------------------------
49 // --------------------------------------------------------------------------
50
51
52 // ----- CA tracking ----------------------------------------------------
54 {
55 assert(fRun);
56
57 // --- Tracking geometry interface
59
60 // --- Kalman Filter
61 auto kf = new CbmKF();
62 fRun->AddTask(kf);
63
64 // --- CA Track Finder
65 auto ca = new CbmL1("CA Track Finder");
66 fRun->AddTask(ca);
67
68 // --- Track finder steering class
69 auto trackFinder = new CbmL1StsTrackFinder();
70
71 // --- Track finder task
72 FairTask* findTracks = nullptr;
73 if (fRun->GetConfig().f_glb_mode == ECbmRecoMode::Timeslice)
74 findTracks = new CbmStsFindTracks(0, trackFinder, true);
75 else
76 findTracks = new CbmStsFindTracksEvents(trackFinder, true);
77 fRun->AddTask(findTracks);
78 }
79 // --------------------------------------------------------------------------
80
81
82 // ----- Event building from digis --------------------------------------
84 {
85 assert(fRun);
86 if (fRun->GetConfig().f_evbuild_type == cbm::reco::offline::ECbmEvbuildType::Undefined)
87 throw std::out_of_range("Undefined event builder type");
88
89 // --- Ideal digi event builder (using MC truth information)
90 if (fRun->GetConfig().f_evbuild_type == cbm::reco::offline::ECbmEvbuildType::Ideal) {
91 FairTask* evBuildRaw = new CbmBuildEventsIdeal();
92 fRun->AddTask(evBuildRaw);
93 } //? Ideal event builder
94
95 // --- Real digi event builder
96 // TODO: This should be replaced by the newer algorithm algo/evbuild/EventBuilder
97 else {
98
99 const cbm::reco::offline::Config& config = fRun->GetConfig();
100 ECbmModuleId triggerDetector = config.f_evbuild_trigDet;
101
102 if (!fRun->IsDataPresent(triggerDetector)) throw std::runtime_error("No input data for trigger detector");
103
104 // --- Task
106
107 // --- Mode
108 evBuildRaw->SetEventOverlapMode(config.f_evbuild_ovlapmode);
109
110 // --- Reference detector
111 switch (triggerDetector) {
121 default: throw std::out_of_range("Event builder: Undefined trigger detector"); break;
122 }
123
124 // --- Make BMON (default reference detector) a selected detector (with default parameters)
125 if (triggerDetector != ECbmModuleId::kBmon) evBuildRaw->AddDetector(kRawEventBuilderDetBmon);
126
127 // --- Remove detectors of which there are no input data
128 if (!fRun->IsDataPresent(ECbmModuleId::kRich)) evBuildRaw->RemoveDetector(kRawEventBuilderDetRich);
129 if (!fRun->IsDataPresent(ECbmModuleId::kMuch)) evBuildRaw->RemoveDetector(kRawEventBuilderDetMuch);
130 if (!fRun->IsDataPresent(ECbmModuleId::kPsd)) evBuildRaw->RemoveDetector(kRawEventBuilderDetPsd);
131 if (!fRun->IsDataPresent(ECbmModuleId::kTof)) evBuildRaw->RemoveDetector(kRawEventBuilderDetTof);
132 if (!fRun->IsDataPresent(ECbmModuleId::kTrd)) evBuildRaw->RemoveDetector(kRawEventBuilderDetTrd);
133 if (!fRun->IsDataPresent(ECbmModuleId::kFsd)) evBuildRaw->RemoveDetector(kRawEventBuilderDetFsd);
134
135 // --- Timeslice parameters
136 evBuildRaw->SetTsParameters(0.0, 1.e7, 0.0);
137
138 // --- Use CbmMuchDigi instead of CbmMuchBeamtimeDigi
139 // TODO: Seems legacy.
140 evBuildRaw->ChangeMuchBeamtimeDigiFlag(kFALSE);
141
142 // --- Set trigger parameters
143 evBuildRaw->SetTriggerMinNumber(triggerDetector, config.f_evbuild_trigNumMin);
144 evBuildRaw->SetTriggerMaxNumber(triggerDetector, config.f_evbuild_trigNumMax);
145 evBuildRaw->SetTriggerWindow(triggerDetector, config.f_evbuild_trigWinMin, config.f_evbuild_trigWinMax);
146
147 fRun->AddTask(evBuildRaw);
148
149 } //? Real event builder
150 }
151 // --------------------------------------------------------------------------
152
153
154 // ----- LIT Global Tracking --------------------------------------------
156 {
157 assert(fRun);
159 finder->SetTrackingType(fRun->GetConfig().f_lit_trackType);
160 finder->SetMergerType(fRun->GetConfig().f_lit_mergeType);
161 fRun->AddTask(finder);
162 }
163 // --------------------------------------------------------------------------
164
165
166 // ----- MUCH reconstruction --------------------------------------------
168 {
169 assert(fRun);
170 if (!fRun->IsDataPresent(ECbmModuleId::kMuch)) return;
171
172 // --- Parameter file name
173 TString geoTag;
174 if (CbmSetup::Instance()->GetGeoTag(ECbmModuleId::kMuch, geoTag)) {
175 Int_t muchFlag = (geoTag.Contains("mcbm") ? 1 : 0);
176 TString parFile = gSystem->Getenv("VMCWORKDIR");
177 parFile += "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root";
178
179 auto muchGeoScheme = CbmMuchGeoScheme::Instance();
180 if (!muchGeoScheme->IsInitialized()) {
181 muchGeoScheme->Init(parFile, muchFlag);
182 }
183
184 FairTask* muchReco = new CbmMuchFindHitsGem(parFile.Data(), muchFlag);
185 fRun->AddTask(muchReco);
186 }
187 }
188 // --------------------------------------------------------------------------
189
190
191 // ----- MVD reconstruction ---------------------------------------------
193 {
194 assert(fRun);
195 if (!fRun->IsDataPresent(ECbmModuleId::kMvd)) return;
196
197 // The real eventbuilder currently doesn't support the MVD detector
198 if (fRun->GetConfig().f_evbuild_type == cbm::reco::offline::ECbmEvbuildType::Real) {
199 return;
200 }
201
202 CbmMvdClusterfinder* mvdCluster = new CbmMvdClusterfinder("MVD Cluster Finder", 0, 0);
203 if (fRun->GetConfig().f_glb_mode == ECbmRecoMode::EventByEvent) {
205 }
206 else {
207 mvdCluster->SetMode(ECbmRecoMode::Timeslice);
208 }
209 fRun->AddTask(mvdCluster);
210
211 CbmMvdHitfinder* mvdHit = new CbmMvdHitfinder("MVD Hit Finder", 0, 0);
212 mvdHit->UseClusterfinder(kTRUE);
213 if (fRun->GetConfig().f_glb_mode == ECbmRecoMode::EventByEvent) {
215 }
216 else {
218 }
219 fRun->AddTask(mvdHit);
220 }
221 // --------------------------------------------------------------------------
222
223
224 // ----- Primary Vertex Finding -----------------------------------------
226 {
227 assert(fRun);
228 CbmPrimaryVertexFinder* pvFinder = new CbmPVFinderKF();
229 CbmFindPrimaryVertex* findVertex = new CbmFindPrimaryVertex(pvFinder);
230 fRun->AddTask(findVertex);
231 }
232 // --------------------------------------------------------------------------
233
234
235 // ----- RICH hit finding -----------------------------------------------
237 {
238 assert(fRun);
239 if (!fRun->IsDataPresent(ECbmModuleId::kRich)) return;
240
241 CbmRichHitProducer* richHitProd = new CbmRichHitProducer();
242 fRun->AddTask(richHitProd);
243 }
244 // --------------------------------------------------------------------------
245
246
247 // ----- RICH reconstruction --------------------------------------------
249 {
250 assert(fRun);
251 if (!fRun->IsDataPresent(ECbmModuleId::kRich)) return;
252
254 fRun->AddTask(richReco);
255 }
256 // --------------------------------------------------------------------------
257
258
259 // ----- STS reconstruction ---------------------------------------------
261 {
262 assert(fRun);
263 if (!fRun->IsDataPresent(ECbmModuleId::kSts)) return;
264
265 CbmRecoSts* stsReco = new CbmRecoSts(fRun->GetConfig().f_glb_mode);
266 stsReco->SetUseGpuReco(fRun->GetConfig().f_sts_usegpu);
267 fRun->AddTask(stsReco);
268 }
269 // --------------------------------------------------------------------------
270
271
272 // ----- TOF reconstruction ---------------------------------------------
274 {
275 assert(fRun);
276 if (!fRun->IsDataPresent(ECbmModuleId::kTof)) return;
277
278 CbmTofSimpClusterizer* tofCluster = new CbmTofSimpClusterizer("TOF Simple Clusterizer", 0);
279 tofCluster->SetOutputBranchPersistent("TofHit", kTRUE);
280 tofCluster->SetOutputBranchPersistent("TofDigiMatch", kTRUE);
281 fRun->AddTask(tofCluster);
282 }
283 // --------------------------------------------------------------------------
284
285
286 // ----- PSD reconstruction ---------------------------------------------
288 {
289 assert(fRun);
290 if (!fRun->IsDataPresent(ECbmModuleId::kPsd)) return;
291
292 CbmPsdHitProducer* psdHit = new CbmPsdHitProducer();
293 fRun->AddTask(psdHit);
294 }
295 // --------------------------------------------------------------------------
296
297
298 // ----- FSD reconstruction ---------------------------------------------
300 {
301 assert(fRun);
302 if (!fRun->IsDataPresent(ECbmModuleId::kFsd)) return;
303
304 CbmFsdHitProducer* fsdHit = new CbmFsdHitProducer();
305 fRun->AddTask(fsdHit);
306 }
307 // --------------------------------------------------------------------------
308
309
310 // ----- Event building from tracks -------------------------------------
312 {
313 assert(fRun);
314 auto eventBuilder = new CbmBuildEventsFromTracksReal();
315 fRun->AddTask(eventBuilder);
316 }
317 // --------------------------------------------------------------------------
318
319
320 // ----- TRD PID --------------------------------------------------------
322 {
323 assert(fRun);
324 if (!fRun->IsDataPresent(ECbmModuleId::kTrd)) return;
325
326 CbmTrdSetTracksPidLike* trdPid = new CbmTrdSetTracksPidLike("TRDLikelihood", "TRDLikelihood");
327 trdPid->SetUseMCInfo(kTRUE);
328 trdPid->SetUseMomDependence(kTRUE);
329 fRun->AddTask(trdPid);
330 }
331 // --------------------------------------------------------------------------
332
333
334 // ----- TRD reconstruction ---------------------------------------------
336 {
337 assert(fRun);
338 if (!fRun->IsDataPresent(ECbmModuleId::kTrd)) return;
339
340 CbmTrdClusterFinder* trdCluster = new CbmTrdClusterFinder();
341 if (fRun->GetConfig().f_glb_mode == ECbmRecoMode::EventByEvent)
342 trdCluster->SetTimeBased(kFALSE);
343 else
344 trdCluster->SetTimeBased(kTRUE);
345 trdCluster->SetNeighbourEnable(true, false);
346 trdCluster->SetMinimumChargeTH(fRun->GetConfig().f_trd_trigThresh);
347 trdCluster->SetRowMerger(true);
348 fRun->AddTask(trdCluster);
349
350 CbmTrdHitProducer* trdHit = new CbmTrdHitProducer();
351 fRun->AddTask(trdHit);
352 }
353 // --------------------------------------------------------------------------
354
355
356 // ----- Bmon reconstruction ----------------------------------------------
358 {
359 assert(fRun);
360 CbmRecoT0* recoBmon = new CbmRecoT0();
361 fRun->AddTask(recoBmon);
362 }
363 // --------------------------------------------------------------------------
364
365} // namespace cbm::reco::offline
static const RawEventBuilderDetector kRawEventBuilderDetSts
static const RawEventBuilderDetector kRawEventBuilderDetTrd2D
static const RawEventBuilderDetector kRawEventBuilderDetBmon
static const RawEventBuilderDetector kRawEventBuilderDetFsd
static const RawEventBuilderDetector kRawEventBuilderDetTrd
static const RawEventBuilderDetector kRawEventBuilderDetPsd
static const RawEventBuilderDetector kRawEventBuilderDetRich
static const RawEventBuilderDetector kRawEventBuilderDetTof
static const RawEventBuilderDetector kRawEventBuilderDetMuch
ECbmModuleId
Enumerator for module Identifiers.
Definition CbmDefs.h:45
@ kMvd
Micro-Vertex Detector.
Definition CbmDefs.h:47
@ kTrd
Transition Radiation Detector.
Definition CbmDefs.h:51
@ kTof
Time-of-flight Detector.
Definition CbmDefs.h:52
@ kPsd
Projectile spectator detector.
Definition CbmDefs.h:54
@ kSts
Silicon Tracking System.
Definition CbmDefs.h:48
@ kTrd2d
TRD-FASP Detector (FIXME)
Definition CbmDefs.h:58
@ kMuch
Muon detection system.
Definition CbmDefs.h:50
@ kFsd
Forward spectator detector.
Definition CbmDefs.h:59
@ kBmon
Bmon Counter.
Definition CbmDefs.h:57
@ kRich
Ring-Imaging Cherenkov Detector.
Definition CbmDefs.h:49
Hit Producer for FSD.
CBM task for global track reconstruction.
A manager for setup representation in CBM reconstruction.
Class for producing RICH hits directly from MCPoints.
FairTask to produce TrdCluster objects from TrdHit objects.
FairTask to produce TrdHit objects from TrdCluster objects.
int Int_t
Definition CbmKF.h:34
Definition CbmL1.h:105
void SetMergerType(const string &mergerType)
void SetTrackingType(const string &trackingType)
static CbmMuchGeoScheme * Instance()
void SetMode(ECbmRecoMode mode)
Set execution mode.
void SetMode(ECbmRecoMode mode)
Set execution mode.
void UseClusterfinder(Bool_t clusterfinderFlag)
Implementation of the primary vertex finder using KF utility.
Task class for local reconstruction in the STS.
Definition CbmRecoSts.h:54
void SetUseGpuReco(bool useGPU)
Task class for reconstruction of the event t0.
Definition CbmRecoT0.h:50
Class for producing RICH hits directly from MCPoints.
Main class for running event reconstruction in the RICH detector.
static CbmSetup * Instance()
Definition CbmSetup.cxx:160
Task class for finding STS tracks in an event.
void SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd)
void SetEventOverlapMode(EOverlapModeRaw mode)
void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal)
void ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn=kFALSE)
void RemoveDetector(RawEventBuilderDetector selDet)
void SetReferenceDetector(RawEventBuilderDetector refDet, std::vector< bool > select={})
void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength)
void AddDetector(RawEventBuilderDetector selDet)
Simple Cluster building and hit producing for CBM ToF using Digis as input.
static void SetTimeBased(Bool_t set=kTRUE)
static void SetRowMerger(Bool_t set=kTRUE)
static void SetMinimumChargeTH(Float_t th)
static void SetNeighbourEnable(Bool_t col=kTRUE, Bool_t row=kFALSE)
void SetUseMomDependence(Bool_t use=kTRUE)
void SetUseMCInfo(Bool_t use=kTRUE)
static RecoSetupManager * Instance()
Instance access.
void RegisterTrackEventBuilder()
Local reconstruction for FSD.
void RegisterTrdReco()
Event building from tracks.
void RegisterFsdReco()
Local reconstruction for PSD.
void RegisterMvdReco()
Local reconstruction for MUCH.
TaskFactory(Run *steer=nullptr)
Constructor.
void RegisterPvFinder()
Local reconstruction for MVD.
void RegisterTofReco()
Local reconstruction for STS.
void RegisterStsReco()
Local reconstruction for RICH.
void RegisterGlobalTracking()
Event building from digis.
void RegisterTrdPid()
Local reconstruction for TRD.
void RegisterPsdReco()
Local reconstruction for TOF.
void RegisterRichHitFinder()
Primary vertex finding.
TODO: SZh 8.11.2022: add selection of parameterisation.
Definition CaBranch.h:14