Project
Loading...
Searching...
No Matches
VisualisationEventROOTSerializer.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
18#include <fairlogger/Logger.h>
19#include <iostream>
20
21#include <TFile.h>
22#include <TTree.h>
23#include <TKey.h>
24#include <TParameter.h>
25#include <TNtuple.h>
26
27namespace o2
28{
29namespace event_visualisation
30{
31constexpr int ROOT_FILE_VERSION = 1;
32
33void VisualisationEventROOTSerializer::save(const char* name, const std::string& value)
34{
35 TNamed obj(name, value);
36 obj.Write();
37}
38
39std::string VisualisationEventROOTSerializer::readString(TFile& f, const char* name)
40{
41 auto* v = (TNamed*)f.Get(name);
42 if (v == nullptr) {
43 return "";
44 }
45 std::string result = v->GetTitle();
46 free(v);
47 return result;
48}
49
50void VisualisationEventROOTSerializer::saveInt(const char* name, int value)
51{
52 TParameter<int> obj;
53 obj.SetVal(value);
54 obj.Write(name);
55}
56
57void VisualisationEventROOTSerializer::saveUInt64(const char* name, uint64_t value)
58{
59 TParameter<long> obj;
60 obj.SetVal((long)value);
61 obj.Write(name);
62}
63
64int VisualisationEventROOTSerializer::readInt(TFile& f, const char* name)
65{
66 auto v = (TParameter<int>*)f.Get(name);
67 if (v == nullptr) {
68 return 0;
69 }
70 int result = v->GetVal();
71 free(v);
72 return result;
73}
74
75uint64_t VisualisationEventROOTSerializer::readUInt64(TFile& f, const char* name)
76{
77 auto v = (TParameter<uint64_t>*)f.Get(name);
78 if (v == nullptr) {
79 return 0;
80 }
81 uint64_t result = v->GetVal();
82 free(v);
83 return result;
84}
85
86bool VisualisationEventROOTSerializer::existUInt64(TFile& f, const char* name)
87{
88 auto v = (TParameter<uint64_t>*)f.Get(name);
89 if (v == nullptr) {
90 return false;
91 }
92 free(v);
93 return true;
94}
95
97{
98 TFile f(fileName.c_str(), "recreate");
99
100 saveInt("runNumber", event.mRunNumber);
101 saveInt("runType", event.mRunType);
102 saveInt("clMask", event.mClMask);
103 saveInt("trkMask", event.mTrkMask);
104 saveInt("tfCounter", event.mTfCounter);
105 saveInt("firstTForbit", event.mFirstTForbit);
106 saveInt("primaryVertex", event.mPrimaryVertex);
107 saveUInt64("creationTime", event.mCreationTime);
108 std::string version = std::to_string(event.mEveVersion / 100.0);
109 save("eveVersion", version); // obsolete
110 saveInt("version", event.mEveVersion);
111 // save("workflowParameters", event.mWorkflowParameters);
112
113 // clusters
114 TNtuple xyz("xyz", "xyz", "x:y:z");
115 long xyzPos = 0L;
116
117 TTree clusters("clusters", "Clusters");
118 long cluster_xyz;
119 unsigned cluster_bgid;
120 float cluster_time;
121 clusters.Branch("BGID", &cluster_bgid);
122 clusters.Branch("time", &cluster_time);
123 clusters.Branch("xyz", &cluster_xyz);
124 for (auto cluster : event.getClustersSpan()) {
125 cluster_time = cluster.Time();
126 cluster_bgid = serialize(cluster.mBGID);
127 cluster_xyz = xyzPos;
128 xyz.Fill(cluster.X(), cluster.Y(), cluster.Z());
129 xyzPos++;
130 clusters.Fill();
131 }
132
133 // Tracks
134 long track_xyz; // first track point
135 int track_points; // number of track points
136 int track_clusters; // number of track clusters
137 unsigned track_BGID; // binary GID
138 float track_time;
139 int track_charge;
140 float track_theta;
141 float track_phi;
142 float track_eta;
143 int track_PID;
144
145 TTree tracks("tracks", "Tracks");
146 tracks.Branch("xyz", &track_xyz);
147 tracks.Branch("time", &track_time);
148 tracks.Branch("charge", &track_charge);
149 tracks.Branch("theta", &track_theta);
150 tracks.Branch("phi", &track_phi);
151 tracks.Branch("eta", &track_eta);
152 tracks.Branch("PID", &track_PID);
153 tracks.Branch("BGID", &track_BGID);
154 tracks.Branch("points", &track_points);
155 tracks.Branch("clusters", &track_clusters);
156
157 for (auto track : event.getTracksSpan()) {
158 track_xyz = xyzPos;
159 track_time = std::isnan(track.mTime) ? 0 : track.mTime;
160 track_charge = track.mCharge;
161 track_theta = std::isnan(track.mTheta) ? 0 : track.mTheta;
162 track_phi = std::isnan(track.mPhi) ? 0 : track.mPhi;
163 track_eta = std::isnan(track.mEta) ? 0 : track.mEta;
164 track_PID = track.mPID;
165 track_BGID = serialize(track.mBGID);
166
167 xyz.Fill(track.mStartCoordinates[0], track.mStartCoordinates[1], track.mStartCoordinates[2]);
168 xyzPos++;
169 track_points = track.getPointCount();
170
171 for (size_t i = 0; i < track.getPointCount(); i++) {
172 xyz.Fill(track.mPolyX[i], track.mPolyY[i], track.mPolyZ[i]);
173 xyzPos++;
174 }
175 track_clusters = track.getClusterCount();
176 for (auto cluster : track.getClustersSpan()) {
177 xyz.Fill(cluster.X(), cluster.Y(), cluster.Z());
178 xyzPos++;
179 }
180 tracks.Fill();
181 }
182
183 clusters.Write();
184
185 // calorimeters
186 TTree calo("calo", "Calorimeters");
187 float calo_time;
188 float calo_energy;
189 float calo_eta;
190 float calo_phi;
191 int calo_PID;
192 unsigned calo_BGID;
193
194 calo.Branch("time", &calo_time);
195 calo.Branch("energy", &calo_energy);
196 calo.Branch("eta", &calo_eta);
197 calo.Branch("phi", &calo_phi);
198 calo.Branch("BGID", &calo_BGID);
199 calo.Branch("PID", &calo_PID);
200
201 for (const auto& calorimeter : event.getCalorimetersSpan()) {
202 calo_time = calorimeter.getTime();
203 calo_energy = calorimeter.getEnergy();
204 calo_eta = calorimeter.getEta();
205 calo_phi = calorimeter.getPhi();
206 calo_BGID = serialize(calorimeter.mBGID);
207 calo_PID = calorimeter.getPID();
208 calo.Fill();
209 }
210 calo.Write();
211
212 tracks.Write();
213
214 xyz.Write();
215}
216
218{
219 // LOGF(info, "VisualisationEventROOTSerializer <- %s ", fileName);
220 event.mTracks.clear();
221 event.mClusters.clear();
222 event.mCalo.clear();
223
224 TFile f(fileName.c_str());
225
226 event.setRunNumber(readInt(f, "runNumber"));
227 event.setRunType(static_cast<parameters::GRPECS::RunType>(readInt(f, "runType")));
228 event.setClMask(readInt(f, "clMask"));
229 event.setTrkMask(readInt(f, "trkMask"));
230 event.setTfCounter(readInt(f, "tfCounter"));
231 event.setFirstTForbit(readInt(f, "firstTForbit"));
232 event.mPrimaryVertex = readInt(f, "primaryVertex");
233
234 if (existUInt64(f, "creationTime")) {
235 event.setCreationTime(readInt(f, "creationTime"));
236 } else {
237 auto collisionTime = readString(f, "collisionTime");
238 event.mCreationTime = parseDateTime(collisionTime.c_str());
239 }
240
241 event.mEveVersion = 0;
242 if (f.Get("version") != nullptr) {
243 event.mEveVersion = readInt(f, "version");
244 } else {
245 std::string version = readString(f, "eveVersion");
246 event.mEveVersion = (int)(100 * std::stof(version));
247 }
248
249 // xyz
250 auto* xyz = (TNtuple*)f.Get("xyz");
251 if (xyz == nullptr) {
252 return false;
253 }
254
255 // tracks
256 auto* tracks = (TTree*)f.Get("tracks");
257 if (tracks == nullptr) {
258 delete xyz;
259 return false;
260 }
261
262 long track_xyz; // first track point
263 int track_points; // number of track points
264 int track_clusters; // number of track clusters
265 int track_source; // obsolete
266 std::string* track_GID = nullptr;
267 unsigned track_BGID;
268 float track_time;
269 int track_charge;
270 float track_theta;
271 float track_phi;
272 float track_eta;
273 int track_PID;
274
275 tracks->SetBranchAddress("xyz", &track_xyz);
276 tracks->SetBranchAddress("time", &track_time);
277 tracks->SetBranchAddress("charge", &track_charge);
278 tracks->SetBranchAddress("theta", &track_theta);
279 tracks->SetBranchAddress("phi", &track_phi);
280 tracks->SetBranchAddress("eta", &track_eta);
281 tracks->SetBranchAddress("PID", &track_PID);
282 auto gid = tracks->GetBranch("GID"); // obsolete
283 if (gid != nullptr) {
284 tracks->SetBranchAddress("GID", &track_GID);
285 }
286 auto bgid = tracks->GetBranch("BGID");
287 if (bgid != nullptr) {
288 tracks->SetBranchAddress("BGID", &track_BGID);
289 }
290 auto source = tracks->GetBranch("source"); // obsolete
291 if (source != nullptr) {
292 tracks->SetBranchAddress("source", &track_source);
293 }
294 tracks->SetBranchAddress("points", &track_points);
295 tracks->SetBranchAddress("clusters", &track_clusters);
296
297 auto tracksNoOfEntries = (Int_t)tracks->GetEntries();
298 for (Int_t i = 0; i < tracksNoOfEntries; i++) {
299 tracks->GetEntry(i);
300 VisualisationTrack track;
301 track.mTime = track_time;
302 track.mCharge = track_charge;
303 track.mTheta = track_theta;
304 track.mPhi = track_phi;
305 track.mEta = track_eta;
306 track.mPID = track_PID;
307 if (bgid) {
308 track.mBGID = deserialize(track_BGID);
309 } else {
310 track.mBGID = gidFromString(*track_GID);
311 }
312 xyz->GetEntry(track_xyz);
313 track.addStartCoordinates(xyz->GetArgs());
314 for (int p = 0; p < track_points; p++) {
315 xyz->GetEntry(track_xyz + 1 + p);
316 track.addPolyPoint(xyz->GetArgs());
317 }
318 for (size_t it = 0; it < track_clusters; it++) {
319 xyz->GetEntry(track_xyz + 1 + track_points + it);
320 VisualisationCluster cluster(xyz->GetArgs(), track.mTime, track.mBGID);
321 track.mClusters.emplace_back(cluster);
322 }
323 event.mTracks.emplace_back(track);
324 }
325
326 if (gid != nullptr) {
327 delete track_GID;
328 track_GID = nullptr;
329 }
330
331 if (!readClusters(event, f, xyz)) {
332 delete xyz;
333 delete tracks;
334 return false;
335 }
336
337 if (!readCalo(event, f)) {
338 delete xyz;
339 delete tracks;
340 return false;
341 }
342
343 delete tracks;
344 delete xyz;
345
346 event.afterLoading();
347 return true;
348}
349
350bool VisualisationEventROOTSerializer::readClusters(VisualisationEvent& event, TFile& f, TNtuple* xyz)
351{
352 auto* clusters = (TTree*)f.Get("clusters");
353 if (clusters == nullptr) {
354 return false;
355 }
356
357 long cluster_xyz;
358 int cluster_source;
359 unsigned cluster_BGID;
360
361 float cluster_time;
362 auto source = clusters->GetBranch("source"); // obsolete
363 if (source != nullptr) {
364 clusters->SetBranchAddress("source", &cluster_source);
365 }
366
367 auto bgid = clusters->GetBranch("BGID");
368 if (bgid != nullptr) {
369 clusters->SetBranchAddress("BGID", &cluster_BGID);
370 }
371
372 clusters->SetBranchAddress("time", &cluster_time);
373 clusters->SetBranchAddress("xyz", &cluster_xyz);
374 auto clustersNoOfEntries = (Int_t)clusters->GetEntries();
375 for (Int_t i = 0; i < clustersNoOfEntries; i++) {
376 clusters->GetEntry(i);
377 xyz->GetEntry(cluster_xyz);
378 dataformats::GlobalTrackID gid = 0;
379 if (bgid) {
380 gid = deserialize(cluster_BGID);
381 } else if (source) {
382 gid = deserialize(cluster_source, 0, 0);
383 }
384 VisualisationCluster cluster(xyz->GetArgs(), cluster_time, gid);
385 event.mClusters.emplace_back(cluster);
386 }
387 delete clusters;
388 return true;
389}
390
391bool VisualisationEventROOTSerializer::readCalo(VisualisationEvent& event, TFile& f)
392{
393 auto* calo = (TTree*)f.Get("calo");
394 if (calo == nullptr) {
395 return false;
396 }
397
398 int calo_source;
399 float calo_time;
400 float calo_energy;
401 float calo_eta;
402 float calo_phi;
403 unsigned calo_BGID;
404 int calo_PID;
405
406 auto source = calo->GetBranch("source");
407 if (source != nullptr) {
408 calo->SetBranchAddress("source", &calo_source);
409 }
410 auto bgid = calo->GetBranch("BGID");
411 if (bgid != nullptr) {
412 calo->SetBranchAddress("BGID", &calo_BGID);
413 }
414
415 calo->SetBranchAddress("time", &calo_time);
416 calo->SetBranchAddress("energy", &calo_energy);
417 calo->SetBranchAddress("eta", &calo_eta);
418 calo->SetBranchAddress("phi", &calo_phi);
419 calo->SetBranchAddress("PID", &calo_PID);
420
421 auto nentries = (Int_t)calo->GetEntries();
422 for (Int_t i = 0; i < nentries; i++) {
423 calo->GetEntry(i);
424 VisualisationCalo calorimeter;
425 calorimeter.mTime = calo_time;
426 calorimeter.mEnergy = calo_energy;
427 calorimeter.mEta = calo_eta;
428 calorimeter.mPhi = calo_phi;
429 if (bgid) {
430 calorimeter.mBGID = deserialize(calo_BGID);
431 } else {
432 calorimeter.mBGID = deserialize(calo_source, 0, 0);
433 }
434 calorimeter.mPID = calo_PID;
435 event.mCalo.emplace_back(calorimeter);
436 }
437 delete calo;
438 return true;
439}
440
441} // namespace event_visualisation
442} // namespace o2
int32_t i
bool fromFile(VisualisationEvent &event, std::string fileName) override
void toFile(const VisualisationEvent &event, std::string fileName) override
static unsigned serialize(o2::dataformats::GlobalTrackID gidValue)
static o2::dataformats::GlobalTrackID deserialize(unsigned seralizedValue)
static o2::dataformats::GlobalTrackID gidFromString(const std::string &gid)
void addPolyPoint(float x, float y, float z)
struct _cl_event * event
Definition glcorearb.h:2982
GLuint64EXT * result
Definition glcorearb.h:5662
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLdouble f
Definition glcorearb.h:310
GLsizei GLsizei GLchar * source
Definition glcorearb.h:798
GLsizei const GLfloat * value
Definition glcorearb.h:819
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
std::vector< Cluster > clusters