Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ namespace o2::its3::reco_workflow
framework::WorkflowSpec getWorkflow(bool useMC,
const std::string& trmode,
o2::gpu::GPUDataTypes::DeviceType dtype,
bool useGPUWorkflow,
bool upstreamDigits,
bool upstreamClusters,
bool disableRootOutput,
Expand Down
40 changes: 37 additions & 3 deletions Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,18 @@
#include "ITS3Workflow/TrackerSpec.h"
#include "ITS3Workflow/TrackWriterSpec.h"
#include "ITS3Workflow/DigitReaderSpec.h"
#include "Framework/Logger.h"
#include "GPUWorkflow/GPUWorkflowSpec.h"
#include "Framework/CCDBParamSpec.h"

// Dummy pointers
using CompletionPolicyData = std::vector<InputSpec>;
static CompletionPolicyData gPolicyData;
static std::shared_ptr<o2::gpu::GPURecoWorkflowSpec> gTask;

namespace o2::its3::reco_workflow
{

framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype,
framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype, bool useGPUWorkflow,
bool upstreamDigits, bool upstreamClusters, bool disableRootOutput, bool useGeom, int useTrig, bool overrideBeamPosition)
{
framework::WorkflowSpec specs;
Expand All @@ -38,8 +44,36 @@ framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::g
}

if (trmode != "off") {
specs.emplace_back(o2::its3::getTrackerSpec(useMC, useGeom, useTrig, trmode, overrideBeamPosition, dtype));
if (useGPUWorkflow) {
o2::gpu::GPURecoWorkflowSpec::Config cfg;
cfg.runITSTracking = true;
cfg.isITS3 = true;
cfg.itsTriggerType = useTrig;
cfg.itsOverrBeamEst = overrideBeamPosition;
cfg.processMC = useMC;
Inputs ggInputs;
auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, true, false, true, true,
useGeom ? o2::base::GRPGeomRequest::Aligned : o2::base::GRPGeomRequest::None,
ggInputs, true);
if (!useGeom) {
ggRequest->addInput({"itsTGeo", "ITS", "GEOMTGEO", 0, Lifetime::Condition, framework::ccdbParamSpec("ITS/Config/Geometry")}, ggInputs);
}

auto task = std::make_shared<o2::gpu::GPURecoWorkflowSpec>(&gPolicyData, cfg, std::vector<int>(), 0, ggRequest);
gTask = task;
Inputs taskInputs = task->inputs();
Options taskOptions = task->options();
std::move(ggInputs.begin(), ggInputs.end(), std::back_inserter(taskInputs));

specs.emplace_back(DataProcessorSpec{
"its3-gpu-tracker",
taskInputs,
task->outputs(),
AlgorithmSpec{adoptTask<o2::gpu::GPURecoWorkflowSpec>(task)},
taskOptions});
} else {
specs.emplace_back(o2::its3::getTrackerSpec(useMC, useGeom, useTrig, trmode, overrideBeamPosition, dtype));
}
if (!disableRootOutput) {
specs.emplace_back(o2::its3::getTrackWriterSpec(useMC));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ void customize(std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
{"tracking-mode", o2::framework::VariantType::String, "off", {"off,sync,async,cosmics"}},
{"configKeyValues", VariantType::String, "", {"Semicolon separated key=value strings"}},
{"use-full-geometry", o2::framework::VariantType::Bool, false, {"use full geometry instead of the light-weight IT3 part"}},
{"use-gpu-workflow", o2::framework::VariantType::Bool, false, {"use GPU workflow (default: false)"}},
{"gpu-device", o2::framework::VariantType::Int, 1, {"use gpu device: CPU=1,CUDA=2,HIP=3 (default: CPU)"}}};
o2::raw::HBFUtilsInitializer::addConfigOption(options);
std::swap(workflowOptions, options);
Expand All @@ -67,6 +68,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
auto extClusters = configcontext.options().get<bool>("clusters-from-upstream");
auto disableRootOutput = configcontext.options().get<bool>("disable-root-output");
auto useGeom = configcontext.options().get<bool>("use-full-geometry");
auto useGPUWfx = configcontext.options().get<bool>("use-gpu-workflow");
std::transform(trmode.begin(), trmode.end(), trmode.begin(), [](unsigned char c) { return std::tolower(c); });

o2::conf::ConfigurableParam::updateFromString(configcontext.options().get<std::string>("configKeyValues"));
Expand All @@ -80,7 +82,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
LOG(fatal) << "Unknown trigger type requested for events prescaling: " << selTrig;
}
}
auto wf = o2::its3::reco_workflow::getWorkflow(useMC, trmode, gpuDevice, extDigits, extClusters, disableRootOutput, useGeom, trType, beamPosOVerride);
auto wf = o2::its3::reco_workflow::getWorkflow(useMC, trmode, gpuDevice, useGPUWfx, extDigits, extClusters, disableRootOutput, useGeom, trType, beamPosOVerride);

// configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit
o2::raw::HBFUtilsInitializer hbfIni(configcontext, wf);
Expand Down
3 changes: 2 additions & 1 deletion GPU/Workflow/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ o2_add_library(GPUWorkflow
O2::DataFormatsGlobalTracking
O2::DataFormatsTRD
PRIVATE_LINK_LIBRARIES O2::GPUTracking
O2::ITSTrackingInterface)
O2::ITSTrackingInterface
$<$<BOOL:${ENABLE_UPGRADES}>:O2::ITS3TrackingInterface>)

o2_add_executable(reco-workflow
COMPONENT_NAME gpu
Expand Down
1 change: 1 addition & 0 deletions GPU/Workflow/include/GPUWorkflow/GPUWorkflowSpec.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ class GPURecoWorkflowSpec : public o2::framework::Task
bool runITSTracking = false;
bool itsOverrBeamEst = false;
bool tpcTriggerHandling = false;
bool isITS3 = false;
};

GPURecoWorkflowSpec(CompletionPolicyData* policyData, Config const& specconfig, std::vector<int32_t> const& tpcsectors, uint64_t tpcSectorMask, std::shared_ptr<o2::base::GRPGeomRequest>& ggr, std::function<bool(o2::framework::DataProcessingHeader::StartTime)>** gPolicyOrder = nullptr);
Expand Down
16 changes: 16 additions & 0 deletions GPU/Workflow/src/GPUWorkflowITS.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

#include "ITStracking/TrackingInterface.h"

#ifdef ENABLE_UPGRADES
#include "ITS3Reconstruction/TrackingInterface.h"
#endif

namespace o2::gpu
{

Expand All @@ -35,6 +39,18 @@ void GPURecoWorkflowSpec::initFunctionITS(o2::framework::InitContext& ic)
{
o2::its::VertexerTraits* vtxTraits = nullptr;
o2::its::TrackerTraits* trkTraits = nullptr;
#ifdef ENABLE_UPGRADES
if (mSpecConfig.isITS3) {
mITSTrackingInterface = std::make_unique<o2::its3::ITS3TrackingInterface>(mSpecConfig.processMC,
mSpecConfig.itsTriggerType,
mSpecConfig.itsOverrBeamEst);
} else
#endif
{
mITSTrackingInterface = std::make_unique<o2::its::ITSTrackingInterface>(mSpecConfig.processMC,
mSpecConfig.itsTriggerType,
mSpecConfig.itsOverrBeamEst);
}
mITSTrackingInterface = std::make_unique<o2::its::ITSTrackingInterface>(mSpecConfig.processMC,
mSpecConfig.itsTriggerType,
mSpecConfig.itsOverrBeamEst);
Expand Down
10 changes: 7 additions & 3 deletions GPU/Workflow/src/GPUWorkflowSpec.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -1174,9 +1174,13 @@ Inputs GPURecoWorkflowSpec::inputs()
} else if (mSpecConfig.itsTriggerType == 2) {
inputs.emplace_back("phystrig", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe);
}
inputs.emplace_back("itscldict", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary"));
inputs.emplace_back("itsalppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam"));

if (mSpecConfig.isITS3) {
inputs.emplace_back("cldict", "IT3", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("IT3/Calib/ClusterDictionary"));
inputs.emplace_back("alppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam"));
} else {
inputs.emplace_back("itscldict", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary"));
inputs.emplace_back("itsalppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam"));
}
if (mSpecConfig.itsOverrBeamEst) {
inputs.emplace_back("meanvtx", "GLO", "MEANVERTEX", 0, Lifetime::Condition, ccdbParamSpec("GLO/Calib/MeanVertex", {}, 1));
}
Expand Down