Skip to content

Commit fc4ba28

Browse files
authored
Event display screenshot functionality update
screenshot updated
1 parent 56db42b commit fc4ba28

12 files changed

Lines changed: 155 additions & 48 deletions

File tree

EventVisualisation/Base/include/EventVisualisationBase/DataSource.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ class DataSource
5555

5656
virtual void changeDataFolder(std::string /*newFolder*/){};
5757
virtual void saveCurrentEvent(std::string /*targetFolder*/){};
58+
virtual int getRunNumber() const { return 0; }
59+
virtual void setRunNumber(int) {}
60+
virtual std::string getCollisionTime() const { return "not specified"; }
61+
virtual void setCollisionTime(std::string) {}
5862
};
5963

6064
} // namespace event_visualisation

EventVisualisation/Base/include/EventVisualisationBase/DataSourceOnline.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class DataSourceOnline : public DataSource
3131
{
3232
protected:
3333
FileWatcher mFileWatcher;
34+
int mRunNumber;
35+
std::string mCollisionTime;
3436

3537
public:
3638
DataSourceOnline(const std::string path);
@@ -50,6 +52,10 @@ class DataSourceOnline : public DataSource
5052
std::vector<std::pair<VisualisationEvent, EVisualisationGroup>> getVisualisationList(int no) override;
5153
void changeDataFolder(std::string newFolder) override { mFileWatcher.changeFolder(newFolder); };
5254
void saveCurrentEvent(std::string targetFolder) override { mFileWatcher.saveCurrentFileToFolder(targetFolder); };
55+
int getRunNumber() const override { return this->mRunNumber; }
56+
void setRunNumber(int runNumber) override { this->mRunNumber = runNumber; }
57+
std::string getCollisionTime() const override { return this->mCollisionTime; }
58+
void setCollisionTime(std::string collisionTime) override { this->mCollisionTime = collisionTime; }
5359
};
5460

5561
} // namespace event_visualisation

EventVisualisation/Base/src/DataSourceOnline.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ std::vector<std::pair<VisualisationEvent, EVisualisationGroup>> DataSourceOnline
3636

3737
mFileWatcher.setCurrentItem(no);
3838
VisualisationEvent vEvent = this->mDataReader->getEvent(mFileWatcher.currentFilePath());
39+
this->setRunNumber(vEvent.getRunNumber());
40+
this->setCollisionTime(vEvent.getCollisionTime());
3941

4042
for(auto filter = EVisualisationGroup::ITS;
4143
filter != EVisualisationGroup::NvisualisationGroups;

EventVisualisation/DataConverter/include/EventVisualisationDataConverter/VisualisationEvent.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ class VisualisationEvent
5959
/// by providing their names
6060
struct VisualisationEventVO {
6161
int eventNumber;
62-
int runNumber;
62+
o2::header::DataHeader::RunNumberType runNumber;
6363
double energy;
6464
int multiplicity;
6565
std::string collidingSystem;
66-
time_t timeStamp;
66+
time_t collisionTime;
6767
};
6868
// Default constructor
6969
VisualisationEvent(const VisualisationEventVO vo);
@@ -117,17 +117,23 @@ class VisualisationEvent
117117
void setWorkflowVersion(float workflowVersion) { this->mWorkflowVersion = workflowVersion; }
118118
void setWorkflowParameters(const std::string& workflowParameters) { this->mWorkflowParameters = workflowParameters; }
119119

120+
o2::header::DataHeader::RunNumberType getRunNumber() const { return this->mRunNumber; }
121+
void setRunNumber(o2::header::DataHeader::RunNumberType runNumber) { this->mRunNumber = runNumber; }
122+
123+
std::string getCollisionTime() const { return this->mCollisionTime; }
124+
void setCollisionTime(std::string collisionTime) { this->mCollisionTime = collisionTime; }
125+
120126
private:
121-
float mWorkflowVersion; /// workflow version used to generate this Event
122-
std::string mWorkflowParameters; /// workflow parameters used to generate this Event
123-
int mEventNumber; /// event number in file
124-
int mRunNumber; /// run number
125-
double mEnergy; /// energy of the collision
126-
int mMultiplicity; /// number of particles reconstructed
127-
std::string mCollidingSystem; /// colliding system (e.g. proton-proton)
128-
std::time_t mTimeStamp; /// collision timestamp
129-
std::vector<VisualisationTrack> mTracks; /// an array of visualisation tracks
130-
std::vector<VisualisationCluster> mClusters; /// an array of visualisation clusters
127+
float mWorkflowVersion; /// workflow version used to generate this Event
128+
std::string mWorkflowParameters; /// workflow parameters used to generate this Event
129+
int mEventNumber; /// event number in file
130+
o2::header::DataHeader::RunNumberType mRunNumber; /// run number
131+
double mEnergy; /// energy of the collision
132+
int mMultiplicity; /// number of particles reconstructed
133+
std::string mCollidingSystem; /// colliding system (e.g. proton-proton)
134+
std::string mCollisionTime; /// collision timestamp
135+
std::vector<VisualisationTrack> mTracks; /// an array of visualisation tracks
136+
std::vector<VisualisationCluster> mClusters; /// an array of visualisation clusters
131137
};
132138

