Skip to content

Commit 751a579

Browse files
committed
GPU Display Qt GUI: Add proper passing of frames with config elements to the GUI and returning lambda functions with value updates
1 parent 8cae0e3 commit 751a579

21 files changed

Lines changed: 1510 additions & 257 deletions

‎GPU/GPUTracking/Definitions/GPUSettingsList.h‎

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ EndConfig()
436436
#ifndef GPUCA_GPUCODE_DEVICE
437437
// Light settings concerning the event display (can be changed without rebuilding vertices)
438438
BeginSubConfig(GPUSettingsDisplayLight, light, configStandalone.display, "GLL", 'g', "Light OpenGL display settings", display_light)
439-
AddOption(animationMode, int32_t, 0, "", 0, "")
439+
AddOption(animationMode, int32_t, 0, "", 0, "", min(0), max(6))
440440
AddOption(smoothPoints, bool, true, "", 0, "Apply smoothing to points")
441441
AddOption(smoothLines, bool, false, "", 0, "Apply smoothing to lines")
442442
AddOption(depthBuffer, bool, false, "", 0, "Enable Z-buffer")
@@ -449,19 +449,19 @@ AddOption(drawTracks, bool, false, "", 0, "Highlight sector tracks")
449449
AddOption(drawExtrapolatedTracks, bool, false, "", 0, "Highlight global sector tracks prolonged into adjacent sector")
450450
AddOption(drawFinal, bool, false, "", 0, "Highlight final tracks")
451451
AddOption(excludeClusters, int32_t, 0, "", 0, "Exclude clusters from selected draw objects from display, (2 = exclude clusters but still show tracks)")
452-
AddOption(drawSector, int32_t, -1, "", 0, "Show individual sector")
452+
AddOption(drawSector, int32_t, -1, "", 0, "Show individual sector", min(-1), max(35))
453453
AddOption(drawRelatedSectors, int32_t, 0, "", 0, "Show related sectors (if drawSector != -1)")
454454
AddOption(drawGrid, int32_t, 0, "", 0, "Highlight grid")
455455
AddOption(propagateTracks, int32_t, 0, "", 0, "Propagate final tracks further (inward / outward / show MC tracks)")
456456
AddOption(showCollision, int32_t, -1, "", 0, "Show only individual collision")
457457
AddOption(colorCollisions, int32_t, 0, "", 0, "Distinguish collisions in timeframe by color")
458458
AddOption(colorClusters, int32_t, 1, "", 0, "Color clusters belonging to track objects")
459-
AddOption(pointSize, float, 2.0f, "", 0, "Set point size")
460-
AddOption(lineWidth, float, 1.4f, "", 0, "Set line width")
459+
AddOption(pointSize, float, 2.0f, "", 0, "Set point size", min(0.8f), max(20.f))
460+
AddOption(lineWidth, float, 1.4f, "", 0, "Set line width", min(0.4f), max(20.f))
461461
AddOption(drawTPC, bool, true, "", 0, "Enable drawing TPC data")
462-
AddOption(drawTRD, bool, true, "", 0, "Enabale drawing TRD data")
463-
AddOption(drawTOF, bool, true, "", 0, "Enabale drawing TOF data")
464-
AddOption(drawITS, bool, true, "", 0, "Enabale drawing ITS data")
462+
AddOption(drawTRD, bool, true, "", 0, "Enable drawing TRD data")
463+
AddOption(drawTOF, bool, true, "", 0, "Enable drawing TOF data")
464+
AddOption(drawITS, bool, true, "", 0, "Enable drawing ITS data")
465465
AddOption(drawField, bool, false, "", 0, "Enable drawing magnetic field")
466466
AddOption(bFieldStepSize, float, 5.0f, "", 0, "Set field line step size")
467467
AddOption(bFieldStepCount, int32_t, 100, "", 0, "Set field line step count")
@@ -477,7 +477,7 @@ AddOption(drawITSTracks, bool, true, "", 0, "Show tracks with ITS contribution")
477477
AddOption(drawTRDTracks, bool, true, "", 0, "Show tracks with TRD contribution")
478478
AddOption(drawTOFTracks, bool, true, "", 0, "Show tracks with TOF contribution")
479479
AddOption(drawTracksAndFilter, bool, false, "", 0, "Use AND filter instead of OR filter for selecting tracks")
480-
AddOption(propagateLoopers, bool, false, "", 0, "Enabale propagation of loopers")
480+
AddOption(propagateLoopers, bool, false, "", 0, "Enable propagation of loopers")
481481
AddOption(clustersOnly, bool, false, "", 0, "Visualize clusters only")
482482
AddOption(clustersOnNominalRow, bool, false, "", 0, "Show clusters at nominal x of pad row for early-transformed data")
483483
AddOption(separateExtrapolatedTracks, bool, false, "", 0, "Draw track segments propagated to adjacent sectors separately")
@@ -490,8 +490,7 @@ AddOption(hideRejectedTracks, int32_t, 1, "", 0, "Hide rejected tracks")
490490
AddOption(hideUnmatchedClusters, int32_t, 0, "", 0, "Hide unmatched clusters")
491491
AddOption(trackFilter, int32_t, 0, "", 0, "Apply filter on tracks to be displayed")
492492
AddOption(projectXY, int32_t, 0, "", 0, "Project everything on the XY-plane")
493-
AddOption(xAdd, float, 0, "", 0, "Separate sectors, increase X coordinate")
494-
AddOption(zAdd, float, 0, "", 0, "Separate sides, increase Z coordinate")
493+
AddOption(xzAdd, float, 0, "", 0, "Separate sectors, increase X coordinate", min(0.f), max(300.f))
495494
AddHelp("help", 'h')
496495
EndConfig()
497496

