Skip to content

Commit 4acbd0a

Browse files
authored
Extend RecoContainer to support ITS and MFT cluster access per layer (#15861)
When per-layer input for ITS (MFT) clusters is expected, one should do: 1) Before caling DataRequest::requestITSClusters or batch methods calling this request one should call DataRequest::setITSPerLayer(v=true) method. 2) Once RecoContainer::collectData was invoked, query clusters and related data via usual methods getITSClustersROFRecords, getITSClusters, getITSClustersPatterns, getITSClustersMCLabels with extra argument (int layer=0). Note that in case of old access mode (not per layer) the call to e.g. getITSClusters(0) and equivalent getITSClusters() will return usual flat span of clusters covering all layers.
1 parent de2a8c4 commit 4acbd0a

5 files changed

Lines changed: 112 additions & 46 deletions

File tree

‎DataFormats/Detectors/GlobalTracking/include/DataFormatsGlobalTracking/RecoContainer.h‎

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,22 @@ namespace o2
187187
namespace globaltracking
188188
{
189189

190+
// max number of layers for which the ITS/MFT clusters, ROF records and patterns can be provided separately
191+
constexpr int MaxITSLayers = 7;
192+
constexpr int MaxMFTLayers = 10;
193+
190194
// helper class to request DPL input data from the processor specs definition
191195
struct DataRequest {
192196
std::vector<o2::framework::InputSpec> inputs;
193197
std::unordered_map<std::string, bool> requestMap;
194198
MatchingType matchingInputType = MatchingType::Standard; // use subspec = 0 for inputs
199+
bool ITSPerLayer = false; // ITS clusters, ROFs and patterns are provided per layer
200+
bool MFTPerLayer = false; // MFT clusters, ROFs and patterns are provided per layer
201+
202+
auto getITSPerLayer() const { return ITSPerLayer; }
203+
auto getMFTPerLayer() const { return MFTPerLayer; }
204+
void setITSPerLayer(bool v = true);
205+
void setMFTPerLayer(bool v = true);
195206

196207
auto getMatchingInputType() const { return matchingInputType; }
197208
void setMatchingInputStrict() { matchingInputType = MatchingType::Strict; }
@@ -314,11 +325,19 @@ struct RecoContainer {
314325
COSM_TRACKS_MC,
315326
NCOSMSLOTS };
316327

328+
// slots to register ITS/MFT clusters data (per layer, or all layers together in the slot 0)
329+
enum ITSMFTClusSlots { ITSMFT_ROF, // ROF records
330+
ITSMFT_CLS, // compact clusters
331+
ITSMFT_PAT, // cluster patterns
332+
NITSMFTCLUSSLOTS };
333+
317334
using AccSlots = o2::dataformats::AbstractRefAccessor<int, NCOMMONSLOTS>; // int here is a dummy placeholder
318335
using PVertexAccessor = o2::dataformats::AbstractRefAccessor<int, NPVTXSLOTS>;
319336
using SVertexAccessor = o2::dataformats::AbstractRefAccessor<int, NSVTXSLOTS>;
320337
using STrackAccessor = o2::dataformats::AbstractRefAccessor<int, NSTRKSLOTS>;
321338
using CosmicsAccessor = o2::dataformats::AbstractRefAccessor<int, NCOSMSLOTS>;
339+
using ITSClusAccessor = o2::dataformats::AbstractRefAccessor<int, MaxITSLayers>;
340+
using MFTClusAccessor = o2::dataformats::AbstractRefAccessor<int, MaxMFTLayers>;
322341
using GTrackID = o2::dataformats::GlobalTrackID;
323342
using GlobalIDSet = std::array<GTrackID, GTrackID::NSources>;
324343

@@ -332,7 +351,14 @@ struct RecoContainer {
332351
STrackAccessor strkPool; // containers for strangeness tracking related objects
333352
CosmicsAccessor cosmPool; // containers for cosmics track data
334353

335-
std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcITSClusters;
354+
bool ITSPerLayer = false; // ITS clusters, ROFs and patterns are provided per layer
355+
bool MFTPerLayer = false; // MFT clusters, ROFs and patterns are provided per layer
356+
357+
std::array<ITSClusAccessor, NITSMFTCLUSSLOTS> ITSClustersData; // [ROF/Clus/Patt][MaxITSLayers slots, non-staggered == 0]
358+
std::array<MFTClusAccessor, NITSMFTCLUSSLOTS> MFTClustersData; // [ROF/Clus/Patt][MaxMFTLayers slots, non-staggered == 0]
359+
360+
std::array<std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>>, MaxITSLayers> mcITSClusters;
361+
std::array<std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>>, MaxMFTLayers> mcMFTClusters;
336362
std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcTOFClusters;
337363
std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcHMPClusters;
338364
std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcCPVClusters;
@@ -350,6 +376,9 @@ struct RecoContainer {
350376
std::unique_ptr<o2::tpc::internal::getWorkflowTPCInput_ret> inputsTPCclusters; // special struct for TPC clusters access
351377
std::unique_ptr<o2::trd::RecoInputContainer> inputsTRD; // special struct for TRD tracklets, trigger records
352378

379+
auto getITSPerLayer() const { return ITSPerLayer; }
380+
auto getMFTPerLayer() const { return MFTPerLayer; }
381+
353382
void collectData(o2::framework::ProcessingContext& pc, const DataRequest& request);
354383
void createTracks(std::function<bool(const o2::track::TrackParCov&, GTrackID)> const& creator) const;
355384
template <class T>
@@ -497,11 +526,11 @@ struct RecoContainer {
497526
auto getITSABClusterRefs() const { return getSpan<int>(GTrackID::ITSAB, INDICES); }
498527
auto getITSABMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSAB, MCLABELS); }
499528

500-
// ITS clusters
501-
auto getITSClustersROFRecords() const { return getSpan<o2::itsmft::ROFRecord>(GTrackID::ITS, CLUSREFS); }
502-
auto getITSClusters() const { return getSpan<o2::itsmft::CompClusterExt>(GTrackID::ITS, CLUSTERS); }
503-
auto getITSClustersPatterns() const { return getSpan<unsigned char>(GTrackID::ITS, PATTERNS); }
504-
auto getITSClustersMCLabels() const { return mcITSClusters.get(); }
529+
// ITS clusters (layer is ignored unless the data was provided per layer)
530+
auto getITSClustersROFRecords(int layer = 0) const { return ITSClustersData[ITSMFT_ROF].getSpan<o2::itsmft::ROFRecord>(layer); }
531+
auto getITSClusters(int layer = 0) const { return ITSClustersData[ITSMFT_CLS].getSpan<o2::itsmft::CompClusterExt>(layer); }
532+
auto getITSClustersPatterns(int layer = 0) const { return ITSClustersData[ITSMFT_PAT].getSpan<unsigned char>(layer); }
533+
auto getITSClustersMCLabels(int layer = 0) const { return mcITSClusters[layer].get(); }
505534

506535
// MFT
507536
const o2::mft::TrackMFT& getMFTTrack(GTrackID gid) const { return getTrack<o2::mft::TrackMFT>(gid); }
@@ -510,10 +539,11 @@ struct RecoContainer {
510539
auto getMFTTracksClusterRefs() const { return getSpan<int>(GTrackID::MFT, INDICES); }
511540
auto getMFTTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::MFT, MCLABELS); }
512541

513-
// MFT clusters
514-
auto getMFTClustersROFRecords() const { return getSpan<o2::itsmft::ROFRecord>(GTrackID::MFT, CLUSREFS); }
515-
auto getMFTClusters() const { return getSpan<o2::itsmft::CompClusterExt>(GTrackID::MFT, CLUSTERS); }
516-
auto getMFTClustersPatterns() const { return getSpan<unsigned char>(GTrackID::MFT, PATTERNS); }
542+
// MFT clusters (layer is ignored unless the data was provided per layer)
543+
auto getMFTClustersROFRecords(int layer = 0) const { return MFTClustersData[ITSMFT_ROF].getSpan<o2::itsmft::ROFRecord>(layer); }
544+
auto getMFTClusters(int layer = 0) const { return MFTClustersData[ITSMFT_CLS].getSpan<o2::itsmft::CompClusterExt>(layer); }
545+
auto getMFTClustersPatterns(int layer = 0) const { return MFTClustersData[ITSMFT_PAT].getSpan<unsigned char>(layer); }
546+
auto getMFTClustersMCLabels(int layer = 0) const { return mcMFTClusters[layer].get(); }
517547

518548
// MCH
519549
const o2::mch::TrackMCH& getMCHTrack(GTrackID gid) const { return getTrack<o2::mch::TrackMCH>(gid); }

‎DataFormats/Detectors/GlobalTracking/src/RecoContainer.cxx‎

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@ using DetID = o2::detectors::DetID;
5656
RecoContainer::RecoContainer() = default;
5757
RecoContainer::~RecoContainer() = default;
5858

59+
void DataRequest::setITSPerLayer(bool v)
60+
{
61+
if (requestMap.find("clusITS") != requestMap.end()) {
62+
LOGP(fatal, "setITSPerLayer must be called before request ITS clusters");
63+
}
64+
ITSPerLayer = v;
65+
}
66+
67+
void DataRequest::setMFTPerLayer(bool v)
68+
{
69+
if (requestMap.find("clusMFT") != requestMap.end()) {
70+
LOGP(fatal, "setMFTPerLayer must be called before requesting MFT clusters");
71+
}
72+
MFTPerLayer = v;
73+
}
5974
void DataRequest::addInput(const InputSpec&& isp)
6075
{
6176
if (std::find(inputs.begin(), inputs.end(), isp) == inputs.end()) {
@@ -228,42 +243,51 @@ void DataRequest::requestTOFMatches(o2::dataformats::GlobalTrackID::mask_t src,
228243

229244
void DataRequest::requestITSClusters(bool mc)
230245
{
231-
addInput({"clusITS", "ITS", "COMPCLUSTERS", 0, Lifetime::Timeframe});
232-
addInput({"clusITSPatt", "ITS", "PATTERNS", 0, Lifetime::Timeframe});
233-
addInput({"clusITSROF", "ITS", "CLUSTERSROF", 0, Lifetime::Timeframe});
234-
addInput({"alpparITS", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")});
235-
if (mc) {
236-
addInput({"clusITSMC", "ITS", "CLUSTERSMCTR", 0, Lifetime::Timeframe});
246+
uint16_t nInp = ITSPerLayer ? MaxITSLayers : 1;
247+
for (uint16_t il = 0; il < nInp; ++il) {
248+
addInput({"clusITS" + std::to_string(il), "ITS", "COMPCLUSTERS", il, Lifetime::Timeframe});
249+
addInput({"clusITSPatt" + std::to_string(il), "ITS", "PATTERNS", il, Lifetime::Timeframe});
250+
addInput({"clusITSROF" + std::to_string(il), "ITS", "CLUSTERSROF", il, Lifetime::Timeframe});
251+
if (mc) {
252+
addInput({"clusITSMC" + std::to_string(il), "ITS", "CLUSTERSMCTR", il, Lifetime::Timeframe});
253+
}
237254
}
255+
addInput({"alpparITS", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")});
238256
addInput({"cldictITS", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary")});
239257
requestMap["clusITS"] = mc;
240258
}
241259

242260
#ifdef ENABLE_UPGRADES
243261
void DataRequest::requestIT3Clusters(bool mc)
244262
{
245-
addInput({"clusITS", "ITS", "COMPCLUSTERS", 0, Lifetime::Timeframe});
246-
addInput({"clusITSPatt", "ITS", "PATTERNS", 0, Lifetime::Timeframe});
247-
addInput({"clusITSROF", "ITS", "CLUSTERSROF", 0, Lifetime::Timeframe});
248-
addInput({"alpparITS", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")});
249-
if (mc) {
250-
addInput({"clusITSMC", "ITS", "CLUSTERSMCTR", 0, Lifetime::Timeframe});
263+
uint16_t nInp = ITSPerLayer ? MaxITSLayers : 1;
264+
for (uint16_t il = 0; il < nInp; ++il) {
265+
addInput({"clusITS" + std::to_string(il), "ITS", "COMPCLUSTERS", il, Lifetime::Timeframe});
266+
addInput({"clusITSPatt" + std::to_string(il), "ITS", "PATTERNS", il, Lifetime::Timeframe});
267+
addInput({"clusITSROF" + std::to_string(il), "ITS", "CLUSTERSROF", il, Lifetime::Timeframe});
268+
if (mc) {
269+
addInput({"clusITSMC" + std::to_string(il), "ITS", "CLUSTERSMCTR", il, Lifetime::Timeframe});
270+
}
251271
}
272+
addInput({"alpparITS", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")});
252273
addInput({"cldictIT3", "IT3", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("IT3/Calib/ClusterDictionary")});
253274
requestMap["clusIT3"] = mc;
254275
}
255276
#endif
256277

257278
void DataRequest::requestMFTClusters(bool mc)
258279
{
259-
addInput({"clusMFT", "MFT", "COMPCLUSTERS", 0, Lifetime::Timeframe});
260-
addInput({"clusMFTPatt", "MFT", "PATTERNS", 0, Lifetime::Timeframe});
261-
addInput({"clusMFTROF", "MFT", "CLUSTERSROF", 0, Lifetime::Timeframe});
280+
uint16_t nInp = MFTPerLayer ? MaxMFTLayers : 1;
281+
for (uint16_t il = 0; il < nInp; ++il) {
282+
addInput({"clusMFT" + std::to_string(il), "MFT", "COMPCLUSTERS", il, Lifetime::Timeframe});
283+
addInput({"clusMFTPatt" + std::to_string(il), "MFT", "PATTERNS", il, Lifetime::Timeframe});
284+
addInput({"clusMFTROF" + std::to_string(il), "MFT", "CLUSTERSROF", il, Lifetime::Timeframe});
285+
if (mc) {
286+
addInput({"clusMFTMC" + std::to_string(il), "MFT", "CLUSTERSMCTR", il, Lifetime::Timeframe});
287+
}
288+
}
262289
addInput({"cldictMFT", "MFT", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("MFT/Calib/ClusterDictionary")});
263290
addInput({"alpparMFT", "MFT", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("MFT/Config/AlpideParam")});
264-
if (mc) {
265-
addInput({"clusMFTMC", "MFT", "CLUSTERSMCTR", 0, Lifetime::Timeframe});
266-
}
267291
requestMap["clusMFT"] = mc;
268292
}
269293

@@ -616,6 +640,9 @@ void RecoContainer::collectData(ProcessingContext& pc, const DataRequest& reques
616640
{
617641
auto& reqMap = requests.requestMap;
618642

643+
ITSPerLayer = requests.getITSPerLayer();
644+
MFTPerLayer = requests.getMFTPerLayer();
645+
619646
startIR = {0, pc.services().get<o2::framework::TimingInfo>().firstTForbit};
620647

621648
auto req = reqMap.find("trackITS");
@@ -1074,11 +1101,14 @@ void RecoContainer::addITSClusters(ProcessingContext& pc, bool mc)
10741101
pc.inputs().get<o2::itsmft::TopologyDictionary*>("cldictITS"); // just to trigger the finaliseCCDB
10751102
pc.inputs().get<o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>*>("alpparITS"); // note: configurable param does not need finaliseCCDB
10761103
}
1077-
commonPool[GTrackID::ITS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("clusITSROF"), CLUSREFS);
1078-
commonPool[GTrackID::ITS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("clusITS"), CLUSTERS);
1079-
commonPool[GTrackID::ITS].registerContainer(pc.inputs().get<gsl::span<unsigned char>>("clusITSPatt"), PATTERNS);
1080-
if (mc) {
1081-
mcITSClusters = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("clusITSMC");
1104+
uint16_t nInp = ITSPerLayer ? MaxITSLayers : 1;
1105+
for (uint16_t il = 0; il < nInp; ++il) {
1106+
ITSClustersData[ITSMFT_ROF].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("clusITSROF" + std::to_string(il)), il);
1107+
ITSClustersData[ITSMFT_CLS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("clusITS" + std::to_string(il)), il);
1108+
ITSClustersData[ITSMFT_PAT].registerContainer(pc.inputs().get<gsl::span<unsigned char>>("clusITSPatt" + std::to_string(il)), il);
1109+
if (mc) {
1110+
mcITSClusters[il] = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("clusITSMC" + std::to_string(il));
1111+
}
10821112
}
10831113
}
10841114

@@ -1089,11 +1119,14 @@ void RecoContainer::addIT3Clusters(ProcessingContext& pc, bool mc)
10891119
pc.inputs().get<o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>*>("alpparITS"); // note: configurable param does not need finaliseCCDB
10901120
pc.inputs().get<o2::its3::TopologyDictionary*>("cldictIT3"); // just to trigger the finaliseCCDB
10911121
}
1092-
commonPool[GTrackID::ITS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("clusITSROF"), CLUSREFS);
1093-
commonPool[GTrackID::ITS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("clusITS"), CLUSTERS);
1094-
commonPool[GTrackID::ITS].registerContainer(pc.inputs().get<gsl::span<unsigned char>>("clusITSPatt"), PATTERNS);
1095-
if (mc) {
1096-
mcITSClusters = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("clusITSMC");
1122+
uint16_t nInp = ITSPerLayer ? MaxITSLayers : 1;
1123+
for (uint16_t il = 0; il < nInp; ++il) {
1124+
ITSClustersData[ITSMFT_ROF].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("clusITSROF" + std::to_string(il)), il);
1125+
ITSClustersData[ITSMFT_CLS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("clusITS" + std::to_string(il)), il);
1126+
ITSClustersData[ITSMFT_PAT].registerContainer(pc.inputs().get<gsl::span<unsigned char>>("clusITSPatt" + std::to_string(il)), il);
1127+
if (mc) {
1128+
mcITSClusters[il] = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("clusITSMC" + std::to_string(il));
1129+
}
10971130
}
10981131
}
10991132
#endif
@@ -1105,11 +1138,14 @@ void RecoContainer::addMFTClusters(ProcessingContext& pc, bool mc)
11051138
pc.inputs().get<o2::itsmft::TopologyDictionary*>("cldictMFT"); // just to trigger the finaliseCCDB
11061139
pc.inputs().get<o2::itsmft::DPLAlpideParam<o2::detectors::DetID::MFT>*>("alpparMFT"); // note: configurable param does not need finaliseCCDB
11071140
}
1108-
commonPool[GTrackID::MFT].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("clusMFTROF"), CLUSREFS);
1109-
commonPool[GTrackID::MFT].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("clusMFT"), CLUSTERS);
1110-
commonPool[GTrackID::MFT].registerContainer(pc.inputs().get<gsl::span<unsigned char>>("clusMFTPatt"), PATTERNS);
1111-
if (mc) {
1112-
mcITSClusters = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("clusMFTMC");
1141+
uint16_t nInp = MFTPerLayer ? MaxMFTLayers : 1;
1142+
for (uint16_t il = 0; il < nInp; ++il) {
1143+
MFTClustersData[ITSMFT_ROF].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("clusMFTROF" + std::to_string(il)), il);
1144+
MFTClustersData[ITSMFT_CLS].registerContainer(pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("clusMFT" + std::to_string(il)), il);
1145+
MFTClustersData[ITSMFT_PAT].registerContainer(pc.inputs().get<gsl::span<unsigned char>>("clusMFTPatt" + std::to_string(il)), il);
1146+
if (mc) {
1147+
mcMFTClusters[il] = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("clusMFTMC" + std::to_string(il));
1148+
}
11131149
}
11141150
}
11151151

‎Detectors/GlobalTracking/src/MatchTPCITS.cxx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ bool MatchTPCITS::prepareITSData()
695695
}
696696

697697
if (mMCTruthON) {
698-
mITSClsLabels = inp.mcITSClusters.get();
698+
mITSClsLabels = inp.getITSClustersMCLabels();
699699
}
700700

701701
// ITS tracks

‎Detectors/Vertexing/StrangenessTracking/src/StrangenessTracker.cxx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ bool StrangenessTracker::loadData(const o2::globaltracking::RecoContainer& recoD
9191
}
9292

9393
if (mMCTruthON) {
94-
mITSClsLabels = recoData.mcITSClusters.get();
94+
mITSClsLabels = recoData.getITSClustersMCLabels();
9595
mITSTrkLabels = recoData.getITSTracksMCLabels();
9696
}
9797

‎GPU/Workflow/helper/src/GPUWorkflowHelper.cxx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ std::shared_ptr<const GPUWorkflowHelper::tmpDataContainer> GPUWorkflowHelper::fi
4747
ioPtr.nItsClusterROF = ITSClusterROFRec.size();
4848
ioPtr.itsClusterROF = ITSClusterROFRec.data();
4949
if (useMC) {
50-
const auto& ITSClsLabels = recoCont.mcITSClusters.get();
50+
const auto* ITSClsLabels = recoCont.getITSClustersMCLabels();
5151
ioPtr.itsClusterMC = ITSClsLabels;
5252
}
5353
}

0 commit comments

Comments
 (0)