BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
eventdisplay.cxx
Go to the documentation of this file.
1#if !defined(__CLING__) || defined(__MAKECLING__)
2// ROOT includes
3#include "TKey.h"
4#include "TPRegexp.h"
5#include "TROOT.h"
6#include "TStopwatch.h"
7#include "TString.h"
8#include "TSystem.h"
9
10// FairRoot includes
11#include "FairFileSource.h"
12#include "FairParRootFileIo.h"
13#include "FairRootFileSink.h"
14#include "FairRunAna.h"
15#include "FairRuntimeDb.h"
16#include "FairSource.h"
17
18// BM@N includes
19#include "BmnFieldMap.h"
20#include "BmnFileSource.h"
21#include "BmnFunctionSet.h"
22#include "BmnGlobalTrackDraw.h"
23#include "BmnNewFieldMap.h"
24#include "BmnTrackDrawH.h"
25#include "GeoSetup.h"
26#include "MpdEventManager.h"
27#include "MpdHitPointSetDraw.h"
28#include "MpdMCPointDraw.h"
29#include "MpdMCTracks.h"
30#include "UniRun.h"
31
32#include <iostream>
33using namespace std;
34#endif
35
36void SetTasks(MpdEventManager* fMan, int data_source, int run_period, int run_number, bool isField, bool isTarget);
37
38// common EVENT DISPLAY macro for simulated and experimental data
39//
40// data source: 0 - event display for simulatated data (it shows both MC and reconstructed simulated data):
41// sim_run_info - path to the ROOT file with MC data and detector geometry
42// reco_file - ROOT file with reconstructed data for simulated events
43// data source: 1 - offline event display for reconstructed experimental data (it can work in online continious view):
44// sim_run_info - run number in 'runN-NN' format, e.g. "run3-642" to obtain BM@N geometry from the Unified
45// Condition Database reco_file - ROOT file with reconstructed data for experimental events
46// data source: 2 - online event display for raw experimental data from directory (it can work in offline mode for last
47// modified file in the directory):
48// it uses ATLAS TDAQ components, so TDAQ should be present on your machine (FindTDAQ.cmake script)
49// sim_run_info - run number in 'runN-NN' format, e.g. "run6-1" to obtain BM@N geometry from the Unified Condition
50// Database reco_file - path to the directory with raw '*.data' files, e.g. "/tdaq/data/" (last slash is required)
51// is_online: false (default) - use Offline Mode (manual switching of events); true - use Online Mode (continious view
52// events)
53
54// void eventdisplay(char* sim_run_info = "run6-1220", char* reco_file = "$VMCWORKDIR/macro/run/bmn_run1220.root", int
55// data_source = 1, bool is_online = false) void eventdisplay(char* sim_run_info = "run6-1220", char* reco_file =
56// "/tdaq/data/", int data_source = 2, bool is_online = true)
57void eventdisplay(const char* sim_run_info = "$VMCWORKDIR/macro/run/bmnsim.root",
58 const char* reco_file = "$VMCWORKDIR/macro/run/bmndst.root",
59 int data_source = 0,
60 bool is_online = false)
61{
62 gDebug = 0;
63
64 // CREATE FairRunAna
65 FairRunAna* fRunAna = new FairRunAna();
66
67 int run_period = -1, run_number = -1;
68 bool isTarget = false, isField = true;
69 FairSource* fFileSource = NULL;
70
71 TString strSimRunInfo(sim_run_info), strRecoFile(reco_file);
72 // FOR SIMULATION : set source of events to display and addtiional parameters
73 if (data_source == 0) {
74 // check file existence with MC data and detector geometry
75 if (!BmnFunctionSet::CheckFileExist(strSimRunInfo)) {
76 cout << endl << "ERROR: Simulation file with detector geometry wasn't found!" << endl;
77 return;
78 }
79
80 fFileSource = new FairFileSource(strSimRunInfo);
81
82 // set parameter file with MC data and detector geometry
83 FairRuntimeDb* rtdb = fRunAna->GetRuntimeDb();
84 FairParRootFileIo* parIo1 = new FairParRootFileIo();
85 parIo1->open(strSimRunInfo.Data());
86 rtdb->setFirstInput(parIo1);
87 rtdb->setOutput(parIo1);
88 rtdb->saveOutput();
89
90 // add file with reconstructed data as a friend
91 if (BmnFunctionSet::CheckFileExist(strRecoFile))
92 ((FairFileSource*)fFileSource)->AddFriend(strRecoFile);
93 else
94 cout << endl << "Warning: File with reconstructed data wasn't found!" << endl;
95 }
96 // FOR EXPERIMENTAL DATA
97 // FROM RECONSTRUCTED ROOT FILE (data_source == 1), FROM DIRECTORY WITH RAW .DATA FILES (data_source == 2)
98 else
99 {
100 Ssiz_t indDash = strSimRunInfo.First('-');
101 if ((indDash > 0) && (strSimRunInfo.BeginsWith("run"))) {
102 // get run period
103 run_period = TString(strSimRunInfo(3, indDash - 3)).Atoi();
104 // get run number
105 run_number = TString(strSimRunInfo(indDash + 1, strSimRunInfo.Length() - indDash - 1)).Atoi();
106
107 // get geometry for run from the Geometry Database
108 GeoSetup gSetup;
109 string setupTag = gSetup.GetLastApprovedSetupTag(TString::Format("run%d", run_period).Data());
110 Int_t res_code = gSetup.LoadSetupToGeoManager(setupTag);
111 if (res_code != 0) {
112 cout << "\nGeometry '" << setupTag << "' couldn't be loaded from the Geometry Database" << endl;
113 return;
114 }
115
116 // set magnet field with factor corresponding the given run (for GEANE)
117 UniRun* pCurrentRun = UniRun::GetRun(run_period, run_number);
118 if (pCurrentRun == 0)
119 return;
120
121 Double_t fieldScale = 0.0;
122 Double_t map_current = 55.87;
123 Double_t* field_voltage = pCurrentRun->GetFieldVoltage();
124 if ((field_voltage == NULL) || (*field_voltage < 10)) {
125 fieldScale = 0;
126 isField = kFALSE;
127 } else
128 fieldScale = (*field_voltage) / map_current;
129 BmnFieldMap* magField = new BmnNewFieldMap("field_sp41v4_ascii_Extrap.dat");
130 magField->SetScale(fieldScale);
131 magField->Init();
132 fRunAna->SetField(magField);
133 TString targ = "-", beam = pCurrentRun->GetBeamParticle();
134 if (beam == "")
135 beam = "-";
136 if (pCurrentRun->GetTargetParticle() != "") {
137 isTarget = kTRUE;
138 targ = *(pCurrentRun->GetTargetParticle());
139 }
140
141 cout << "\n\n|||||||||||||||| EXPERIMENTAL RUN SUMMARY ||||||||||||||||" << endl;
142 cout << "||\t\tPeriod:\t\t" << run_period << "\t\t\t||" << endl;
143 cout << "||\t\tNumber:\t\t" << run_number << "\t\t\t||" << endl;
144 cout << "||\t\tBeam:\t\t" << beam << "\t\t\t||" << endl;
145 cout << "||\t\tTarget:\t\t" << targ << "\t\t\t||" << endl;
146 cout << "||\t\tField scale:\t" << setprecision(4) << fieldScale << "\t\t\t||" << endl;
147 cout << "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n\n" << endl;
148 } else {
149 cout << "Error: run info wasn't found!" << endl;
150 return;
151 }
152
153 if (!BmnFunctionSet::CheckFileExist(strRecoFile))
154 return;
155
156 // set source as raw data file
157 if (data_source == 1)
158 fFileSource = new BmnFileSource(strRecoFile);
159 // set source as TDAQ Event Monitor
160 if (data_source == 2) {
161 // load TDAQ libraries
162 gSystem->Load("libemon");
163 gSystem->Load("libemon-dal");
164 gSystem->Load("libcmdline");
165 gSystem->Load("libipc");
166 gSystem->Load("libowl");
167 gSystem->Load("libomniORB4");
168 gSystem->Load("libomnithread");
169 gSystem->Load("libers");
170
171 // fFileSource = new BmnTdaqSource("bmn", "raw", "file", 2);
172 }
173 }
174
175 if (fFileSource != NULL)
176 fRunAna->SetSource(fFileSource);
177
178 // Create Event Manager
179 MpdEventManager* fMan = new MpdEventManager();
180 fMan->isOnline = is_online;
181 fMan->iDataSource = data_source;
182
183 // set output file
184 fRunAna->SetSink(new FairRootFileSink("ed_out.root"));
185
186 // set tasks to draw
187 SetTasks(fMan, data_source, run_period, run_number, isField, isTarget);
188
189 // light background color by default
190 fMan->background_color = 17;
191 fMan->isDarkColor = false;
192
193 // MpdEventManager::Init(Int_t visopt = 1, Int_t vislvl = 3, Int_t maxvisnds = 10000)
194 fMan->Init();
195}
196
197// set FairRunAna drawing tasks depending from data source and on/offline mode
198void SetTasks(MpdEventManager* fMan, int data_source, int run_period, int run_number, bool isField, bool isTarget)
199{
200 Style_t pointMarker = kFullDotSmall;
201 Color_t mcPointColor = kRed, recoPointColor = kBlack, expPointColor = kRed;
202
203 // FOR SIMULATION
204 if (data_source == 0) {
205 // draw MC Points
206 MpdMCPointDraw* ArmTrigPoint = new MpdMCPointDraw("ArmTrigPoint", mcPointColor, pointMarker);
207 fMan->AddTask(ArmTrigPoint);
208 MpdMCPointDraw* BCPoint = new MpdMCPointDraw("BCPoint", mcPointColor, pointMarker);
209 fMan->AddTask(BCPoint);
210 MpdMCPointDraw* FDPoint = new MpdMCPointDraw("FDPoint", mcPointColor, pointMarker);
211 fMan->AddTask(FDPoint);
212 MpdMCPointDraw* MWPCPoint = new MpdMCPointDraw("MWPCPoint", mcPointColor, pointMarker);
213 fMan->AddTask(MWPCPoint);
214 MpdMCPointDraw* BdPoint = new MpdMCPointDraw("BdPoint", mcPointColor, pointMarker);
215 fMan->AddTask(BdPoint);
216 MpdMCPointDraw* SiliconPoint = new MpdMCPointDraw("SiliconPoint", mcPointColor, pointMarker);
217 fMan->AddTask(SiliconPoint);
218 MpdMCPointDraw* StsPoint = new MpdMCPointDraw("StsPoint", mcPointColor, pointMarker); // GEM
219 fMan->AddTask(StsPoint);
220 MpdMCPointDraw* CSCPoint = new MpdMCPointDraw("CSCPoint", mcPointColor, pointMarker);
221 fMan->AddTask(CSCPoint);
222 MpdMCPointDraw* TOF1Point = new MpdMCPointDraw("TOF400Point", mcPointColor, pointMarker);
223 fMan->AddTask(TOF1Point);
224 MpdMCPointDraw* DCHPoint = new MpdMCPointDraw("DCHPoint", mcPointColor, pointMarker);
225 fMan->AddTask(DCHPoint);
226 MpdMCPointDraw* TofPoint = new MpdMCPointDraw("TOF700Point", mcPointColor, pointMarker);
227 fMan->AddTask(TofPoint);
228 MpdMCPointDraw* EcalPoint = new MpdMCPointDraw("EcalPoint", mcPointColor, pointMarker);
229 fMan->AddTask(EcalPoint);
230 MpdMCPointDraw* ZdcPoint = new MpdMCPointDraw("ZdcPoint", mcPointColor, pointMarker);
231 fMan->AddTask(ZdcPoint);
232 MpdMCPointDraw* SSDPoint = new MpdMCPointDraw("SsdPoint", mcPointColor, pointMarker);
233 fMan->AddTask(SSDPoint);
234
235 // draw MC Geometry Tracks
236 MpdMCTracks* GeoTrack = new MpdMCTracks("GeoTracks");
237 fMan->AddTask(GeoTrack);
238 // OR draw MC tracks by Geane - not implemented yet
239 // MpdMCStack* MC Track = new MpdMCStack("MCTrack");
240 // fMan->AddTask(MCTrack);
241
242 // draw Reconstructed Detector Hits
243 MpdHitPointSetDraw* BmnMwpcHit = new MpdHitPointSetDraw("BmnMwpcHit", expPointColor, pointMarker);
244 fMan->AddTask(BmnMwpcHit);
245 MpdHitPointSetDraw* BmnArmTrigHit = new MpdHitPointSetDraw("BmnArmTrigHit", recoPointColor, pointMarker);
246 fMan->AddTask(BmnArmTrigHit);
247 MpdHitPointSetDraw* BmnBCHit = new MpdHitPointSetDraw("BmnBCHit", recoPointColor, pointMarker);
248 fMan->AddTask(BmnBCHit);
249 MpdHitPointSetDraw* BmnGemHit = new MpdHitPointSetDraw(
250 "BmnGemStripHit", recoPointColor, pointMarker); // new MpdHitDraw("BmnGemStripHit", 1); //in box view
251 fMan->AddTask(BmnGemHit);
252 MpdHitPointSetDraw* BmnTof1Hit = new MpdHitPointSetDraw("BmnTof400Hit", recoPointColor, pointMarker);
253 fMan->AddTask(BmnTof1Hit);
254 MpdHitPointSetDraw* BmnDchHit = new MpdHitPointSetDraw("BmnDchHit", recoPointColor, pointMarker);
255 fMan->AddTask(BmnDchHit);
256 MpdHitPointSetDraw* BmnTof2Hit = new MpdHitPointSetDraw("BmnTof700Hit", recoPointColor, pointMarker);
257 fMan->AddTask(BmnTof2Hit);
258 MpdHitPointSetDraw* BmnSiliconHit = new MpdHitPointSetDraw("BmnSiliconHit", recoPointColor, pointMarker);
259 fMan->AddTask(BmnSiliconHit);
260 MpdHitPointSetDraw* BmnCSCHit = new MpdHitPointSetDraw("BmnCSCHit", recoPointColor, pointMarker);
261 fMan->AddTask(BmnCSCHit);
262 MpdHitPointSetDraw* BmnUpstreamHit = new MpdHitPointSetDraw("BmnUpstreamHit", recoPointColor, pointMarker);
263 fMan->AddTask(BmnUpstreamHit);
264
265 // draw Reconstructed Global Tracks
267 fMan->AddTask(BmnGlobalTrack);
268
269 // save EventDisplay Screenshot
270 // MpdWebScreenshots* WebScreenshots = new MpdWebScreenshots("WebScreenshots", "/var/www/html/events"); // for
271 // WEB-page MpdWebScreenshots* WebScreenshots = new MpdWebScreenshots("WebScreenshots","screenshots"); // folder
272 // to save the screenshots WebScreenshots->SetFormatFiles(0); // 0 -.png, 1 -.jpg, 2 -.jpg and .png
273 // WebScreenshots->SetMultiFiles(0); // 0 - the same file (event.png), 1 - multiple files (event_nnn.png)
274 // WebScreenshots->SetPort(8016); // 8016 by default
275 // fMan->AddTask(WebScreenshots);
276
277 return;
278 }
279
280 // FOR EXPERIMENTAL DATA FROM RECONSTRUCTED ROOT FILE
281 if (data_source == 1) {
282 // draw MWPC Hits
283 MpdHitPointSetDraw* BmnMwpcHit = new MpdHitPointSetDraw("BmnMwpcHit", expPointColor, pointMarker);
284 fMan->AddTask(BmnMwpcHit);
285 // draw Silicon Hits
286 MpdHitPointSetDraw* BmnSiliconHit = new MpdHitPointSetDraw("BmnSiliconHit", expPointColor, pointMarker);
287 fMan->AddTask(BmnSiliconHit);
288 // draw GEM Hits
289 MpdHitPointSetDraw* BmnGemHit = new MpdHitPointSetDraw("BmnGemStripHit", expPointColor, pointMarker);
290 fMan->AddTask(BmnGemHit);
291 // draw DCH Hits
292 MpdHitPointSetDraw* BmnDchHit = new MpdHitPointSetDraw("BmnDchHit", expPointColor, pointMarker);
293 fMan->AddTask(BmnDchHit);
294 // draw TOF1 Hits
295 MpdHitPointSetDraw* BmnTof1Hit = new MpdHitPointSetDraw("BmnTof400Hit", expPointColor, pointMarker);
296 fMan->AddTask(BmnTof1Hit);
297 // draw TOF2 Hits
298 MpdHitPointSetDraw* BmnTof2Hit = new MpdHitPointSetDraw("BmnTof700Hit", expPointColor, pointMarker);
299 fMan->AddTask(BmnTof2Hit);
300 // draw CSC Hits
301 MpdHitPointSetDraw* BmnCSCHit = new MpdHitPointSetDraw("BmnCSCHit", expPointColor, pointMarker);
302 fMan->AddTask(BmnCSCHit);
303 // draw Upstream Hits
304 MpdHitPointSetDraw* BmnUpstreamHit = new MpdHitPointSetDraw("BmnUpstreamHit", expPointColor, pointMarker);
305 fMan->AddTask(BmnUpstreamHit);
306
307 // draw MWPC Tracks
308 BmnTrackDrawH* BmnMwpcTrack = new BmnTrackDrawH("BmnMwpcTrack", "BmnMwpcHit");
309 fMan->AddTask(BmnMwpcTrack);
310 // draw GEM Tracks
311 BmnTrackDrawH* BmnGemTrack = new BmnTrackDrawH("BmnGemTrack", "BmnGemStripHit");
312 fMan->AddTask(BmnGemTrack);
313 // draw DCH Tracks
314 // BmnTrackDrawH* DchTrack = new BmnTrackDrawH("BmnDchTrack", "BmnDchHit");
315 // fMan->AddTask(DchTrack);
316
317 // draw Reconstructed Global Tracks
319 fMan->AddTask(BmnGlobalTrack);
320
321 // FairGeane* Geane = new FairGeane();
322 // fMan->AddTask(Geane);
323 // CbmTrackDraw* MwpcTrack = new CbmTrackDraw("MwpcMatchedTracks");
324 // fMan->AddTask(MwpcTrack);
325
326 return;
327 }
328 /*
329 // FOR EXPERIMENTAL DATA FROM DIRECTORY WITH .DATA FILES
330 if (data_source == 2)
331 {
332 // GEM hit finder
333 BmnGemStripConfiguration::GEM_CONFIG gem_config;
334 if (run_period == 6)
335 gem_config = BmnGemStripConfiguration::RunSpring2017;
336 else if (run_period == 5)
337 gem_config = BmnGemStripConfiguration::RunWinter2016;
338 BmnGemStripHitMaker* gemHM = new BmnGemStripHitMaker(true);
339 gemHM->SetCurrentConfig(gem_config);
340 gemHM->SetAlignmentCorrectionsFileName(run_period, run_number);
341 gemHM->SetHitMatching(kTRUE);
342 gemHM->SetVerbose(0);
343 fMan->AddTask(gemHM);
344
345 // Tracking GEM
346 BmnGemTracking* gemTF = new BmnGemTracking();
347 gemTF->SetTarget(isTarget);
348 gemTF->SetField(isField);
349 TVector3 vAppr = TVector3(0.0, -3.5, -21.7);
350 gemTF->SetRoughVertex(vAppr);
351 gemTF->SetVerbose(1);
352 fMan->AddTask(gemTF);
353
354 // TOF-400 hit finder
355 BmnTof1HitProducer* tof1HP = new BmnTof1HitProducer("TOF1", false, 0, kTRUE);
356 fMan->AddTask(tof1HP);
357
358 // draw GEM hits
359 MpdHitPointSetDraw* GemHit = new MpdHitPointSetDraw("BmnGemStripHit", expPointColor, pointMarker);
360 GemHit->SetVerbose(1);
361 fMan->AddTask(GemHit);
362
363 // draw TOF-400 hits
364 MpdHitPointSetDraw* Tof1Hit = new MpdHitPointSetDraw("BmnTof400Hit", expPointColor, pointMarker);
365 Tof1Hit->SetVerbose(1);
366 fMan->AddTask(Tof1Hit);
367
368 // draw GEM seeds or tracks
369 BmnTrackDrawH* GemTrack = new BmnTrackDrawH("BmnGemTrack", "BmnGemStripHit");
370 GemTrack->SetVerbose(1);
371 fMan->AddTask(GemTrack);
372
373 return;
374 }*/
375}
376
377int main(int argc, char** arg)
378{
379 eventdisplay();
380}
short Style_t
int Int_t
short Color_t
Int_t gDebug
int Ssiz_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
kRed
kBlack
kFullDotSmall
R__EXTERN TSystem * gSystem
void SetScale(Double_t factor)
Set a global field scaling factor.
Definition BmnFieldMap.h:55
virtual void Init()
BmnFileSource.h.
static int CheckFileExist(TString &fileName, int iVerbose=0, EAccessMode mode=kFileExists)
BmnGlobalTrack.h.
Field Map does not have any symmetries w.r.t coordinate axises.
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
virtual void Init(Int_t visopt=1, Int_t vislvl=3, Int_t maxvisnds=10000)
void AddTask(FairTask *t)
MpdMCTracks.
Definition MpdMCTracks.h:23
Int_t Atoi() 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
TString GetTargetParticle()
get target particle of the current run
Definition UniRun.h:111
void SetTasks(MpdEventManager *fMan, int data_source, int run_period, int run_number, bool isField, bool isTarget)
void eventdisplay(const char *sim_run_info="$VMCWORKDIR/macro/run/bmnsim.root", const char *reco_file="$VMCWORKDIR/macro/run/bmndst.root", int data_source=0, bool is_online=false)
Definition json.hpp:4446
int main(void)
Definition test_FC.cpp:33