Skip to content

Commit 22f8ca8

Browse files
jmyrchaJulian Myrcha
andauthored
o2-eve: online production of screenshots in specified folder (for out… (AliceO2Group#9399)
* o2-eve: online production of screenshots in specified folder (for outreach) * fix call to fairlogger Co-authored-by: Julian Myrcha <[email protected]>
1 parent 90af7df commit 22f8ca8

File tree

12 files changed

+66
-24
lines changed

12 files changed

+66
-24
lines changed

EventVisualisation/Base/include/EventVisualisationBase/ConfigurationManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace o2
2424
namespace event_visualisation
2525
{
2626
/// Version of the software
27-
const static std::string o2_eve_version = "1.32";
27+
const static std::string o2_eve_version = "1.35";
2828

2929
/// Configuration Manager allows an easy access to the config file.
3030
///

EventVisualisation/Base/include/EventVisualisationBase/DataSource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class DataSource
7070
virtual void saveCurrentEvent(std::string /*targetFolder*/){};
7171
virtual int getRunNumber() const { return 0; }
7272
virtual void setRunNumber(int) {}
73+
virtual std::string getEventName() { return "event"; };
7374
virtual int getFirstTForbit() const { return 0; }
7475
virtual void setFirstTForbit(int) {}
7576
virtual std::string getCollisionTime() const { return "not specified"; }

EventVisualisation/Base/include/EventVisualisationBase/DataSourceOnline.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class DataSourceOnline : public DataSource
5858
void saveCurrentEvent(std::string targetFolder) override { mFileWatcher.saveCurrentFileToFolder(targetFolder); };
5959
int getRunNumber() const override { return this->mRunNumber; }
6060
void setRunNumber(int runNumber) override { this->mRunNumber = runNumber; }
61+
std::string getEventName() override { return mFileWatcher.currentItem(); };
6162
int getFirstTForbit() const override { return this->mFirstTForbit; }
6263
void setFirstTForbit(int firstTForbit) override { this->mFirstTForbit = firstTForbit; }
6364
std::string getCollisionTime() const override { return this->mCollisionTime; }

EventVisualisation/Base/include/EventVisualisationBase/DirectoryLoader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ namespace event_visualisation
2727
class DirectoryLoader
2828
{
2929
public:
30-
static std::deque<std::string> load(const std::string& path, const std::string& marker);
30+
static std::deque<std::string> load(const std::string& path, const std::string& marker, const std::string& ext);
31+
static void reduceNumberOfFiles(const std::string& path, const std::deque<std::string>& files, std::size_t filesInFolder);
3132
};
3233

3334
} // namespace event_visualisation

EventVisualisation/Base/src/DirectoryLoader.cxx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
using namespace std;
2121
using namespace o2::event_visualisation;
2222

23-
deque<string> DirectoryLoader::load(const std::string& path, const std::string& marker)
23+
deque<string> DirectoryLoader::load(const std::string& path, const std::string& marker, const std::string& ext)
2424
{
2525
deque<string> result;
2626
for (const auto& entry : std::filesystem::directory_iterator(path)) {
27-
if (entry.path().extension() == ".json") {
27+
if (entry.path().extension() == ext) {
2828
result.push_back(entry.path().filename());
2929
}
3030
}
@@ -36,3 +36,11 @@ deque<string> DirectoryLoader::load(const std::string& path, const std::string&
3636

3737
return result;
3838
}
39+
40+
void DirectoryLoader::reduceNumberOfFiles(const std::string& path, const std::deque<std::string>& files, std::size_t filesInFolder)
41+
{
42+
int items = files.size() - std::min(files.size(), filesInFolder);
43+
for (int i = 0; i < items; i++) {
44+
std::remove((path + "/" + files[i]).c_str()); // delete file
45+
}
46+
}

EventVisualisation/Base/src/FileWatcher.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ bool FileWatcher::refresh()
131131
LOG(info) << "previous:" << previous;
132132
LOG(info) << "currentFile:" << this->mCurrentFile;
133133

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

EventVisualisation/View/include/EventVisualisationView/Options.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class Options
3333
std::string mFileName; // -f 'data.root'
3434
std::string mDataFolder; // -d './'
3535
std::string mSavedDataFolder; // -s './'
36+
std::string mImageFolder; // -i './'
3637
long mMemoryLimit; // -m 1500 (MB) = 1.5GB
3738
bool mHideDplGUI; // -hg
3839
std::string mAODConverterPath; // -a 'o2-eve-aodconverter'
@@ -51,6 +52,7 @@ class Options
5152
bool json() { return this->mJSON; }
5253
bool online() { return this->mOnline; }
5354
std::string dataFolder() { return this->mDataFolder; }
55+
std::string imageFolder() { return this->mImageFolder; }
5456
std::string savedDataFolder() { return this->mSavedDataFolder; }
5557
std::string fileName() { return this->mFileName; }
5658
bool randomTracks() { return this->mRandomTracks; }

EventVisualisation/View/include/EventVisualisationView/Screenshot.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ class Screenshot
3333
static TASImage* ScaleImage(TASImage* image, UInt_t desiredWidth, UInt_t desiredHeight, const std::string& backgroundColor);
3434

3535
public:
36-
static void perform(o2::detectors::DetID::mask_t detectorsMask, int runNumber, int firstTForbit, std::string collisionTime);
36+
static void perform(std::string fileName, o2::detectors::DetID::mask_t detectorsMask, int runNumber, int firstTFOrbit, std::string collisionTime);
3737
};
3838

3939
} // namespace event_visualisation
4040
} // namespace o2
4141

42-
#endif // ALICE_O2_EVENTVISUALISATION_SCREENSHOT_H
42+
#endif // ALICE_O2_EVENTVISUALISATION_SCREENSHOT_H

EventVisualisation/View/src/EventManagerFrame.cxx

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <TTimer.h>
2222
#include <TGDoubleSlider.h>
2323
#include <EventVisualisationBase/DataSourceOnline.h>
24+
#include <EventVisualisationBase/ConfigurationManager.h>
25+
#include <EventVisualisationBase/DirectoryLoader.h>
2426
#include <EventVisualisationView/EventManagerFrame.h>
2527
#include <EventVisualisationView/MultiView.h>
2628
#include <EventVisualisationView/Screenshot.h>
@@ -267,7 +269,19 @@ void EventManagerFrame::DoScreenshot()
267269
if (not setInTick()) {
268270
return;
269271
}
270-
Screenshot::perform(this->mEventManager->getDataSource()->getDetectorsMask(),
272+
273+
std::time_t time = std::time(nullptr);
274+
char time_str[100];
275+
std::strftime(time_str, sizeof(time_str), "%Y_%m_%d_%H_%M_%S", std::localtime(&time));
276+
TEnv settings;
277+
ConfigurationManager::getInstance().getConfig(settings);
278+
std::string outDirectory = settings.GetValue("screenshot.path", "Screenshots");
279+
std::ostringstream filepath;
280+
filepath << outDirectory << "/Screenshot_" << time_str << ".png";
281+
if (!std::filesystem::is_directory(outDirectory)) {
282+
std::filesystem::create_directory(outDirectory);
283+
}
284+
Screenshot::perform(filepath.str(), this->mEventManager->getDataSource()->getDetectorsMask(),
271285
this->mEventManager->getDataSource()->getRunNumber(),
272286
this->mEventManager->getDataSource()->getFirstTForbit(),
273287
this->mEventManager->getDataSource()->getCollisionTime());
@@ -312,6 +326,21 @@ void EventManagerFrame::DoTimeTick()
312326

313327
if (refreshNeeded) {
314328
mEventManager->displayCurrentEvent();
329+
if (!Options::Instance()->imageFolder().empty()) {
330+
string fileName = mEventManager->getInstance().getDataSource()->getEventName();
331+
string imageFolder = Options::Instance()->imageFolder();
332+
if (!std::filesystem::is_directory(imageFolder)) {
333+
std::filesystem::create_directory(imageFolder);
334+
}
335+
fileName = imageFolder + "/" + fileName.substr(0, fileName.find_last_of('.')) + ".png";
336+
Screenshot::perform(fileName, this->mEventManager->getDataSource()->getDetectorsMask(),
337+
this->mEventManager->getDataSource()->getRunNumber(),
338+
this->mEventManager->getDataSource()->getFirstTForbit(),
339+
this->mEventManager->getDataSource()->getCollisionTime());
340+
DirectoryLoader::reduceNumberOfFiles(imageFolder, DirectoryLoader::load(imageFolder, "_", ".png"), 10);
341+
342+
LOG(info) << mEventManager->getInstance().getDataSource()->getEventName();
343+
}
315344
}
316345
mEventId->SetIntNumber(mEventManager->getDataSource()->getCurrentEvent());
317346
clearInTick();

EventVisualisation/View/src/Options.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ bool Options::processCommandLine(int argc, char* argv[])
5757
eveOptions.add_options()(
5858
"help,h", "produce help message")(
5959
"datafolder,d", bpo::value<decltype(this->mDataFolder)>()->default_value("./json"), "name of the data folder")(
60+
"imagefolder,i", bpo::value<decltype(this->mImageFolder)>()->default_value(""), "name of the image folder")(
6061
"filename,f", bpo::value<decltype(this->mFileName)>()->default_value("data.root"), "name of the data file")(
6162
"json,j", bpo::value<decltype(this->mJSON)>()->zero_tokens()->default_value(false), "use json files as a source")(
6263
"memorylimit,m", bpo::value<decltype(this->mMemoryLimit)>()->default_value(-1), "memory usage limit (MB) - app will terminate if it is exceeded (pass -1 for no limit)")(
@@ -89,6 +90,7 @@ bool Options::processCommandLine(int argc, char* argv[])
8990
}
9091

9192
this->mDataFolder = varmap["datafolder"].as<decltype(this->mDataFolder)>();
93+
this->mImageFolder = varmap["imagefolder"].as<decltype(this->mImageFolder)>();
9294
this->mFileName = varmap["filename"].as<decltype(this->mFileName)>();
9395
this->mJSON = varmap["json"].as<decltype(this->mJSON)>();
9496
this->mMemoryLimit = varmap["memorylimit"].as<decltype(this->mMemoryLimit)>();

0 commit comments

Comments
 (0)