133139
} // namespace event_visualisation

EventVisualisation/DataConverter/src/VisualisationEvent.cxx

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ VisualisationEvent::VisualisationEvent(VisualisationEventVO vo)
9191
this->mEnergy = vo.energy;
9292
this->mMultiplicity = vo.multiplicity;
9393
this->mCollidingSystem = vo.collidingSystem;
94-
this->mTimeStamp = vo.timeStamp;
94+
this->mCollisionTime = vo.collisionTime;
9595
}
9696

9797
std::string VisualisationEvent::toJson()
@@ -101,7 +101,8 @@ std::string VisualisationEvent::toJson()
101101

102102
// compatibility verification
103103
tree.AddMember("fileVersion", rapidjson::Value().SetInt(JSON_FILE_VERSION), allocator);
104-
tree.AddMember("timeStamp", rapidjson::Value().SetFloat(this->mTimeStamp), allocator);
104+
tree.AddMember("runNumber", rapidjson::Value().SetInt(this->mRunNumber), allocator);
105+
tree.AddMember("collisionTime", rapidjson::Value().SetString(this->mCollisionTime.c_str(), this->mCollisionTime.size()), allocator);
105106
tree.AddMember("workflowVersion", rapidjson::Value().SetFloat(this->mWorkflowVersion), allocator);
106107
tree.AddMember("workflowParameters", rapidjson::Value().SetString(this->mWorkflowParameters.c_str(), this->mWorkflowParameters.size()), allocator);
107108
// Tracks
@@ -160,15 +161,23 @@ void VisualisationEvent::fromJson(std::string json)
160161

161162
auto version = 1;
162163
if (tree.HasMember("fileVersion")) {
163-
rapidjson::Value& fileVersion = tree["fileVersion"];
164-
version = fileVersion.GetInt();
164+
rapidjson::Value& jsonFileVersion = tree["fileVersion"];
165+
version = jsonFileVersion.GetInt();
165166
}
166-
auto timeStamp = time(nullptr);
167-
if (tree.HasMember("timeStamp")) {
168-
rapidjson::Value& fileTimeStamp = tree["timeStamp"];
169-
timeStamp = fileTimeStamp.GetFloat();
167+
168+
o2::header::DataHeader::RunNumberType runNumber = 0;
169+
if (tree.HasMember("runNumber")) {
170+
rapidjson::Value& jsonRunNumber = tree["runNumber"];
171+
runNumber = jsonRunNumber.GetInt();
172+
}
173+
this->setRunNumber(runNumber);
174+
175+
auto collisionTime = "not specified";
176+
if (tree.HasMember("collisionTime")) {
177+
rapidjson::Value& jsonCollisionTime = tree["collisionTime"];
178+
collisionTime = jsonCollisionTime.GetString();
170179
}
171-
this->mTimeStamp = timeStamp;
180+
this->setCollisionTime(collisionTime);
172181

173182
rapidjson::Value& trackCount = tree["trackCount"];
174183
this->mTracks.reserve(trackCount.GetInt());
@@ -220,7 +229,7 @@ bool VisualisationEvent::fromFile(std::string fileName)
220229

221230
VisualisationEvent::VisualisationEvent()
222231
{
223-
this->mTimeStamp = time(nullptr); // current time
232+
this->mCollisionTime = ""; // collision time not set
224233
}
225234

226235
} // namespace event_visualisation

