Skip to content

Commit aeb566d

Browse files
jmyrchaJulian Myrchaalibuild
authored
o2-eve, o2-eve-export-workflow, o2-eve-convert: serialisation to root… (AliceO2Group#9497)
* o2-eve, o2-eve-export-workflow, o2-eve-convert: serialisation to root files, conversion tool * clang * formatting * Update VisualisationEventROOTSerializer.cxx * Please consider the following formatting changes Co-authored-by: Julian Myrcha <jmyrcha@cern.ch> Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 8bd9492 commit aeb566d

27 files changed

Lines changed: 574 additions & 96 deletions

EventVisualisation/Base/include/EventVisualisationBase/DirectoryLoader.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define O2EVE_DIRECTORYLOADER_H
1818

1919
#include <string>
20+
#include <vector>
2021
#include <deque>
2122

2223
namespace o2
@@ -27,13 +28,13 @@ namespace event_visualisation
2728
class DirectoryLoader
2829
{
2930
private:
30-
static int getNumberOfFiles(std::string& path, std::string& ext);
31-
static std::string getLatestFile(std::string& path, std::string& ext);
31+
static int getNumberOfFiles(std::string& path, std::vector<std::string>& ext);
32+
static std::string getLatestFile(std::string& path, std::vector<std::string>& ext);
3233

3334
public:
34-
static std::deque<std::string> load(const std::string& path, const std::string& marker, const std::string& ext);
35+
static std::deque<std::string> load(const std::string& path, const std::string& marker, const std::vector<std::string>& ext);
3536
static void reduceNumberOfFiles(const std::string& path, const std::deque<std::string>& files, std::size_t filesInFolder);
36-
static void removeOldestFiles(std::string& path, std::string ext, int remaining);
37+
static void removeOldestFiles(std::string& path, std::vector<std::string>& ext, int remaining);
3738
};
3839

3940
} // namespace event_visualisation

EventVisualisation/Base/include/EventVisualisationBase/FileWatcher.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include <string>
2020
#include <deque>
21+
#include <vector>
2122

2223
namespace o2
2324
{
@@ -33,10 +34,11 @@ class FileWatcher
3334
std::string prevItem(const std::string& item) const;
3435
std::string mDataFolder; ///< folder being observed
3536
std::string mCurrentFile; ///< "current" file name
37+
std::vector<std::string> mExt; ///< extensions of files to be observed
3638
bool currentFileExist();
3739

3840
public:
39-
FileWatcher(const std::string& path);
41+
FileWatcher(const std::string& path, std::vector<std::string> ext);
4042
void changeFolder(const std::string& path); ///< switch to observe other folder
4143
void saveCurrentFileToFolder(const std::string& destinationFolder); ///< copies
4244
int getSize() const; ///< include guards (so >=2 )

EventVisualisation/Base/src/DataSourceOnline.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ std::vector<std::pair<VisualisationEvent, EVisualisationGroup>> DataSourceOnline
6565
return res;
6666
}
6767

68-
DataSourceOnline::DataSourceOnline(const std::string path) : mFileWatcher(path)
68+
DataSourceOnline::DataSourceOnline(const std::string path) : mFileWatcher(path, {".json", ".root"})
6969
{
7070
}
7171

EventVisualisation/Base/src/DirectoryLoader.cxx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
using namespace std;
2323
using namespace o2::event_visualisation;
2424

