Skip to content

Commit f7b582e

Browse files
mconcaschiarazampolli
authored andcommitted
ITS-GPU: Fixup for running on PbPb in async mode (#12489)
* Fix tracking mode not correctly forwarded * Make ITS GPU running on PbPb in async
1 parent 3ea66c1 commit f7b582e

9 files changed

Lines changed: 46 additions & 41 deletions

File tree

Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ class TimeFrameGPU : public TimeFrame
190190
void initialiseHybrid(const int, const TrackingParameters&, const int, IndexTableUtils* utils = nullptr, const TimeFrameGPUParameters* pars = nullptr);
191191
void initDevice(const int, IndexTableUtils*, const TrackingParameters& trkParam, const TimeFrameGPUParameters&, const int, const int);
192192
void initDeviceSAFitting();
193-
void loadTrackingFrameInfoDevice();
193+
void loadTrackingFrameInfoDevice(const int);
194194
void loadUnsortedClustersDevice();
195195
void loadClustersDevice();
196196
void loadTrackletsDevice();
@@ -199,7 +199,7 @@ class TimeFrameGPU : public TimeFrame
199199
void loadTrackSeedsChi2Device();
200200
void loadRoadsDevice();
201201
void loadTrackSeedsDevice(std::vector<CellSeed>&);
202-
void createTrackITSExtDevice(const std::vector<CellSeed>& seeds);
202+
void createTrackITSExtDevice(const std::vector<CellSeed>&);
203203
void createTrackITSExtDevice(); // deprecated
204204
void downloadTrackITSExtDevice();
205205
void initDeviceChunks(const int, const int);

Detectors/ITSMFT/ITS/tracking/GPU/cuda/TimeFrameGPU.cu

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ void TimeFrameGPU<nLayers>::allocMemAsync(void** ptr, size_t size, Stream* strPt
342342
if (extAllocator) {
343343
*ptr = mAllocator->allocate(size);
344344
} else {
345-
LOGP(debug, "Calling default CUDA allocator");
345+
LOGP(info, "Calling default CUDA allocator");
346346
checkGPUError(cudaMallocAsync(reinterpret_cast<void**>(ptr), size, strPtr->get()));
347347
}
348348
}
@@ -373,17 +373,10 @@ void TimeFrameGPU<nLayers>::registerHostMemory(const int maxLayers)
373373
template <int nLayers>
374374
void TimeFrameGPU<nLayers>::unregisterHostMemory(const int maxLayers)
375375
{
376-
if (!mHostRegistered) {
377-
return;
378-
}
379-
for (auto iLayer{0}; iLayer < maxLayers; ++iLayer) {
380-
checkGPUError(cudaHostUnregister(mClusters[iLayer].data()));
381-
checkGPUError(cudaHostUnregister(mNClustersPerROF[iLayer].data()));
382-
checkGPUError(cudaHostUnregister(mIndexTables[iLayer].data()));
376+
for (auto iLayer{0}; iLayer < nLayers; ++iLayer) {
377+
checkGPUError(cudaHostUnregister(mTrackingFrameInfo[iLayer].data()));
383378
}
384-
checkGPUError(cudaHostUnregister(mHostNTracklets.data()));
385-
checkGPUError(cudaHostUnregister(mHostNCells.data()));
386-
mHostRegistered = false;
379+
checkGPUError(cudaHostUnregister(mTrackingFrameInfoDevice.data()));
387380
}
388381

389382
template <int nLayers>
@@ -522,17 +515,21 @@ void TimeFrameGPU<nLayers>::loadClustersDevice()
522515
}
523516

524517
template <int nLayers>
525-
void TimeFrameGPU<nLayers>::loadTrackingFrameInfoDevice()
518+
void TimeFrameGPU<nLayers>::loadTrackingFrameInfoDevice(const int iteration)
526519
{
527520
for (auto iLayer{0}; iLayer < nLayers; ++iLayer) {
528521
LOGP(debug, "gpu-transfer: loading {} tfinfo on layer {}, for {} MB.", mTrackingFrameInfo[iLayer].size(), iLayer, mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo) / MB);
529522
allocMemAsync(reinterpret_cast<void**>(&mTrackingFrameInfoDevice[iLayer]), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), nullptr, getExtAllocator());
530523
// Register and move data
531-
checkGPUError(cudaHostRegister(mTrackingFrameInfo[iLayer].data(), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), cudaHostRegisterPortable));
524+
if (!iteration) {
525+
checkGPUError(cudaHostRegister(mTrackingFrameInfo[iLayer].data(), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), cudaHostRegisterPortable));
526+
}
532527
checkGPUError(cudaMemcpyAsync(mTrackingFrameInfoDevice[iLayer], mTrackingFrameInfo[iLayer].data(), mTrackingFrameInfo[iLayer].size() * sizeof(TrackingFrameInfo), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
533528
}
534529
allocMemAsync(reinterpret_cast<void**>(&mTrackingFrameInfoDeviceArray), nLayers * sizeof(TrackingFrameInfo*), nullptr, getExtAllocator());
535-
checkGPUError(cudaHostRegister(mTrackingFrameInfoDevice.data(), nLayers * sizeof(TrackingFrameInfo*), cudaHostRegisterPortable));
530+
if (!iteration) {
531+
checkGPUError(cudaHostRegister(mTrackingFrameInfoDevice.data(), nLayers * sizeof(TrackingFrameInfo*), cudaHostRegisterPortable));
532+
}
536533
checkGPUError(cudaMemcpyAsync(mTrackingFrameInfoDeviceArray, mTrackingFrameInfoDevice.data(), nLayers * sizeof(TrackingFrameInfo*), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
537534
}
538535

@@ -570,7 +567,7 @@ template <int nLayers>
570567
void TimeFrameGPU<nLayers>::loadRoadsDevice()
571568
{
572569
LOGP(debug, "gpu-transfer: loading {} roads, for {} MB.", mRoads.size(), mRoads.size() * sizeof(Road<nLayers - 2>) / MB);
573-
allocMemAsync(reinterpret_cast<void**>(&mRoadsDevice), mRoads.size() * sizeof(Road<nLayers - 2>), &(mGpuStreams[0]), false);
570+
allocMemAsync(reinterpret_cast<void**>(&mRoadsDevice), mRoads.size() * sizeof(Road<nLayers - 2>), &(mGpuStreams[0]), getExtAllocator());
574571
checkGPUError(cudaHostRegister(mRoads.data(), mRoads.size() * sizeof(Road<nLayers - 2>), cudaHostRegisterPortable));
575572
checkGPUError(cudaMemcpyAsync(mRoadsDevice, mRoads.data(), mRoads.size() * sizeof(Road<nLayers - 2>), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
576573
}
@@ -579,7 +576,7 @@ template <int nLayers>
579576
void TimeFrameGPU<nLayers>::loadTrackSeedsDevice(std::vector<CellSeed>& seeds)
580577
{
581578
LOGP(debug, "gpu-transfer: loading {} track seeds, for {} MB.", seeds.size(), seeds.size() * sizeof(CellSeed) / MB);
582-
allocMemAsync(reinterpret_cast<void**>(&mTrackSeedsDevice), seeds.size() * sizeof(CellSeed), &(mGpuStreams[0]), false);
579+
allocMemAsync(reinterpret_cast<void**>(&mTrackSeedsDevice), seeds.size() * sizeof(CellSeed), &(mGpuStreams[0]), getExtAllocator());
583580
checkGPUError(cudaHostRegister(seeds.data(), seeds.size() * sizeof(CellSeed), cudaHostRegisterPortable));
584581
checkGPUError(cudaMemcpyAsync(mTrackSeedsDevice, seeds.data(), seeds.size() * sizeof(CellSeed), cudaMemcpyHostToDevice, mGpuStreams[0].get()));
585582
}
@@ -589,8 +586,8 @@ void TimeFrameGPU<nLayers>::createTrackITSExtDevice(const std::vector<CellSeed>&
589586
{
590587
mTrackITSExt.clear();
591588
mTrackITSExt.resize(seeds.size());
592-
LOGP(debug, "gpu-allocation: reserving {} tracks, for {} MB.", seeds.size(), seeds.size() * sizeof(o2::its::TrackITSExt) / MB);
593-
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), seeds.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), false);
589+
LOGP(info, "gpu-allocation: reserving {} tracks, for {} MB.", seeds.size(), seeds.size() * sizeof(o2::its::TrackITSExt) / MB);
590+
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), seeds.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), getExtAllocator());
594591
checkGPUError(cudaMemsetAsync(mTrackITSExtDevice, 0, seeds.size() * sizeof(o2::its::TrackITSExt), mGpuStreams[0].get()));
595592
checkGPUError(cudaHostRegister(mTrackITSExt.data(), seeds.size() * sizeof(o2::its::TrackITSExt), cudaHostRegisterPortable));
596593
}
@@ -600,8 +597,8 @@ void TimeFrameGPU<nLayers>::createTrackITSExtDevice()
600597
{
601598
mTrackITSExt.clear();
602599
mTrackITSExt.resize(mRoads.size());
603-
LOGP(debug, "gpu-allocation: reserving {} tracks, for {} MB.", mRoads.size(), mRoads.size() * sizeof(o2::its::TrackITSExt) / MB);
604-
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), mRoads.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), false);
600+
LOGP(info, "gpu-allocation: reserving {} tracks, for {} MB.", mRoads.size(), mRoads.size() * sizeof(o2::its::TrackITSExt) / MB);
601+
allocMemAsync(reinterpret_cast<void**>(&mTrackITSExtDevice), mRoads.size() * sizeof(o2::its::TrackITSExt), &(mGpuStreams[0]), getExtAllocator());
605602
checkGPUError(cudaMemsetAsync(mTrackITSExtDevice, 0, mRoads.size() * sizeof(o2::its::TrackITSExt), mGpuStreams[0].get()));
606603
checkGPUError(cudaHostRegister(mTrackITSExt.data(), mRoads.size() * sizeof(o2::its::TrackITSExt), cudaHostRegisterPortable));
607604
}

Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -870,9 +870,7 @@ template <int nLayers>
870870
void TrackerTraitsGPU<nLayers>::initialiseTimeFrame(const int iteration)
871871
{
872872
mTimeFrameGPU->initialiseHybrid(iteration, mTrkParams[iteration], nLayers);
873-
mTimeFrameGPU->loadClustersDevice();
874-
mTimeFrameGPU->loadUnsortedClustersDevice();
875-
mTimeFrameGPU->loadTrackingFrameInfoDevice();
873+
mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration);
876874
}
877875

