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 std::string fileName =
location.fileName();
99 TFile
f(fileName.c_str(),
"recreate");
101 saveInt(
"runNumber",
event.mRunNumber);
102 saveInt(
"runType",
event.mRunType);
103 saveInt(
"clMask",
event.mClMask);
104 saveInt(
"trkMask",
event.mTrkMask);
105 saveInt(
"tfCounter",
event.mTfCounter);
106 saveInt(
"firstTForbit",
event.mFirstTForbit);
107 saveInt(
"primaryVertex",
event.mPrimaryVertex);
108 saveUInt64(
"creationTime",
event.mCreationTime);
111 saveInt(
"version",
event.mEveVersion);
115 TNtuple xyz(
"xyz",
"xyz",
"x:y:z");
118 TTree
clusters(
"clusters",
"Clusters");
120 unsigned cluster_bgid;
122 clusters.Branch(
"BGID", &cluster_bgid);
123 clusters.Branch(
"time", &cluster_time);
124 clusters.Branch(
"xyz", &cluster_xyz);
125 for (
auto cluster :
event.getClustersSpan()) {
126 cluster_time = cluster.Time();
128 cluster_xyz = xyzPos;
129 xyz.Fill(cluster.X(), cluster.Y(), cluster.Z());
146 TTree tracks(
"tracks",
"Tracks");
147 tracks.Branch(
"xyz", &track_xyz);
148 tracks.Branch(
"time", &track_time);
149 tracks.Branch(
"charge", &track_charge);
150 tracks.Branch(
"theta", &track_theta);
151 tracks.Branch(
"phi", &track_phi);
152 tracks.Branch(
"eta", &track_eta);
153 tracks.Branch(
"PID", &track_PID);
154 tracks.Branch(
"BGID", &track_BGID);
155 tracks.Branch(
"points", &track_points);
156 tracks.Branch(
"clusters", &track_clusters);
158 for (
auto track :
event.getTracksSpan()) {
160 track_time = std::isnan(track.mTime) ? 0 : track.mTime;
161 track_charge = track.mCharge;
162 track_theta = std::isnan(track.mTheta) ? 0 : track.mTheta;
163 track_phi = std::isnan(track.mPhi) ? 0 : track.mPhi;
164 track_eta = std::isnan(track.mEta) ? 0 : track.mEta;
165 track_PID = track.mPID;
168 xyz.Fill(track.mStartCoordinates[0], track.mStartCoordinates[1], track.mStartCoordinates[2]);
170 track_points = track.getPointCount();
172 for (
size_t i = 0;
i < track.getPointCount();
i++) {
173 xyz.Fill(track.mPolyX[
i], track.mPolyY[
i], track.mPolyZ[
i]);
176 track_clusters = track.getClusterCount();
177 for (
auto cluster : track.getClustersSpan()) {
178 xyz.Fill(cluster.X(), cluster.Y(), cluster.Z());
187 TTree calo(
"calo",
"Calorimeters");
195 calo.Branch(
"time", &calo_time);
196 calo.Branch(
"energy", &calo_energy);
197 calo.Branch(
"eta", &calo_eta);
198 calo.Branch(
"phi", &calo_phi);
199 calo.Branch(
"BGID", &calo_BGID);
200 calo.Branch(
"PID", &calo_PID);
202 for (
const auto& calorimeter :
event.getCalorimetersSpan()) {
203 calo_time = calorimeter.getTime();
204 calo_energy = calorimeter.getEnergy();
205 calo_eta = calorimeter.getEta();
206 calo_phi = calorimeter.getPhi();
207 calo_BGID =
serialize(calorimeter.mBGID);
208 calo_PID = calorimeter.getPID();
221 event.mTracks.clear();
222 event.mClusters.clear();
225 TFile
f(fileName.c_str());
227 event.setRunNumber(readInt(
f,
"runNumber"));
229 event.setClMask(readInt(
f,
"clMask"));
230 event.setTrkMask(readInt(
f,
"trkMask"));
231 event.setTfCounter(readInt(
f,
"tfCounter"));
232 event.setFirstTForbit(readInt(
f,
"firstTForbit"));
233 event.mPrimaryVertex = readInt(
f,
"primaryVertex");
235 if (existUInt64(
f,
"creationTime")) {
236 event.setCreationTime(readInt(
f,
"creationTime"));
238 auto collisionTime = readString(
f,
"collisionTime");
242 event.mEveVersion = 0;
243 if (
f.Get(
"version") !=
nullptr) {
244 event.mEveVersion = readInt(
f,
"version");
246 std::string
version = readString(
f,
"eveVersion");
247 event.mEveVersion = (
int)(100 * std::stof(
version));
251 auto* xyz = (TNtuple*)
f.Get(
"xyz");
252 if (xyz ==
nullptr) {
257 auto* tracks = (TTree*)
f.Get(
"tracks");
258 if (tracks ==
nullptr) {
267 std::string* track_GID =
nullptr;
276 tracks->SetBranchAddress(
"xyz", &track_xyz);
277 tracks->SetBranchAddress(
"time", &track_time);
278 tracks->SetBranchAddress(
"charge", &track_charge);
279 tracks->SetBranchAddress(
"theta", &track_theta);
280 tracks->SetBranchAddress(
"phi", &track_phi);
281 tracks->SetBranchAddress(
"eta", &track_eta);
282 tracks->SetBranchAddress(
"PID", &track_PID);
283 auto gid = tracks->GetBranch(
"GID");
284 if (gid !=
nullptr) {
285 tracks->SetBranchAddress(
"GID", &track_GID);
287 auto bgid = tracks->GetBranch(
"BGID");
288 if (bgid !=
nullptr) {
289 tracks->SetBranchAddress(
"BGID", &track_BGID);
291 auto source = tracks->GetBranch(
"source");
293 tracks->SetBranchAddress(
"source", &track_source);
295 tracks->SetBranchAddress(
"points", &track_points);
296 tracks->SetBranchAddress(
"clusters", &track_clusters);
298 auto tracksNoOfEntries = (Int_t)tracks->GetEntries();
299 for (Int_t
i = 0;
i < tracksNoOfEntries;
i++) {
302 track.mTime = track_time;
303 track.mCharge = track_charge;
304 track.mTheta = track_theta;
305 track.mPhi = track_phi;
306 track.mEta = track_eta;
307 track.mPID = track_PID;
313 xyz->GetEntry(track_xyz);
314 track.addStartCoordinates(xyz->GetArgs());
315 for (
int p = 0; p < track_points; p++) {
316 xyz->GetEntry(track_xyz + 1 + p);
319 for (
size_t it = 0; it < track_clusters; it++) {
320 xyz->GetEntry(track_xyz + 1 + track_points + it);
322 track.mClusters.emplace_back(cluster);
324 event.mTracks.emplace_back(track);
327 if (gid !=
nullptr) {
332 if (!readClusters(
event,
f, xyz)) {
338 if (!readCalo(
event,
f)) {
347 event.afterLoading();
353 auto*
clusters = (TTree*)
f.Get(
"clusters");
360 unsigned cluster_BGID;
365 clusters->SetBranchAddress(
"source", &cluster_source);
368 auto bgid =
clusters->GetBranch(
"BGID");
369 if (bgid !=
nullptr) {
370 clusters->SetBranchAddress(
"BGID", &cluster_BGID);
373 clusters->SetBranchAddress(
"time", &cluster_time);
374 clusters->SetBranchAddress(
"xyz", &cluster_xyz);
375 auto clustersNoOfEntries = (Int_t)
clusters->GetEntries();
376 for (Int_t
i = 0;
i < clustersNoOfEntries;
i++) {
378 xyz->GetEntry(cluster_xyz);
379 dataformats::GlobalTrackID gid = 0;
385 VisualisationCluster cluster(xyz->GetArgs(), cluster_time, gid);
386 event.mClusters.emplace_back(cluster);
392bool VisualisationEventROOTSerializer::readCalo(VisualisationEvent&
event, TFile&
f)
394 auto* calo = (TTree*)
f.Get(
"calo");
395 if (calo ==
nullptr) {
407 auto source = calo->GetBranch(
"source");
409 calo->SetBranchAddress(
"source", &calo_source);
411 auto bgid = calo->GetBranch(
"BGID");
412 if (bgid !=
nullptr) {
413 calo->SetBranchAddress(
"BGID", &calo_BGID);
416 calo->SetBranchAddress(
"time", &calo_time);
417 calo->SetBranchAddress(
"energy", &calo_energy);
418 calo->SetBranchAddress(
"eta", &calo_eta);
419 calo->SetBranchAddress(
"phi", &calo_phi);
420 calo->SetBranchAddress(
"PID", &calo_PID);
422 auto nentries = (Int_t)calo->GetEntries();
423 for (Int_t
i = 0;
i < nentries;
i++) {
425 VisualisationCalo calorimeter;
426 calorimeter.mTime = calo_time;
427 calorimeter.mEnergy = calo_energy;
428 calorimeter.mEta = calo_eta;
429 calorimeter.mPhi = calo_phi;
433 calorimeter.mBGID =
deserialize(calo_source, 0, 0);
435 calorimeter.mPID = calo_PID;
436 event.mCalo.emplace_back(calorimeter);
bool fromFile(VisualisationEvent &event, std::string fileName) override
void toFile(const VisualisationEvent &event, Location &location) 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