@@ -502,14 +501,14 @@ AddOption(camYUp, bool, false, "", 0, "Orient the camera such that the y-axis is
502501
AddOption(cameraMode, int32_t, 0, "", 0, "Camera mode")
503502
AddOption(fullScreen, bool, false, "", 0, "Full Screen")
504503
AddOption(maximized, bool, true, "", 0, "Maximized window")
505-
AddOption(drawQualityMSAA, int32_t, 0, "", 0, "MultiSample Anti Aliasing")
506-
AddOption(drawQualityDownsampleFSAA, int32_t, 0, "", 0, "Downsampling Anti Aliasing")
504+
AddOption(drawQualityMSAA, int32_t, 0, "", 0, "MultiSample Anti Aliasing", min(0), max(8))
505+
AddOption(drawQualityDownsampleFSAA, int32_t, 0, "", 0, "Downsampling Anti Aliasing", min(0), max(4))
507506
AddOption(drawQualityVSync, bool, true, "", 0, "Enable Vertical Sync")
508507
AddOption(fpsLimit, int32_t, 1, "", 0, "FPS limit: 0 = none (maximum rate), 1 = display refresh rate (no limit without VSync), 2 = fpsRate")
509-
AddOption(fpsRate, int32_t, 100, "", 0, "Target frame rate (frames per second) for fpsLimit 2, or if the backend cannot limit to the refresh rate (0 = no limit)")
508+
AddOption(fpsRate, int32_t, 100, "", 0, "Target frame rate (frames per second) for fpsLimit 2, or if the backend cannot limit to the refresh rate", min(1), max(9999))
510509
AddOption(useGLIndirectDraw, bool, true, "", 0, "Use OpenGL indirect draws to reduce number of draw calls")
511-
AddOption(screenshotScaleFactor, int32_t, 1, "", 0, "Resolution scale factor when taking screenshots")
512-
AddOption(fov, int32_t, 45, "", 0, "Display FOV")
510+
AddOption(screenshotScaleFactor, int32_t, 1, "", 0, "Resolution scale factor when taking screenshots", min(1), max(4))
511+
AddOption(fov, float, 45.f, "", 0, "Display FOV", min(5.f), max(175.f))
513512
AddHelp("help", 'h')
514513
EndConfig()
515514

‎GPU/GPUTracking/display/CMakeLists.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ set(SRCS_NO_H helpers/GPUDisplayLoader.cxx
132132
frontend/GPUDisplayHelp.cxx
133133
frontend/GPUDisplayFrontendConfig.cxx)
134134

135-
set(HDRS_INSTALL helpers/GPUDisplayMagneticFieldConstants.h frontend/GPUDisplayFrontendKeys.h)
135+
set(HDRS_INSTALL helpers/GPUDisplayMagneticFieldConstants.h frontend/GPUDisplayFrontendKeys.h frontend/GPUDisplayControl.h)
136136

137137
if(GPUCA_EVENT_DISPLAY_VULKAN)
138138
set(SRCS ${SRCS} backend/GPUDisplayBackendVulkan.cxx)

‎GPU/GPUTracking/display/GPUDisplay.cxx‎

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ int32_t GPUDisplay::DrawGLScene(bool suspended)
218218
} else if (!mOverlayTFClusters.size()) {
219219
mNCollissions = std::max(1u, mIOPtrs->nMCInfosTPCCol);
220220
}
221+
if (mCfgL.showCollision >= mNCollissions) { // Fewer collisions in the new event
222+
mCfgL.showCollision = -1;
223+
mUpdateDrawCommands = true;
224+
}
221225
try {
222226
DrawGLScene_internal(suspended);
223227
} catch (const std::runtime_error& e) {
@@ -244,8 +248,8 @@ void GPUDisplay::DrawGLScene_cameraAndAnimation(bool suspended, float animateTim
244248
mFrontend->mMouseWheel = 0;
245249
bool lookOrigin = mCfgR.camLookOrigin ^ mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_FOCUS_ORIGIN]];
246250
bool yUp = mCfgR.camYUp ^ mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_FOCUS_ORIENT_UP]] ^ lookOrigin;
247-
bool rotateModel = mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_ROTATE_MODEL]] || mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_ROTATE_AROUND_Z]];
248-
bool rotateModelTPC = mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_ROTATE_AROUND_Z]];
251+
bool rotateModelTPC = mCfgC.mRotateAroundZ || mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_ROTATE_AROUND_Z]];
252+
bool rotateModel = rotateModelTPC || mCfgC.mRotateModel || mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_ROTATE_MODEL]];
249253