EventVisualisation/View/include/EventVisualisationView/EventManagerFrame.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class EventManagerFrame : public TGMainFrame
4545
static TGTextButton* makeButton(TGCompositeFrame* p, const char* txt, Int_t width = 0,
4646
Int_t lo = 0, Int_t ro = 0, Int_t to = 0, Int_t bo = 0);
4747
bool CopyImage(TASImage* dst, TASImage* src, Int_t x_dst = 0, Int_t y_dst = 0, Int_t x_src = 0, Int_t y_src = 0, UInt_t w_src = 0, UInt_t h_src = 0);
48+
TASImage* ScaleImage(TASImage* image, UInt_t desiredWidth, UInt_t desiredHeight);
4849

4950
protected:
5051
o2::event_visualisation::EventManager* mEventManager; // Model object.

EventVisualisation/View/src/EventManagerFrame.cxx

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,23 +167,34 @@ namespace o2
167167
char time_str[100];
168168
std::strftime(time_str, sizeof(time_str), "%Y_%m_%d_%H_%M_%S", std::localtime(&time));
169169

170+
TASImage* scaledImage;
171+
170172
std::ostringstream filepath;
171173
filepath << outDirectory << "/Screenshot_" << time_str << ".png";
172174

173175
TASImage image(width, height);
174176
image.FillRectangle(backgroundColor, 0, 0, width, height);
175177

176178
TImage* view3dImage = MultiView::getInstance()->getView(MultiView::EViews::View3d)->GetGLViewer()->GetPictureUsingBB();
177-
view3dImage->Scale(width * 0.65, height * 0.95);
178-
CopyImage(&image, (TASImage*)view3dImage, width * 0.015, height * 0.025, 0, 0, view3dImage->GetWidth(), view3dImage->GetHeight());
179+
scaledImage = ScaleImage((TASImage*)view3dImage, width * 0.65, height * 0.95);
180+
if (scaledImage) {
181+
CopyImage(&image, scaledImage, width * 0.015, height * 0.025, 0, 0, scaledImage->GetWidth(), scaledImage->GetHeight());
182+
delete scaledImage;
183+
}
179184

180185
TImage* viewRphiImage = MultiView::getInstance()->getView(MultiView::EViews::ViewRphi)->GetGLViewer()->GetPictureUsingBB();
181-
viewRphiImage->Scale(width * 0.3, height * 0.45);
182-
CopyImage(&image, (TASImage*)viewRphiImage, width * 0.68, height * 0.025, 0, 0, viewRphiImage->GetWidth(), viewRphiImage->GetHeight());
186+
scaledImage = ScaleImage((TASImage*)viewRphiImage, width * 0.3, height * 0.45);
187+
if (scaledImage) {
188+
CopyImage(&image, scaledImage, width * 0.68, height * 0.025, 0, 0, scaledImage->GetWidth(), scaledImage->GetHeight());
189+
delete scaledImage;
190+
}
183191

