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