250254
// Calculate rotation / translation scaling factors
251255
float scalefactor = mFrontend->mKeys[mFrontend->KEY_SHIFT] ? 0.2f : 1.0f;
@@ -277,7 +281,7 @@ void GPUDisplay::DrawGLScene_cameraAndAnimation(bool suspended, float animateTim
277281
mCfgL.lineWidth = 1.4f;
278282
mCfgL.drawSector = -1;
279283
mCfgL.showCollision = -1;
280-
mCfgH.xAdd = mCfgH.zAdd = 0;
284+
mCfgH.xzAdd = 0;
281285
mCfgR.camLookOrigin = mCfgR.camYUp = false;
282286
mAngleRollOrigin = -1e9f;
283287
mCfgR.fov = 45.f;
@@ -305,13 +309,15 @@ void GPUDisplay::DrawGLScene_cameraAndAnimation(bool suspended, float animateTim
305309
}
306310

307311
if (mFrontend->mKeys[mFrontend->mKeyDownMap[mFrontend->KEY_MAP_CHANGE_ANIMATION_INTERVAL]]) {
308-
mAnimationDelay += moveX;
309-
if (mAnimationDelay < 0.05f) {
310-
mAnimationDelay = 0.05f;
312+
mCfgC.mAnimationDelay += moveX;
313+
if (mCfgC.mAnimationDelay < 0.05f) {
314+
mCfgC.mAnimationDelay = 0.05f;
315+
} else if (mCfgC.mAnimationDelay > 20.f) {
316+
mCfgC.mAnimationDelay = 20.f;
311317
}
312318
moveX = 0.f;
313319
moveY = 0.f;
314-
SetInfo("Animation delay set to %1.2f", mAnimationDelay);
320+
SetInfo("Animation delay set to %1.2f", mCfgC.mAnimationDelay);
315321
}
316322

317323
if (yUp) {
@@ -706,10 +712,10 @@ void GPUDisplay::DrawGLScene_internal(bool suspended, float animateTime, bool re
706712
char info[1024];
707713
float fps = (double)mFramesDoneFPS / fpstime;
708714
snprintf(info, 1024,
709-
"FPS: %6.2f (Sector: %d, 1:Clusters %d, 2:Prelinks %d, 3:Links %d, 4:Seeds %d, 5:Tracklets %d, 6:Tracks %d, 7:GTracks %d, 8:Merger %d) (%d frames, %d draw calls) "
710-
"(X %1.2f Y %1.2f Z %1.2f / R %1.2f Phi %1.1f Theta %1.1f) / Yaw %1.1f Pitch %1.1f Roll %1.1f)",
715+
"FPS:%8.2f (Sector: %d, 1:Clusters %d, 2:Prelinks %d, 3:Links %d, 4:Seeds %d, 5:Tracklets %d, 6:Tracks %d, 7:GTracks %d, 8:Merger %d) (%d frames, %d draw calls) "
716+
"(X %1.2f Y %1.2f Z %1.2f / R %1.2f Phi %1.1f Theta %1.1f) / Yaw %1.1f Pitch %1.1f Roll %1.1f - Size: %ux%u",
711717
fps, mCfgL.drawSector, mCfgL.drawClusters, mCfgL.drawInitLinks, mCfgL.drawLinks, mCfgL.drawSeeds, mCfgL.drawTracklets, mCfgL.drawTracks, mCfgL.drawExtrapolatedTracks, mCfgL.drawFinal, mFramesDone, mNDrawCalls, mXYZ[0], mXYZ[1], mXYZ[2], mRPhiTheta[0], mRPhiTheta[1] * 180 / CAMath::Pi(),
712-
mRPhiTheta[2] * 180 / CAMath::Pi(), mAngle[1] * 180 / CAMath::Pi(), mAngle[0] * 180 / CAMath::Pi(), mAngle[2] * 180 / CAMath::Pi());
718+
mRPhiTheta[2] * 180 / CAMath::Pi(), mAngle[1] * 180 / CAMath::Pi(), mAngle[0] * 180 / CAMath::Pi(), mAngle[2] * 180 / CAMath::Pi(), mBackend->mScreenWidth, mBackend->mScreenHeight);
713719
if (fpstime > 1.) {
714720
if (mCfgC.mPrintInfoText & 2) {
715721
GPUInfo("%s", info);
@@ -721,7 +727,7 @@ void GPUDisplay::DrawGLScene_internal(bool suspended, float animateTime, bool re
721727
mFramesDoneFPS = 0;
722728
}
723729

724-
if (mCfgC.mPrintInfoText & 1) {
730+
if (mCfgC.mPrintInfoText & 1 || mCfgC.mPrintInfoTextGUI) {
725731
showInfo(info);
726732
}
727733
}
@@ -732,9 +738,9 @@ void GPUDisplay::DrawGLScene_internal(bool suspended, float animateTime, bool re
732738
std::vector<char> pixels = mBackend->getPixels();
733739
char tmpFileName[48];
734740
if (animateScreenshot) {
735-
snprintf(tmpFileName, 48, "mAnimation%d_%05d.bmp", mAnimationExport, mAnimationFrame);
741+
snprintf(tmpFileName, 48, "%d_%05d.bmp", mAnimationExport, mAnimationFrame);
736742
}
737-
DoScreenshot(animateScreenshot ? tmpFileName : mScreenshotFile.c_str(), pixels);
743+
DoScreenshot(animateScreenshot ? (mCfgC.mScreenShotname + tmpFileName).c_str() : mScreenshotFile.c_str(), pixels);
738744
}
739745
}
740746

‎GPU/GPUTracking/display/GPUDisplay.h‎

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define GPUDISPLAY_H
1717

1818
#include "frontend/GPUDisplayFrontend.h"
19+
#include "frontend/GPUDisplayControl.h"
1920
#include "backend/GPUDisplayBackend.h"
2021
#include "GPUDisplayInterface.h"
2122
#include "GPUSettings.h"
@@ -87,21 +88,13 @@ class GPUDisplay : public GPUDisplayInterface
8788
GPUDisplayFrontend* frontend() { return mFrontend; }
8889
int32_t& drawTextFontSize() { return mDrawTextFontSize; }
8990

90-
struct control {
91-
std::atomic<int32_t> mDisplayControl = 0; // Control for next event (=1) or quit (=2)
92-
std::atomic<bool> mResetScene = false;
93-
int32_t mPrintInfoText = 1;
94-
bool mPrintInfoTextAlways = false;
95-
bool mRequestScreenshot = false;
96-
int32_t mAnimateScreenshot = 0;
97-
bool mAnimationChangeConfig = true;
98-
bool dummy = false; // dummy value to reference for keys that do not change variables
99-
} mCfgC;
91+
GPUDisplayControl mCfgC;
10092

10193
private:
10294
void buildConfig();
10395
void buildConfigKeys();
10496
void buildConfigInfo();
97+
void buildConfigQtGUI();
10598

10699
static constexpr int32_t NSECTORS = o2::tpc::constants::MAXSECTOR;
107100
static constexpr float GL_SCALE_FACTOR = (1.f / 100.f);
@@ -114,6 +107,7 @@ class GPUDisplay : public GPUDisplayInterface
114107
static constexpr const int32_t N_LINES_TYPE = 7;
115108
static constexpr const int32_t N_FINAL_TYPE = 4;
116109
static constexpr int32_t TRACK_TYPE_ID_LIMIT = 100;
110+
static const std::array<std::string, 7> ANIMATION_MODE_NAMES_SHORT, ANIMATION_MODE_NAMES_LONG; // By mCfgL.animationMode
117111
enum PointTypes { tCLUSTER = 0,
118112
tINITLINK = 1,
119113
tLINK = 2,
@@ -180,6 +174,7 @@ class GPUDisplay : public GPUDisplayInterface
180174
void updateOptions();
181175
void disableUnsupportedOptions();
182176
int32_t buildTrackFilter();
177+
std::string trackFilterName() const; // Selected track filter: macro file from filterMacros, or "Custom Macro"
183178
const GPUTPCTracker& sectorTracker(int32_t iSector);
184179
const GPUTRDGeometry* trdGeometry();
185180
const GPUTrackingInOutPointers* mIOPtrs = nullptr;
@@ -191,6 +186,12 @@ class GPUDisplay : public GPUDisplayInterface
191186
void calcXYZ(const float*);
192187
void mAnimationCloseAngle(float& newangle, float lastAngle);
193188
void mAnimateCloseQuaternion(float* v, float lastx, float lasty, float lastz, float lastw);
189+
void SaveGLPos(); // Camera position to mCfgC.mGLPosFile
190+
void LoadGLPos();
191+
void SaveGLAnimation(); // Animation path to mCfgC.mGLAnimationFile
192+
void LoadGLAnimation();
193+
void takeScreenshot();
194+
void runAnimation(); // Starts the animation if it has enough points
194195
void setAnimationPoint();
195196
void resetAnimation();
196197
void removeAnimationPoint();
@@ -300,6 +301,8 @@ class GPUDisplay : public GPUDisplayInterface
300301
std::vector<bool> mTrackFilter;
301302

302303
volatile bool mUpdateTrackFilter = false;
304+
std::string mTrackFilterMacroLoaded; // Track filter macro file loaded into ROOT, unloaded before loading another one (same function name)
305+
bool mUpdateGUIOptions = false; // The Qt GUI must call the dynamic option lambdas of its elements again (new event, GUI started)
303306
volatile bool mUpdateVertexLists = true;
304307
volatile bool mUpdateEventData = false;
305308
volatile bool mUpdateDrawCommands = true;
@@ -313,12 +316,14 @@ class GPUDisplay : public GPUDisplayInterface
313316
int32_t mAnimationLastBase = 0;
314317
int32_t mAnimationMixBase = -1; // Target keyframe of the current config blend (mixing), -1 = none
315318
int32_t mAnimationExport = 0;
316-
float mAnimationDelay = 2.f;
317319
vecpod<float> mAnimateVectors[9];
318320
vecpod<GPUSettingsDisplayLight> mAnimateConfig;
319321
opengl_spline mAnimationSplines[8];
320322

321323
char mInfoText2[1024];
324+
std::string mGUIInfoStatus; // Latest status line (FPS etc.) for the Qt GUI
325+
std::string mGUIInfoText; // Latest info message (SetInfo) for the Qt GUI
326+
uint64_t mGUIInfoTextCounter = 0; // Number of info messages, the GUI shows a new one for some seconds
322327
HighResTimer mInfoText2Timer, mInfoHelpTimer;
323328

324329
std::vector<threadVertexBuffer> mThreadBuffers;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2019-2026 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+
/// \file GPUDisplayControl.h
13+
/// \author David Rohr
14+
15+
#ifndef GPUDISPLAYCONTROL_H
16+
#define GPUDISPLAYCONTROL_H
17+
18+
#include <atomic>
19+
#include <cstdint>
20+
#include <string>
21+
22+
namespace o2::gpu
23+
{
24+
template <class T>
25+
struct GPUDisplayCopyableAtomic : std::atomic<T> { // std::atomic deletes the copy, here it copies the value
26+
using std::atomic<T>::atomic;
27+
GPUDisplayCopyableAtomic(const GPUDisplayCopyableAtomic& o) : std::atomic<T>(o.load()) {}
28+
GPUDisplayCopyableAtomic& operator=(const GPUDisplayCopyableAtomic& o)
29+
{
30+
this->store(o.load());
31+
return *this;
32+
}
33+
};
34+
35+
struct GPUDisplayControl { // Settings of the display without RTTI, copied to the Qt GUI
36+
GPUDisplayCopyableAtomic<int32_t> mDisplayControl = 0; // Control for next event (=1) or quit (=2)
37+
GPUDisplayCopyableAtomic<bool> mResetScene = false;
38+
int32_t mPrintInfoText = 1;
39+
bool mPrintInfoTextAlways = false;
40+
bool mRequestScreenshot = false;
41+
int32_t mAnimateScreenshot = 0;
42+
bool mAnimationChangeConfig = true;
43+
float mAnimationDelay = 2.f;
44+
bool mPrintInfoTextGUI = true; // Send the status and info text to the Qt GUI, shown at its bottom
45+
bool mGuiPrintInfo = false; // Show the info of options changed with Qt GUI elements (not for key presses in the GUI)
46+
bool mRotateModel = false; // Rotate the model instead of the camera, like holding RCTRL (set in the Qt GUI)
47+
bool mRotateAroundZ = false; // Rotate the TPC around the beamline, like holding RALT (set in the Qt GUI)
48+
std::string mFilterMacroCustom; // Code of the custom track filter ROOT macro (trackFilter = filterMacros.size() + 1), set in the Qt GUI
49+
std::string mScreenShotname = "screenshot"; // Name of screenshot and animation frame files, followed by numbers
50+
std::string mGLPosFile = "glpos.tmp"; // File for saving / loading the camera position
51+
std::string mGLAnimationFile = "glanimation.tmp"; // File for saving / loading the animation path
52+
int8_t mGuiDarkMode = -1; // Dark mode of the Qt GUI, -1 = not yet set: the GUI reports the system scheme when it starts
53+
float mGuiScale = 1.f; // Scale factor of text and elements of the Qt GUI (on top of the system scaling), Ctrl + mouse wheel / Ctrl + 0 in the GUI
54+
bool dummy = false; // dummy value to reference for keys that do not change variables
55+
};
56+
} // namespace o2::gpu
57+
58+
#endif

0 commit comments

Comments
 (0)