25-
deque<string> DirectoryLoader::load(const std::string& path, const std::string& marker, const std::string& ext)
25+
deque<string> DirectoryLoader::load(const std::string& path, const std::string& marker, const std::vector<std::string>& ext)
2626
{
2727
deque<string> result;
2828
for (const auto& entry : std::filesystem::directory_iterator(path)) {
29-
if (entry.path().extension() == ext) {
29+
if (std::find(ext.begin(), ext.end(), entry.path().extension()) != ext.end()) {
3030
result.push_back(entry.path().filename());
3131
}
3232
}
@@ -58,22 +58,22 @@ std::time_t to_time_t(TP tp)
5858
return system_clock::to_time_t(sctp);
5959
}
6060

61-
int DirectoryLoader::getNumberOfFiles(std::string& path, std::string& ext)
61+
int DirectoryLoader::getNumberOfFiles(std::string& path, std::vector<std::string>& ext)
6262
{
6363
int res = 0;
6464
for (const auto& entry : std::filesystem::directory_iterator(path)) {
65-
if (entry.path().extension() == ext) {
65+
if (std::find(ext.begin(), ext.end(), entry.path().extension()) != ext.end()) {
6666
res++;
6767
}
6868
}
6969
return res;
7070
}
71-
std::string DirectoryLoader::getLatestFile(std::string& path, std::string& ext)
71+
std::string DirectoryLoader::getLatestFile(std::string& path, std::vector<std::string>& ext)
7272
{
7373
std::string oldest_file_name = "";
7474
std::time_t oldest_file_time = LONG_MAX;
7575
for (const auto& entry : std::filesystem::directory_iterator(path)) {
76-
if (entry.path().extension() == ext) {
76+
if (std::find(ext.begin(), ext.end(), entry.path().extension()) != ext.end()) {
7777
auto file_time = entry.last_write_time();
7878
std::time_t tt = to_time_t(file_time);
7979
if (tt < oldest_file_time) {
@@ -85,7 +85,7 @@ std::string DirectoryLoader::getLatestFile(std::string& path, std::string& ext)
8585
return oldest_file_name;
8686
}
8787

88-
void DirectoryLoader::removeOldestFiles(std::string& path, std::string ext, int remaining)
88+
void DirectoryLoader::removeOldestFiles(std::string& path, std::vector<std::string>& ext, int remaining)
8989
{
9090
while (getNumberOfFiles(path, ext) > remaining) {
9191
LOG(info) << "removing oldest file in folder: " << path << " : " << getLatestFile(path, ext);

EventVisualisation/Base/src/FileWatcher.cxx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ using namespace o2::event_visualisation;
2828
const char* FileWatcher::mLowGuard = " 0"; /// start guard
2929
const char* FileWatcher::mEndGuard = "~0"; /// stop guard
3030

31-
FileWatcher::FileWatcher(const string& path)
31+
FileWatcher::FileWatcher(const string& path, std::vector<std::string> ext)
3232
{
3333
//LOG(info) << "FileWatcher::FileWatcher(" << path << ")";
3434
this->mDataFolder = path;
3535
this->mCurrentFile = mEndGuard;
3636
this->mFiles.clear();
3737
this->mFiles.push_front(mLowGuard);
3838
this->mFiles.push_back(mEndGuard);
39+
this->mExt = ext;
3940
//LOG(info) << "FileWatcher" << this->getSize();
4041
}
4142

@@ -131,7 +132,7 @@ bool FileWatcher::refresh()
131132
LOG(info) << "previous:" << previous;
132133
LOG(info) << "currentFile:" << this->mCurrentFile;
133134

134-
this->mFiles = DirectoryLoader::load(this->mDataFolder, "_", ".json"); // already sorted according part staring with marker
135+
this->mFiles = DirectoryLoader::load(this->mDataFolder, "_", this->mExt); // already sorted according part staring with marker
135136
if (this->mCurrentFile != mEndGuard) {
136137
if (this->mFiles.empty()) {
137138
this->mCurrentFile = mEndGuard; // list empty - stick to last element

EventVisualisation/DataConverter/CMakeLists.txt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,28 @@
1010
# or submit itself to any jurisdiction.
1111

1212
o2_add_library(EventVisualisationDataConverter
13-
SOURCES src/VisualisationEvent.cxx
13+
SOURCES src/VisualisationEvent.cxx
1414
src/VisualisationTrack.cxx
1515
src/VisualisationCluster.cxx
1616
src/VisualisationCalo.cxx
1717
src/VisualisationEventSerializer.cxx
1818
src/VisualisationEventJSONSerializer.cxx
19+
src/VisualisationEventROOTSerializer.cxx
1920
PUBLIC_LINK_LIBRARIES RapidJSON::RapidJSON
2021
O2::ReconstructionDataFormats
2122
)
23+
24+
o2_add_executable(eve-convert
25+
SOURCES src/converter.cxx
26+
src/VisualisationEvent.cxx
27+
src/VisualisationEventSerializer.cxx
28+
src/VisualisationEventJSONSerializer.cxx
29+
src/VisualisationEventROOTSerializer.cxx
30+
src/VisualisationTrack.cxx
31+
src/VisualisationCluster.cxx
32+
src/VisualisationCalo.cxx
33+
PUBLIC_LINK_LIBRARIES
34+
O2::EventVisualisationView
35+
RapidJSON::RapidJSON
36+
O2::ReconstructionDataFormats
37+
)

EventVisualisation/DataConverter/include/EventVisualisationDataConverter/VisualisationEvent.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,17 @@ class VisualisationEvent
162162
mCalo.clear();
163163
}
164164

165+
void afterLoading(); // compute internal fields which are not persisted
166+
165167
const VisualisationCluster& getCluster(int i) const { return mClusters[i]; };
166168
size_t getClusterCount() const { return mClusters.size(); } // Returns number of clusters
167-
void setWorkflowVersion(const std::string& workflowVersion) { this->mWorkflowVersion = workflowVersion; }
168169
void setWorkflowParameters(const std::string& workflowParameters) { this->mWorkflowParameters = workflowParameters; }
169170

170171
std::string getCollisionTime() const { return this->mCollisionTime; }
171172
void setCollisionTime(std::string collisionTime) { this->mCollisionTime = collisionTime; }
172173

174+
void setEveVersion(std::string eveVersion) { this->mEveVersion = eveVersion; }
175+
173176
float getMinTimeOfTracks() const { return this->mMinTimeOfTracks; }
174177
float getMaxTimeOfTracks() const { return this->mMaxTimeOfTracks; } /// maximum time of tracks in the event
175178

@@ -202,7 +205,7 @@ class VisualisationEvent
202205

203206
float mMinTimeOfTracks; /// minimum time of tracks in the event
204207
float mMaxTimeOfTracks; /// maximum time of tracks in the event
205-
std::string mWorkflowVersion; /// workflow version used to generate this Event
208+
std::string mEveVersion; /// workflow version used to generate this Event
206209
std::string mWorkflowParameters; /// workflow parameters used to generate this Event
207210
int mEventNumber; /// event number in file
208211
double mEnergy; /// energy of the collision

EventVisualisation/DataConverter/include/EventVisualisationDataConverter/VisualisationEventJSONSerializer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ namespace event_visualisation
2929
class VisualisationEventJSONSerializer : public VisualisationEventSerializer
3030
{
3131
static int getIntOrDefault(rapidjson::Value& tree, const char* key, int defaultValue = 0);
32+
float getFloatOrDefault(rapidjson::Value& tree, const char* key, float defaultValue = 0.0f);
33+
std::string getStringOrDefault(rapidjson::Value& tree, const char* key, const char* defaultValue = "");
3234

3335
std::string toJson(const VisualisationEvent& event) const;
3436
void fromJson(VisualisationEvent& event, std::string json);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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+
12+
///
13+
/// \file VisualisationEventSerializer.h
14+
/// \author Julian Myrcha
15+
///
16+
17+
#ifndef O2EVE_VISUALISATIONEVENTROOTSERIALIZER_H
18+
#define O2EVE_VISUALISATIONEVENTROOTSERIALIZER_H
19+
20+
#include "EventVisualisationDataConverter/VisualisationEventSerializer.h"
21+
#include "EventVisualisationDataConverter/VisualisationTrack.h"
22+
#include <string>
23+
#include <TFile.h>
24+
25+
namespace o2
26+
{
27+
namespace event_visualisation
28+
{
29+
30+
class VisualisationEventROOTSerializer : public VisualisationEventSerializer
31+
{
32+
static void save(const char* name, int value);
33+
static int readInt(TFile& f, const char* name);
34+
static void save(const char* name, const std::string& value);
35+
static std::string readString(TFile& f, const char* name);
36+
37+
public:
38+
bool fromFile(VisualisationEvent& event, std::string fileName) override;
39+
void toFile(const VisualisationEvent& event, std::string fileName) override;
40+
~VisualisationEventROOTSerializer() override = default;
41+
};
42+
43+
} // namespace event_visualisation
44+
} // namespace o2
45+
46+
#endif // O2EVE_VISUALISATIONEVENTROOTSERIALIZER_H

EventVisualisation/DataConverter/include/EventVisualisationDataConverter/VisualisationEventSerializer.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "EventVisualisationDataConverter/VisualisationEvent.h"
2020
#include <string>
21+
#include <map>
2122

2223
namespace o2
2324
{
@@ -26,19 +27,14 @@ namespace event_visualisation
2627

2728
class VisualisationEventSerializer
2829
{
29-
static VisualisationEventSerializer* instance;
30+
static std::map<std::string, VisualisationEventSerializer*> instances;
3031

3132
protected:
3233
VisualisationEventSerializer() = default;
3334
static std::string fileNameIndexed(const std::string fileName, const int index);
3435

3536
public:
36-
static VisualisationEventSerializer* getInstance() { return instance; }
37-
static void setInstance(VisualisationEventSerializer* newInstance)
38-
{ // take ownership
39-
delete instance;
40-
instance = newInstance;
41-
}
37+
static VisualisationEventSerializer* getInstance(std::string ext) { return instances[ext]; }
4238
virtual bool fromFile(VisualisationEvent& event, std::string fileName) = 0;
4339
virtual void toFile(const VisualisationEvent& event, std::string fileName) = 0;
4440
virtual ~VisualisationEventSerializer() = default;

0 commit comments

Comments
 (0)