CbmRoot
Loading...
Searching...
No Matches
CbmOnlineParWrite.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer] */
4
5#include "CbmOnlineParWrite.h"
6
8#include "CbmL1.h"
9#include "CbmMcbmUtils.h"
10#include "CbmSetup.h"
11#include "CbmSinkDummy.h"
12#include "CbmSourceDummy.h"
13#include "CbmStsAddress.h"
14#include "CbmStsParAsic.h"
15#include "CbmStsParModule.h"
16#include "CbmStsParSensor.h"
17#include "CbmStsParSensorCond.h"
18#include "CbmStsParSetSensor.h"
19#include "CbmStsSetup.h"
25#include "CbmTrdParSetAsic.h"
26#include "CbmTrdParSetDigi.h"
27
28#include <FairParAsciiFileIo.h>
29#include <FairParRootFileIo.h>
30#include <FairRootFileSink.h>
31#include <FairRunAna.h>
32#include <FairRuntimeDb.h>
33
34#include <TGeoManager.h>
35#include <TObjString.h>
36#include <TStopwatch.h>
37
38#include <iostream>
39
40using namespace cbm::algo;
41
43{
44 // Add detectors here
45 AddTrd();
46 AddTof();
47 AddSts();
48}
49
50// ===========================================================================
51// TRD setup
52// ===========================================================================
54{
55 // Copied from macro/beamtime/mcbm2022/trd_hitfinder_run.C
58
59 // ----- TRD digitisation parameters -------------------------------------
60 TString geoTagTrd;
62 throw std::runtime_error{"TRD not enabled in current geometry!"};
63 }
64
65 if (!fSetup->GetGeoTag(ECbmModuleId::kTrd, geoTagTrd)) {
66 throw std::runtime_error{"Failed to get TRD geo tag from CbmSetup!"};
67 }
68
69 TString paramFilesTrd(Form("%s/parameters/trd/trd_%s", fSrcDir.Data(), geoTagTrd.Data()));
70 std::vector<TString> paramFilesVecTrd = {"asic", "digi", "gas", "gain"};
71 for (auto parIt : paramFilesVecTrd) {
72 fParList->Add(new TObjString(Form("%s.%s.par", paramFilesTrd.Data(), parIt.Data())));
73 }
74
75 for (auto parFileVecIt : *fParList) {
76 std::cout << Form("TrdParams - %s - added to parameter file list", parFileVecIt->GetName()) << std::endl;
77 }
78
79 // ----- TRD task ---------------------------------------------------------
80 auto* trdHitfinderPar = new CbmTaskTrdHitFinderParWrite{};
81 fRun->AddTask(trdHitfinderPar);
82
83
84 // Initialize input files
85 FairParAsciiFileIo asciiInput;
86 std::string digiparfile = Form("%s/parameters/trd/trd_%s.digi.par", fSrcDir.Data(), geoTagTrd.Data());
87 std::string asicparfile = Form("%s/parameters/trd/trd_%s.asic.par", fSrcDir.Data(), geoTagTrd.Data());
88
89 // Read the .digi file and store result
90 auto* digiparset = new CbmTrdParSetDigi{};
91 if (asciiInput.open(digiparfile.data())) {
92 digiparset->init(&asciiInput);
93 }
94 asciiInput.close();
95
96 // Read the .asic file and store result
97 auto* asicparset = new CbmTrdParSetAsic{};
98 if (asciiInput.open(asicparfile.data())) {
99 asicparset->init(&asciiInput);
100 }
101 asciiInput.close();
102
103 // Unpack
104 CbmTaskTrdUnpackParWrite::Pars parFilesUnpack{.asic = asicparset, .digi = digiparset, .setup = fConfig.setupType};
105 auto* trdUnpackPar = new CbmTaskTrdUnpackParWrite{parFilesUnpack};
106 fRun->AddTask(trdUnpackPar);
107}
108
109// ===========================================================================
110// TOF setup
111// ===========================================================================
113{
114 // Copied from macro/tools/tof_hitfinder_run.C
116
117 TString geoTag;
120 TObjString* tofBdfFile = new TObjString(fSrcDir + "/parameters/tof/tof_" + geoTag + ".digibdf.par");
121 fParList->Add(tofBdfFile);
122 std::cout << "-I- TOF: Using parameter file " << tofBdfFile->GetString() << std::endl;
123 }
124
125 // ----- TOF defaults ------------------------
126 Int_t calMode = 93;
127 Int_t calSel = 1;
128 Double_t dDeadtime = 50.;
129
130 TString TofFileFolder = fSrcDir + "/parameters/mcbm/";
131 bool doCalibration = false;
132 TString cCalId = "490.100.5.0";
133 Int_t iCalSet = 30040500; // calibration settings
134 TString cFname = "";
135
136 switch (fConfig.setupType) {
137 case Setup::mCBM2022:
138 doCalibration = true;
139 cCalId = "2391.5.000";
140 iCalSet = 22002500;
141 break;
142 case Setup::mCBM2024_03:
143 doCalibration = true;
144 cCalId = "2912.1";
145 iCalSet = 012032500;
146 break;
147 case Setup::mCBM2024_05:
148 doCalibration = true;
149 cFname = Form("%s/3026_1_TofCal.hst.root", TofFileFolder.Data());
150 break;
151 case Setup::mCBM2025_02:
152 doCalibration = true;
153 cFname = Form("%s/3310_1_TofCal.hst.root", TofFileFolder.Data());
154 break;
155 default: throw std::runtime_error("TOF: Unknown setup type");
156 }
157
158 if (cFname.IsNull() && doCalibration) {
159 cFname =
160 Form("%s/%s_set%09d_%02d_%01dtofClust.hst.root", TofFileFolder.Data(), cCalId.Data(), iCalSet, calMode, calSel);
161 }
162
163 auto* tofCluster = new CbmTaskTofClusterizerParWrite("Task TOF Clusterizer", 0, 1);
164 tofCluster->SetCalParFileName(cFname);
165 tofCluster->SetCalMode(calMode);
166 tofCluster->SetTotMax(20.); // Tot upper limit for walk corection
167 tofCluster->SetTotMin(0.); //(12000.); // Tot lower limit for walk correction
168 tofCluster->SetTotMean(5.); // Tot calibration target value in ns
169 tofCluster->SetMaxTimeDist(1.0); // default cluster range in ns
170 tofCluster->SetChannelDeadtime(dDeadtime); // artificial deadtime in ns
171 tofCluster->PosYMaxScal(0.75); //in % of length
172 fRun->AddTask(tofCluster);
173}
174
175// ===========================================================================
176// STS setup
177// ===========================================================================
179{
180 // Copied from macro/beamtime/mcbm2022/mcbm_reco.C
181
182 auto* recoSts = new CbmTaskStsHitFinderParWrite{};
183 // recoSts->SetMode(ECbmRecoMode::EventByEvent);
184
185 // recoSts->SetTimeCutDigisAbs(20.0); // cluster finder: time cut in ns
186 // recoSts->SetTimeCutClustersAbs(20.0); // hit finder: time cut in ns
187
188 TString geoTag;
190 LOG(info) << "STS geo tag: " << geoTag;
191
192 // Sensor params
194 sensor6cm.SetPar(0, 6.2092); // Extension in x
195 sensor6cm.SetPar(1, 6.2); // Extension in y
196 sensor6cm.SetPar(2, 0.03); // Extension in z
197 sensor6cm.SetPar(3, 5.9692); // Active size in y
198 sensor6cm.SetPar(4, 1024.); // Number of strips front side
199 sensor6cm.SetPar(5, 1024.); // Number of strips back side
200 sensor6cm.SetPar(6, 0.0058); // Strip pitch front side
201 sensor6cm.SetPar(7, 0.0058); // Strip pitch back side
202 sensor6cm.SetPar(8, 0.0); // Stereo angle front side
203 sensor6cm.SetPar(9, 7.5); // Stereo angle back side
204
205 CbmStsParSensor sensor12cm(sensor6cm); // copy all parameters, change then only the y size
206 sensor12cm.SetPar(1, 12.4); // Extension in y
207 sensor12cm.SetPar(3, 12.1692); // Active size in y
208
209 // --- Addresses for sensors
210 // --- They are defined in each station as sensor 1, module 1, halfladderD (2), ladder 1
211 // Int_t GetAddress(UInt_t unit = 0, UInt_t ladder = 0, UInt_t halfladder = 0, UInt_t module = 0, UInt_t sensor = 0,
212 // UInt_t side = 0, UInt_t version = kCurrentVersion);
213
214 // --- Now we can define the sensor parameter set and tell recoSts to use it
215 auto sensorParSet = new CbmStsParSetSensor("CbmStsParSetSensor", "STS sensor parameters"
216 "mcbm2021");
217
218 // TODO: is it possible to read these values from a parameter file?
219 if (fConfig.setupType == Setup::mCBM2022) {
220
221 Int_t stsAddress01 = CbmStsAddress::GetAddress(0, 0, 1, 0, 0, 0); // U0 L0 M0 6 cm
222 Int_t stsAddress02 = CbmStsAddress::GetAddress(0, 0, 1, 1, 0, 0); // U0 L0 M1 6 cm
223 Int_t stsAddress03 = CbmStsAddress::GetAddress(0, 1, 1, 0, 0, 0); // U0 L1 M0 6 cm
224 Int_t stsAddress04 = CbmStsAddress::GetAddress(0, 1, 1, 1, 0, 0); // U0 L1 M1 6 cm
225 Int_t stsAddress05 = CbmStsAddress::GetAddress(1, 0, 1, 0, 0, 0); // U1 L0 M0 6 cm
226 Int_t stsAddress06 = CbmStsAddress::GetAddress(1, 0, 1, 1, 0, 0); // U1 L0 M1 12 cm
227 Int_t stsAddress07 = CbmStsAddress::GetAddress(1, 1, 1, 0, 0, 0); // U1 L1 M0 6 cm
228 Int_t stsAddress08 = CbmStsAddress::GetAddress(1, 1, 1, 1, 0, 0); // U1 L1 M1 12 cm
229 Int_t stsAddress09 = CbmStsAddress::GetAddress(1, 2, 1, 0, 0, 0); // U1 L2 M0 6 cm
230 Int_t stsAddress10 = CbmStsAddress::GetAddress(1, 2, 1, 1, 0, 0); // U1 L2 M1 6 cm
231 Int_t stsAddress11 = CbmStsAddress::GetAddress(1, 2, 1, 2, 0, 0); // U1 L2 M2 6 cm
232
233 LOG(info) << "STS address01 " << CbmStsAddress::ToString(stsAddress01);
234 LOG(info) << "STS address02 " << CbmStsAddress::ToString(stsAddress02);
235 LOG(info) << "STS address03 " << CbmStsAddress::ToString(stsAddress03);
236 LOG(info) << "STS address04 " << CbmStsAddress::ToString(stsAddress04);
237 LOG(info) << "STS address05 " << CbmStsAddress::ToString(stsAddress05);
238 LOG(info) << "STS address06 " << CbmStsAddress::ToString(stsAddress06);
239 LOG(info) << "STS address07 " << CbmStsAddress::ToString(stsAddress07);
240 LOG(info) << "STS address08 " << CbmStsAddress::ToString(stsAddress08);
241 LOG(info) << "STS address09 " << CbmStsAddress::ToString(stsAddress09);
242 LOG(info) << "STS address10 " << CbmStsAddress::ToString(stsAddress10);
243 LOG(info) << "STS address11 " << CbmStsAddress::ToString(stsAddress11);
244
245 sensorParSet->SetParSensor(stsAddress01, sensor6cm);
246 sensorParSet->SetParSensor(stsAddress02, sensor6cm);
247 sensorParSet->SetParSensor(stsAddress03, sensor6cm);
248 sensorParSet->SetParSensor(stsAddress04, sensor6cm);
249 sensorParSet->SetParSensor(stsAddress05, sensor6cm);
250 sensorParSet->SetParSensor(stsAddress06, sensor12cm);
251 sensorParSet->SetParSensor(stsAddress07, sensor6cm);
252 sensorParSet->SetParSensor(stsAddress08, sensor12cm);
253 sensorParSet->SetParSensor(stsAddress09, sensor6cm);
254 sensorParSet->SetParSensor(stsAddress10, sensor6cm);
255 sensorParSet->SetParSensor(stsAddress11, sensor6cm);
256 }
257 else if (fConfig.setupType == Setup::mCBM2024_03 || fConfig.setupType == Setup::mCBM2024_05
258 || fConfig.setupType == Setup::mCBM2025_02) {
259 uint32_t addr01 = 0x10008012;
260 uint32_t addr02 = 0x10018012;
261 uint32_t addr03 = 0x10008412;
262 uint32_t addr04 = 0x10018412;
263 uint32_t addr05 = 0x10008422;
264 uint32_t addr06 = 0x10018422;
265 uint32_t addr07 = 0x10008822;
266 uint32_t addr08 = 0x10018822;
267 uint32_t addr09 = 0x10028822;
268 uint32_t addr10 = 0x10008022;
269 uint32_t addr11 = 0x10018022;
270 uint32_t addr00 = 0x10000002; // New station 0 in mCBM2024
271
272 LOG(info) << "STS address01 " << CbmStsAddress::ToString(addr01);
273 LOG(info) << "STS address02 " << CbmStsAddress::ToString(addr02);
274 LOG(info) << "STS address03 " << CbmStsAddress::ToString(addr03);
275 LOG(info) << "STS address04 " << CbmStsAddress::ToString(addr04);
276 LOG(info) << "STS address05 " << CbmStsAddress::ToString(addr05);
277 LOG(info) << "STS address06 " << CbmStsAddress::ToString(addr06);
278 LOG(info) << "STS address07 " << CbmStsAddress::ToString(addr07);
279 LOG(info) << "STS address08 " << CbmStsAddress::ToString(addr08);
280 LOG(info) << "STS address09 " << CbmStsAddress::ToString(addr09);
281 LOG(info) << "STS address10 " << CbmStsAddress::ToString(addr10);
282 LOG(info) << "STS address11 " << CbmStsAddress::ToString(addr11);
283 LOG(info) << "STS address00 " << CbmStsAddress::ToString(addr00);
284
285 sensorParSet->SetParSensor(addr01, sensor6cm);
286 sensorParSet->SetParSensor(addr02, sensor6cm);
287 sensorParSet->SetParSensor(addr03, sensor6cm);
288 sensorParSet->SetParSensor(addr04, sensor6cm);
289 sensorParSet->SetParSensor(addr05, sensor6cm);
290 sensorParSet->SetParSensor(addr06, sensor12cm);
291 sensorParSet->SetParSensor(addr07, sensor6cm);
292 sensorParSet->SetParSensor(addr08, sensor6cm);
293 sensorParSet->SetParSensor(addr09, sensor6cm);
294 sensorParSet->SetParSensor(addr10, sensor6cm);
295 sensorParSet->SetParSensor(addr11, sensor12cm);
296 sensorParSet->SetParSensor(addr00, sensor6cm);
297 }
298 else {
299 throw std::runtime_error("STS: Unknown setup type");
300 }
301
302 recoSts->UseSensorParSet(sensorParSet);
303
304 // ASIC params: #ADC channels, dyn. range, threshold, time resol., dead time,
305 // noise RMS, zero-threshold crossing rate
306 auto parAsic = new CbmStsParAsic(128, 31, 75000., 3000., 5., 800., 1000., 3.9789e-3);
307
308 // Module params: number of channels, number of channels per ASIC
309 auto parMod = new CbmStsParModule(2048, 128);
310 parMod->SetAllAsics(*parAsic);
311 recoSts->UseModulePar(parMod);
312
313 // Sensor conditions: full depletion voltage, bias voltage, temperature,
314 // coupling capacitance, inter-strip capacitance
315 auto sensorCond = new CbmStsParSensorCond(70., 140., 268., 17.5, 1.);
316 recoSts->UseSensorCond(sensorCond);
317
318 fRun->AddTask(recoSts);
319}
320
322{
323
324 auto* pSetupBuilder{cbm::kf::TrackingSetupBuilder::Instance()};
325 pSetupBuilder->SetIgnoreHitPresence();
326
327 // Tracking detector interfaces initialization
329
330 // Tracking initialization class
331 auto* pCa = new CbmL1();
332 pCa->SetMcbmMode();
333 pCa->SetInitMode(CbmL1::EInitMode::Param);
334 pCa->SetParameterFilename(Form("./%s.ca.par", fGeoSetupTag.Data()));
335 fRun->AddTask(pCa);
336}
337
338
340{
341 // Copied and adjusted from macro/beamtime/mcbm2022/trd_hitfinder_run.C
342
343 static bool callOnce = true;
344 if (!callOnce) {
345 throw std::runtime_error("CbmOnlineParWrite::Run() can only be called once at the moment!");
346 }
347 callOnce = false;
348
349 fConfig = config;
350
351 // ----- Environment --------------------------------------------------
352 fSrcDir = gSystem->Getenv("VMCWORKDIR"); // top source directory
353 // ------------------------------------------------------------------------
354
355 // ----- In- and output file names ------------------------------------
356
357 // --- Load the geometry setup ----
358 TString geoSetupTag = "";
359 try {
360 uint64_t runId = -1;
361 switch (fConfig.setupType) {
362 case Setup::mCBM2022: runId = 2391; break;
363 case Setup::mCBM2024_03: runId = 2724; break;
364 case Setup::mCBM2024_05: runId = 2918; break;
365 case Setup::mCBM2025_02: runId = 3453; break;
366 default: throw std::runtime_error("Unknown setup type");
367 }
368 geoSetupTag = cbm::mcbm::GetSetupFromRunId(runId);
369 }
370 catch (const std::invalid_argument& e) {
371 std::cout << "Error in mapping from runID to setup name: " << e.what() << std::endl;
372 return;
373 }
374
375 LOG(info) << "Using geometry setup: " << geoSetupTag;
376 fGeoSetupTag = geoSetupTag;
377
378 TString geoFile = fSrcDir + "/macro/run/data/" + geoSetupTag + ".geo.root";
380 fSetup->LoadSetup(geoSetupTag);
381
382 //----- Load Parameters --------------------------------------------------
383 fParList = new TList();
384
385 // ----- FairRunAna ---------------------------------------------------
386 fRun = new FairRunAna();
387
388 // Dummy source required for the FairRunAna as it will crash without a source
389 fRun->SetSource(new CbmSourceDummy{});
390 fRun->SetSink(new CbmSinkDummy{});
391
392
393 // =========================================================================
394 // === Alignment Correction ===
395 // =========================================================================
396 if (fConfig.doAlignment) {
397
398 TString alignmentMatrixFileName = fSrcDir + "/parameters/mcbm/AlignmentMatrices_" + geoSetupTag + ".root";
399 if (alignmentMatrixFileName.Length() == 0) {
400 throw std::runtime_error{"Alignment matrix file name is empty"};
401 }
402
403 LOG(info) << "Applying alignment for file '" << alignmentMatrixFileName << "'";
404
405 // Define the basic structure which needs to be filled with information
406 // This structure is stored in the output file and later passed to the
407 // FairRoot framework to do the (miss)alignment
408 std::map<std::string, TGeoHMatrix>* matrices{nullptr};
409
410 // read matrices from disk
411 LOG(info) << "Filename: " << alignmentMatrixFileName;
412 TFile* misalignmentMatrixRootfile = new TFile(alignmentMatrixFileName, "READ");
413 if (misalignmentMatrixRootfile->IsOpen()) {
414 gDirectory->GetObject("MisalignMatrices", matrices);
415 misalignmentMatrixRootfile->Close();
416 }
417 else {
418 throw std::runtime_error{"Could not open alignment matrix file: " + alignmentMatrixFileName};
419 }
420
421 if (matrices) {
422 fRun->AddAlignmentMatrices(*matrices);
423 }
424 else {
425 throw std::runtime_error{"Could not read alignment matrices from file: " + alignmentMatrixFileName};
426 }
427 }
428
429
430 // ----- Add detectors ------------------------------------------------
431 AddDetectors();
432 AddCa();
433
434 // ----- Parameter database --------------------------------------------
435 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
436 FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
437 parIo2->setAutoWritable(false);
438 parIo2->open(fParList, "in");
439 rtdb->setSecondInput(parIo2);
440 // ------------------------------------------------------------------------
441
442 // ----- Run initialisation -------------------------------------------
443 fRun->SetGeomFile(geoFile);
444 fRun->Init();
445
446 // No need to run the event loop, parameters are written during the initialization
447
448
449 // ----- Clean up ---------------------------------------------------------
450 gGeoManager->GetListOfVolumes()->Delete();
451 gGeoManager->GetListOfShapes()->Delete();
452 delete gGeoManager;
453
454 // Delete files created by FairRun that I don't know how disable otherwise
455 gSystem->Exec("rm all_*.par");
456}
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kTrd2d
TRD-FASP Detector (FIXME)
This file contains the declaration of the CbmOnlineParWrite class.
Dummy input source.
int Int_t
Definition CbmL1.h:109
@ Param
Parameter initialization (when algorithm execution is not required)
void Run(const Config &config)
void SetActive(ECbmModuleId moduleId, Bool_t active=kTRUE)
Definition CbmSetup.cxx:185
Bool_t IsActive(ECbmModuleId moduleId)
Definition CbmSetup.cxx:169
Bool_t GetGeoTag(ECbmModuleId moduleId, TString &tag)
Definition CbmSetup.cxx:127
static CbmSetup * Instance()
Definition CbmSetup.cxx:160
void LoadSetup(const char *setupName)
Definition CbmSetup.h:64
A dummy sink class, which is to be passed to a FairRunAna, if no output is required.
Dummy input FAIR source. Doesn't create any branches or data.
Parameters of the STS readout ASIC.
Parameters for one STS module.
Parameters for operating conditions of a STS sensor.
Constructional parameters of a STS sensor.
void SetPar(UInt_t index, Float_t value)
Set a parameter.
Parameters container for CbmStsParSensor.
Describe TRD module ASIC settings (electronic gain, delays, etc)
static TrackingSetupBuilder * Instance()
Instance access.
int32_t GetAddress(uint32_t unit=0, uint32_t ladder=0, uint32_t halfladder=0, uint32_t module=0, uint32_t sensor=0, uint32_t side=0, uint32_t version=kCurrentVersion)
Construct address.
std::string ToString(int32_t address)
String output.
std::string GetSetupFromRunId(uint64_t ulRunId)