18#include <fairlogger/Logger.h>
24#include <TParameter.h>
29namespace event_visualisation
33void VisualisationEventROOTSerializer::save(
const char*
name,
const std::string&
value)
39std::string VisualisationEventROOTSerializer::readString(TFile&
f,
const char*
name)
41 auto*
v = (TNamed*)
f.Get(
name);
45 std::string
result =
v->GetTitle();
50void VisualisationEventROOTSerializer::saveInt(
const char*
name,
int value)
57void VisualisationEventROOTSerializer::saveUInt64(
const char*
name, uint64_t
value)
60 obj.SetVal((
long)
value);
64int VisualisationEventROOTSerializer::readInt(TFile&
f,
const char*
name)
66 auto v = (TParameter<int>*)
f.Get(
name);
75uint64_t VisualisationEventROOTSerializer::readUInt64(TFile&
f,
const char*
name)
77 auto v = (TParameter<uint64_t>*)
f.Get(
name);
86bool VisualisationEventROOTSerializer::existUInt64(TFile&
f,
const char*
name)
88 auto v = (TParameter<uint64_t>*)
f.Get(
name);
98 TFile
f(fileName.c_str(),
"recreate");
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);
110 saveInt(
"version",
event.mEveVersion);
114 TNtuple xyz(
"xyz",
"xyz",
"x:y:z");
117 TTree
clusters(
"clusters",
"Clusters");
119 unsigned cluster_bgid;
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();
127 cluster_xyz = xyzPos;
128 xyz.Fill(cluster.X(), cluster.Y(), cluster.Z());
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);
157 for (
auto track :
event.getTracksSpan()) {
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;
167 xyz.Fill(track.mStartCoordinates[0], track.mStartCoordinates[1], track.mStartCoordinates[2]);
169 track_points = track.getPointCount();
171 for (
size_t i = 0;
i < track.getPointCount();
i++) {
172 xyz.Fill(track.mPolyX[
i], track.mPolyY[
i], track.mPolyZ[
i]);
175 track_clusters = track.getClusterCount();
176 for (
auto cluster : track.getClustersSpan()) {
177 xyz.Fill(cluster.X(), cluster.Y(), cluster.Z());
186 TTree calo(
"calo",
"Calorimeters");
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);
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();
220 event.mTracks.clear();
221 event.mClusters.clear();
224 TFile
f(fileName.c_str());
226 event.setRunNumber(readInt(
f,
"runNumber"));
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");
234 if (existUInt64(
f,
"creationTime")) {
235 event.setCreationTime(readInt(
f,
"creationTime"));
237 auto collisionTime = readString(
f,
"collisionTime");
241 event.mEveVersion = 0;
242 if (
f.Get(
"version") !=
nullptr) {
243 event.mEveVersion = readInt(
f,
"version");
245 std::string
version = readString(
f,
"eveVersion");
246 event.mEveVersion = (
int)(100 * std::stof(
version));
250 auto* xyz = (TNtuple*)
f.Get(
"xyz");
251 if (xyz ==
nullptr) {
256 auto* tracks = (TTree*)
f.Get(
"tracks");
257 if (tracks ==
nullptr) {
266 std::string* track_GID =
nullptr;
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");
283 if (gid !=
nullptr) {
284 tracks->SetBranchAddress(
"GID", &track_GID);
286 auto bgid = tracks->GetBranch(
"BGID");
287 if (bgid !=
nullptr) {
288 tracks->SetBranchAddress(
"BGID", &track_BGID);
290 auto source = tracks->GetBranch(
"source");
292 tracks->SetBranchAddress(
"source", &track_source);
294 tracks->SetBranchAddress(
"points", &track_points);
295 tracks->SetBranchAddress(
"clusters", &track_clusters);
297 auto tracksNoOfEntries = (Int_t)tracks->GetEntries();
298 for (Int_t
i = 0;
i < tracksNoOfEntries;
i++) {
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;
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);
318 for (
size_t it = 0; it < track_clusters; it++) {
319 xyz->GetEntry(track_xyz + 1 + track_points + it);
321 track.mClusters.emplace_back(cluster);
323 event.mTracks.emplace_back(track);
326 if (gid !=
nullptr) {
331 if (!readClusters(
event,
f, xyz)) {
337 if (!readCalo(
event,
f)) {
346 event.afterLoading();
352 auto*
clusters = (TTree*)
f.Get(
"clusters");
359 unsigned cluster_BGID;
364 clusters->SetBranchAddress(
"source", &cluster_source);
367 auto bgid =
clusters->GetBranch(
"BGID");
368 if (bgid !=
nullptr) {
369 clusters->SetBranchAddress(
"BGID", &cluster_BGID);
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++) {
377 xyz->GetEntry(cluster_xyz);
378 dataformats::GlobalTrackID gid = 0;
384 VisualisationCluster cluster(xyz->GetArgs(), cluster_time, gid);
385 event.mClusters.emplace_back(cluster);
391bool VisualisationEventROOTSerializer::readCalo(VisualisationEvent&
event, TFile&
f)
393 auto* calo = (TTree*)
f.Get(
"calo");
394 if (calo ==
nullptr) {
406 auto source = calo->GetBranch(
"source");
408 calo->SetBranchAddress(
"source", &calo_source);
410 auto bgid = calo->GetBranch(
"BGID");
411 if (bgid !=
nullptr) {
412 calo->SetBranchAddress(
"BGID", &calo_BGID);
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);
421 auto nentries = (Int_t)calo->GetEntries();
422 for (Int_t
i = 0;
i < nentries;
i++) {
424 VisualisationCalo calorimeter;
425 calorimeter.mTime = calo_time;
426 calorimeter.mEnergy = calo_energy;
427 calorimeter.mEta = calo_eta;
428 calorimeter.mPhi = calo_phi;
432 calorimeter.mBGID =
deserialize(calo_source, 0, 0);
434 calorimeter.mPID = calo_PID;
435 event.mCalo.emplace_back(calorimeter);
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)
static time_t parseDateTime(const char *datetimeString)
void addPolyPoint(float x, float y, float z)
GLuint const GLchar * name
GLsizei GLsizei GLchar * source
GLsizei const GLfloat * value
constexpr int ROOT_FILE_VERSION
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)
std::vector< Cluster > clusters