878876
template <int nLayers>
@@ -1165,14 +1163,12 @@ template <int nLayers>
11651163
void TrackerTraitsGPU<nLayers>::computeTrackletsHybrid(const int iteration)
11661164
{
11671165
TrackerTraits::computeLayerTracklets(iteration);
1168-
mTimeFrameGPU->loadTrackletsDevice();
11691166
}
11701167
11711168
template <int nLayers>
11721169
void TrackerTraitsGPU<nLayers>::computeCellsHybrid(const int iteration)
11731170
{
11741171
TrackerTraits::computeLayerCells(iteration);
1175-
mTimeFrameGPU->loadCellsDevice();
11761172
};
11771173
11781174
template <int nLayers>
@@ -1203,6 +1199,10 @@ void TrackerTraitsGPU<nLayers>::findRoadsHybrid(const int iteration)
12031199
}
12041200
trackSeeds.insert(trackSeeds.end(), updatedCellSeed.begin(), updatedCellSeed.end());
12051201
}
1202+
if (!trackSeeds.size()) {
1203+
LOGP(info, "No track seeds found, skipping track finding");
1204+
continue;
1205+
}
12061206
mTimeFrameGPU->createTrackITSExtDevice(trackSeeds);
12071207
mTimeFrameGPU->loadTrackSeedsDevice(trackSeeds);
12081208
@@ -1265,12 +1265,15 @@ void TrackerTraitsGPU<nLayers>::findRoadsHybrid(const int iteration)
12651265
mTimeFrame->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track);
12661266
}
12671267
}
1268+
if (iteration == 2) {
1269+
mTimeFrameGPU->unregisterHostMemory(0); // FIXME this needs to work also with sync
1270+
}
12681271
};
12691272
12701273
template <int nLayers>
12711274
void TrackerTraitsGPU<nLayers>::findTracksHybrid(const int iteration)
12721275
{
1273-
// LOGP(info, "propagator device pointer: {}", (void*)mTimeFrameGPU->getDevicePropagator());
1276+
LOGP(info, "propagator device pointer: {}", (void*)mTimeFrameGPU->getDevicePropagator());
12741277
mTimeFrameGPU->createTrackITSExtDevice();
12751278
gpu::fitTracksKernel<<<20, 512>>>(mTimeFrameGPU->getDeviceArrayClusters(), // Cluster** foundClusters,
12761279
mTimeFrameGPU->getDeviceArrayUnsortedClusters(), // Cluster** foundUnsortedClusters,
@@ -1287,7 +1290,6 @@ void TrackerTraitsGPU<nLayers>::findTracksHybrid(const int iteration)
12871290
mTrkParams[0].MaxChi2NDF, // float maxChi2NDF,
12881291
mTimeFrameGPU->getDevicePropagator()); // const o2::base::Propagator* propagator
12891292
mTimeFrameGPU->downloadTrackITSExtDevice();
1290-
discardResult(cudaDeviceSynchronize());
12911293
auto& tracks = mTimeFrameGPU->getTrackITSExt();
12921294
std::sort(tracks.begin(), tracks.end(),
12931295
[](TrackITSExt& track1, TrackITSExt& track2) { return track1.isBetter(track2, 1.e6f); });

Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
106106
double total{0.};
107107
mTraits->UpdateTrackingParameters(mTrkParams);
108108
for (int iteration = 0; iteration < (int)mTrkParams.size(); ++iteration) {
109+
LOGP(info, "Iteration {}", iteration);
109110
total += evaluateTask(&Tracker::initialiseTimeFrameHybrid, "Hybrid Timeframe initialisation", logger, iteration);
110111
total += evaluateTask(&Tracker::computeTrackletsHybrid, "Hybrid Tracklet finding", logger, iteration);
111112
logger(fmt::format("\t- Number of tracklets: {}", mTraits->getTFNumberOfTracklets()));
@@ -115,7 +116,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
115116
}
116117
float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / mTraits->getTFNumberOfClusters() : 0.f;
117118
if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
118-
error(fmt::format("Too many tracklets per cluster ({}), check the detector status and/or the selections.", trackletsPerCluster));
119+
error(fmt::format("Too many tracklets per cluster ({}), check the detector status and/or the selections. Current limit is {}", trackletsPerCluster, mTrkParams[iteration].TrackletsPerClusterLimit));
119120
break;
120121
}
121122

