Skip to content

Commit b8782ae

Browse files
authored
Add support for bitmap in ROFRecords (#13385)
1 parent 476a75a commit b8782ae

File tree

4 files changed

+38
-25
lines changed

4 files changed

+38
-25
lines changed

DataFormats/Detectors/ITSMFT/common/include/DataFormatsITSMFT/ROFRecord.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ class ROFRecord
4545
void setFirstEntry(int idx) { mROFEntry.setFirstEntry(idx); }
4646
void setNEntries(int n) { mROFEntry.setEntries(n); }
4747

48+
uint32_t getFlags() const { return mBits; }
49+
void setFlags(uint32_t flags) { mBits = flags; }
50+
void setFlag(uint8_t flagIndex) { mBits |= (1 << flagIndex); }
51+
void resetFlag(uint8_t flagIndex) { mBits &= ~(1 << flagIndex); }
52+
bool getFlag(uint8_t flagIndex) const { return mBits & (1 << flagIndex); }
53+
void clearAllFlags() { mBits = 0; }
54+
void setAllFlags() { mBits = ~0; }
55+
4856
const BCData& getBCData() const { return mBCData; }
4957
BCData& getBCData() { return mBCData; }
5058
EvIdx getEntry() const { return mROFEntry; }
@@ -91,8 +99,8 @@ class ROFRecord
9199
o2::InteractionRecord mBCData; // BC data for given trigger
92100
EvIdx mROFEntry; //< reference on the 1st object of the ROF in data
93101
ROFtype mROFrame = 0; //< frame ID
94-
95-
ClassDefNV(ROFRecord, 2);
102+
uint32_t mBits = 0;
103+
ClassDefNV(ROFRecord, 3);
96104
};
97105

98106
/// this is a simple reference connecting (composed) MC event ID (from the EventRecord of the RunContext)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void TrackerTraits::computeLayerTracklets(const int iteration, int iROFslice, in
9898

