From e00fdebb99859c127906a7aea1eac61d6b15607c Mon Sep 17 00:00:00 2001 From: David Rohr Date: Thu, 7 Nov 2024 22:53:19 +0100 Subject: [PATCH 1/5] TPC: Fix invalid template keyword with argument list (clang19 complains, remove since not really needed) --- GPU/TPCFastTransformation/Spline1DSpec.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/TPCFastTransformation/Spline1DSpec.h b/GPU/TPCFastTransformation/Spline1DSpec.h index e37ee67581c63..f8af1980d81ae 100644 --- a/GPU/TPCFastTransformation/Spline1DSpec.h +++ b/GPU/TPCFastTransformation/Spline1DSpec.h @@ -448,7 +448,7 @@ class Spline1DSpec GPUgeneric() const T Sr[/*mYdim*/], GPUgeneric() const T Dr[/*mYdim*/], DataT u, GPUgeneric() T S[/*mYdim*/]) const { - TBase::template interpolateU(YdimT, knotL, Sl, Dl, Sr, Dr, u, S); + TBase::interpolateU(YdimT, knotL, Sl, Dl, Sr, Dr, u, S); } using TBase::getNumberOfKnots; From 2ab8d92ee0da7c549814e79d3027177052758221 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:51:34 +0100 Subject: [PATCH 2/5] DPL: account for aod-parent-access-level == 0 In the case of self contained derived data, it is ok not to look in the parents for missing metadata. --- .../src/AODJAlienReaderHelpers.cxx | 23 +++++++++---------- Framework/AnalysisSupport/src/Plugin.cxx | 9 +++++++- Framework/Core/src/Plugin.cxx | 5 +++- Framework/Core/src/WorkflowHelpers.cxx | 1 - 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Framework/AnalysisSupport/src/AODJAlienReaderHelpers.cxx b/Framework/AnalysisSupport/src/AODJAlienReaderHelpers.cxx index 90d88cb43626e..9c19de85739ce 100644 --- a/Framework/AnalysisSupport/src/AODJAlienReaderHelpers.cxx +++ b/Framework/AnalysisSupport/src/AODJAlienReaderHelpers.cxx @@ -118,19 +118,23 @@ static inline auto extractOriginalsTuple(framework::pack, ProcessingConte return std::make_tuple(extractTypedOriginal(pc)...); } -AlgorithmSpec AODJAlienReaderHelpers::rootFileReaderCallback(ConfigContext const& config) +AlgorithmSpec AODJAlienReaderHelpers::rootFileReaderCallback(ConfigContext const& ctx) { // aod-parent-base-path-replacement is now a workflow option, so it needs to be // retrieved from the ConfigContext. This is because we do not allow workflow options // to change over start-stop-start because they can affect the topology generation. std::string parentFileReplacement; - if (config.options().isSet("aod-parent-base-path-replacement")) { - parentFileReplacement = config.options().get("aod-parent-base-path-replacement"); + if (ctx.options().isSet("aod-parent-base-path-replacement")) { + parentFileReplacement = ctx.options().get("aod-parent-base-path-replacement"); } - auto callback = AlgorithmSpec{adaptStateful([parentFileReplacement](ConfigParamRegistry const& options, - DeviceSpec const& spec, - Monitoring& monitoring, - DataProcessingStats& stats) { + int parentAccessLevel = 0; + if (ctx.options().isSet("aod-parent-access-level")) { + parentAccessLevel = ctx.options().get("aod-parent-access-level"); + } + auto callback = AlgorithmSpec{adaptStateful([parentFileReplacement, parentAccessLevel](ConfigParamRegistry const& options, + DeviceSpec const& spec, + Monitoring& monitoring, + DataProcessingStats& stats) { // FIXME: not actually needed, since data processing stats can specify that we should // send the initial value. stats.updateStats({static_cast(ProcessingStatsId::ARROW_BYTES_CREATED), DataProcessingStats::Op::Set, 0}); @@ -148,11 +152,6 @@ AlgorithmSpec AODJAlienReaderHelpers::rootFileReaderCallback(ConfigContext const auto maxRate = options.get("aod-max-io-rate"); - int parentAccessLevel = 0; - if (options.isSet("aod-parent-access-level")) { - parentAccessLevel = options.get("aod-parent-access-level"); - } - // create a DataInputDirector auto didir = std::make_shared(filename, &monitoring, parentAccessLevel, parentFileReplacement); if (options.isSet("aod-reader-json")) { diff --git a/Framework/AnalysisSupport/src/Plugin.cxx b/Framework/AnalysisSupport/src/Plugin.cxx index e2a9a98ab90d3..bba3499286e08 100644 --- a/Framework/AnalysisSupport/src/Plugin.cxx +++ b/Framework/AnalysisSupport/src/Plugin.cxx @@ -150,13 +150,20 @@ struct DiscoverMetadataInAOD : o2::framework::ConfigDiscoveryPlugin { return results; } - // Lets try in parent files + if (!registry.isSet("aod-parent-access-level") || registry.get("aod-parent-access-level") == 0) { + LOGP(info, "No metadata found in file \"{}\" and parent level 0 prevents further lookup.", filename); + results.push_back(ConfigParamSpec{"aod-metadata-disable", VariantType::String, "1", {"Metadata not found in AOD"}}); + return results; + } + + // Lets try in parent file. auto parentFiles = (TMap*)currentFile->Get("parentFiles"); if (!parentFiles) { LOGP(info, "No metadata found in file \"{}\"", filename); results.push_back(ConfigParamSpec{"aod-metadata-disable", VariantType::String, "1", {"Metadata not found in AOD"}}); return results; } + LOGP(info, "No metadata found in file \"{}\", checking in its parents.", filename); for (auto* p : *parentFiles) { std::string parentFilename = ((TPair*)p)->Value()->GetName(); // Do the replacement. Notice this will require changing aod-parent-base-path-replacement to be diff --git a/Framework/Core/src/Plugin.cxx b/Framework/Core/src/Plugin.cxx index 91c74bafff5ad..726b12ff68365 100644 --- a/Framework/Core/src/Plugin.cxx +++ b/Framework/Core/src/Plugin.cxx @@ -141,7 +141,7 @@ struct DiscoverAODOptionsInCommandLine : o2::framework::ConfigDiscoveryPlugin { bool injectOption = true; for (size_t i = 0; i < argc; i++) { std::string_view arg = argv[i]; - if (!arg.starts_with("--aod-writer-") && arg != "--aod-parent-base-path-replacement") { + if (!arg.starts_with("--aod-writer-") && !arg.starts_with("--aod-parent-")) { continue; } std::string key = arg.data() + 2; @@ -156,6 +156,9 @@ struct DiscoverAODOptionsInCommandLine : o2::framework::ConfigDiscoveryPlugin { if (key == "aod-parent-base-path-replacement") { results.push_back(ConfigParamSpec{"aod-parent-base-path-replacement", VariantType::String, value, {R"(Replace base path of parent files. Syntax: FROM;TO. E.g. "alien:///path/in/alien;/local/path". Enclose in "" on the command line.)"}}); } + if (key == "aod-parent-access-level") { + results.push_back(ConfigParamSpec{"aod-parent-access-level", VariantType::String, value, {"Allow parent file access up to specified level. Default: no (0)"}}); + } } if (injectOption) { results.push_back(ConfigParamSpec{"aod-writer-compression", VariantType::Int, 505, {"AOD Compression options"}}); diff --git a/Framework/Core/src/WorkflowHelpers.cxx b/Framework/Core/src/WorkflowHelpers.cxx index 56e9930e3b655..da9a135dc5eb8 100644 --- a/Framework/Core/src/WorkflowHelpers.cxx +++ b/Framework/Core/src/WorkflowHelpers.cxx @@ -216,7 +216,6 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext .options = {ConfigParamSpec{"aod-file-private", VariantType::String, ctx.options().get("aod-file"), {"AOD file"}}, ConfigParamSpec{"aod-max-io-rate", VariantType::Float, 0.f, {"Maximum I/O rate in MB/s"}}, ConfigParamSpec{"aod-reader-json", VariantType::String, {"json configuration file"}}, - ConfigParamSpec{"aod-parent-access-level", VariantType::String, {"Allow parent file access up to specified level. Default: no (0)"}}, ConfigParamSpec{"time-limit", VariantType::Int64, 0ll, {"Maximum run time limit in seconds"}}, ConfigParamSpec{"orbit-offset-enumeration", VariantType::Int64, 0ll, {"initial value for the orbit"}}, ConfigParamSpec{"orbit-multiplier-enumeration", VariantType::Int64, 0ll, {"multiplier to get the orbit from the counter"}}, From 56ccb8b3156a3ff671fe98e91fde2ba815b03b64 Mon Sep 17 00:00:00 2001 From: David Rohr Date: Fri, 8 Nov 2024 13:55:05 +0100 Subject: [PATCH 3/5] GPU: Add overrideNHbfPerTF option --- GPU/GPUTracking/Definitions/GPUSettingsList.h | 1 + GPU/Workflow/src/GPUWorkflowSpec.cxx | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/GPU/GPUTracking/Definitions/GPUSettingsList.h b/GPU/GPUTracking/Definitions/GPUSettingsList.h index 224e7c720c334..b4831c2088dc2 100644 --- a/GPU/GPUTracking/Definitions/GPUSettingsList.h +++ b/GPU/GPUTracking/Definitions/GPUSettingsList.h @@ -526,6 +526,7 @@ BeginSubConfig(GPUSettingsO2, global, configStandalone, "O2", 0, "O2 workflow se AddOption(solenoidBzNominalGPU, float, -1e6f, "", 0, "Field strength of solenoid Bz in kGaus") AddOption(constBz, bool, false, "", 0, "force constant Bz for tests") AddOption(continuousMaxTimeBin, int32_t, 0, "", 0, "maximum time bin of continuous data, 0 for triggered events, -1 for default of 23ms") +AddOption(overrideNHbfPerTF, int32_t, 0, "", 0, "Overrides the number of HBF per TF if != 0") AddOption(deviceType, std::string, "CPU", "", 0, "Device type, CPU | CUDA | HIP | OCL1 | OCL2") AddOption(forceDeviceType, bool, true, "", 0, "force device type, otherwise allows fall-back to CPU") AddOption(synchronousProcessing, bool, false, "", 0, "Apply performance shortcuts for synchronous processing, disable unneeded steps") diff --git a/GPU/Workflow/src/GPUWorkflowSpec.cxx b/GPU/Workflow/src/GPUWorkflowSpec.cxx index 4549d895c26b9..b7bd7b608aaf5 100644 --- a/GPU/Workflow/src/GPUWorkflowSpec.cxx +++ b/GPU/Workflow/src/GPUWorkflowSpec.cxx @@ -156,7 +156,7 @@ void GPURecoWorkflowSpec::init(InitContext& ic) mAutoSolenoidBz = mConfParam->solenoidBzNominalGPU == -1e6f; mAutoContinuousMaxTimeBin = mConfig->configGRP.continuousMaxTimeBin == -1; if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.continuousMaxTimeBin = (256 * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.continuousMaxTimeBin = ((mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : 256) * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; } if (mConfig->configProcessing.deviceNum == -2) { int32_t myId = ic.services().get().inputTimesliceId; @@ -583,7 +583,7 @@ void GPURecoWorkflowSpec::run(ProcessingContext& pc) mTFSettings->tfStartOrbit = tinfo.firstTForbit; mTFSettings->hasTfStartOrbit = 1; mTFSettings->hasNHBFPerTF = 1; - mTFSettings->nHBFPerTF = GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF(); + mTFSettings->nHBFPerTF = mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF(); mTFSettings->hasRunStartOrbit = 0; if (mVerbosity) { LOG(info) << "TF firstTForbit " << mTFSettings->tfStartOrbit << " nHBF " << mTFSettings->nHBFPerTF << " runStartOrbit " << mTFSettings->runStartOrbit << " simStartOrbit " << mTFSettings->simStartOrbit; @@ -1016,7 +1016,7 @@ void GPURecoWorkflowSpec::doCalibUpdates(o2::framework::ProcessingContext& pc, c mConfig->configGRP.continuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; newCalibValues.newContinuousMaxTimeBin = true; newCalibValues.continuousMaxTimeBin = mConfig->configGRP.continuousMaxTimeBin; - LOG(info) << "Updating max time bin " << newCalibValues.continuousMaxTimeBin; + LOG(info) << "Updating max time bin " << newCalibValues.continuousMaxTimeBin << " (" << mTFSettings->nHBFPerTF << " orbits)"; } if (!mPropagatorInstanceCreated) { From ac19d82daecd0dd89ee35eb63328a30c102959e3 Mon Sep 17 00:00:00 2001 From: David Rohr Date: Fri, 8 Nov 2024 14:53:33 +0100 Subject: [PATCH 4/5] GPU: Rename some continuousMaxTimeBin to avoid confusion, improve defaults, and cleanup --- Detectors/TPC/qc/src/Tracking.cxx | 2 +- .../src/TPCTrackingDigitsPreCheck.cxx | 2 +- .../reconstruction/test/testGPUCATracking.cxx | 2 +- .../TPC/workflow/src/EntropyEncoderSpec.cxx | 2 +- GPU/GPUTracking/Base/GPUParam.cxx | 4 ++-- GPU/GPUTracking/DataTypes/GPUSettings.h | 2 +- GPU/GPUTracking/Definitions/GPUSettingsList.h | 4 ++-- GPU/GPUTracking/Global/GPUChainTracking.cxx | 2 +- .../GPUO2InterfaceConfigurableParam.cxx | 8 ++++---- .../Interface/GPUO2InterfaceUtils.cxx | 20 ++++++++++--------- .../Standalone/Benchmark/standalone.cxx | 16 +++++++-------- GPU/Workflow/src/GPUWorkflowSpec.cxx | 8 ++++---- GPU/Workflow/src/O2GPUDPLDisplay.cxx | 6 +++--- 13 files changed, 40 insertions(+), 38 deletions(-) diff --git a/Detectors/TPC/qc/src/Tracking.cxx b/Detectors/TPC/qc/src/Tracking.cxx index a3ae6320fe9e0..c2bdf2a5c54bf 100644 --- a/Detectors/TPC/qc/src/Tracking.cxx +++ b/Detectors/TPC/qc/src/Tracking.cxx @@ -51,7 +51,7 @@ void Tracking::initialize(outputModes outputMode, bool postprocessOnly) const auto grp = o2::parameters::GRPObject::loadFrom(); if (grp) { mQAConfig->configGRP.solenoidBzNominalGPU = GPUO2InterfaceUtils::getNominalGPUBz(*grp); - mQAConfig->configGRP.continuousMaxTimeBin = grp->isDetContinuousReadOut(o2::detectors::DetID::TPC) ? -1 : 0; + mQAConfig->configGRP.grpContinuousMaxTimeBin = grp->isDetContinuousReadOut(o2::detectors::DetID::TPC) ? -1 : 0; } else { throw std::runtime_error("Failed to initialize run parameters from GRP"); } diff --git a/Detectors/TPC/reconstruction/src/TPCTrackingDigitsPreCheck.cxx b/Detectors/TPC/reconstruction/src/TPCTrackingDigitsPreCheck.cxx index b2a11811c5661..738e6cff20df4 100644 --- a/Detectors/TPC/reconstruction/src/TPCTrackingDigitsPreCheck.cxx +++ b/Detectors/TPC/reconstruction/src/TPCTrackingDigitsPreCheck.cxx @@ -53,7 +53,7 @@ TPCTrackingDigitsPreCheck::precheckModifiedData TPCTrackingDigitsPreCheck::runPr std::unique_ptr retVal = std::make_unique(); retVal->tpcDigitsMap = *ptrs->tpcPackedDigits; const float zsThreshold = config->configReconstruction.tpc.zsThreshold; - const int maxContTimeBin = config->configGRP.continuousMaxTimeBin; + const int maxContTimeBin = config->configGRP.grpContinuousMaxTimeBin; static bool filterOutOfTF = getenv("TPC_WORKFLOW_FILTER_DIGITS_OUTSIDE_OF_TF") && atoi(getenv("TPC_WORKFLOW_FILTER_DIGITS_OUTSIDE_OF_TF")); bool updateDigits = (zsThreshold > 0 || filterOutOfTF) && ptrs->tpcZS == nullptr; const auto& d = ptrs->tpcPackedDigits; diff --git a/Detectors/TPC/reconstruction/test/testGPUCATracking.cxx b/Detectors/TPC/reconstruction/test/testGPUCATracking.cxx index 33537dc373451..6c0ea8b265585 100644 --- a/Detectors/TPC/reconstruction/test/testGPUCATracking.cxx +++ b/Detectors/TPC/reconstruction/test/testGPUCATracking.cxx @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(CATracking_test1) config.configProcessing.eventDisplay = nullptr; //Ptr to event display backend, for running standalone OpenGL event display config.configGRP.solenoidBzNominalGPU = solenoidBz; - config.configGRP.continuousMaxTimeBin = continuous ? GPUSettings::TPC_MAX_TF_TIME_BIN : 0; //Number of timebins in timeframe if continuous, 0 otherwise + config.configGRP.grpContinuousMaxTimeBin = continuous ? GPUSettings::TPC_MAX_TF_TIME_BIN : 0; // Number of timebins in timeframe if continuous, 0 otherwise config.configReconstruction.tpc.nWays = 3; //Should always be 3! config.configReconstruction.tpc.nWaysOuter = true; //Will create outer param for TRD diff --git a/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx b/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx index 35b76715cbc28..8cca67f65f275 100644 --- a/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx +++ b/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx @@ -92,7 +92,7 @@ void EntropyEncoderSpec::run(ProcessingContext& pc) LOG(fatal) << "configKeyValue tpcTriggeredMode does not match GRP isDetContinuousReadOut(TPC) setting"; } - mConfig->configGRP.continuousMaxTimeBin = (GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF() * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = (GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF() * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; mConfig->configGRP.solenoidBzNominalGPU = GPUO2InterfaceUtils::getNominalGPUBz(*GRPGeomHelper::instance().getGRPMagField()); mParam->UpdateSettings(&mConfig->configGRP); diff --git a/GPU/GPUTracking/Base/GPUParam.cxx b/GPU/GPUTracking/Base/GPUParam.cxx index 8e2daf1a61490..42d4f61f77116 100644 --- a/GPU/GPUTracking/Base/GPUParam.cxx +++ b/GPU/GPUTracking/Base/GPUParam.cxx @@ -130,8 +130,8 @@ void GPUParam::UpdateSettings(const GPUSettingsGRP* g, const GPUSettingsProcessi UpdateBzOnly(g->solenoidBzNominalGPU); par.assumeConstantBz = g->constBz; par.toyMCEventsFlag = g->homemadeEvents; - par.continuousTracking = g->continuousMaxTimeBin != 0; - continuousMaxTimeBin = g->continuousMaxTimeBin == -1 ? GPUSettings::TPC_MAX_TF_TIME_BIN : g->continuousMaxTimeBin; + par.continuousTracking = g->grpContinuousMaxTimeBin != 0; + continuousMaxTimeBin = g->grpContinuousMaxTimeBin == -1 ? GPUSettings::TPC_MAX_TF_TIME_BIN : g->grpContinuousMaxTimeBin; } par.earlyTpcTransform = rec.tpc.forceEarlyTransform == -1 ? (!par.continuousTracking) : rec.tpc.forceEarlyTransform; qptB5Scaler = CAMath::Abs(bzkG) > 0.1f ? CAMath::Abs(bzkG) / 5.006680f : 1.f; // Repeat here, since passing in g is optional diff --git a/GPU/GPUTracking/DataTypes/GPUSettings.h b/GPU/GPUTracking/DataTypes/GPUSettings.h index 69f3ff67cf257..738457ec99d7b 100644 --- a/GPU/GPUTracking/DataTypes/GPUSettings.h +++ b/GPU/GPUTracking/DataTypes/GPUSettings.h @@ -57,7 +57,7 @@ struct GPUSettingsGRP { float solenoidBzNominalGPU = -5.00668f; // solenoid field strength int32_t constBz = 0; // for test-MC events with constant Bz int32_t homemadeEvents = 0; // Toy-MC events - int32_t continuousMaxTimeBin = 0; // 0 for triggered events, -1 for default TF length + int32_t grpContinuousMaxTimeBin = -2; // 0 for triggered events, -1 for automatic setting, -2 invalid default int32_t needsClusterer = 0; // Set to true if the data requires the clusterizer int32_t doCompClusterDecode = 0; // Set to true if the data contains compressed TPC clusters }; diff --git a/GPU/GPUTracking/Definitions/GPUSettingsList.h b/GPU/GPUTracking/Definitions/GPUSettingsList.h index b4831c2088dc2..0b2da89b79ad5 100644 --- a/GPU/GPUTracking/Definitions/GPUSettingsList.h +++ b/GPU/GPUTracking/Definitions/GPUSettingsList.h @@ -478,7 +478,7 @@ AddOption(eventsDir, const char*, "pp", "events", 'e', "Directory with events to AddOption(noEvents, bool, false, "", 0, "Run without data (e.g. for field visualization)") AddOption(eventDisplay, int32_t, 0, "display", 'd', "Show standalone event display", def(1)) AddOption(eventGenerator, bool, false, "", 0, "Run event generator") -AddOption(cont, bool, false, "", 0, "Process continuous timeframe data") +AddOption(cont, bool, false, "", 0, "Process continuous timeframe data, even if input is triggered") AddOption(outputcontrolmem, uint64_t, 0, "outputMemory", 0, "Use predefined output buffer of this size", min(0ul), message("Using %s bytes as output memory")) AddOption(inputcontrolmem, uint64_t, 0, "inputMemory", 0, "Use predefined input buffer of this size", min(0ul), message("Using %s bytes as input memory")) AddOption(cpuAffinity, int32_t, -1, "", 0, "Pin CPU affinity to this CPU core", min(-1)) @@ -525,7 +525,7 @@ EndConfig() BeginSubConfig(GPUSettingsO2, global, configStandalone, "O2", 0, "O2 workflow settings", global) AddOption(solenoidBzNominalGPU, float, -1e6f, "", 0, "Field strength of solenoid Bz in kGaus") AddOption(constBz, bool, false, "", 0, "force constant Bz for tests") -AddOption(continuousMaxTimeBin, int32_t, 0, "", 0, "maximum time bin of continuous data, 0 for triggered events, -1 for default of 23ms") +AddOption(setMaxTimeBin, int32_t, -2, "", 0, "maximum time bin of continuous data, 0 for triggered events, -1 for automatic continuous mode, -2 for automatic continuous / triggered") AddOption(overrideNHbfPerTF, int32_t, 0, "", 0, "Overrides the number of HBF per TF if != 0") AddOption(deviceType, std::string, "CPU", "", 0, "Device type, CPU | CUDA | HIP | OCL1 | OCL2") AddOption(forceDeviceType, bool, true, "", 0, "force device type, otherwise allows fall-back to CPU") diff --git a/GPU/GPUTracking/Global/GPUChainTracking.cxx b/GPU/GPUTracking/Global/GPUChainTracking.cxx index 319e57d99fd0e..8c2599604387b 100644 --- a/GPU/GPUTracking/Global/GPUChainTracking.cxx +++ b/GPU/GPUTracking/Global/GPUChainTracking.cxx @@ -639,7 +639,7 @@ int32_t GPUChainTracking::DoQueuedUpdates(int32_t stream, bool updateSlave) grp->solenoidBzNominalGPU = mNewCalibValues->solenoidField; } if (mNewCalibValues->newContinuousMaxTimeBin) { - grp->continuousMaxTimeBin = mNewCalibValues->continuousMaxTimeBin; + grp->grpContinuousMaxTimeBin = mNewCalibValues->continuousMaxTimeBin; } } } diff --git a/GPU/GPUTracking/Interface/GPUO2InterfaceConfigurableParam.cxx b/GPU/GPUTracking/Interface/GPUO2InterfaceConfigurableParam.cxx index c3aaec8d9f9a6..86ae8e3457019 100644 --- a/GPU/GPUTracking/Interface/GPUO2InterfaceConfigurableParam.cxx +++ b/GPU/GPUTracking/Interface/GPUO2InterfaceConfigurableParam.cxx @@ -103,11 +103,11 @@ GPUSettingsO2 GPUO2InterfaceConfiguration::ReadConfigurableParam(GPUO2InterfaceC obj.configReconstruction = rec; obj.configDisplay = display; obj.configQA = QA; - if (obj.configGRP.continuousMaxTimeBin == 0 || obj.configGRP.continuousMaxTimeBin == -1) { - if (global.continuousMaxTimeBin) { - obj.configGRP.continuousMaxTimeBin = global.continuousMaxTimeBin; + if (obj.configGRP.grpContinuousMaxTimeBin < 0) { + if (global.setMaxTimeBin != -2) { + obj.configGRP.grpContinuousMaxTimeBin = global.setMaxTimeBin; } else { - obj.configGRP.continuousMaxTimeBin = global.tpcTriggeredMode ? 0 : -1; + obj.configGRP.grpContinuousMaxTimeBin = global.tpcTriggeredMode ? 0 : -1; } } if (global.solenoidBzNominalGPU > -1e6f) { diff --git a/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx b/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx index 15a5980a47696..c765909fd879f 100644 --- a/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx +++ b/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx @@ -83,30 +83,32 @@ std::unique_ptr GPUO2InterfaceUtils::getFullParam(float solenoidBz, ui { std::unique_ptr retVal = std::make_unique(); std::unique_ptr tmpConfig; + std::unique_ptr tmpSettingsO2; if (!pConfiguration) { tmpConfig = std::make_unique(); pConfiguration = &tmpConfig; - (*pConfiguration)->configGRP.continuousMaxTimeBin = -1; + (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = -1; } else if (!*pConfiguration) { *pConfiguration = std::make_unique(); - (*pConfiguration)->configGRP.continuousMaxTimeBin = -1; + (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = -1; } (*pConfiguration)->configGRP.solenoidBzNominalGPU = solenoidBz; if (pO2Settings && *pO2Settings) { **pO2Settings = (*pConfiguration)->ReadConfigurableParam(); - } else if (pO2Settings) { - *pO2Settings = std::make_unique((*pConfiguration)->ReadConfigurableParam()); } else { - (*pConfiguration)->ReadConfigurableParam(); + if (!pO2Settings) { + pO2Settings = &tmpSettingsO2; + } + *pO2Settings = std::make_unique((*pConfiguration)->ReadConfigurableParam()); } if (nHbfPerTf == 0) { - nHbfPerTf = 256; + nHbfPerTf = (*pO2Settings)->overrideNHbfPerTF ? (*pO2Settings)->overrideNHbfPerTF : 256; } if (autoMaxTimeBin) { - *autoMaxTimeBin = (*pConfiguration)->configGRP.continuousMaxTimeBin == -1; + *autoMaxTimeBin = (*pConfiguration)->configGRP.grpContinuousMaxTimeBin == -1; } - if ((*pConfiguration)->configGRP.continuousMaxTimeBin == -1) { - (*pConfiguration)->configGRP.continuousMaxTimeBin = (nHbfPerTf * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + if ((*pConfiguration)->configGRP.grpContinuousMaxTimeBin == -1) { + (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = (nHbfPerTf * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; } retVal->SetDefaults(&(*pConfiguration)->configGRP, &(*pConfiguration)->configReconstruction, &(*pConfiguration)->configProcessing, nullptr); return retVal; diff --git a/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx b/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx index 3626c33dfbb2c..09069ba1d104d 100644 --- a/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx +++ b/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx @@ -302,7 +302,7 @@ int32_t SetupReconstruction() printf("Error reading event config file\n"); return 1; } - printf("Read event settings from dir %s (solenoidBz: %f, home-made events %d, constBz %d, maxTimeBin %d)\n", filename, rec->GetGRPSettings().solenoidBzNominalGPU, (int32_t)rec->GetGRPSettings().homemadeEvents, (int32_t)rec->GetGRPSettings().constBz, rec->GetGRPSettings().continuousMaxTimeBin); + printf("Read event settings from dir %s (solenoidBz: %f, home-made events %d, constBz %d, maxTimeBin %d)\n", filename, rec->GetGRPSettings().solenoidBzNominalGPU, (int32_t)rec->GetGRPSettings().homemadeEvents, (int32_t)rec->GetGRPSettings().constBz, rec->GetGRPSettings().grpContinuousMaxTimeBin); if (configStandalone.testSyncAsync) { recAsync->ReadSettings(filename); } @@ -331,7 +331,7 @@ int32_t SetupReconstruction() grp.constBz = true; } if (configStandalone.TF.nMerge || configStandalone.TF.bunchSim) { - if (grp.continuousMaxTimeBin) { + if (grp.grpContinuousMaxTimeBin) { printf("ERROR: requested to overlay continuous data - not supported\n"); return 1; } @@ -340,11 +340,11 @@ int32_t SetupReconstruction() configStandalone.cont = true; } if (chainTracking->GetTPCTransformHelper()) { - grp.continuousMaxTimeBin = configStandalone.TF.timeFrameLen * ((double)GPUReconstructionTimeframe::TPCZ / (double)GPUReconstructionTimeframe::DRIFT_TIME) / chainTracking->GetTPCTransformHelper()->getCorrMap()->getVDrift(); + grp.grpContinuousMaxTimeBin = configStandalone.TF.timeFrameLen * ((double)GPUReconstructionTimeframe::TPCZ / (double)GPUReconstructionTimeframe::DRIFT_TIME) / chainTracking->GetTPCTransformHelper()->getCorrMap()->getVDrift(); } } - if (configStandalone.cont && grp.continuousMaxTimeBin == 0) { - grp.continuousMaxTimeBin = -1; + if (configStandalone.cont && grp.grpContinuousMaxTimeBin == 0) { + grp.grpContinuousMaxTimeBin = -1; } if (rec->GetDeviceType() == GPUReconstruction::DeviceType::CPU) { printf("Standalone Test Framework for CA Tracker - Using CPU\n"); @@ -904,11 +904,11 @@ int32_t main(int argc, char** argv) if (configStandalone.overrideMaxTimebin && (chainTracking->mIOPtrs.clustersNative || chainTracking->mIOPtrs.tpcPackedDigits || chainTracking->mIOPtrs.tpcZS)) { GPUSettingsGRP grp = rec->GetGRPSettings(); - if (grp.continuousMaxTimeBin == 0) { + if (grp.grpContinuousMaxTimeBin == 0) { printf("Cannot override max time bin for non-continuous data!\n"); } else { - grp.continuousMaxTimeBin = chainTracking->mIOPtrs.tpcZS ? GPUReconstructionConvert::GetMaxTimeBin(*chainTracking->mIOPtrs.tpcZS) : chainTracking->mIOPtrs.tpcPackedDigits ? GPUReconstructionConvert::GetMaxTimeBin(*chainTracking->mIOPtrs.tpcPackedDigits) : GPUReconstructionConvert::GetMaxTimeBin(*chainTracking->mIOPtrs.clustersNative); - printf("Max time bin set to %d\n", (int32_t)grp.continuousMaxTimeBin); + grp.grpContinuousMaxTimeBin = chainTracking->mIOPtrs.tpcZS ? GPUReconstructionConvert::GetMaxTimeBin(*chainTracking->mIOPtrs.tpcZS) : chainTracking->mIOPtrs.tpcPackedDigits ? GPUReconstructionConvert::GetMaxTimeBin(*chainTracking->mIOPtrs.tpcPackedDigits) : GPUReconstructionConvert::GetMaxTimeBin(*chainTracking->mIOPtrs.clustersNative); + printf("Max time bin set to %d\n", grp.grpContinuousMaxTimeBin); rec->UpdateSettings(&grp); if (recAsync) { recAsync->UpdateSettings(&grp); diff --git a/GPU/Workflow/src/GPUWorkflowSpec.cxx b/GPU/Workflow/src/GPUWorkflowSpec.cxx index b7bd7b608aaf5..fcf27074ca717 100644 --- a/GPU/Workflow/src/GPUWorkflowSpec.cxx +++ b/GPU/Workflow/src/GPUWorkflowSpec.cxx @@ -154,9 +154,9 @@ void GPURecoWorkflowSpec::init(InitContext& ic) } mAutoSolenoidBz = mConfParam->solenoidBzNominalGPU == -1e6f; - mAutoContinuousMaxTimeBin = mConfig->configGRP.continuousMaxTimeBin == -1; + mAutoContinuousMaxTimeBin = mConfig->configGRP.grpContinuousMaxTimeBin < 0; if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.continuousMaxTimeBin = ((mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : 256) * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = ((mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : 256) * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; } if (mConfig->configProcessing.deviceNum == -2) { int32_t myId = ic.services().get().inputTimesliceId; @@ -1013,9 +1013,9 @@ void GPURecoWorkflowSpec::doCalibUpdates(o2::framework::ProcessingContext& pc, c LOG(info) << "Updating solenoid field " << newCalibValues.solenoidField; } if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.continuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; newCalibValues.newContinuousMaxTimeBin = true; - newCalibValues.continuousMaxTimeBin = mConfig->configGRP.continuousMaxTimeBin; + newCalibValues.continuousMaxTimeBin = mConfig->configGRP.grpContinuousMaxTimeBin; LOG(info) << "Updating max time bin " << newCalibValues.continuousMaxTimeBin << " (" << mTFSettings->nHBFPerTF << " orbits)"; } diff --git a/GPU/Workflow/src/O2GPUDPLDisplay.cxx b/GPU/Workflow/src/O2GPUDPLDisplay.cxx index bb46bd440d399..6946d65915503 100644 --- a/GPU/Workflow/src/O2GPUDPLDisplay.cxx +++ b/GPU/Workflow/src/O2GPUDPLDisplay.cxx @@ -90,7 +90,7 @@ void O2GPUDPLDisplaySpec::init(InitContext& ic) mTFSettings->hasSimStartOrbit = 1; auto& hbfu = o2::raw::HBFUtils::Instance(); mTFSettings->simStartOrbit = hbfu.getFirstIRofTF(o2::InteractionRecord(0, hbfu.orbitFirstSampled)).orbit; - mAutoContinuousMaxTimeBin = mConfig->configGRP.continuousMaxTimeBin == -1; + mAutoContinuousMaxTimeBin = mConfig->configGRP.grpContinuousMaxTimeBin < -1; mDisplay.reset(new GPUO2InterfaceDisplay(mConfig.get())); } @@ -108,14 +108,14 @@ void O2GPUDPLDisplaySpec::run(ProcessingContext& pc) mTFSettings->tfStartOrbit = pc.services().get().firstTForbit; mTFSettings->hasTfStartOrbit = 1; mTFSettings->hasNHBFPerTF = 1; - mTFSettings->nHBFPerTF = GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF(); + mTFSettings->nHBFPerTF = mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF(); mTFSettings->hasRunStartOrbit = 0; if (mGRPGeomUpdated) { mGRPGeomUpdated = false; mConfig->configGRP.solenoidBzNominalGPU = GPUO2InterfaceUtils::getNominalGPUBz(*GRPGeomHelper::instance().getGRPMagField()); if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.continuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; } mDisplay->UpdateGRP(&mConfig->configGRP); if (mGeometryCreated == 0) { From c4f9811d15d072b8c9a6aba226f57b775c21263e Mon Sep 17 00:00:00 2001 From: David Rohr Date: Fri, 8 Nov 2024 15:07:49 +0100 Subject: [PATCH 5/5] GPU: Add GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf and remove copy&paste --- Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx | 2 +- GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx | 7 ++++++- GPU/GPUTracking/Interface/GPUO2InterfaceUtils.h | 1 + GPU/Workflow/src/GPUWorkflowSpec.cxx | 4 ++-- GPU/Workflow/src/O2GPUDPLDisplay.cxx | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx b/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx index 8cca67f65f275..b81cb9a802a4a 100644 --- a/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx +++ b/Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx @@ -92,7 +92,7 @@ void EntropyEncoderSpec::run(ProcessingContext& pc) LOG(fatal) << "configKeyValue tpcTriggeredMode does not match GRP isDetContinuousReadOut(TPC) setting"; } - mConfig->configGRP.grpContinuousMaxTimeBin = (GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF() * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF()); mConfig->configGRP.solenoidBzNominalGPU = GPUO2InterfaceUtils::getNominalGPUBz(*GRPGeomHelper::instance().getGRPMagField()); mParam->UpdateSettings(&mConfig->configGRP); diff --git a/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx b/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx index c765909fd879f..fa5705e903d1a 100644 --- a/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx +++ b/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.cxx @@ -108,7 +108,7 @@ std::unique_ptr GPUO2InterfaceUtils::getFullParam(float solenoidBz, ui *autoMaxTimeBin = (*pConfiguration)->configGRP.grpContinuousMaxTimeBin == -1; } if ((*pConfiguration)->configGRP.grpContinuousMaxTimeBin == -1) { - (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = (nHbfPerTf * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(nHbfPerTf); } retVal->SetDefaults(&(*pConfiguration)->configGRP, &(*pConfiguration)->configReconstruction, &(*pConfiguration)->configProcessing, nullptr); return retVal; @@ -135,3 +135,8 @@ void GPUO2InterfaceUtils::paramUseExternalOccupancyMap(GPUParam* param, uint32_t } } } + +uint32_t GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(uint32_t nHbf) +{ + return (nHbf * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; +} diff --git a/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.h b/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.h index 7b96326387f59..0b5d2b5aa3f7a 100644 --- a/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.h +++ b/GPU/GPUTracking/Interface/GPUO2InterfaceUtils.h @@ -58,6 +58,7 @@ class GPUO2InterfaceUtils static std::unique_ptr getFullParam(float solenoidBz, uint32_t nHbfPerTf = 0, std::unique_ptr* pConfiguration = nullptr, std::unique_ptr* pO2Settings = nullptr, bool* autoMaxTimeBin = nullptr); static std::shared_ptr getFullParamShared(float solenoidBz, uint32_t nHbfPerTf = 0, std::unique_ptr* pConfiguration = nullptr, std::unique_ptr* pO2Settings = nullptr, bool* autoMaxTimeBin = nullptr); // Return owning pointer static void paramUseExternalOccupancyMap(GPUParam* param, uint32_t nHbfPerTf, const uint32_t* occupancymap, int32_t occupancyMapSize); + static uint32_t getTpcMaxTimeBinFromNHbf(uint32_t nHbf); class GPUReconstructionZSDecoder { diff --git a/GPU/Workflow/src/GPUWorkflowSpec.cxx b/GPU/Workflow/src/GPUWorkflowSpec.cxx index fcf27074ca717..0360a352b0a90 100644 --- a/GPU/Workflow/src/GPUWorkflowSpec.cxx +++ b/GPU/Workflow/src/GPUWorkflowSpec.cxx @@ -156,7 +156,7 @@ void GPURecoWorkflowSpec::init(InitContext& ic) mAutoSolenoidBz = mConfParam->solenoidBzNominalGPU == -1e6f; mAutoContinuousMaxTimeBin = mConfig->configGRP.grpContinuousMaxTimeBin < 0; if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.grpContinuousMaxTimeBin = ((mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : 256) * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(mConfParam->overrideNHbfPerTF ? mConfParam->overrideNHbfPerTF : 256); } if (mConfig->configProcessing.deviceNum == -2) { int32_t myId = ic.services().get().inputTimesliceId; @@ -1013,7 +1013,7 @@ void GPURecoWorkflowSpec::doCalibUpdates(o2::framework::ProcessingContext& pc, c LOG(info) << "Updating solenoid field " << newCalibValues.solenoidField; } if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.grpContinuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(mTFSettings->nHBFPerTF); newCalibValues.newContinuousMaxTimeBin = true; newCalibValues.continuousMaxTimeBin = mConfig->configGRP.grpContinuousMaxTimeBin; LOG(info) << "Updating max time bin " << newCalibValues.continuousMaxTimeBin << " (" << mTFSettings->nHBFPerTF << " orbits)"; diff --git a/GPU/Workflow/src/O2GPUDPLDisplay.cxx b/GPU/Workflow/src/O2GPUDPLDisplay.cxx index 6946d65915503..8513541bcae43 100644 --- a/GPU/Workflow/src/O2GPUDPLDisplay.cxx +++ b/GPU/Workflow/src/O2GPUDPLDisplay.cxx @@ -115,7 +115,7 @@ void O2GPUDPLDisplaySpec::run(ProcessingContext& pc) mGRPGeomUpdated = false; mConfig->configGRP.solenoidBzNominalGPU = GPUO2InterfaceUtils::getNominalGPUBz(*GRPGeomHelper::instance().getGRPMagField()); if (mAutoContinuousMaxTimeBin) { - mConfig->configGRP.grpContinuousMaxTimeBin = (mTFSettings->nHBFPerTF * o2::constants::lhc::LHCMaxBunches + 2 * o2::tpc::constants::LHCBCPERTIMEBIN - 2) / o2::tpc::constants::LHCBCPERTIMEBIN; + mConfig->configGRP.grpContinuousMaxTimeBin = GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(mTFSettings->nHBFPerTF); } mDisplay->UpdateGRP(&mConfig->configGRP); if (mGeometryCreated == 0) {