@@ -127,7 +128,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
127128
}
128129
float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / mTraits->getTFNumberOfClusters() : 0.f;
129130
if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
130-
error(fmt::format("Too many cells per cluster ({}), check the detector status and/or the selections.", cellsPerCluster));
131+
error(fmt::format("Too many cells per cluster ({}), check the detector status and/or the selections. Current limit is {}", cellsPerCluster, mTrkParams[iteration].CellsPerClusterLimit));
131132
break;
132133
}
133134
total += evaluateTask(&Tracker::findCellsNeighboursHybrid, "Hybrid Neighbour finding", logger, iteration);

Detectors/ITSMFT/ITS/workflow/src/RecoWorkflow.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ framework::WorkflowSpec getWorkflow(bool useMC,
6262
cfg.runITSTracking = true;
6363
cfg.itsTriggerType = useTrig;
6464
cfg.itsOverrBeamEst = overrideBeamPosition;
65+
cfg.itsTrackingMode = trmode == "sync" ? 0 : (trmode == "async" ? 1 : 2);
6566

6667
Inputs ggInputs;
6768
auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, true, false, true, true, o2::base::GRPGeomRequest::Aligned, ggInputs, true);

GPU/GPUTracking/Base/GPUReconstruction.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ void* GPUReconstruction::AllocateUnmanagedMemory(size_t size, int type)
676676
char* retVal;
677677
GPUProcessor::computePointerWithAlignment(pool, retVal, size);
678678
if (pool > poolend) {
679-
GPUError("Insufficient unmanaged memory: missing %lu", (size_t)((char*)pool - (char*)poolend));
679+
GPUError("Insufficient unmanaged memory: missing %lu bytes", (size_t)((char*)pool - (char*)poolend));
680680
throw std::bad_alloc();
681681
}
682682
UpdateMaxMemoryUsed();

