Skip to content

Commit 150525b

Browse files
committed
fix6
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 8b966d3 commit 150525b

2 files changed

Lines changed: 83 additions & 27 deletions

File tree

Detectors/ITSMFT/ITS/macros/test/optimize_vertexer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@
3838
r"duplicate_rate=([0-9.]+) f1=([0-9.]+)"
3939
)
4040
LINE_VALIDATION_PATTERN = re.compile(
41-
r"ITS vertexer line validation: findable=(\d+) true_lines=(\d+) fake_lines=(\d+) total_lines=(\d+) "
41+
r"ITS vertexer(?: \w+)? line validation: findable=(\d+) true_lines=(\d+) fake_lines=(\d+) total_lines=(\d+) "
4242
r"unique_truth_ge2_lines=(\d+) eff=([0-9.]+)"
4343
)
4444
BINS_PATTERN = re.compile(
4545
r"ITS vertexer(?: \w+)? multiplicity bins \[[^\]]+\]: truth_findable=(\[[^\]]+\]) "
4646
r"truth_found=(\[[^\]]+\]) reco_total=(\[[^\]]+\]) reco_true=(\[[^\]]+\])"
4747
)
4848
LINE_BINS_PATTERN = re.compile(
49-
r"ITS vertexer line multiplicity bins \[[^\]]+\]: truth_findable=(\[[^\]]+\]) truth_ge2_lines=(\[[^\]]+\])"
49+
r"ITS vertexer(?: \w+)? line multiplicity bins \[[^\]]+\]: truth_findable=(\[[^\]]+\]) truth_ge2_lines=(\[[^\]]+\])"
5050
)
5151
ELAPSED_PATTERN = re.compile(r"(?:Vertex seeding total elapsed time:|total found \d+ in) ([0-9.]+) ms")
5252
ITSRECO_NAME_PATTERN = re.compile(r"^itsreco_(\d+)$")

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

Lines changed: 81 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <algorithm>
1313
#include <array>
14+
#include <cstdint>
1415
#include <format>
1516
#include <map>
1617
#include <memory>
@@ -40,8 +41,6 @@
4041
#include "Framework/DataRefUtils.h"
4142
#include "Framework/DeviceSpec.h"
4243
#include "SimulationDataFormat/DigitizationContext.h"
43-
#include "SimulationDataFormat/O2DatabasePDG.h"
44-
#include "Steer/MCKinematicsReader.h"
4544