184192
TImage* viewZrhoImage = MultiView::getInstance()->getView(MultiView::EViews::ViewZrho)->GetGLViewer()->GetPictureUsingBB();
185-
viewZrhoImage->Scale(width * 0.3, height * 0.45);
186-
CopyImage(&image, (TASImage*)viewZrhoImage, width * 0.68, height * 0.525, 0, 0, viewZrhoImage->GetWidth(), viewZrhoImage->GetHeight());
193+
scaledImage = ScaleImage((TASImage*)viewZrhoImage, width * 0.3, height * 0.45);
194+
if (scaledImage) {
195+
CopyImage(&image, scaledImage, width * 0.68, height * 0.525, 0, 0, scaledImage->GetWidth(), scaledImage->GetHeight());
196+
delete scaledImage;
197+
}
187198

188199
bool logo = true;
189200
if (logo) {
@@ -226,7 +237,17 @@ namespace o2
226237

227238
image.BeginPaint();
228239
for (int i = 0; i < 4; i++) {
229-
lines.push_back("");
240+
lines.push_back(""); // make sure that at least 4 lines are exising
241+
}
242+
if (!this->mEventManager->getDataSource()->getCollisionTime().empty()) {
243+
char buff[100];
244+
snprintf(buff, sizeof(buff), "Run number: %d", (int)this->mEventManager->getDataSource()->getRunNumber());
245+
lines[0] = buff;
246+
snprintf(buff, sizeof(buff), "Date: %s", this->mEventManager->getDataSource()->getCollisionTime().c_str());
247+
lines[1] = buff;
248+
}
249+
250+
for (int i = 0; i < 4; i++) {
230251
image.DrawText(textX, textY + i * textLineHeight, lines[i].c_str(), fontSize, "#BBBBBB", "FreeSansBold.otf");
231252
}
232253
image.EndPaint();
@@ -409,5 +430,41 @@ namespace o2
409430
return true;
410431
}
411432

433+
TASImage* EventManagerFrame::ScaleImage(TASImage* image, UInt_t desiredWidth, UInt_t desiredHeight)
434+
{
435+
if (!image) {
436+
return nullptr;
437+
}
438+
if (desiredWidth == 0 || desiredHeight == 0) {
439+
return nullptr;
440+
}
441+
442+
const char* backgroundColor = "#000000";
443+
444+
UInt_t scaleWidth = desiredWidth;
445+
UInt_t scaleHeight = desiredHeight;
446+
UInt_t offsetWidth = 0;
447+
UInt_t offsetHeight = 0;
448+
449+
float aspectRatio = (float)image->GetWidth() / (float)image->GetHeight();
450+
451+
if (desiredWidth >= aspectRatio * desiredHeight) {
452+
scaleWidth = (UInt_t)(aspectRatio * desiredHeight);
453+
offsetWidth = (desiredWidth - scaleWidth) / 2.0f;
454+
} else {
455+
scaleHeight = (UInt_t)((1.0f / aspectRatio) * desiredWidth);
456+
offsetHeight = (desiredHeight - scaleHeight) / 2.0f;
457+
}
458+
459+
TASImage* scaledImage = new TASImage(desiredWidth, desiredHeight);
460+
scaledImage->FillRectangle(backgroundColor, 0, 0, desiredWidth, desiredHeight);
461+
462+
image->Scale(scaleWidth, scaleHeight);
463+
464+
CopyImage(scaledImage, image, offsetWidth, offsetHeight, 0, 0, scaleWidth, scaleHeight);
465+
466+
return scaledImage;
467+
}
468+
412469
} // namespace event_visualisation
413470
}