GPU/GPUTracking/Global/GPUChainITS.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ o2::its::TimeFrame* GPUChainITS::GetITSTimeframe()
9090
mFrameworkAllocator.reset(new o2::its::GPUFrameworkExternalAllocator);
9191
mFrameworkAllocator->setReconstructionFramework(rec());
9292
mITSTimeFrame->setExternalAllocator(mFrameworkAllocator.get());
93-
LOGP(debug, "GPUChainITS is giving me ps: {} prop: {}", (void*)processorsShadow(), (void*)processorsShadow()->calibObjects.o2Propagator);
93+
LOGP(info, "GPUChainITS is giving me ps: {} prop: {} allocator: {}", (void*)processorsShadow(), (void*)processorsShadow()->calibObjects.o2Propagator, (void*)mFrameworkAllocator.get());
9494
mITSTimeFrame->setDevicePropagator(processorsShadow()->calibObjects.o2Propagator);
9595
}
9696
#endif

GPU/Workflow/include/GPUWorkflow/GPUWorkflowSpec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class GPURecoWorkflowSpec : public o2::framework::Task
126126
int lumiScaleType = 0; // 0=off, 1=CTP, 2=TPC scalers
127127
bool outputErrorQA = false;
128128
bool runITSTracking = false;
129+
int itsTrackingMode = 0; // 0=sync, 1=async, 2=cosmics
129130
bool itsOverrBeamEst = false;
130131
bool tpcTriggerHandling = false;
131132
};
@@ -232,7 +233,6 @@ class GPURecoWorkflowSpec : public o2::framework::Task
232233
bool mPropagatorInstanceCreated = false;
233234
bool mITSRunVertexer = false;
234235
bool mITSCosmicsProcessing = false;
235-
std::string mITSMode = "sync";
236236
};
237237