4645
using namespace o2::framework;
4746
using namespace o2::its;
@@ -245,6 +244,7 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
245244
if (mIsMC) {
246245
constexpr size_t NMultiplicityBins{8};
247246
constexpr auto multiplicityBinsLabel = "2,3,4-7,8-15,16-31,32-63,64-127,128+";
247+
constexpr uint8_t firstThreeLayersMask = 0x7;
248248
auto composeTruthLabel = [](const int eventId, const int sourceId) {
249249
return o2::MCCompLabel{o2::MCCompLabel::maxTrackID(), eventId, sourceId, false};
250250
};
@@ -319,47 +319,98 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
319319
std::map<o2::MCCompLabel, bool> uniqueTrueLabelsAll;
320320
std::map<o2::MCCompLabel, bool> uniqueTrueLabelsFindable;
321321
std::map<o2::MCCompLabel, int> truthMultiplicity;
322+
std::map<o2::MCCompLabel, bool> eligibleTruthEvents;
323+
std::map<o2::MCCompLabel, uint8_t> contributorLayerMask;
324+
std::map<o2::MCCompLabel, std::map<o2::MCCompLabel, bool>> lineContributors;
322325
std::array<int, NMultiplicityBins> findableTruthBins{};
323326
std::array<int, NMultiplicityBins> uniqueTrueFoundBins{};
327+
std::array<int, NMultiplicityBins> lineTruthFoundBins{};
324328
std::array<int, NMultiplicityBins> recoTotalBins{};
325329
std::array<int, NMultiplicityBins> recoTrueBins{};
326330
int nTrueVrt{0};
331+
int nLineTrue{0}, nLineFake{0}, nLineTotal{0}, nLineFindable{0}, nLineUniqueTruth{0};
327332

328333
const auto dc = o2::steer::DigitizationContext::loadFromFile("collisioncontext.root");
329334
const auto irs = dc->getEventRecords();
330335
const int64_t roFrameBiasInBC = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance().getROFBiasInBC(1);
331336
const auto firstSampledTFIR = o2::raw::HBFUtils::Instance().getFirstSampledTFIR();
332-
o2::steer::MCKinematicsReader mcReader(dc);
333337
const int iSrc = 0; // take only events from collision generator
334338
const auto eveId2colId = dc->getCollisionIndicesForSource(iSrc);
335-
for (int iEve{0}; iEve < mcReader.getNEvents(iSrc); ++iEve) {
336-
const auto colId = eveId2colId.find(iEve);
337-
if (colId == eveId2colId.end()) {
338-
mcReader.releaseTracksForSourceAndEvent(iSrc, iEve);
339-
continue;
340-
}
341-
const auto& ir = irs[colId->second];
339+
for (const auto& [iEve, iCol] : eveId2colId) {
340+
const auto& ir = irs[iCol];
342341
if (!ir.isDummy()) {
343342
const auto bc = (ir - firstSampledTFIR).toLong() - roFrameBiasInBC;
344343
if (bc >= 0 && upcPassRanForBC(bc)) {
345-
const int nCont = std::ranges::count_if(mcReader.getTracks(iSrc, iEve), [](const auto& trk) {
346-
if (!trk.isPrimary()) {
347-
return false;
348-
}
349-
const auto* p = o2::O2DatabasePDG::Instance()->GetParticle(trk.GetPdgCode());
350-
return p && p->Charge() != 0;
351-
});
352-
if (nCont > 1) {
353-
const auto label = composeTruthLabel(iEve, iSrc);
354-
truthMultiplicity[label] = nCont;
355-
++nTrueVrt;
356-
if (const auto truthBin = getMultiplicityBin(nCont); truthBin >= 0) {
357-
++findableTruthBins[truthBin];
358-
}
344+
eligibleTruthEvents[composeTruthLabel(iEve, iSrc)] = true;
345+
}
346+
}
347+
}
348+
349+
for (int layer = 0; layer < 3; ++layer) {
350+
for (const auto& cluster : mTimeFrame->getClusters()[layer]) {
351+
for (const auto& label : mTimeFrame->getClusterLabels(layer, cluster.clusterId)) {
352+
if (!label.isValid() || label.isFake()) {
353+
continue;
354+
}
355+
const auto eventLabel = composeTruthLabel(label.getEventID(), label.getSourceID());
356+
if (!eligibleTruthEvents.contains(eventLabel)) {
357+
continue;
359358
}
359+
contributorLayerMask[label] |= (1 << layer);
360+
}
361+
}
362+
}
363+
364+
for (const auto& [label, layerMask] : contributorLayerMask) {
365+
if ((layerMask & firstThreeLayersMask) != firstThreeLayersMask) {
366+
continue;
367+
}
368+
++truthMultiplicity[composeTruthLabel(label.getEventID(), label.getSourceID())];
369+
}
370+
371+
for (const auto& [label, nCont] : truthMultiplicity) {
372+
if (nCont > 1) {
373+
++nTrueVrt;
374+
if (const auto truthBin = getMultiplicityBin(nCont); truthBin >= 0) {
375+
++findableTruthBins[truthBin];
376+
}
377+
}
378+
}
379+
380+
for (int rofId = 0; rofId < mTimeFrame->getNrof(1); ++rofId) {
381+
for (const auto& label : mTimeFrame->getLinesLabel(rofId)) {
382+
++nLineTotal;
383+
if (!label.isValid() || label.isFake()) {
384+
++nLineFake;
385+
continue;
386+
}
387+
const auto eventLabel = composeTruthLabel(label.getEventID(), label.getSourceID());
388+
if (!eligibleTruthEvents.contains(eventLabel)) {
389+
++nLineFake;
390+
continue;
391+
}
392+
if (const auto found = contributorLayerMask.find(label); found != contributorLayerMask.end() && (found->second & firstThreeLayersMask) == firstThreeLayersMask) {
393+
++nLineTrue;
394+
lineContributors[eventLabel][label] = true;
395+
} else {
396+
++nLineFake;
397+
}
398+
}
399+
}
400+
401+
for (const auto& [label, nCont] : truthMultiplicity) {
402+
if (nCont <= 1) {
403+
continue;
404+
}
405+
++nLineFindable;
406+
const auto found = lineContributors.find(label);
407+
const auto nFoundContributors = found == lineContributors.end() ? 0 : static_cast<int>(found->second.size());
408+
if (nFoundContributors > 1) {
409+
++nLineUniqueTruth;
410+
if (const auto truthBin = getMultiplicityBin(nCont); truthBin >= 0) {
411+
++lineTruthFoundBins[truthBin];
360412
}
361413
}
362-
mcReader.releaseTracksForSourceAndEvent(iSrc, iEve);
363414
}
364415

365416
int nRecoVertices{0}, nFoundVrt{0}, nFakeVrt{0}, nUniqueTrueVertAll{0}, nUniqueTrueVertFindable{0};
@@ -394,10 +445,15 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
394445
}
395446

396447
const auto efficiency = nTrueVrt > 0 ? static_cast<float>(nUniqueTrueVertFindable) / static_cast<float>(nTrueVrt) : 0.f;
448+
const auto lineEfficiency = nLineFindable > 0 ? static_cast<float>(nLineUniqueTruth) / static_cast<float>(nLineFindable) : 0.f;
397449
const auto purity = nRecoVertices > 0 ? static_cast<float>(nFoundVrt) / static_cast<float>(nRecoVertices) : 0.f;
398450
const auto fakeRate = nRecoVertices > 0 ? static_cast<float>(nFakeVrt) / static_cast<float>(nRecoVertices) : 0.f;
399451
const auto duplicateRate = nFoundVrt > 0 ? static_cast<float>(nFoundVrt - nUniqueTrueVertAll) / static_cast<float>(nFoundVrt) : 0.f;
400452
const auto f1 = (purity + efficiency) > 0.f ? 2.f * purity * efficiency / (purity + efficiency) : 0.f;
453+
LOGP(info, "ITS vertexer {} line validation: findable={} true_lines={} fake_lines={} total_lines={} unique_truth_ge2_lines={} eff={:.6f}",
454+
tuneUPC ? "UPC" : "all", nLineFindable, nLineTrue, nLineFake, nLineTotal, nLineUniqueTruth, lineEfficiency);
455+
LOGP(info, "ITS vertexer {} line multiplicity bins [{}]: truth_findable={} truth_ge2_lines={}",
456+
tuneUPC ? "UPC" : "all", multiplicityBinsLabel, formatCounts(findableTruthBins), formatCounts(lineTruthFoundBins));
401457
LOGP(info, "ITS vertexer {} validation: findable={} true_found={} unique_true_findable={} unique_true_all={} total_found={} eff={:.6f} purity={:.6f} fake_rate={:.6f} duplicate_rate={:.6f} f1={:.6f}",
402458
tuneUPC ? "UPC" : "all", nTrueVrt, nFoundVrt, nUniqueTrueVertFindable, nUniqueTrueVertAll, nRecoVertices, efficiency, purity, fakeRate, duplicateRate, f1);
403459
LOGP(info, "ITS vertexer {} multiplicity bins [{}]: truth_findable={} truth_found={} reco_total={} reco_true={}",

0 commit comments

Comments
 (0)