Project
Loading...
Searching...
No Matches
EventManager.cxx
Go to the documentation of this file.
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
18
19#include <unordered_map>
29#include <TEveManager.h>
30#include <TEveTrack.h>
31#include <TEveTrackPropagator.h>
32#include <TEveElement.h>
33#include <TGListTree.h>
34#include <TEveCalo.h>
35#include <fairlogger/Logger.h>
36#include <rapidjson/document.h>
37#include <rapidjson/stringbuffer.h>
38#include <rapidjson/writer.h>
39#include <gsl/span>
40
41#define elemof(e) (unsigned int)(sizeof(e) / sizeof(e[0]))
42
43using namespace std;
44using namespace rapidjson;
45
46namespace o2
47{
48namespace event_visualisation
49{
50
51EventManager* EventManager::instance = nullptr;
52
54{
55 if (instance == nullptr) {
56 instance = new EventManager();
57 }
58 return *instance;
59}
60
61EventManager::EventManager() : TEveEventManager("Event", "")
62{
63 LOGF(info, "Initializing TEveManager");
64
66
67 vizSettings.firstEvent = true;
68
69 for (int i = 0; i < NvisualisationGroups; i++) {
70 vizSettings.trackVisibility[i] = true;
71 vizSettings.trackColor[i] = settings.GetValue("tracks.byType.unknown", kMagenta);
72 vizSettings.trackStyle[i] = 1;
73 vizSettings.trackWidth[i] = 1;
74 vizSettings.clusterVisibility[i] = true;
75 vizSettings.clusterColor[i] = settings.GetValue("clusters.byType.unknown", kBlue);
76 vizSettings.clusterStyle[i] = 20;
77 vizSettings.clusterSize[i] = 1.0f;
78 }
79}
80
82{
83 auto start = std::chrono::high_resolution_clock::now();
84 const auto multiView = MultiView::getInstance();
85 const auto dataSource = getDataSource();
86 if (dataSource->getEventCount() > 0) {
87 if (!vizSettings.firstEvent) {
88 saveVisualisationSettings();
89 }
90
91 multiView->destroyAllEvents();
92 int no = dataSource->getCurrentEvent();
93
94 for (int i = 0; i < EVisualisationDataType::NdataTypes; ++i) {
95 dataTypeLists[i] = new TEveElementList(gDataTypeNames[i].c_str());
96 dataTypeListsPhi[i] = new TEveElementList(gDataTypeNames[i].c_str());
97 }
98
99 VisualisationEvent event; // collect calorimeters in one drawing step
100 auto displayList = dataSource->getVisualisationList(no,
101 EventManagerFrame::getInstance().getMinTimeFrameSliderValue(),
102 EventManagerFrame::getInstance().getMaxTimeFrameSliderValue(),
104
105 for (auto it = displayList.begin(); it != displayList.end(); ++it) {
106 if (it->second == EVisualisationGroup::EMC || it->second == EVisualisationGroup::PHS) {
107 displayCalorimeters(it->first, gVisualisationGroupName[it->second]);
108 } else {
109 displayVisualisationEvent(it->first, gVisualisationGroupName[it->second]);
110 }
111 }
112 multiView->registerElements(dataTypeLists, dataTypeListsPhi);
113
114 if (vizSettings.firstEvent) {
115 ifstream s(TEMP_SETTINGS_PATH);
116 if (s.good()) {
117 restoreVisualisationSettings();
118 } else {
119 saveVisualisationSettings();
120 }
121 vizSettings.firstEvent = false;
122 } else {
123 restoreVisualisationSettings();
124 }
125
126 if (dataSource->getRunNumber() != -1) {
127 if (this->mShowDate) {
128 std::string creationTime = dataSource->getCreationTimeAsString();
129 multiView->getAnnotationTop()->SetText(
130 TString::Format("Run %d %s\n%s", dataSource->getRunNumber(),
131 std::string(parameters::GRPECS::RunTypeNames[dataSource->getRunType()]).c_str(),
132 creationTime.c_str()));
133 } else {
134 multiView->getAnnotationTop()->SetText(TString::Format("Run %d", dataSource->getRunNumber()));
135 }
137 multiView->getAnnotationBottom()->SetText(
138 TString::Format("TFOrbit: %d\nDetectors: %s", dataSource->getFirstTForbit(), detectors.c_str()));
139 } else {
140 multiView->getAnnotationTop()->SetText("No Available Data to Display");
141 }
142 }
143 multiView->redraw3D();
144 auto stop = std::chrono::high_resolution_clock::now();
145 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
146}
147
149{
150 if (getDataSource()->getEventCount() > 0) {
151 if (no == -1) {
152 no = getDataSource()->getEventCount() - 1;
153 }
154 this->getDataSource()->setCurrentEvent(no);
156 }
157}
158
160{
161 if (getDataSource()->getEventCount() > 0) {
162 if (this->getDataSource()->getCurrentEvent() < getDataSource()->getEventCount() - 1) {
163 Int_t event = (this->getDataSource()->getCurrentEvent() + 1) % getDataSource()->getEventCount();
165 }
166 }
167}
168
170{
171 if (getDataSource()->getEventCount() > 0) {
172 if (this->getDataSource()->getCurrentEvent() > 0) {
173 GotoEvent(this->getDataSource()->getCurrentEvent() - 1);
174 }
175 }
176}
177
179{
180 if (getDataSource()->getEventCount() > 0) {
181 GotoEvent(this->getDataSource()->getCurrentEvent());
182 }
183}
184
186{
187 delete this->dataSource;
188 this->dataSource = nullptr;
189}
190
192{
193 TEveEventManager::AfterNewEventLoaded();
194}
195
196void EventManager::AddNewEventCommand(const TString& cmd)
197{
198 TEveEventManager::AddNewEventCommand(cmd);
199}
200
202{
203 TEveEventManager::RemoveNewEventCommand(cmd);
204}
205
207{
208 TEveEventManager::ClearNewEventCommands();
209}
210
211EventManager::~EventManager()
212{
213 instance = nullptr;
214}
215
217{
218 DestroyElements();
219}
220
221void EventManager::displayVisualisationEvent(VisualisationEvent& event, const std::string& detectorName)
222{
223 double eta = 0.1;
224 size_t trackCount = event.getTrackCount();
225
226 // tracks
227 auto* list = new TEveTrackList(detectorName.c_str());
228 list->IncDenyDestroy();
229 // clusters
230 size_t clusterCount = 0;
231 auto* point_list = new TEvePointSet(detectorName.c_str());
232 point_list->IncDenyDestroy(); // don't delete if zero parent
233 point_list->SetMarkerColor(settings.GetValue("clusters.byType.unknown", kBlue));
234
235 for (size_t i = 0; i < trackCount; ++i) {
236 VisualisationTrack track = event.getTrack(i);
237 TEveRecTrackD t;
238 t.fSign = track.getCharge() > 0 ? 1 : -1;
239 auto* vistrack = new TEveTrack(&t, &TEveTrackPropagator::fgDefault);
240 vistrack->SetLineColor(settings.GetValue("tracks.byType.unknown", kMagenta));
241 vistrack->SetName(track.getGIDAsString().c_str());
242 size_t pointCount = track.getPointCount();
243 vistrack->Reset(pointCount);
244
245 int points = 0;
246 for (size_t j = 0; j < pointCount; ++j) {
247 auto point = track.getPoint(j);
248 if (point[2] > eta || point[2] < -1 * eta) {
249 vistrack->SetNextPoint(point[0], point[1], point[2]);
250 points++;
251 }
252 }
253 if (points > 0) {
254 list->AddElement(vistrack);
255 }
256
257 // clusters connected with track
258 for (size_t i = 0; i < track.getClusterCount(); ++i) {
259 VisualisationCluster cluster = track.getCluster(i);
260 if (cluster.Z() > eta || cluster.Z() < -1 * eta) { // temporary remove eta=0 artefacts
261 point_list->SetNextPoint(cluster.X(), cluster.Y(), cluster.Z());
262 clusterCount++;
263 }
264 }
265 }
266
267 if (trackCount != 0) {
268 dataTypeLists[EVisualisationDataType::Tracks]->AddElement(list);
269 if (detectorName != "MCH" && detectorName != "MFT" && detectorName != "MID") {
270 dataTypeListsPhi[EVisualisationDataType::Tracks]->AddElement(list);
271 }
272 }
273
274 // global clusters (with no connection information)
275 for (size_t i = 0; i < event.getClusterCount(); ++i) {
276 VisualisationCluster cluster = event.getCluster(i);
277 if (cluster.Z() > eta || cluster.Z() < -1 * eta) { // temporary remove eta=0 artefacts
278 point_list->SetNextPoint(cluster.X(), cluster.Y(), cluster.Z());
279 clusterCount++;
280 }
281 }
282
283 if (clusterCount != 0) {
284 dataTypeLists[EVisualisationDataType::Clusters]->AddElement(point_list);
285 if (detectorName != "MCH" && detectorName != "MFT" && detectorName != "MID") {
286 dataTypeListsPhi[EVisualisationDataType::Clusters]->AddElement(point_list);
287 }
288 }
289
290 LOGF(info, "tracks: ", trackCount, " detector: ", detectorName, ":",
291 dataTypeLists[EVisualisationDataType::Tracks]->NumChildren());
292 LOGF(info, "clusters: ", clusterCount, " detector: ", detectorName, ":",
293 dataTypeLists[EVisualisationDataType::Clusters]->NumChildren());
294}
295
296void EventManager::displayCalorimeters(VisualisationEvent& event, const std::string& detectorName)
297{
298 if (event.getCaloCount() > 0) {
299 struct CaloInfo {
300 std::string name;
301 std::string configColor;
302 int defaultColor;
303 std::string configSizeEta;
304 float sizeEta;
305 std::string configSizePhi;
306 float sizePhi;
307 std::string configNoise;
308 float defaultNoise;
309 std::string configTransparency;
310 int defaultTransparency;
311 std::string configBarrelRadius;
312 int defaultBarrelRadius;
313 std::string configTowerMaxHeight;
314 float defaultTowerMaxHeight;
315 std::string configMaxValAbs;
316 float defaultMaxValAbs;
317 };
318
319 // TODO: calculate values based on info available in O2
320 static const std::unordered_map<o2::dataformats::GlobalTrackID::Source, CaloInfo> caloInfos =
321 {
322 {o2::dataformats::GlobalTrackID::EMC, {"emcal", "emcal.tower.color", kYellow, "emcal.tower.size.eta", 0.0143, "emcal.tower.size.phi", 0.0143, "emcal.tower.noise", 0, "emcal.tower.transparency", 101, "emcal.barrel.radius", 500, "emcal.tower.max.height", 80, "emcal.tower.max.val.abs", 100}},
323 {o2::dataformats::GlobalTrackID::PHS, {"phos", "phos.tower.color", kYellow, "phos.tower.size.eta", 0.0046, "phos.tower.size.phi", 0.00478, "phos.tower.noise", 200, "phos.tower.transparency", 101, "phos.barrel.radius", 550, "phos.tower.max.height", 80, "phos.tower.max.val.abs", 100}},
324 };
325
326 auto data = new TEveCaloDataVec(1);
327 data->IncDenyDestroy();
329
330 const CaloInfo& info = caloInfos.at(key);
331 data->RefSliceInfo(0).Setup(info.name.c_str(),
332 settings.GetValue(info.configNoise.c_str(), info.defaultNoise),
333 settings.GetValue(info.configColor.c_str(), info.defaultColor),
334 settings.GetValue(info.configTransparency.c_str(), info.defaultTransparency));
335
336 const auto dEta = settings.GetValue(info.configSizeEta.c_str(), info.sizeEta) / 2.0;
337 const auto dPhi = settings.GetValue(info.configSizePhi.c_str(), info.sizePhi) / 2.0;
338 const float barrelRadius = settings.GetValue(info.configBarrelRadius.c_str(), info.defaultBarrelRadius);
339
340 struct pair_hash {
341 std::size_t operator()(const std::pair<float, float>& pair) const
342 {
343 return std::hash<float>()(pair.first + 1000.0 * pair.second);
344 }
345 };
346 std::unordered_map<std::pair<float, float>, float, pair_hash> map; // sum up entries for the same tower
347 for (const auto& calo : event.getCalorimetersSpan()) {
348 map[std::make_pair(calo.getEta(), calo.getPhi())] += calo.getEnergy();
349 }
350
351 for (const auto& entry : map) {
352 auto [eta, phi] = entry.first;
353 data->AddTower(eta - dEta, eta + dEta, phi - dPhi, phi + dPhi);
354 data->FillSlice(0, entry.second);
355 }
356
357 // remove artefacts
358 data->AddTower(-0.5, 0.5, -1.574 - 0.1, -1.574 + 0.1);
359 data->AddTower(-0.5, 0.5, 1.574 - 0.1, 1.574 + 0.1);
360 data->AddTower(-0.5, 0.5, -0.593 - 0.1, -0.593 + 0.1);
361 data->AddTower(-0.5, 0.5, -0.726 - 0.1, -0.726 + 0.1);
362 data->AddTower(-0.5, 0.5, -3.028 - 0.1, -3.028 + 0.1);
363 data->AddTower(-0.5, 0.5, -1.915 - 0.1, -1.915 + 0.1);
364
365 data->DataChanged();
366 data->SetAxisFromBins();
367
368 auto calo3d = new TEveCalo3D(data);
369 calo3d->SetName(detectorName.c_str());
370 calo3d->SetScaleAbs(kTRUE);
371 calo3d->SetMaxTowerH(settings.GetValue(info.configTowerMaxHeight.c_str(), info.defaultTowerMaxHeight));
372 calo3d->SetMaxValAbs(settings.GetValue(info.configMaxValAbs.c_str(), info.defaultMaxValAbs));
373 // calo3d->SetAutoRange(kTRUE);
374
375 calo3d->SetBarrelRadius(barrelRadius);
376 calo3d->SetEndCapPos(barrelRadius);
377 calo3d->SetRnrFrame(false, false); // do not draw barrel grid
378
379 dataTypeLists[EVisualisationDataType::Calorimeters]->AddElement(calo3d);
380 dataTypeListsPhi[EVisualisationDataType::Calorimeters]->AddElement(calo3d);
381 }
382}
383
384void EventManager::saveVisualisationSettings()
385{
386 const auto& tracks = *dataTypeLists[EVisualisationDataType::Tracks];
387
388 for (auto elm : tracks.RefChildren()) {
389 auto trackList = static_cast<TEveTrackList*>(elm);
390 int i = findGroupIndex(trackList->GetElementName());
391
392 if (i != -1) {
393 vizSettings.trackVisibility[i] = trackList->GetRnrSelf();
394 vizSettings.trackColor[i] = trackList->GetLineColor();
395 vizSettings.trackStyle[i] = trackList->GetLineStyle();
396 vizSettings.trackWidth[i] = trackList->GetLineWidth();
397 }
398 }
399
400 const auto& clusters = *dataTypeLists[EVisualisationDataType::Clusters];
401
402 for (auto elm : clusters.RefChildren()) {
403 auto clusterSet = static_cast<TEvePointSet*>(elm);
404 int i = findGroupIndex(clusterSet->GetElementName());
405
406 if (i != -1) {
407 vizSettings.clusterVisibility[i] = clusterSet->GetRnrSelf();
408 vizSettings.clusterColor[i] = clusterSet->GetMarkerColor();
409 vizSettings.clusterStyle[i] = clusterSet->GetMarkerStyle();
410 vizSettings.clusterSize[i] = clusterSet->GetMarkerSize();
411 }
412 }
413
414 ofstream settings(TEMP_SETTINGS_PATH);
415
416 if (settings.good()) {
417 Document d;
418 d.SetObject();
419 auto& allocator = d.GetAllocator();
420
421 auto jsonArray = [](const auto& array, auto& allocator) {
422 Value arr(kArrayType);
423
424 for (const auto& value : array) {
425 arr.PushBack(value, allocator);
426 }
427
428 return arr;
429 };
430 std::string version = std::to_string(o2_eve_version / 100.0);
431 d.AddMember("version", rapidjson::Value().SetString(version.c_str(), version.length()), allocator); // obsolete
432 d.AddMember("trackVisibility", jsonArray(vizSettings.trackVisibility, allocator), allocator);
433 d.AddMember("trackColor", jsonArray(vizSettings.trackColor, allocator), allocator);
434 d.AddMember("trackStyle", jsonArray(vizSettings.trackStyle, allocator), allocator);
435 d.AddMember("trackWidth", jsonArray(vizSettings.trackWidth, allocator), allocator);
436 d.AddMember("clusterVisibility", jsonArray(vizSettings.clusterVisibility, allocator), allocator);
437 d.AddMember("clusterColor", jsonArray(vizSettings.clusterColor, allocator), allocator);
438 d.AddMember("clusterStyle", jsonArray(vizSettings.clusterStyle, allocator), allocator);
439 d.AddMember("clusterSize", jsonArray(vizSettings.clusterSize, allocator), allocator);
440
441 auto jsonCamera = [&jsonArray](MultiView::EViews view, auto& allocator) {
442 Value obj(kObjectType);
443
444 auto& camera = MultiView::getInstance()->getView(view)->GetGLViewer()->CurrentCamera();
445
446 const gsl::span baseSpan(camera.RefCamBase().CArr(), 16);
447 obj.AddMember("base", jsonArray(baseSpan, allocator), allocator);
448
449 const gsl::span transSpan(camera.GetCamTrans().CArr(), 16);
450 obj.AddMember("trans", jsonArray(transSpan, allocator), allocator);
451
452 if (camera.IsOrthographic()) {
453 obj.AddMember("zoom", dynamic_cast<TGLOrthoCamera&>(camera).GetZoom(), allocator);
454 } else if (camera.IsPerspective()) {
455 obj.AddMember("fov", dynamic_cast<TGLPerspectiveCamera&>(camera).GetFOV(), allocator);
456 }
457
458 return obj;
459 };
460
461 d.AddMember("camera3d", jsonCamera(MultiView::View3d, allocator), allocator);
462 d.AddMember("cameraRphi", jsonCamera(MultiView::ViewRphi, allocator), allocator);
463 d.AddMember("cameraZY", jsonCamera(MultiView::ViewZY, allocator), allocator);
464
465 StringBuffer strbuf;
466 Writer<StringBuffer> writer(strbuf);
467 d.Accept(writer);
468
469 settings << strbuf.GetString();
470 }
471}
472
473void EventManager::restoreVisualisationSettings()
474{
475 ifstream settings(TEMP_SETTINGS_PATH);
476
477 if (settings.good()) {
478 string json((istreambuf_iterator<char>(settings)), istreambuf_iterator<char>());
479 Document d;
480 d.Parse(json.c_str());
481
482 std::string version = std::to_string(o2_eve_version / 100.0);
484 LOGF(info, "visualisation settings has wrong version and was not restored");
485 return;
486 }
487
488 auto updateArray = [](auto& array, const auto& document, const char* name, const auto& accessor) {
489 for (size_t i = 0; i < elemof(array); ++i) {
490 array[i] = accessor(document[name][i]);
491 }
492 };
493
494 auto getBool = [](const GenericValue<UTF8<char>>& v) { return v.GetBool(); };
495 auto getUint = [](const GenericValue<UTF8<char>>& v) { return v.GetUint(); };
496 auto getFloat = [](const GenericValue<UTF8<char>>& v) { return v.GetFloat(); };
497
498 updateArray(vizSettings.trackVisibility, d, "trackVisibility", getBool);
499 updateArray(vizSettings.trackColor, d, "trackColor", getUint);
500 updateArray(vizSettings.trackStyle, d, "trackStyle", getUint);
501 updateArray(vizSettings.trackWidth, d, "trackWidth", getUint);
502 updateArray(vizSettings.clusterVisibility, d, "clusterVisibility", getBool);
503 updateArray(vizSettings.clusterColor, d, "clusterColor", getUint);
504 updateArray(vizSettings.clusterStyle, d, "clusterStyle", getUint);
505 updateArray(vizSettings.clusterSize, d, "clusterSize", getFloat);
506
507 auto updateCamera = [getFloat](MultiView::EViews view, const auto& document, const char* name) {
508 auto& camera = MultiView::getInstance()->getView(view)->GetGLViewer()->CurrentCamera();
509
510 std::array<Double_t, 16> values;
511
512 for (size_t i = 0; i < values.size(); ++i) {
513 values[i] = getFloat(document[name]["base"][i]);
514 }
515 camera.RefCamBase() = TGLMatrix(values.data());
516
517 for (size_t i = 0; i < values.size(); ++i) {
518 values[i] = getFloat(document[name]["trans"][i]);
519 }
520 camera.RefCamTrans() = TGLMatrix(values.data());
521
522 if (camera.IsOrthographic()) {
523 dynamic_cast<TGLOrthoCamera&>(camera).SetZoom(getFloat(document[name]["zoom"]));
524 } else if (camera.IsPerspective()) {
525 dynamic_cast<TGLPerspectiveCamera&>(camera).SetFOV(getFloat(document[name]["fov"]));
526 }
527
528 camera.IncTimeStamp();
529 };
530
531 updateCamera(MultiView::View3d, d, "camera3d");
532 updateCamera(MultiView::ViewRphi, d, "cameraRphi");
533 updateCamera(MultiView::ViewZY, d, "cameraZY");
534 }
535
536 const auto& tracks = *dataTypeLists[EVisualisationDataType::Tracks];
537
538 for (auto elm : tracks.RefChildren()) {
539 auto trackList = static_cast<TEveTrackList*>(elm);
540 int i = findGroupIndex(trackList->GetElementName());
541
542 if (i != -1) {
543 const auto viz = vizSettings.trackVisibility[i];
544 trackList->SetRnrSelfChildren(viz, viz);
545 trackList->SetLineColor(vizSettings.trackColor[i]);
546 trackList->SetLineStyle(vizSettings.trackStyle[i]);
547 trackList->SetLineWidth(vizSettings.trackWidth[i]);
548 }
549 }
550
551 const auto& clusters = *dataTypeLists[EVisualisationDataType::Clusters];
552
553 for (auto elm : clusters.RefChildren()) {
554 auto clusterSet = static_cast<TEvePointSet*>(elm);
555 int i = findGroupIndex(clusterSet->GetElementName());
556
557 if (i != -1) {
558 const auto viz = vizSettings.clusterVisibility[i];
559 clusterSet->SetRnrSelfChildren(viz, viz);
560 clusterSet->SetMarkerColor(vizSettings.clusterColor[i]);
561 clusterSet->SetMarkerStyle(vizSettings.clusterStyle[i]);
562 clusterSet->SetMarkerSize(vizSettings.clusterSize[i]);
563 }
564 }
565
567}
568
569} // namespace event_visualisation
570} // namespace o2
o2::monitoring::tags::Value Value
Grouping reading from file(s)
GUI (bottom buttons) for visualisation.
#define elemof(e)
int32_t i
uint32_t j
Definition RawData.h:0
nlohmann::json json
StringRef key
static std::string getNames(mask_t mask, char delimiter=',')
Definition DetID.cxx:74
static ConfigurationManager & getInstance()
Returns an instance of ConfigurationManager.
void getConfig(TEnv &settings) const
Returns current event display configuration.
virtual int getRunNumber() const
Definition DataSource.h:72
virtual std::vector< std::pair< VisualisationEvent, EVisualisationGroup > > getVisualisationList(int no, float minTime, float maxTime, float range)=0
virtual int getFirstTForbit() const
Definition DataSource.h:78
virtual o2::detectors::DetID::mask_t getDetectorsMask()=0
virtual void setCurrentEvent(Int_t)
Definition DataSource.h:54
virtual o2::parameters::GRPECS::RunType getRunType()
Definition DataSource.h:74
std::string getCreationTimeAsString() const
static EventManagerFrame & getInstance()
Returns an instance of EventManagerFrame.
static EventManager & getInstance()
Returns an instance of EventManager.
void RemoveNewEventCommand(const TString &cmd) override
void AddNewEventCommand(const TString &cmd) override
static MultiView * getInstance()
Returns an instance of the MultiView.
TEveViewer * getView(EViews view)
Returns pointer to specific view.
Definition MultiView.h:70
static std::string getStringOrDefault(rapidjson::Value &tree, const char *key, const char *defaultValue="")
std::array< float, 3 > getPoint(size_t i) const
const VisualisationCluster & getCluster(int i) const
struct _cl_event * event
Definition glcorearb.h:2982
GLuint entry
Definition glcorearb.h:5735
const GLdouble * v
Definition glcorearb.h:832
GLenum array
Definition glcorearb.h:4274
GLuint const GLchar * name
Definition glcorearb.h:781
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLenum GLsizei GLsizei GLint * values
Definition glcorearb.h:1576
GLboolean * data
Definition glcorearb.h:298
GLuint start
Definition glcorearb.h:469
std::string detectors(const std::vector< std::string > &det, unsigned mask)
const std::string gVisualisationGroupName[NvisualisationGroups]
@ Clusters
Reconstructed clusters (RecPoints)
@ NdataTypes
number of supported data types
const std::string gDataTypeNames[NdataTypes]
struct o2::upgrades_utils::@454 tracks
structure to keep trigger-related info
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
Definition list.h:40
std::vector< Cluster > clusters