238238
} // end namespace gpu

GPU/Workflow/src/GPUWorkflowITS.cxx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ int GPURecoWorkflowSpec::runITSTracking(o2::framework::ProcessingContext& pc)
184184
pattIt = patterns.begin();
185185
std::vector<int> savedROF;
186186
auto logger = [&](std::string s) { LOG(info) << s; };
187+
auto fatalLogger = [&](std::string s) { LOG(fatal) << s; };
187188
auto errorLogger = [&](std::string s) { LOG(error) << s; };
188189

189190
o2::its::FastMultEst multEst; // mult estimator
@@ -252,7 +253,11 @@ int GPURecoWorkflowSpec::runITSTracking(o2::framework::ProcessingContext& pc)
252253

253254
mITSTimeFrame->setMultiplicityCutMask(processingMask);
254255
// Run CA tracker
255-
mITSTracker->clustersToTracksHybrid(logger, errorLogger);
256+
if (!mSpecConfig.itsTrackingMode) {
257+
mITSTracker->clustersToTracksHybrid(logger, errorLogger);
258+
} else {
259+
mITSTracker->clustersToTracksHybrid(logger, fatalLogger);
260+
}
256261
size_t totTracks{mITSTimeFrame->getNumberOfTracks()}, totClusIDs{mITSTimeFrame->getNumberOfUsedClusters()};
257262
allTracks.reserve(totTracks);
258263
allClusIdx.reserve(totClusIDs);
@@ -303,7 +308,6 @@ int GPURecoWorkflowSpec::runITSTracking(o2::framework::ProcessingContext& pc)
303308