9999
for (int iV{startVtx}; iV < endVtx; ++iV) {
100100
auto& primaryVertex{primaryVertices[iV]};
101-
if (primaryVertex.isFlagSet(1) && iteration != 3) {
101+
if (primaryVertex.isFlagSet(2) && iteration != 3) {
102102
continue;
103103
}
104104
const float resolution = o2::gpu::CAMath::Sqrt(Sq(mTrkParams[iteration].PVres) / primaryVertex.getNContributors() + Sq(tf->getPositionResolution(iLayer)));

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

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,14 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
118118
}
119119

120120
auto rofsinput = pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("ROframes");
121-
auto& rofs = pc.outputs().make<std::vector<o2::itsmft::ROFRecord>>(Output{"ITS", "ITSTrackROF", 0}, rofsinput.begin(), rofsinput.end());
121+
auto& trackROFvec = pc.outputs().make<std::vector<o2::itsmft::ROFRecord>>(Output{"ITS", "ITSTrackROF", 0}, rofsinput.begin(), rofsinput.end());
122122
auto& irFrames = pc.outputs().make<std::vector<o2::dataformats::IRFrame>>(Output{"ITS", "IRFRAMES", 0});
123123
const auto& alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance(); // RS: this should come from CCDB
124124

125-
irFrames.reserve(rofs.size());
125+
irFrames.reserve(trackROFvec.size());
126126
int nBCPerTF = alpParams.roFrameLengthInBC;
127127

128-
LOGP(info, "ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), rofs.size());
129-
128+
LOGP(info, "ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), trackROFvec.size());
130129
const dataformats::MCTruthContainer<MCCompLabel>* labels = nullptr;
131130
gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
132131
if (mIsMC) {
@@ -165,8 +164,8 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
165164

166165
gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
167166

168-
gsl::span<itsmft::ROFRecord> rofspan(rofs);
169-
mTimeFrame->loadROFrameData(rofspan, compClusters, pattIt, mDict, labels);
167+
gsl::span<itsmft::ROFRecord> trackROFspan(trackROFvec);
168+
mTimeFrame->loadROFrameData(trackROFspan, compClusters, pattIt, mDict, labels);
170169
pattIt = patterns.begin();
171170
std::vector<int> savedROF;
172171
auto logger = [&](std::string s) { LOG(info) << s; };
@@ -175,12 +174,12 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
175174

176175
FastMultEst multEst; // mult estimator
177176
std::vector<bool> processingMask, processUPCMask;
178-
int cutVertexMult{0}, cutUPCVertex{0}, cutRandomMult = int(rofs.size()) - multEst.selectROFs(rofs, compClusters, physTriggers, processingMask);
177+
int cutVertexMult{0}, cutUPCVertex{0}, cutRandomMult = int(trackROFvec.size()) - multEst.selectROFs(trackROFvec, compClusters, physTriggers, processingMask);
179178
processUPCMask.resize(processingMask.size(), false);
180179
mTimeFrame->setMultiplicityCutMask(processingMask);
181180
float vertexerElapsedTime{0.f};
182181
if (mRunVertexer) {
183-
vertROFvec.reserve(rofs.size());
182+
vertROFvec.reserve(trackROFvec.size());
184183
// Run seeding vertexer
185184
if constexpr (isGPU) {
186185
vertexerElapsedTime = mVertexer->clustersToVerticesHybrid(logger);
@@ -192,9 +191,9 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
192191
}
193192
const auto& multEstConf = FastMultEstConfig::Instance(); // parameters for mult estimation and cuts
194193
gsl::span<const std::pair<MCCompLabel, float>> vMCRecInfo;
195-
for (auto iRof{0}; iRof < rofspan.size(); ++iRof) {
194+
for (auto iRof{0}; iRof < trackROFspan.size(); ++iRof) {
196195
std::vector<Vertex> vtxVecLoc;
197-
auto& vtxROF = vertROFvec.emplace_back(rofspan[iRof]);
196+
auto& vtxROF = vertROFvec.emplace_back(trackROFspan[iRof]);
198197
vtxROF.setFirstEntry(vertices.size());
199198
if (mRunVertexer) {
200199
auto vtxSpan = mTimeFrame->getPrimaryVertices(iRof);
@@ -219,6 +218,11 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
219218
allVerticesLabels.push_back(vMCRecInfo[iV].first);
220219
allVerticesPurities.push_back(vMCRecInfo[iV].second);
221220
}
221+
if (v.isFlagSet(2)) { // Vertex is reconstructed in a second iteration
222+
vtxROF.setFlag(2); // flag that at least one vertex is from the second iteration
223+
} else {
224+
vtxROF.setFlag(1); // flag that at least one vertex is from the first iteration
225+
}
222226
}
223227
if (processingMask[iRof] && !selROF) { // passed selection in clusters and not in vertex multiplicity
224228
LOGP(info, "ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
@@ -236,22 +240,22 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
236240
}
237241
}
238242
if (mRunVertexer) {
239-
LOG(info) << fmt::format(" - rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}, upc.sel:{}", cutRandomMult + cutVertexMult + cutUPCVertex, rofspan.size(), cutRandomMult, multEst.lastRandomSeed, cutVertexMult, cutUPCVertex);
243+
LOG(info) << fmt::format(" - rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}, upc.sel:{}", cutRandomMult + cutVertexMult + cutUPCVertex, trackROFspan.size(), cutRandomMult, multEst.lastRandomSeed, cutVertexMult, cutUPCVertex);
240244
LOG(info) << fmt::format(" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
241245
vertexerElapsedTime,
242246
mTimeFrame->getPrimaryVerticesNum(),
243247
mTimeFrame->getTotVertIteration()[0],
244248
o2::its::VertexerParamConfig::Instance().nIterations > 1 ? mTimeFrame->getTotVertIteration()[1] : 0,
245-
rofspan.size() - mTimeFrame->getNoVertexROF(),
246-
rofspan.size());
249+
trackROFspan.size() - mTimeFrame->getNoVertexROF(),
250+
trackROFspan.size());
247251
}
248252

249253
if (mOverrideBeamEstimation) {
250254
LOG(info) << fmt::format(" - Beam position set to: {}, {} from meanvertex object", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
251255
} else {
252256
LOG(info) << fmt::format(" - Beam position computed for the TF: {}, {}", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
253257
}
254-
if (mCosmicsProcessing && compClusters.size() > 1500 * rofspan.size()) {
258+
if (mCosmicsProcessing && compClusters.size() > 1500 * trackROFspan.size()) {
255259
LOG(error) << "Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing.";
256260
} else {
257261

@@ -279,17 +283,18 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
279283
LOG(warning) << fmt::format(" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries", mTimeFrame->hasBogusClusters());
280284
}
281285

282-
for (unsigned int iROF{0}; iROF < rofs.size(); ++iROF) {
283-
auto& rof{rofs[iROF]};
286+
for (unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
287+
auto& tracksROF{trackROFvec[iROF]};
288+
auto& vtxROF = vertROFvec[iROF];
284289
auto& tracks = mTimeFrame->getTracks(iROF);
285290
auto number{tracks.size()};
286291
auto first{allTracks.size()};
287-
int offset = -rof.getFirstEntry(); // cluster entry!!!
288-
rof.setFirstEntry(first);
289-
rof.setNEntries(number);
290-
292+
int offset = -tracksROF.getFirstEntry(); // cluster entry!!!
293+
tracksROF.setFirstEntry(first);
294+
tracksROF.setNEntries(number);
295+
tracksROF.setFlags(number ? vtxROF.getFlags() : 0); // copies 0xffffffff if cosmics
291296
if (processingMask[iROF]) {
292-
irFrames.emplace_back(rof.getBCData(), rof.getBCData() + nBCPerTF - 1).info = tracks.size();
297+
irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
293298
}
294299
allTrackLabels.reserve(mTimeFrame->getTracksLabel(iROF).size()); // should be 0 if not MC
295300
std::copy(mTimeFrame->getTracksLabel(iROF).begin(), mTimeFrame->getTracksLabel(iROF).end(), std::back_inserter(allTrackLabels));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ void VertexerTraits::computeVertices(const int iteration)
469469
mTimeFrame->getTrackletClusters(rofId)[iCluster].getAvgDistance2()); // In place of chi2
470470

471471
vertices.back().setTimeStamp(rofId);
472-
vertices.back().setFlags(iteration);
472+
vertices.back().setFlags(iteration + 1); // This can be interpreted as the UPC flag if it is > 0
473473
if (mTimeFrame->hasMCinformation()) {
474474
std::vector<o2::MCCompLabel> labels;
475475
for (auto& index : mTimeFrame->getTrackletClusters(rofId)[iCluster].getLabels()) {

0 commit comments

Comments
 (0)