BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
run_reco_bmn.C
Go to the documentation of this file.
1/*
2 * Modified version to test alignment algorithms efficiency.
3 * All modifications are marked by comments with "PLV" tag.
4 * Author: Polev I.Yu., polev@jinr.ru
5 * Date: February 2026
6 */
7
8// Macro for reconstruction of simulated and experimental BM@N events
9//
10// inFileName - input file with data (MC or exp. data)
11// dstFileName - output file with reconstructed data (full DST format)
12// nStartEvent - number of first event to process (starts with zero), default: 0
13// nEvents - number of events to process after nStartEvent, 0 - all events of the given file after nStartEvent to
14// tracking - tracking algorithm: VectorFinder (default), L1Tracking (for online), CellAuto
15// #define USE_GEODB
16R__ADD_INCLUDE_PATH($VMCWORKDIR);
24
25void run_reco_bmn(TString inFileName = "$VMCWORKDIR/macro/run/bmnsim.root",
26 TString dstFileName = "$VMCWORKDIR/macro/run/bmndst.root",
27 Int_t nStartEvent = 0,
28 Int_t nEvents = 0,
29 enumTracking tracking = VectorFinder)
30{
31 gDebug = 0; // ROOT debug option
32 // if (gEnv) gEnv->SetValue("Root.Stacktrace", 0);
33 // Verbosity level (0 = summary only, 1 = event-level, 2 = track-level, 3 = full debug)
34 Int_t iVerbose = 0;
35 // Log level for LOG(severity): "fatal", "error", "alarm", "important", "warn", "state", "info", "detail", "debug",
36 // "debug[1-4]", "trace", "nolog"
37 FairLogger::GetLogger()->SetLogScreenLevel("info");
38 gRandom->SetSeed(0); // set seed for PRNG
39
40 // ----- Timer ---------------------------------------------------------
41 TStopwatch timer;
42 timer.Start();
43
44 // check input file exists
45 if (!BmnFunctionSet::CheckFileExist(inFileName, 1))
46 exit(-1);
47
48 // ----- Reconstruction run --------------------------------------------
49 FairRunAna* fRunAna = new FairRunAna();
50 fRunAna->SetEventHeader(new DstEventHeader());
51
52 Bool_t isTarget = kTRUE; // flag for tracking (run with target or not)
53 Bool_t isExp = (BmnFunctionSet::isSimulationFile(inFileName)
54 == 0); // flag for FairRunAna tasks whether simulation or experimental data are used
55
56 // Declare input source as simulation file or experimental data
57 FairSource* fFileSource;
58
59 // -1 means use of the BM@N-setup when processing MC-input
60 // DO NOT change it manually!
61 Int_t run_period = 9, run_number = -1;
62 Double_t fieldScale = 0.;
63 if (!isExp) // for simulation files
64 fFileSource = new FairFileSource(inFileName);
65 else // for experimental files
66 {
67 // set source - digit file without auxilary FairRoot directories
68 // returns real run_period and run_number from the source file
69 fFileSource = new BmnFileSource(inFileName, run_period, run_number);
70
71 // get geometry for run from the Geometry Database
72 GeoSetup gSetup;
73 int errStatus = gSetup.LoadSetupToGeoManager("run9_26.01.0");
74 if (errStatus != 0) {
75 cout << "ERROR: Geometry not loaded. Error status " << errStatus << endl;
76 exit(-1);
77 }
78 // set magnetic field with factor corresponding to the given run
79 UniRun* pCurrentRun = UniRun::GetRun(run_period, run_number, usePreviousIfMissing);
80 if (pCurrentRun == 0)
81 exit(-6);
82 Double_t field_voltage = 0;
83 if (pCurrentRun->GetFieldVoltage())
84 field_voltage = *pCurrentRun->GetFieldVoltage();
85 else {
86 if (usePreviousIfMissing) // get value from a previous run with non-null value
87 {
88 int prev_mag_period = run_period, prev_mag_run = run_number;
89 field_voltage = UniRun::FindPreviousFieldVoltage(prev_mag_period, prev_mag_run);
90 if ((field_voltage == 0) and (prev_mag_run == run_number) and (prev_mag_period == run_period)) {
91 cout << "ERROR: no any field voltage was found for run " << run_period << ":" << run_number << endl;
92 exit(-8);
93 }
94 } else {
95 cout << "ERROR: no field voltage was found for run " << run_period << ":" << run_number << endl;
96 exit(-7);
97 }
98 }
99 Double_t map_voltage = (run_period < 8) ? 55.87 : 112.0;
100 if (field_voltage < 10) {
101 fieldScale = 0;
102 } else
103 fieldScale = (field_voltage) / map_voltage;
104 BmnFieldMap* magField = nullptr;
105#ifdef USE_GEODB
106 magField = dynamic_cast<BmnFieldMap*>(gSetup.GetMagneticField(fieldScale));
107#else
108 magField = new BmnNewFieldMap("FieldMap_1900_extrap_noPed.root");
109 magField->SetScale(fieldScale);
110#endif
111 magField->Init();
112 fRunAna->SetField(magField);
113 isExp = kTRUE;
114 TString targ = "-";
115 if (pCurrentRun->GetTargetParticle() == "") {
116 isTarget = kFALSE;
117 } else {
118 targ = pCurrentRun->GetTargetParticle();
119 isTarget = kTRUE;
120 }
121 TString beam = pCurrentRun->GetBeamParticle();
122 if (beam == "")
123 beam = "-";
124 cout << "\n\n|||||||||||||||| EXPERIMENTAL RUN SUMMARY ||||||||||||||||" << endl;
125 cout << "||\t\t\t\t\t\t\t||" << endl;
126 cout << "||\t\tPeriod:\t\t" << run_period << "\t\t\t||" << endl;
127 cout << "||\t\tNumber:\t\t" << run_number << "\t\t\t||" << endl;
128 cout << "||\t\tBeam:\t\t" << beam << "\t\t\t||" << endl;
129 cout << "||\t\tTarget:\t\t" << targ << "\t\t\t||" << endl;
130 cout << "||\t\tField scale:\t" << setprecision(4) << fieldScale << "\t\t\t||" << endl;
131 cout << "||\t\t\t\t\t\t\t||" << endl;
132 cout << "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n\n" << endl;
133#ifndef USE_GEODB
134 remove(geoFileName.Data());
135#endif
136 }
137
138 fRunAna->SetSource(fFileSource);
139
140 if (dstFileName == "")
141 dstFileName = "bmndst.root";
142 // if directory for the output file does not exist, then create
143 if (BmnFunctionSet::CreateDirectoryTree(dstFileName, 1) < 0)
144 exit(-2);
145 fRunAna->SetSink(new FairRootFileSink(dstFileName));
146 fRunAna->SetGenerateRunInfo(false);
147
148 // if nEvents is equal 0 then all events of the given file starting with "nStartEvent" should be processed
149 if (nEvents == 0)
150 nEvents = MpdGetNumEvents::GetNumROOTEvents((char*)inFileName.Data()) - nStartEvent;
151
152 // Digitisation files.
153 // Add TObjectString file names to a TList which is passed as input to the FairParAsciiFileIo.
154 // The FairParAsciiFileIo will create on fly a concatenated input parameter file, which is then used during the
155 // reconstruction.
156 TList* parFileNameList = new TList();
157
158 // ====================================================================== //
159 // === Pileup Event Classification === //
160 // ====================================================================== //
161 if (run_period == 8 && isExp) {
162 BmnEventSelector* eventSelector = new BmnEventSelector();
163 eventSelector->SetRunId(run_number);
164 eventSelector->SetInputFileName("$VMCWORKDIR/input/eventSelector_calib_run8.root");
165 fRunAna->AddTask(eventSelector);
166 }
167
168 // ====================================================================== //
169 // === Fill basic trigger information === //
170 // ====================================================================== //
171 BmnFillTrigInfoDst* trig = new BmnFillTrigInfoDst(isExp);
172 fRunAna->AddTask(trig);
173
174 // ====================================================================== //
175 // === Hits in front of the target === //
176 // ====================================================================== //
177 if (run_period >= 8) {
178 if (isExp) {
179 BmnSiBTHitMaker* sibtHM = new BmnSiBTHitMaker(run_period, run_number, isExp);
180 // fRunAna->AddTask(sibtHM);
181 }
182 } else {
183 if (!isExp) {
185 fRunAna->AddTask(mwpcHP);
186 }
187 BmnMwpcHitFinder* mwpcHM = new BmnMwpcHitFinder(isExp, run_period, run_number);
188 fRunAna->AddTask(mwpcHM);
189 }
190
191 // ====================================================================== //
192 // === VSP hit finder === //
193 // ====================================================================== //
194 BmnVSPHitMaker* vspHM = new BmnVSPHitMaker(run_period, run_number, isExp);
195 if (isExp)
196 vspHM->SetHitMatching(kFALSE);
197 fRunAna->AddTask(vspHM);
198
199 // ====================================================================== //
200 // === Silicon hit finder === //
201 // ====================================================================== //
202 BmnSiliconHitMaker* siliconHM = new BmnSiliconHitMaker(run_period, run_number, isExp);
203 if (isExp)
204 siliconHM->SetHitMatching(kFALSE);
205 fRunAna->AddTask(siliconHM);
206
207 // ====================================================================== //
208 // === GEM hit finder === //
209 // ====================================================================== //
210 BmnGemStripHitMaker* gemHM = new BmnGemStripHitMaker(run_period, run_number, isExp);
211 if (isExp)
212 gemHM->SetHitMatching(kFALSE);
213 fRunAna->AddTask(gemHM);
214
215 // ====================================================================== //
216 // === CSC hit finder === //
217 // ====================================================================== //
218 BmnCSCHitMaker* cscHM = new BmnCSCHitMaker(run_period, run_number, isExp);
219 if (!isExp)
220 cscHM->SetCurrentConfig(BmnCSCConfiguration::FullCSC_Run8); // set explicitly
221 if (isExp)
222 cscHM->SetHitMatching(kFALSE);
223 fRunAna->AddTask(cscHM);
224
225 // ====================================================================== //
226 // === TOF400 hit finder === //
227 // ====================================================================== //
228 BmnTof1HitProducer* tof400HP = new BmnTof1HitProducer("TOF400", kTOF1, !isExp, iVerbose, kFALSE);
229 tof400HP->SetPeriodRun(run_period, run_number);
230 fRunAna->AddTask(tof400HP);
231
232 // ====================================================================== //
233 // === TOF700 hit finder === //
234 // ====================================================================== //
235 BmnTof1HitProducer* tof700HP = new BmnTof1HitProducer("TOF700", kTOF701, !isExp, iVerbose, kFALSE);
236 tof700HP->SetPeriodRun(run_period, run_number);
237 fRunAna->AddTask(tof700HP);
238
239 // ====================================================================== //
240 // === DCH hit finder === //
241 // ====================================================================== //
242 // if (!isExp) {
243 // BmnDchHitProducer* dchHP = new BmnDchHitProducer();
244 // fRunAna->AddTask(dchHP);
245 // }
246
247 // ====================================================================== //
248 // === FHCAL/ZDC === //
249 // ====================================================================== //
250 bool IsGlobalCoordinates = true;
251 if (run_period >= 8) {
252 // TODO check isExp
253 BmnFHCalReconstructor* fhcalReco = new BmnFHCalReconstructor(isExp, IsGlobalCoordinates);
254 fhcalReco->SetRecoCutsFile("FHCAL_reco_cuts_period8.txt");
255 fRunAna->AddTask(fhcalReco);
256 } else {
257 BmnZdcAnalyzer* zdcAna = new BmnZdcAnalyzer();
258 fRunAna->AddTask(zdcAna);
259 }
260
261 // ====================================================================== //
262 // === ScWall === //
263 // ====================================================================== //
264 IsGlobalCoordinates = true;
265 BmnScWallReconstructor* scwallReco = new BmnScWallReconstructor(isExp, IsGlobalCoordinates);
266 scwallReco->SetRecoCutsFile("SCWALL_reco_cuts_period8.txt");
267 fRunAna->AddTask(scwallReco);
268
269 // ====================================================================== //
270 // === Hodo === //
271 // ====================================================================== //
272
273 BmnHodoReconstructor* hodoReco = new BmnHodoReconstructor("HODO_Q_calibration_period8.json", isExp);
274 hodoReco->SetRecoCutsFile("HODO_reco_cuts_period8.json");
275 fRunAna->AddTask(hodoReco);
276
277 // ====================================================================== //
278 // === Ndet === //
279 // ====================================================================== //
280 IsGlobalCoordinates = true;
281 BmnNdetReconstructor* ndetReco = new BmnNdetReconstructor(isExp, IsGlobalCoordinates);
282 ndetReco->SetRecoCutsFile("NDET_reco_cuts_period8.txt");
283 fRunAna->AddTask(ndetReco);
284
285 // ====================================================================== //
286 // === Vacuum Wall === //
287 // ====================================================================== //
288
290 fRunAna->AddTask(vacReco);
291
292 // ====================================================================== //
293 // === Inner Tracking === //
294 // ====================================================================== //
295 TString innerTrackBranchName; // use different track container
296 BmnRun8cgDetModel alignDetModel; // PLV: detector elements enumeration model (for alignment)
297 BmnMeasureModel alignMeasModel; // PLV: model of X and Y measurements used in alignement
298 const char* alignSolution = "solution_nn.json"; // PLV: path to alignment solution file
299
300 if (tracking == L1Tracking)
301 innerTrackBranchName = "StsTrack";
302 else
303 innerTrackBranchName = "StsVector";
304 if (run_period >= 8) {
305 BmnToCbmHitConverter* hitConverter = new BmnToCbmHitConverter(iVerbose, isExp);
306 // AZ-150224 hitConverter->SetFixedErrors(0.05, 0.25, 0.02, 0.65);
307 hitConverter->SetFixedErrors(0.08 / sqrt(12) * 1.2, 0.1234, 0.01 / sqrt(12), 0.1234); // AZ-150224
308 // PLV: turn off manual alignment built in BmnToCbmHitConverter
309 hitConverter->EnableAlignment(kFALSE);
310 fRunAna->AddTask(hitConverter);
311
312 // PLV: apply alignment corrections (for run 8 only)
313 if (run_period == 8) {
314 alignDetModel.Init();
315 BmnAlignerApply* aligner = new BmnAlignerApply(&alignMeasModel, &alignDetModel, alignSolution);
316 fRunAna->AddTask(aligner);
317 }
318 // PLV: end
319
320 CbmKF* kalman = new CbmKF();
321 fRunAna->AddTask(kalman);
322
323 CbmL1* l1 = new CbmL1();
324 TString stsMatBudgetFile = "";
325 l1->SetMaterialBudgetFileName(stsMatBudgetFile);
326 fRunAna->AddTask(l1);
327
328 if (tracking == L1Tracking) {
329 FairTask* stsFindTracks = new CbmStsFindTracks(iVerbose, "CbmL1StsTrackFinder");
330 fRunAna->AddTask(stsFindTracks);
331 }
332 if (tracking == VectorFinder) {
333 // BmnStsVectorFinder* vf = new BmnStsVectorFinder();
335 vf->SetMatBudgetFileName("$VMCWORKDIR/parameters/reco/sts_matbudget_run8.root");
336 fRunAna->AddTask(vf);
337 }
338
339 BmnStsMatchTracks* stsMatchTracks = new BmnStsMatchTracks(iVerbose);
340 stsMatchTracks->SetTrackBranch(innerTrackBranchName);
341 fRunAna->AddTask(stsMatchTracks);
342
343 } else {
344 BmnInnerTrackingRun7* innerTF = new BmnInnerTrackingRun7(run_number, isTarget);
345 innerTF->SetFiltration(isExp); // we use filtration for experimental data only now
346 fRunAna->AddTask(innerTF);
347 }
348
349 // ====================================================================== //
350 // === Beam Tracking === //
351 // ====================================================================== //
352 if (run_period >= 8) {
353 if (isExp) {
354 BmnBeamTracking* beamTF = new BmnBeamTracking(run_period);
355 fRunAna->AddTask(beamTF);
356 }
357 } else {
358 BmnMwpcTrackFinder* mwpcTF = new BmnMwpcTrackFinder(isExp, run_period, run_number);
359 fRunAna->AddTask(mwpcTF);
360 }
361
362 // ====================================================================== //
363 // === Tracking (DCH) === //
364 // ====================================================================== //
365 // BmnDchTrackFinder* dchTF = new BmnDchTrackFinder(run_period, run_number, isExp);
366 // dchTF->SetTransferFunction("transfer_func.txt");
367 // fRunAna->AddTask(dchTF);
368
369 // ====================================================================== //
370 // === Primary vertex finding === //
371 // ====================================================================== //
372 // if (run_period >= 8) {
373 CbmPrimaryVertexFinder* pvFinder = new CbmPVFinderKF();
374 CbmFindPrimaryVertex* findVertex = new CbmFindPrimaryVertex(pvFinder);
375 findVertex->SetTrackBranch(innerTrackBranchName);
376 fRunAna->AddTask(findVertex);
377
378 // AZ-150224
380 fRunAna->AddTask(pvMPD);
381
383 fRunAna->AddTask(combPV);
384 //
385 // // } else {
386 // BmnVertexFinder* gemVF = new BmnVertexFinder(run_period);
387 // fRunAna->AddTask(gemVF);
388 //}
389
390 // ====================================================================== //
391 // === Global Tracking === //
392 // ====================================================================== //
394 glTF->SetPeriodNumber(run_period);
395 glTF->SetInnerTracksBranchName(innerTrackBranchName);
396 fRunAna->AddTask(glTF);
397
398 // BmnVertexFinder* gemVF = new BmnVertexFinder(run_period);
399 // fRunAna->AddTask(gemVF);
400
401 // ====================================================================== //
402 // === Matching global track to MC track procedure === //
403 // ====================================================================== //
404 if (!isExp) {
405 BmnMatchRecoToMC* mcMatching = new BmnMatchRecoToMC();
406 mcMatching->SetInnerTracksBranchName(innerTrackBranchName);
407 fRunAna->AddTask(mcMatching);
408 }
409
410 // ====================================================================== //
411 // === PID procedure === //
412 // ====================================================================== //
413 BmnPid* pid_analyser = new BmnPid();
414 fRunAna->AddTask(pid_analyser);
415
416 // ====================================================================== //
417 // === Residual analysis === //
418 // ====================================================================== //
419 if (run_period < 8) {
420 BmnResiduals* res = new BmnResiduals(run_period, run_number);
421 fRunAna->AddTask(res);
422 }
423
424 // ====================================================================== //
425 // === Centrality === //
426 // ====================================================================== //
427 CentralityClusterizer* cclusterizer = new CentralityClusterizer("XeCsI@3.8AGeV_MBT_7clusters_period8.root");
428 fRunAna->AddTask(cclusterizer);
429
430 // Fill DST Event Header
431 BmnFillDstTask* dst_task = new BmnFillDstTask(nStartEvent, nEvents, isExp, run_period, run_number);
432 fRunAna->AddTask(dst_task);
433
434 // ----- Parameter database (input) -------------------------------------
435 FairRuntimeDb* rtdb = fRunAna->GetRuntimeDb();
436 FairParRootFileIo* parIo1 = new FairParRootFileIo();
437 FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
438 parIo1->open(inFileName.Data());
439 parIo2->open(parFileNameList, "in");
440 rtdb->setFirstInput(parIo1);
441 rtdb->setSecondInput(parIo2);
442 // -------------------------------------------------------------------------
443
444 // ----- Initialize FaiRunAna --------------------------------------------
445 fRunAna->GetMainTask()->SetVerbose(iVerbose);
446 fRunAna->Init();
447 // -------------------------------------------------------------------------
448
449 // ----- Parameter database (output) ------------------------------------
450 FairParRootFileIo* parOut = new FairParRootFileIo(kTRUE);
451 // parOut->open(dstFileName);
452 parOut->open(gFile);
453 rtdb->setOutput(parOut);
454 rtdb->writeContainer(rtdb->getContainer("FairGeoParSet"), rtdb->getCurrentRun());
455 rtdb->saveOutput();
456 // rtdb->print();
457 // -------------------------------------------------------------------------
458
459 // ----- Run FairRunAna -------------------------------------------------
460 fRunAna->Run(nStartEvent, nStartEvent + nEvents);
461 // -------------------------------------------------------------------------
462
463 // ----- Finish --------------------------------------------------------
464 delete fRunAna;
465 delete pvFinder;
466 timer.Stop();
467 Double_t rtime = timer.RealTime();
468 Double_t ctime = timer.CpuTime();
469 cout << endl << endl;
470 cout << "Macro finished successfully." << endl; // marker of successful execution
471 cout << "Input file is " + inFileName << endl;
472 cout << "Output file is " + dstFileName << endl;
473 cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
474 cout << endl;
475 // ------------------------------------------------------------------------
476}
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
enumTracking
@ L1Tracking
@ VectorFinder
void run_reco_bmn(TString inFileName="$VMCWORKDIR/macro/run/bmnsim.root", TString dstFileName="$VMCWORKDIR/macro/run/bmndst.root", Int_t nStartEvent=0, Int_t nEvents=0, enumTracking tracking=VectorFinder)
bool usePreviousIfMissing
@ kTOF1
@ kTOF701
void SetCurrentConfig(BmnCSCConfiguration::CSC_CONFIG config)
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 CheckFileExist(TString &fileName, int iVerbose=0, EAccessMode mode=kFileExists)
void SetHitMatching(Bool_t opt=kTRUE)
void SetInnerTracksBranchName(TString name)
void SetPeriodNumber(Short_t p)
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 SetFixedErrors(Float_t dXgem=0.015, Float_t dYgem=0.058, Float_t dXsil=0.003, Float_t dYsil=0.021)
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.
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
FairField * GetMagneticField(double scale=-1)
Get magnetic field of the current setup geometry.
Definition GeoSetup.cxx:877
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()
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
RVec< PromoteType< T > > sqrt(const RVec< T > &v)