304309
void GPURecoWorkflowSpec::initFunctionITS(InitContext& ic)
305310
{
306-
std::transform(mITSMode.begin(), mITSMode.end(), mITSMode.begin(), [](unsigned char c) { return std::tolower(c); });
307311
o2::its::VertexerTraits* vtxTraits = nullptr;
308312
o2::its::TrackerTraits* trkTraits = nullptr;
309313
mGPUReco->GetITSTraits(trkTraits, vtxTraits, mITSTimeFrame);
@@ -315,25 +319,27 @@ void GPURecoWorkflowSpec::initFunctionITS(InitContext& ic)
315319
mITSCosmicsProcessing = false;
316320
std::vector<o2::its::TrackingParameters> trackParams;
317321

318-
if (mITSMode == "async") {
322+
if (mSpecConfig.itsTrackingMode == 1) {
319323
trackParams.resize(3);
320324
for (auto& param : trackParams) {
321325
param.ZBins = 64;
322326
param.PhiBins = 32;
327+
param.CellsPerClusterLimit = 1.e3f;
328+
param.TrackletsPerClusterLimit = 1.e3f;
323329
}
324330
trackParams[1].TrackletMinPt = 0.2f;
325331
trackParams[1].CellDeltaTanLambdaSigma *= 2.;
326332
trackParams[2].TrackletMinPt = 0.1f;
327333
trackParams[2].CellDeltaTanLambdaSigma *= 4.;
328334
trackParams[2].MinTrackLength = 4;
329335
LOG(info) << "Initializing tracker in async. phase reconstruction with " << trackParams.size() << " passes";
330-
} else if (mITSMode == "sync") {
336+
} else if (mSpecConfig.itsTrackingMode == 0) {
331337
trackParams.resize(1);
332338
trackParams[0].ZBins = 64;
333339
trackParams[0].PhiBins = 32;
334340
trackParams[0].MinTrackLength = 4;
335341
LOG(info) << "Initializing tracker in sync. phase reconstruction with " << trackParams.size() << " passes";
336-
} else if (mITSMode == "cosmics") {
342+
} else if (mSpecConfig.itsTrackingMode == 2) {
337343
mITSCosmicsProcessing = true;
338344
mITSRunVertexer = false;
339345
trackParams.resize(1);
@@ -347,8 +353,6 @@ void GPURecoWorkflowSpec::initFunctionITS(InitContext& ic)
347353
trackParams[0].TrackletsPerClusterLimit = 100.;
348354
trackParams[0].CellsPerClusterLimit = 100.;
349355
LOG(info) << "Initializing tracker in reconstruction for cosmics with " << trackParams.size() << " passes";
350-
} else {
351-
throw std::runtime_error(fmt::format("Unsupported ITS tracking mode {:s} ", mITSMode));
352356
}
353357

354358
for (auto& params : trackParams) {

0 commit comments

Comments
 (0)