Skip to content

Commit 4914deb

Browse files
author
Marcello Di Costanzo
committed
Clenup + sigma computation
1 parent 0efc61e commit 4914deb

3 files changed

Lines changed: 48 additions & 93 deletions

File tree

Detectors/Upgrades/ALICE3/IOTOF/reconstruction/include/IOTOFReconstruction/Clusterer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class Clusterer
6565
// Further reset column buffer in TRK, not included for now in TF3
6666
TopologyClassifier mClsTopoClassifier; //! Convert the cluster topology to the corresponding entry in the dictionary.
6767

68-
void fetchMCLabels(uint32_t digID, const ConstDigitTruth* labelsDig, int& nfilled);
68+
void fetchMCLabels(uint32_t digID, const ConstDigitTruth* labelsDig, int& nFilled);
6969
void findClustersSingleHit(gsl::span<const Digit> digits, uint32_t digitIdx,
7070
const ConstDigitTruth* labelsDigPtr, ClusterTruth* labelsClusPtr);
7171
void findClustersMultipleHits(gsl::span<const Digit> digits, gsl::span<const uint32_t> digitIdxs,

Detectors/Upgrades/ALICE3/IOTOF/reconstruction/src/Clusterer.cxx

Lines changed: 34 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,20 @@ void Clusterer::process(gsl::span<const Digit> digits,
3333
gsl::span<const DigMC2ROFRecord> digMC2ROFs,
3434
std::vector<o2::itsmft::MC2ROFRecord>* clusterMC2ROFs)
3535
{
36-
LOG(info) << "Running clusterizer on " << digitROFs.size() << " ROFs, total digits: " << digits.size();
36+
LOG(info) << "RUNNING CLUSTERIZER ON " << digitROFs.size() << " ROFs, TOTAL DIGITS: " << digits.size();
3737

3838
if (!mThread) {
3939
mThread = std::make_unique<ClustererThread>(this);
4040
}
4141

4242
for (size_t iROF = 0; iROF < digitROFs.size(); ++iROF) {
43-
LOG(info) << "[Clusterer] Processing digit ROF " << iROF << "/" << digitROFs.size();
43+
LOG(debug) << "Processing ROF " << iROF << "/" << digitROFs.size();
4444
const auto& digitsThisROF = digitROFs[iROF];
4545
const auto nStoredCls = static_cast<int>(clusters.size());
4646
const int first = digitsThisROF.getFirstEntry();
4747
const int nDigits = digitsThisROF.getNEntries();
4848

4949
if (nDigits == 0) {
50-
LOG(info) << "[Clusterer] Digit ROF " << iROF << " has no entries, skipping";
5150
clusterROFs.emplace_back(digitsThisROF.getBCData(), digitsThisROF.getROFrame(), nStoredCls, 0);
5251
continue;
5352
}
@@ -93,15 +92,15 @@ void Clusterer::process(gsl::span<const Digit> digits,
9392
nStoredCls, static_cast<int>(clusters.size()) - nStoredCls);
9493
}
9594

96-
LOG(info) << "Finished processing all digit ROFs, total clusters produced: " << clusters.size();
95+
LOG(info) << "FINISHED PROCESSING ALL DIGIT ROFS, TOTAL CLUSTERS PRODUCED: " << clusters.size();
9796
if (clusterMC2ROFs && !digMC2ROFs.empty()) {
9897
clusterMC2ROFs->reserve(clusterMC2ROFs->size() + digMC2ROFs.size());
9998
for (const auto& in : digMC2ROFs) {
10099
clusterMC2ROFs->emplace_back(in.eventRecordID, in.rofRecordID, in.minROF, in.maxROF);
101100
}
102101
}
103102

104-
LOG(info) << "Writing cluster topology map to file TF3ClusterTopologies.root";
103+
LOG(info) << "WRITING CLUSTER TOPOLOGY MAP TO FILE TF3ClusterTopologies.root";
105104
mThread->writeTopologiesToFile("TF3ClusterTopologies.root");
106105
}
107106

@@ -117,16 +116,8 @@ void Clusterer::ClustererThread::processChip(gsl::span<const Digit> digits,
117116
// are the global digit indices for this chip, already sorted by time, col then row).
118117
// We use parent->mSortIdx to resolve the global index of each pixel.
119118
const auto& sortIdx = mParent->mSortIdx;
120-
// LOG(info) << "";
121-
// LOG(info) << "----------------- NEW CHIP -----------------";
122-
// for (int i = 0; i < nDigits; ++i) {
123-
// const auto& digit = digits[sortIdx[firstDigitIdx + i]];
124-
// LOG(info) << "[Clusterer] Digit " << i << "/" << nDigits << ": chipID=" << digit.getChipIndex()
125-
// << ", row=" << digit.getRow() << ", col=" << digit.getColumn()
126-
// << ", charge=" << digit.getCharge() << ", time=" << digit.getTime();
127-
// }
119+
128120
if (nDigits == 1) {
129-
LOG(info) << "[Clusterer] Processing single hit chip";
130121
findClustersSingleHit(digits, sortIdx[firstDigitIdx], labelsDigPtr, labelsClusPtr);
131122
} else {
132123
std::vector<uint32_t> digitIdxs(nDigits);
@@ -136,17 +127,11 @@ void Clusterer::ClustererThread::processChip(gsl::span<const Digit> digits,
136127
}
137128

138129
findClustersMultipleHits(
139-
digits,
140-
gsl::span<const uint32_t>(digitIdxs),
141-
labelsDigPtr,
142-
labelsClusPtr);
130+
digits,
131+
gsl::span<const uint32_t>(digitIdxs),
132+
labelsDigPtr,
133+
labelsClusPtr);
143134
}
144-
// else {
145-
// LOG(info) << "[Clusterer] Processing multi-hit chip with " << nDigits << " hits";
146-
// std::vector<uint32_t> digitIdxs(nDigits);
147-
// std::iota(digitIdxs.begin(), digitIdxs.end(), firstDigitIdx);
148-
// findClustersMultipleHits(digits, gsl::span<const uint32_t>(digitIdxs), labelsDigPtr, labelsClusPtr);
149-
// }
150135

151136
// Flush per-thread output into the caller's containers
152137
if (!mClusters.empty()) {
@@ -176,11 +161,11 @@ void Clusterer::ClustererThread::findClustersSingleHit(gsl::span<const Digit> di
176161
const time_t time = digit.getTime();
177162

178163
if (labelsClusPtr) {
179-
int nlab = 0;
180-
fetchMCLabels(digitIdx, labelsDigPtr, nlab);
181-
const auto cnt = static_cast<uint32_t>(clusters.size());
182-
for (int i = 0; i < nlab; i++) {
183-
labels.addElement(cnt, labelsBuff[i]);
164+
int nStoredLabels = 0;
165+
fetchMCLabels(digitIdx, labelsDigPtr, nStoredLabels);
166+
const auto nCls = static_cast<uint32_t>(mClusters.size());
167+
for (int i = 0; i < nStoredLabels; i++) {
168+
mLabels.addElement(nCls, mLabelsBuff[i]);
184169
}
185170
}
186171

@@ -192,10 +177,10 @@ void Clusterer::ClustererThread::findClustersSingleHit(gsl::span<const Digit> di
192177
// Bit 0 corresponds to (rowOffset=0, colOffset=0) in row-major order
193178
Cluster cluster(row, col, rowSpan, colSpan, firedDigitsMask, clsTopology, chipID, time);
194179

195-
LOG(info) << "Pushing back cluster with row: " << row << ", col: " << col << ", rowSpan: " << rowSpan
196-
<< ", colSpan: " << colSpan << ", pattern: " << firedDigitsMask
197-
<< ", topology: " << clsTopology << ", chipID: " << chipID
198-
<< ", time: " << time;
180+
LOG(debug) << "Pushing back cluster with row: " << row << ", col: " << col << ", rowSpan: " << rowSpan
181+
<< ", colSpan: " << colSpan << ", pattern: " << firedDigitsMask
182+
<< ", topology: " << clsTopology << ", chipID: " << chipID
183+
<< ", time: " << time;
199184

200185
mClusters.emplace_back(cluster);
201186
}
@@ -240,21 +225,12 @@ void Clusterer::ClustererThread::findClustersMultipleHits(gsl::span<const Digit>
240225
}
241226
}
242227

243-
// Debug preclusters
244-
LOG(info) << "[Clusterer] Found " << preclusters.size() << " preclusters in chip " << chipID;
245-
for (size_t i = 0; i < preclusters.size(); ++i) {
246-
LOG(info) << "Precluster " << i << " has " << preclusters[i].size() << " digits";
247-
}
248-
LOG(info) << "";
249-
250228
for (const auto& precluster : preclusters) {
251-
LOG(info) << "[Clusterer] Processing precluster with " << precluster.size() << " digits";
252229

253230
const auto nStoredCls = static_cast<uint32_t>(mClusters.size());
254231

255232
// Single-digit cluster in chip with multiple fired digits
256233
if (precluster.size() == 1) {
257-
LOG(info) << "[Clusterer] Processing single-digit precluster in multi-hit chip";
258234
const auto& digit = digits[precluster[0]];
259235
const uint16_t chipID = digit.getChipIndex();
260236
const uint16_t row = digit.getRow();
@@ -278,14 +254,13 @@ void Clusterer::ClustererThread::findClustersMultipleHits(gsl::span<const Digit>
278254
// Bit 0 corresponds to (rowOffset=0, colOffset=0) in row-major order
279255
Cluster cluster(minRow, minCol, rowSpan, colSpan, firedDigitsMask, clsTopology, chipID, time);
280256

281-
LOG(info) << "Pushing back cluster with row: " << row << ", col: " << col << ", rowSpan: " << rowSpan
257+
LOG(debug) << "Pushing back cluster with row: " << row << ", col: " << col << ", rowSpan: " << rowSpan
282258
<< ", colSpan: " << colSpan << ", pattern: " << firedDigitsMask
283259
<< ", topology: " << clsTopology << ", chipID: " << chipID
284260
<< ", time: " << time;
285261

286262
mClusters.emplace_back(cluster);
287263
} else {
288-
LOG(info) << "[Clusterer] Processing multi-digit precluster with " << precluster.size() << " digits";
289264
// Retrieve min row, min col of the precluster
290265
uint16_t minRow = std::numeric_limits<uint16_t>::max();
291266
uint16_t maxRow = std::numeric_limits<uint16_t>::min();
@@ -313,7 +288,6 @@ void Clusterer::ClustererThread::findClustersMultipleHits(gsl::span<const Digit>
313288
uint16_t firedDigitsMask = 0;
314289

315290
if (rowSpan * colSpan > maxFiredDigitsForCls) {
316-
LOG(warn) << "Adding huge precluster with rowSpan=" << rowSpan << ", colSpan=" << colSpan;
317291
// Overflow precluster: pass InvalidPatternID (or 0) and kHuge topology flag
318292
Cluster cluster(minRow, minCol, rowSpan, colSpan, Cluster::InvalidPatternID, Topologies::kHuge, chipID, clsTime);
319293
mClusters.emplace_back(cluster);
@@ -325,7 +299,7 @@ void Clusterer::ClustererThread::findClustersMultipleHits(gsl::span<const Digit>
325299
const auto& digit = digits[idx];
326300
const uint16_t rowOffset = digit.getRow() - minRow;
327301
const uint16_t colOffset = digit.getColumn() - minCol;
328-
302+
329303
// Single bit position calculation
330304
const uint16_t bitIndex = rowOffset * colSpan + colOffset;
331305

@@ -339,45 +313,42 @@ void Clusterer::ClustererThread::findClustersMultipleHits(gsl::span<const Digit>
339313
mClsTopoClassifier.getTopology(firedDigitsMask, minRow, rowSpan, minCol, colSpan, clsTopology);
340314

341315
// Construct and add cluster using scalar pattern mask
342-
// LOG(info) << "Number of MC labels for this cluster: " << nMcLabels;
343-
for (int i = nMcLabels; i--;) {
344-
// LOG(info) << "[Clusterer::findClustersMultipleHits] Adding MC label " << mLabelsBuff[i] << " to cluster at index " << nStoredCls;
316+
for (int i = 0; i < nMcLabels; i++) {
345317
mLabels.addElement(nStoredCls, mLabelsBuff[i]);
346318
}
347319
Cluster cluster(minRow, minCol, rowSpan, colSpan, firedDigitsMask, clsTopology, chipID, clsTime);
348-
LOG(info) << "Pushing back cluster with row: " << minRow << ", col: " << minCol << ", rowSpan: " << rowSpan
349-
<< ", colSpan: " << colSpan << ", pattern: " << firedDigitsMask
350-
<< ", topology: " << Topologies::kSingleDigit << ", chipID: " << chipID
351-
<< ", time: " << clsTime;
320+
LOG(debug) << "Pushing back cluster with row: " << minRow << ", col: " << minCol << ", rowSpan: " << rowSpan
321+
<< ", colSpan: " << colSpan << ", pattern: " << firedDigitsMask
322+
<< ", topology: " << Topologies::kSingleDigit << ", chipID: " << chipID
323+
<< ", time: " << clsTime;
352324
mClusters.emplace_back(cluster);
353325
}
354326
}
355327
}
356328

357329
//__________________________________________________
358-
void Clusterer::ClustererThread::fetchMCLabels(uint32_t digID, const ConstDigitTruth* labelsDig, int& nfilled)
330+
void Clusterer::ClustererThread::fetchMCLabels(uint32_t digID, const ConstDigitTruth* labelsDig, int& nFilled)
359331
{
360332
if (!labelsDig || digID >= labelsDig->getIndexedSize()) {
361-
// LOG(info) << "[Clusterer::ClustererThread::fetchMCLabels] No labels found for digit ID: " << digID;
362333
return;
363334
}
364-
auto sortBuffer = [this]() { std::sort(this->labelsBuff.begin(), this->labelsBuff.end(), [](Label const& a, Label const& b) { return a.getTrackID() < b.getTrackID(); }); };
335+
auto sortBuffer = [this]() { std::sort(this->mLabelsBuff.begin(), this->mLabelsBuff.end(), [](Label const& a, Label const& b) { return a.getTrackID() < b.getTrackID(); }); };
365336
for (const auto& label : labelsDig->getLabels(digID)) {
366337
bool skip = false;
367-
for (int ic = 0; ic < nfilled; ic++) {
368-
if (labelsBuff[ic] == label) {
338+
for (int ic = 0; ic < nFilled; ic++) {
339+
if (mLabelsBuff[ic] == label) {
369340
skip = true;
370341
break;
371342
}
372343
}
373344
if (!skip) {
374-
if (nfilled < MaxLabels) {
375-
labelsBuff[nfilled++] = label;
376-
if (nfilled == MaxLabels) {
345+
if (nFilled < MaxLabels) {
346+
mLabelsBuff[nFilled++] = label;
347+
if (nFilled == MaxLabels) {
377348
sortBuffer();
378349
}
379-
} else if (labelsBuff.back().getTrackID() > label.getTrackID()) {
380-
labelsBuff.back() = label;
350+
} else if (mLabelsBuff.back().getTrackID() > label.getTrackID()) {
351+
mLabelsBuff.back() = label;
381352
sortBuffer();
382353
}
383354
}

Detectors/Upgrades/ALICE3/IOTOF/reconstruction/src/TopologyClassifier.cxx

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,13 @@ void TopologyClassifier::getTopology(uint16_t bitmask, uint16_t minRow, uint8_t
3838
}
3939

4040
const uint32_t clsTopoKey = packKey(spanRow, spanCol, bitmask);
41-
// Print the 16 bits of the bitmask for debugging
42-
LOG(info) << "[TopologyClassifier::getTopology] Bitmask: " << std::bitset<16>(bitmask) << ", minRow: " << static_cast<int>(minRow) << ", spanRow: " << static_cast<int>(spanRow)
43-
<< ", minCol: " << static_cast<int>(minCol) << ", spanCol: " << static_cast<int>(spanCol);
44-
LOG(info) << "[TopologyClassifier::getTopology] Packed key: " << clsTopoKey;
4541

4642
// Check if the topology is already cached
4743
auto it = mTopologyCache.find(clsTopoKey);
4844
if (it != mTopologyCache.end()) {
4945
topology = it->second.mTopology;
5046
it->second.mFrequency++;
51-
LOG(info) << "[TopologyClassifier::getTopology] Found cached topology: " << static_cast<int>(topology);
47+
LOG(debug) << "Found cached topology: " << static_cast<int>(topology);
5248
return;
5349
}
5450

@@ -62,15 +58,16 @@ TopologyInfo TopologyClassifier::getTopologyFeatures(uint32_t key)
6258
if (it != mTopologyCache.end()) {
6359
return it->second;
6460
} else {
65-
LOG(info) << "[TopologyClassifier::getTopologyFeatures] No cached features found for key: " << key;
61+
LOG(debug) << "No cached features found for key: " << key;
6662
return TopologyInfo(); // Return default-constructed TopologyInfo if not found
6763
}
6864
}
6965

7066
void TopologyClassifier::accountTopology(uint16_t bitmask, uint16_t minRow, uint8_t spanRow, uint16_t minCol, uint8_t spanCol, uint8_t& topology)
7167
{
72-
LOG(info) << "[TopologyClassifier::accountTopology] Classifying topology for bitmask: " << std::bitset<16>(bitmask) << ", minRow: " << static_cast<int>(minRow) << ", spanRow: " << static_cast<int>(spanRow)
73-
<< ", minCol: " << static_cast<int>(minCol) << ", spanCol: " << static_cast<int>(spanCol);
68+
LOG(debug) << "Classifying topology for bitmask: " << std::bitset<16>(bitmask) << ", minRow: "
69+
<< static_cast<int>(minRow) << ", spanRow: " << static_cast<int>(spanRow)
70+
<< ", minCol: " << static_cast<int>(minCol) << ", spanCol: " << static_cast<int>(spanCol);
7471

7572
// New cluster topology features
7673
TopologyInfo newTopo;
@@ -218,7 +215,6 @@ void TopologyClassifier::accountTopology(uint16_t bitmask, uint16_t minRow, uint
218215

219216
void TopologyClassifier::computeCOG(uint16_t bitmask, uint16_t minRow, uint8_t spanRow, uint16_t minCol, uint8_t spanCol, TopologyInfo& topoInfo)
220217
{
221-
LOG(info) << "\n\nComputing COG";
222218
int xOffsetCOG = 0;
223219
int zOffsetCOG = 0;
224220
int firedPixels = 0;
@@ -234,36 +230,25 @@ void TopologyClassifier::computeCOG(uint16_t bitmask, uint16_t minRow, uint8_t s
234230

235231
xOffsetCOG += minRow + iRow;
236232
zOffsetCOG += minCol + iCol;
237-
LOG(info) << "Fired pixel at (row, col): (" << (minRow + iRow) << ", " << (minCol + iCol) << ")";
238-
LOG(info) << "Current offsets: xOffsetCOG = " << xOffsetCOG << ", zOffsetCOG = " << zOffsetCOG;
239233
++firedPixels;
240234
}
241235
}
242236

243237
topoInfo.mOffsetXToCOG = static_cast<int>((static_cast<float>(xOffsetCOG) / firedPixels) - static_cast<float>(minRow));
244238
topoInfo.mOffsetZToCOG = static_cast<int>((static_cast<float>(zOffsetCOG) / firedPixels) - static_cast<float>(minCol));
245-
LOG(info) << "Computed COG offsets: (" << topoInfo.mOffsetXToCOG << ", " << topoInfo.mOffsetZToCOG << ")";
246239
topoInfo.mNPixels = firedPixels;
247240

248-
LOG(info) << "COG: (" << topoInfo.mOffsetXToCOG << ", " << topoInfo.mOffsetZToCOG << "), Fired Pixels: " << firedPixels;
249-
250241
const auto& chipSpecs = ChipSpecificsParam::Instance();
251242
topoInfo.mXMean = (static_cast<float>(xOffsetCOG) / firedPixels - minRow) * chipSpecs.PitchRow;
252243
topoInfo.mZMean = (static_cast<float>(zOffsetCOG) / firedPixels - minCol) * chipSpecs.PitchCol;
253-
// topoInfo.mXMean = (spanRow - 1) * chipSpecs.PitchRow / 2.f;
254-
// topoInfo.mZMean = (spanCol - 1) * chipSpecs.PitchCol / 2.f;
255-
// TO BE IMPLEMENTED
256-
topoInfo.mXSigma2 = 0.f;
257-
topoInfo.mZSigma2 = 0.f;
258-
259-
// const auto& chipSpecs = ChipSpecificsParam::Instance();
260-
// if (useDf) {
261-
// topoInfo.mXmean = dX;
262-
// topoInfo.mZmean = dZ;
263-
// } else { // assign expected sigmas from the pixel X, Z sizes
264-
// topoInfo.mXsigma2 = chipSpecs.PitchRow * chipSpecs.PitchRow / 12. / std::min(10, topoInfo.mSizeX);
265-
// topoInfo.mZsigma2 = chipSpecs.PitchCol * chipSpecs.PitchCol / 12. / std::min(10, topoInfo.mSizeZ);
266-
// }
244+
topoInfo.mXSigma2 = chipSpecs.PitchRow * chipSpecs.PitchRow / 12. / topoInfo.mSizeX;
245+
topoInfo.mZSigma2 = chipSpecs.PitchCol * chipSpecs.PitchCol / 12. / topoInfo.mSizeZ;
246+
247+
LOG(debug) << "Computed topology features";
248+
LOG(debug) << "COG offsets: (" << topoInfo.mOffsetXToCOG << ", " << topoInfo.mOffsetZToCOG << ")";
249+
LOG(debug) << "Shifts to mean: (" << topoInfo.mXMean << ", " << topoInfo.mZMean << ")";
250+
LOG(debug) << "Sigmas: (" << topoInfo.mXSigma2 << ", " << topoInfo.mZSigma2 << ")";
251+
LOG(debug) << "Fired Pixels: " << firedPixels;
267252
}
268253

269254
void TopologyClassifier::saveCacheToFile(const char* filename)
@@ -276,7 +261,6 @@ void TopologyClassifier::saveCacheToFile(const char* filename)
276261

277262
void TopologyClassifier::print()
278263
{
279-
LOG(info) << "Topology Cache Contents:";
280264
for (const auto& entry : mTopologyCache) {
281265
const uint32_t key = entry.first;
282266
const TopologyInfo& topoInfo = entry.second;

0 commit comments

Comments
 (0)