EventVisualisation/Workflow/include/EveWorkflow/AO2DConverter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ struct AO2DConverter {
4141
o2::framework::Configurable<std::string> jsonPath{"jsons-folder", "./jsons", "name of the folder to store json files"};
4242

4343
static constexpr float mWorkflowVersion = 1.00;
44+
o2::header::DataHeader::RunNumberType mRunNumber = 1;
45+
o2::framework::DataProcessingHeader::CreationTime mCreationTime;
4446

4547
void init(o2::framework::InitContext& ic);
4648
void process(o2::aod::Collisions const& collisions, EveWorkflowHelper::AODFullTracks const& tracks);

EventVisualisation/Workflow/include/EveWorkflow/EveWorkflowHelper.h

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

1919
#include "ReconstructionDataFormats/GlobalTrackID.h"
20+
#include "Framework/DataProcessingHeader.h"
2021
#include "DataFormatsTRD/TrackTRD.h"
2122
#include "DataFormatsGlobalTracking/RecoContainer.h"
2223
#include "EveWorkflow/EveConfiguration.h"
@@ -105,7 +106,12 @@ class EveWorkflowHelper
105106
void selectTracks(const CalibObjectsConst* calib, GID::mask_t maskCl,
106107
GID::mask_t maskTrk, GID::mask_t maskMatch);
107108
void addTrackToEvent(const o2::track::TrackParCov& tr, GID gid, float trackTime, float dz, GID::Source source = GID::NSources);
108-
void draw(const std::string& jsonPath, int numberOfFiles, int numberOfTracks, o2::dataformats::GlobalTrackID::mask_t trkMask, o2::dataformats::GlobalTrackID::mask_t clMask, float mWorkflowVersion);
109+
void draw(const std::string& jsonPath, int numberOfFiles, int numberOfTracks,
110+
o2::dataformats::GlobalTrackID::mask_t trkMask,
111+
o2::dataformats::GlobalTrackID::mask_t clMask,
112+
o2::header::DataHeader::RunNumberType runNumber,
113+
o2::framework::DataProcessingHeader::CreationTime creation,
114+
float mWorkflowVersion);
109115
void drawTPC(GID gid, float trackTime);
110116
void drawITS(GID gid, float trackTime);
111117
void drawMFT(GID gid, float trackTime);
@@ -129,11 +135,16 @@ class EveWorkflowHelper
129135
void drawPoint(float x, float y, float z, float trackTime) { mEvent.addCluster(x, y, z, trackTime); }
130136
void prepareITSClusters(const o2::itsmft::TopologyDictionary& dict); // fills mITSClustersArray
131137
void prepareMFTClusters(const o2::itsmft::TopologyDictionary& dict); // fills mMFTClustersArray
132-
void save(const std::string& jsonPath, int numberOfFiles,
133-
o2::dataformats::GlobalTrackID::mask_t trkMask, o2::dataformats::GlobalTrackID::mask_t clMask,
134-
float workflowVersion);
135138
void clear() { mEvent.clear(); }
136139

140+
void save(const std::string& jsonPath,
141+
int numberOfFiles,
142+
o2::dataformats::GlobalTrackID::mask_t trkMask,
143+
o2::dataformats::GlobalTrackID::mask_t clMask,
144+
float workflowVersion,
145+
o2::header::DataHeader::RunNumberType runNumber,
146+
o2::framework::DataProcessingHeader::CreationTime creationTime);
147+
137148
o2::globaltracking::RecoContainer mRecoCont;
138149
o2::globaltracking::RecoContainer& getRecoContainer() { return mRecoCont; }
139150
TracksSet mTrackSet;

EventVisualisation/Workflow/src/AO2DConverter.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void AO2DConverter::process(o2::aod::Collisions const& collisions, EveWorkflowHe
5050
mHelper->drawAOD(track, c.collisionTime());
5151
}
5252

53-
mHelper->save(jsonPath, collisions.size(), GlobalTrackID::MASK_ALL, GlobalTrackID::MASK_NONE, mWorkflowVersion);
53+
mHelper->save(jsonPath, collisions.size(), GlobalTrackID::MASK_ALL, GlobalTrackID::MASK_NONE, mWorkflowVersion, mRunNumber, mCreationTime);
5454
mHelper->clear();
5555
}
5656
}

0 commit comments

Comments
 (0)