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