BmnRoot 26.10.0-210-gc52d34b0
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
rc_rlerr.C
Go to the documentation of this file.
1// Macro for reconstruction of simulated and experimental BM@N events
2//
3// inFileName - input file with data (MC or exp. data)
4// dstFileName - output file with reconstructed data (full DST format)
5// nStartEvent - number of first event to process (starts with zero), default: 0
6// nEvents - number of events to process after nStartEvent, 0 - all events of the given file after nStartEvent to
7// geometryTag - geometry tag for experimental data, "" means the latest geometry for BM@N Run (by creation date)
8// tracking - tracking algorithm: VectorFinder (default), L1Tracking (for online), CellAuto
9
10R__ADD_INCLUDE_PATH($VMCWORKDIR);
18
19void rc_rlerr(TString inFileName,
20 TString dstFileName,
21 Int_t nStartEvent = 0,
22 Int_t nEvents = 0,
23 TString geometryTag = "",
24 enumTracking tracking = VectorFinder)
25{
26 gDebug = 0; // ROOT debug option
27 // if (gEnv) gEnv->SetValue("Root.Stacktrace", 0);
28 // Verbosity level (0 = summary only, 1 = event-level, 2 = track-level, 3 = full debug)
29 Int_t iVerbose = 0;
30 // Log level for LOG(severity): "fatal", "error", "alarm", "important", "warn", "state", "info", "detail", "debug",
31 // "debug[1-4]", "trace", "nolog"
32 FairLogger::GetLogger()->SetLogScreenLevel("info");
33 gRandom->SetSeed(0); // set seed for PRNG
34
35 // ----- Timer ---------------------------------------------------------
36 TStopwatch timer;
37 timer.Start();
38
39 // check input file exists
40 if (!BmnFunctionSet::CheckFileExist(inFileName, 1))
41 exit(-1);
42
43 // ----- Reconstruction run --------------------------------------------
44 FairRunAna* fRunAna = new FairRunAna();
45 fRunAna->SetEventHeader(new DstEventHeader());
46
47 Bool_t isTarget = kTRUE; // flag for tracking (run with target or not)
48 Bool_t isExp = (BmnFunctionSet::isSimulationFile(inFileName)
49 == 0); // flag for FairRunAna tasks whether simulation or experimental data are used
50
51 // Declare input source as simulation file or experimental data
52 FairSource* fFileSource;
53 Int_t run_period = -1, run_number = -1;
54 if (!isExp) { // for simulation files
55 fFileSource = new FairFileSource(inFileName);
56 // define BM@N session number using MC file metaobjects
57 run_period = BmnFunctionSet::GetPeriodNumber(((FairFileSource*)fFileSource)->GetInFile());
58 } else // for experimental files
59 {
60 // set source - digit file without auxilary FairRoot directories
61 // returns real run_period and run_number from the source file
62 fFileSource = new BmnFileSource(inFileName, run_period, run_number);
63
64 // get geometry for run
65 GeoSetup gSetup;
66 if (geometryTag.Strip(TString::kBoth) == "")
67 geometryTag = gSetup.GetLastApprovedSetupTag(TString::Format("run%d", run_period)).c_str();
68 int errStatus = gSetup.LoadSetupToGeoManager(geometryTag.Data());
69 if (errStatus != 0)
70 LOG(fatal) << "Geometry '" << geometryTag << "' not loaded. Error status: " << errStatus << endl;
71 LOG(info) << "Geometry with '" << geometryTag << "' tag is chosen";
72
73 // set magnetic field with factor corresponding to the given run
74 UniRun* pCurrentRun = UniRun::GetRun(run_period, run_number, usePreviousIfMissing);
75 if (pCurrentRun == 0)
76 exit(-6);
77 Double_t field_voltage = 0;
78 if (pCurrentRun->GetFieldVoltage())
79 field_voltage = *pCurrentRun->GetFieldVoltage();
80 else {
81 if (usePreviousIfMissing) // get value from a previous run with non-null value
82 {
83 int prev_mag_period = run_period, prev_mag_run = run_number;
84 field_voltage = UniRun::FindPreviousFieldVoltage(prev_mag_period, prev_mag_run);
85 if ((field_voltage == 0) and (prev_mag_run == run_number) and (prev_mag_period == run_period))
86 LOG(fatal) << "no any field voltage was found for run " << run_period << ":" << run_number << endl;
87 } else
88 LOG(fatal) << "no field voltage was found for run " << run_period << ":" << run_number << endl;
89 }
90 Double_t map_voltage = (run_period < 8) ? 55.87 : 112.0;
91 Double_t fieldScale = 0.;
92 if (field_voltage < 10) {
93 fieldScale = 0;
94 } else
95 fieldScale = (field_voltage) / map_voltage;
96 BmnFieldMap* magField = nullptr;
97 /*
98 Polev I.: GetMagneticField interprets zero value of fieldScale
99 as a request for the default field map and field scale,
100 not as absence of field. This causes a wrong value of filed
101 for the alignment runs.
102 Temporary fix: for the alignment runs init BmnNewFieldMap with
103 local values without requesting database.
104 */
105 // magField = dynamic_cast<BmnFieldMap*>(gSetup.GetMagneticField(fieldScale));
106 magField = new BmnNewFieldMap("FieldMap_1900_extrap_noPed.root");
107 magField->SetScale(fieldScale);
108 magField->Init();
109 fRunAna->SetField(magField);
110 isExp = kTRUE;
111 TString targ = "-";
112 if (pCurrentRun->GetTargetParticle() == "") {
113 isTarget = kFALSE;
114 } else {
115 targ = pCurrentRun->GetTargetParticle();
116 isTarget = kTRUE;
117 }
118 TString beam = pCurrentRun->GetBeamParticle();
119 if (beam == "")
120 beam = "-";
121 cout << "\n\n|||||||||||||||| EXPERIMENTAL RUN SUMMARY ||||||||||||||||" << endl;
122 cout << "||\t\t\t\t\t\t\t||" << endl;
123 cout << "||\t\tPeriod:\t\t" << run_period << "\t\t\t||" << endl;
124 cout << "||\t\tNumber:\t\t" << run_number << "\t\t\t||" << endl;
125 cout << "||\t\tBeam:\t\t" << beam << "\t\t\t||" << endl;
126 cout << "||\t\tTarget:\t\t" << targ << "\t\t\t||" << endl;
127 cout << "||\t\tField scale:\t" << setprecision(4) << fieldScale << "\t\t\t||" << endl;
128 cout << "||\t\t\t\t\t\t\t||" << endl;
129 cout << "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n\n" << endl;
130 // remove(geoFileName.Data());
131 }
132
133 fRunAna->SetSource(fFileSource);
134
135 if (dstFileName == "")
136 dstFileName = "bmndst.root";
137 // if directory for the output file does not exist, then create
138 if (BmnFunctionSet::CreateDirectoryTree(dstFileName, 1) < 0)
139 exit(-2);
140 fRunAna->SetSink(new FairRootFileSink(dstFileName));
141 fRunAna->SetGenerateRunInfo(false);
142
143 // if nEvents is equal 0 then all events of the given file starting with "nStartEvent" should be processed
144 if (nEvents == 0)
145 nEvents = MpdGetNumEvents::GetNumROOTEvents((char*)inFileName.Data()) - nStartEvent;
146
147 // Add TObjectString file names to a TList which is passed as input to the FairParAsciiFileIo
148 // The FairParAsciiFileIo creates a concatenated input parameter file all_<pid>.par, which is then can be used
149 // TList* parFileNameList = new TList();
150
151 // ====================================================================== //
152 // === Pileup Event Classification === //
153 // ====================================================================== //
154 if (run_period == 8 && isExp) {
155 BmnEventSelector* eventSelector = new BmnEventSelector();
156 eventSelector->SetRunId(run_number);
157 eventSelector->SetInputFileName("$VMCWORKDIR/input/eventSelector_calib_run8.root");
158 fRunAna->AddTask(eventSelector);
159 }
160
161 // ====================================================================== //
162 // === Fill basic trigger information === //
163 // ====================================================================== //
164 BmnFillTrigInfoDst* trig = new BmnFillTrigInfoDst(isExp);
165 fRunAna->AddTask(trig);
166
167 // ====================================================================== //
168 // === Hits in front of the target === //
169 // ====================================================================== //
170 if (run_period >= 8) {
171 if (isExp) {
172 BmnSiBTHitMaker* sibtHM = new BmnSiBTHitMaker(run_period, run_number, isExp);
173 fRunAna->AddTask(sibtHM);
174 }
175 } else {
176 if (!isExp) {
178 fRunAna->AddTask(mwpcHP);
179 }
180 BmnMwpcHitFinder* mwpcHM = new BmnMwpcHitFinder(isExp, run_period, run_number);
181 fRunAna->AddTask(mwpcHM);
182 }
183
184 // ====================================================================== //
185 // === VSP hit finder === //
186 // ====================================================================== //
187 BmnVSPHitMaker* vspHM = new BmnVSPHitMaker(run_period, run_number, isExp);
188 if (isExp)
189 vspHM->SetHitMatching(kFALSE);
190 fRunAna->AddTask(vspHM);
191
192 // ====================================================================== //
193 // === Silicon hit finder === //
194 // ====================================================================== //
195 BmnSiliconHitMaker* siliconHM = new BmnSiliconHitMaker(run_period, run_number, isExp);
196 if (isExp)
197 siliconHM->SetHitMatching(kFALSE);
198 fRunAna->AddTask(siliconHM);
199
200 // ====================================================================== //
201 // === GEM hit finder === //
202 // ====================================================================== //
203 BmnGemStripHitMaker* gemHM = new BmnGemStripHitMaker(run_period, run_number, isExp);
204 if (isExp)
205 gemHM->SetHitMatching(kFALSE);
206 fRunAna->AddTask(gemHM);
207
208 // ====================================================================== //
209 // === CSC hit finder === //
210 // ====================================================================== //
211 BmnCSCHitMaker* cscHM = new BmnCSCHitMaker(run_period, run_number, isExp);
212 if (isExp)
213 cscHM->SetHitMatching(kFALSE);
214 fRunAna->AddTask(cscHM);
215
216 // ====================================================================== //
217 // === TOF400 hit finder === //
218 // ====================================================================== //
219 BmnTof1HitProducer* tof400HP = new BmnTof1HitProducer("TOF400", kTOF1, !isExp, iVerbose, kFALSE);
220 tof400HP->SetPeriodRun(run_period, run_number);
221 fRunAna->AddTask(tof400HP);
222
223 // ====================================================================== //
224 // === TOF700 hit finder === //
225 // ====================================================================== //
226 BmnTof1HitProducer* tof700HP = new BmnTof1HitProducer("TOF700", kTOF701, !isExp, iVerbose, kFALSE);
227 tof700HP->SetPeriodRun(run_period, run_number);
228 fRunAna->AddTask(tof700HP);
229
230 // ====================================================================== //
231 // === DCH hit finder === //
232 // ====================================================================== //
233 // if (!isExp) {
234 // BmnDchHitProducer* dchHP = new BmnDchHitProducer();
235 // fRunAna->AddTask(dchHP);
236 // }
237
238 // ====================================================================== //
239 // === FHCAL/ZDC === //
240 // ====================================================================== //
241 bool IsGlobalCoordinates = true;
242 if (run_period >= 8) {
243 // TODO check isExp
244 BmnFHCalReconstructor* fhcalReco = new BmnFHCalReconstructor(isExp, IsGlobalCoordinates);
245 fhcalReco->SetRecoCutsFile(Form("FHCAL_reco_cuts_period%d.txt", run_period));
246 fRunAna->AddTask(fhcalReco);
247 } else {
248 BmnZdcAnalyzer* zdcAna = new BmnZdcAnalyzer();
249 fRunAna->AddTask(zdcAna);
250 }
251
252 // ====================================================================== //
253 // === ScWall === //
254 // ====================================================================== //
255 IsGlobalCoordinates = true;
256 BmnScWallReconstructor* scwallReco = new BmnScWallReconstructor(isExp, IsGlobalCoordinates);
257 scwallReco->SetRecoCutsFile(Form("SCWALL_reco_cuts_period%d.txt", run_period));
258 fRunAna->AddTask(scwallReco);
259
260 // ====================================================================== //
261 // === Hodo === //
262 // ====================================================================== //
263
264 BmnHodoReconstructor* hodoReco = new BmnHodoReconstructor(isExp);
265 hodoReco->SetRecoCutsFile(Form("HODO_reco_cuts_period%d.json", run_period));
266 fRunAna->AddTask(hodoReco);
267
268 // ====================================================================== //
269 // === Ndet === //
270 // ====================================================================== //
271 IsGlobalCoordinates = true;
272 BmnNdetReconstructor* ndetReco = new BmnNdetReconstructor(isExp, IsGlobalCoordinates);
273 ndetReco->SetRecoCutsFile(Form("NDET_reco_cuts_period%d.txt", run_period));
274 fRunAna->AddTask(ndetReco);
275
276 // ====================================================================== //
277 // === Vacuum Wall === //
278 // ====================================================================== //
279
281 fRunAna->AddTask(vacReco);
282
283 // ====================================================================== //
284 // === Inner Tracking === //
285 // ====================================================================== //
286 if (run_period > 8)
287 CbmStsDigiScheme::Instance(9); // AZ-310126
288
289 TString innerTrackBranchName; // use different track container
290 if (tracking == L1Tracking)
291 innerTrackBranchName = "StsTrack";
292 else
293 innerTrackBranchName = "StsVector";
294 if (run_period >= 8) {
295 BmnToCbmHitConverter* hitConverter = new BmnToCbmHitConverter(iVerbose, isExp);
296 // AZ-150224 hitConverter->SetFixedErrors(0.05, 0.25, 0.02, 0.65);
297 // hitConverter->SetFixedErrors(0.08 / sqrt(12) * 1.2, 0.1234, 0.01 / sqrt(12), 0.1234); // AZ-150224
298 hitConverter->EnableAlignment(kFALSE); // AZ-310126
299 // AZ-310126
300 if (run_period > 8) {
301 hitConverter->SetGemConfigFile("GemRun9.xml");
302 hitConverter->SetSilConfigFile("SiliconRun9.xml");
303 hitConverter->SetVspConfigFile("VSP_Run9.xml");
304 }
305 //
306 fRunAna->AddTask(hitConverter);
307
308 CbmKF* kalman = new CbmKF();
309 fRunAna->AddTask(kalman);
310
311 CbmL1* l1 = new CbmL1();
312 TString stsMatBudgetFile = "";
313 l1->SetMaterialBudgetFileName(stsMatBudgetFile);
314 // AZ-310126 fRunAna->AddTask(l1);
315
316 if (tracking == L1Tracking) {
317 FairTask* stsFindTracks = new CbmStsFindTracks(iVerbose, "CbmL1StsTrackFinder");
318 fRunAna->AddTask(stsFindTracks);
319 }
320 if (tracking == VectorFinder) {
321 // BmnStsVectorFinder* vf = new BmnStsVectorFinder();
323 vf->SetMatBudgetFileName("$VMCWORKDIR/parameters/reco/sts_matbudget_run8.root");
324 if (run_period > 8) {
325 vf->SetNofSiStations(5); // AZ-310126 - 4Si+VSP
326 }
327 fRunAna->AddTask(vf);
328 }
329
330 BmnStsMatchTracks* stsMatchTracks = new BmnStsMatchTracks(iVerbose);
331 stsMatchTracks->SetTrackBranch(innerTrackBranchName);
332 fRunAna->AddTask(stsMatchTracks);
333 }
334
335 // ====================================================================== //
336 // === Beam Tracking === //
337 // ====================================================================== //
338 if (run_period >= 8) {
339 if (isExp) {
340 BmnBeamTracking* beamTF = new BmnBeamTracking(run_period);
341 fRunAna->AddTask(beamTF);
342 }
343 } else {
344 BmnMwpcTrackFinder* mwpcTF = new BmnMwpcTrackFinder(isExp, run_period, run_number);
345 fRunAna->AddTask(mwpcTF);
346 }
347
348 // ====================================================================== //
349 // === Tracking (DCH) === //
350 // ====================================================================== //
351 // BmnDchTrackFinder* dchTF = new BmnDchTrackFinder(run_period, run_number, isExp);
352 // dchTF->SetTransferFunction("transfer_func.txt");
353 // fRunAna->AddTask(dchTF);
354
355 // ====================================================================== //
356 // === Primary vertex finding === //
357 // ====================================================================== //
358 // if (run_period >= 8) {
359 CbmPrimaryVertexFinder* pvFinder = new CbmPVFinderKF();
360 CbmFindPrimaryVertex* findVertex = new CbmFindPrimaryVertex(pvFinder);
361 findVertex->SetTrackBranch(innerTrackBranchName);
362 fRunAna->AddTask(findVertex);
363
364 // AZ-150224
366 fRunAna->AddTask(pvMPD);
367
369 fRunAna->AddTask(combPV);
370 //
371 // // } else {
372 // BmnVertexFinder* gemVF = new BmnVertexFinder(run_period);
373 // fRunAna->AddTask(gemVF);
374 //}
375
376 // ====================================================================== //
377 // === Global Tracking === //
378 // ====================================================================== //
379 Bool_t doAlign = kTRUE;
380 if (!isExp)
381 doAlign = kFALSE;
382 BmnGlobalTracking* glTF = new BmnGlobalTracking(isExp, kFALSE /*doAlign*/);
383 glTF->SetRunNumber(run_number);
384 glTF->SetInnerTracksBranchName(innerTrackBranchName);
385 fRunAna->AddTask(glTF);
386
387 // BmnVertexFinder* gemVF = new BmnVertexFinder(run_period);
388 // fRunAna->AddTask(gemVF);
389
390 // ====================================================================== //
391 // === Matching global track to MC track procedure === //
392 // ====================================================================== //
393 if (!isExp) {
394 BmnMatchRecoToMC* mcMatching = new BmnMatchRecoToMC();
395 mcMatching->SetInnerTracksBranchName(innerTrackBranchName);
396 fRunAna->AddTask(mcMatching);
397 }
398
399 // ====================================================================== //
400 // === dE/dx procedure === //
401 // ====================================================================== //
402 // only for Run 8: station/sector numbers are hardcoded in BmnDedx for the Run 8 setup,
403 // BmnDedx.cxx:30-31: fNSt(11) и fNSect({6, 10, 14, 18, 8, 8, 8, 8, 8, 8, 8}) only for Run8 (4 Si + 7 GEM)
404 // so, for Run 9 setup with VSP added, the indexes of the stations goes out of the array bounds
405 if (run_period == 8) {
406 BmnDedx* dedx = new BmnDedx(run_number);
407 fRunAna->AddTask(dedx);
408 }
409
410 // ====================================================================== //
411 // === Residual analysis === //
412 // ====================================================================== //
413 if (run_period < 8) {
414 BmnResiduals* res = new BmnResiduals(run_period, run_number);
415 fRunAna->AddTask(res);
416 }
417
418 // ====================================================================== //
419 // === Centrality === //
420 // ====================================================================== //
421 CentralityClusterizer* cclusterizer = new CentralityClusterizer("XeCsI@3.8AGeV_MBT_7clusters_period8.root");
422 fRunAna->AddTask(cclusterizer);
423
424 // Fill DST Event Header
425 BmnFillDstTask* dst_task = new BmnFillDstTask(nStartEvent, nEvents, isExp, run_period, run_number);
426 fRunAna->AddTask(dst_task);
427
428 // ----- Parameter database (input) -------------------------------------
429 FairRuntimeDb* rtdb = fRunAna->GetRuntimeDb();
430 FairParRootFileIo* parIo1 = new FairParRootFileIo();
431 // FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
432 parIo1->open(inFileName.Data());
433 // parIo2->open(parFileNameList, "in");
434 rtdb->setFirstInput(parIo1);
435 // rtdb->setSecondInput(parIo2);
436 // -------------------------------------------------------------------------
437
438 // ----- Initialize FaiRunAna --------------------------------------------
439 fRunAna->GetMainTask()->SetVerbose(iVerbose);
440 fRunAna->Init();
441 // -------------------------------------------------------------------------
442
443 // ----- Parameter database (output) ------------------------------------
444 FairParRootFileIo* parOut = new FairParRootFileIo(kTRUE);
445 // parOut->open(dstFileName);
446 parOut->open(gFile);
447 rtdb->setOutput(parOut);
448 if (isExp)
449 rtdb->getContainer("FairGeoParSet")->setDescription(geometryTag.Data());
450 rtdb->writeContainer(rtdb->getContainer("FairGeoParSet"), rtdb->getCurrentRun());
451 rtdb->saveOutput();
452 // rtdb->print();
453 // -------------------------------------------------------------------------
454
455 // ----- Run FairRunAna -------------------------------------------------
456 fRunAna->Run(nStartEvent, nStartEvent + nEvents);
457 // -------------------------------------------------------------------------
458
459 // ----- Finish --------------------------------------------------------
460 delete fRunAna;
461 delete pvFinder;
462 timer.Stop();
463 Double_t rtime = timer.RealTime();
464 Double_t ctime = timer.CpuTime();
465 cout << endl << endl;
466 cout << "Macro finished successfully." << endl; // marker of successful execution
467 cout << "Input file is " + inFileName << endl;
468 cout << "Output file is " + dstFileName << endl;
469 cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
470 cout << endl;
471 // ------------------------------------------------------------------------
472}
@ kTOF1
@ kTOF701
bool Bool_t
int Int_t
Int_t gDebug
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
#define R__ADD_INCLUDE_PATH(PATH)
#define gFile
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
void SetHitMatching(Bool_t opt=kTRUE)
void SetInputFileName(const char *name)
void SetRunId(int runId)
Class for BmnFHCalEvent reconstruction (creation) from BmnFHCalDigi {Data} or BmnFHCalDigit {Sim}...
void SetRecoCutsFile(TString reco_cuts_file)
void SetScale(Double_t factor)
Set a global field scaling factor.
Definition BmnFieldMap.h:55
virtual void Init()
BmnFileSource.h.
static int CreateDirectoryTree(TString &fileName, int iVerbose=0, EAccessMode mode=kWritePermission)
static int isSimulationFile(TString fileName="")
static int GetPeriodNumber(TFile *root_file, int method_number=0)
static int CheckFileExist(TString &fileName, int iVerbose=0, EAccessMode mode=kFileExists)
void SetHitMatching(Bool_t opt=kTRUE)
void SetInnerTracksBranchName(TString name)
Class for BmnHodoEvent reconstruction (creation) from BmnHodoDigi {Data} or BmnHodoDigit {Sim}...
void SetRecoCutsFile(const std::string &cuts)
The BmnKFPrimaryVertexFinder class - adaptation of MpdKfPrimaryVertexFinder.
void SetInnerTracksBranchName(TString name)
Class for BmnNdetEvent reconstruction (creation) from BmnNdetDigi {Data} or BmnNdetDigit {Sim}...
void SetRecoCutsFile(const std::string &cuts)
Field Map does not have any symmetries w.r.t coordinate axises.
Class for BmnScWallEvent reconstruction (creation) from BmnScWallDigi {Data} or BmnScWallDigit {Sim}...
void SetRecoCutsFile(TString reco_cuts_file)
void SetHitMatching(Bool_t opt=kTRUE)
void SetTrackBranch(TString trBranch="StsTrack")
void SetMatBudgetFileName(TString s)
void EnableAlignment(Bool_t is_align_enabled=kTRUE)
void SetGemConfigFile(TString file)
void SetVspConfigFile(TString file)
void SetSilConfigFile(TString file)
void SetPeriodRun(Int_t p, Int_t r)
void SetHitMatching(Bool_t opt=kTRUE)
Class for BmnVacWall points info transition on reconstruction stage.
void SetTrackBranch(TString trBranch="StsTrack")
The CbmKF Kalman Filter algorithm.
Definition CbmKF.h:28
Definition CbmL1.h:48
void SetMaterialBudgetFileName(TString s)
Definition CbmL1.h:86
CbmPVFinderKF.
static CbmStsDigiScheme * Instance(int version=1)
CbmStsFindTracks.
Class for event centrality determination through clusterization.
GeoSetup class.
Definition GeoSetup.h:40
int LoadSetupToGeoManager(string_view setup_tag)
Load selected geometry setup from the Local Geometry Database and create gGeoManager instance.
Definition GeoSetup.cxx:512
string GetLastApprovedSetupTag(string_view tag_prefix)
Get tag for the last approved setup corresponding to the pattern.
Definition GeoSetup.cxx:122
static Int_t GetNumROOTEvents(const char *filename, const char *treename="", int iVerbose=2)
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
Double_t CpuTime()
void Stop()
const char * Data() const
static TString Format(const char *fmt,...)
UniRun.h Class for the table: run_.
Definition UniRun.h:21
static UniRun * GetRun(int period_number, int run_number)
get run from the database
Definition UniRun.cxx:161
TString GetBeamParticle()
get beam particle of the current run
Definition UniRun.h:109
double * GetFieldVoltage()
get field voltage of the current run
Definition UniRun.h:121
static double FindPreviousFieldVoltage(int &period_number, int &run_number)
get field voltage value if period_number > 0 and run_number > 0: from the closest previous run,...
Definition UniRun.cxx:908
TString GetTargetParticle()
get target particle of the current run
Definition UniRun.h:111
enumTracking
@ L1Tracking
@ VectorFinder
bool usePreviousIfMissing
Definition rc_rlerr.C:11
void rc_rlerr(TString inFileName, TString dstFileName, Int_t nStartEvent=0, Int_t nEvents=0, TString geometryTag="", enumTracking tracking=VectorFinder)
Definition rc_rlerr.C:19