Skip to content

Commit 616f1f8

Browse files
Refactor track quality assessment and trigger logic - fix TRD extra information
Updated track quality assessment logic to conditionally retain only dEdx information and adjusted related calculations for tracklet merging based on trigger records.
1 parent 8020da3 commit 616f1f8

File tree

1 file changed

+80
-28
lines changed

1 file changed

+80
-28
lines changed

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 80 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,10 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
365365
{
366366
tracksQACursor(
367367
trackQAInfoHolder.trackID,
368-
truncateFloatFraction(trackQAInfoHolder.tpcTime0, mTPCTime0),
368+
mTrackQCRetainOnlydEdx ? 0.0f : truncateFloatFraction(trackQAInfoHolder.tpcTime0, mTPCTime0),
369369
truncateFloatFraction(trackQAInfoHolder.tpcdEdxNorm, mTrackSignal),
370-
trackQAInfoHolder.tpcdcaR,
371-
trackQAInfoHolder.tpcdcaZ,
370+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int16_t>::min() : trackQAInfoHolder.tpcdcaR,
371+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int16_t>::min() : trackQAInfoHolder.tpcdcaZ,
372372
trackQAInfoHolder.tpcClusterByteMask,
373373
trackQAInfoHolder.tpcdEdxMax0R,
374374
trackQAInfoHolder.tpcdEdxMax1R,
@@ -378,18 +378,18 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
378378
trackQAInfoHolder.tpcdEdxTot1R,
379379
trackQAInfoHolder.tpcdEdxTot2R,
380380
trackQAInfoHolder.tpcdEdxTot3R,
381-
trackQAInfoHolder.dRefContY,
382-
trackQAInfoHolder.dRefContZ,
383-
trackQAInfoHolder.dRefContSnp,
384-
trackQAInfoHolder.dRefContTgl,
385-
trackQAInfoHolder.dRefContQ2Pt,
386-
trackQAInfoHolder.dRefGloY,
387-
trackQAInfoHolder.dRefGloZ,
388-
trackQAInfoHolder.dRefGloSnp,
389-
trackQAInfoHolder.dRefGloTgl,
390-
trackQAInfoHolder.dRefGloQ2Pt,
391-
trackQAInfoHolder.dTofdX,
392-
trackQAInfoHolder.dTofdZ);
381+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefContY,
382+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefContZ,
383+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefContSnp,
384+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefContTgl,
385+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefContQ2Pt,
386+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefGloY,
387+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefGloZ,
388+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefGloSnp,
389+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefGloTgl,
390+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dRefGloQ2Pt,
391+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dTofdX,
392+
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dTofdZ);
393393
}
394394

395395
template <typename TRDsExtraCursorType>
@@ -433,7 +433,7 @@ void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContai
433433

434434
auto tphi = trkC.getSnp() / std::sqrt((1.f - trkC.getSnp()) * (1.f + trkC.getSnp()));
435435
auto trackletLength = std::sqrt(1.f + tphi * tphi + trkC.getTgl() * trkC.getTgl());
436-
float cor = mTRDLocalGain->getValue(tracklet.getHCID() / 2, tracklet.getPadCol(), tracklet.getPadRow()) * trackletLength;
436+
float cor = mTRDLocalGain->getValue(tracklet.getHCID() / 2, tracklet.getPadCol(), tracklet.getPadRow()) * mTRDGainCalib->getMPVdEdx(tracklet.getDetector()) / o2::trd::constants::MPVDEDXDEFAULT * trackletLength;
437437
q0s[iLay] = tracklet.getQ0();
438438
q1s[iLay] = tracklet.getQ1();
439439
q2s[iLay] = tracklet.getQ2();
@@ -443,14 +443,56 @@ void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContai
443443
ttgls[iLay] = trkC.getTgl();
444444
tphis[iLay] = tphi;
445445

446-
// z-row merging
446+
// z-row merging, we want to merge only with tracklets from the same trigger record
447447
if (trk.getIsCrossingNeighbor(iLay) && trk.getHasNeighbor()) {
448-
for (const auto& trklt : trklets) {
449-
if (tracklet.getTrackletWord() == trklt.getTrackletWord()) {
448+
// find the trigger the tracklet belongs to
449+
auto trigsTRD = recoData.getTRDTriggerRecords();
450+
size_t trdSelID = -1;
451+
452+
const auto& trig = trigsTRD[mCurrentTRDTrigID];
453+
bool foundTRDTrigger = false;
454+
// first check current trigger
455+
if (trkltId >= trig.getFirstTracklet() && trkltId < trig.getFirstTracklet() + trig.getNumberOfTracklets()) {
456+
trdSelID = mCurrentTRDTrigID;
457+
foundTRDTrigger = true;
458+
} else {
459+
// then check next trigger
460+
if (mCurrentTRDTrigID < trigsTRD.size() - 1) {
461+
const auto& trig = trigsTRD[mCurrentTRDTrigID + 1];
462+
if (trkltId >= trig.getFirstTracklet() && trkltId < trig.getFirstTracklet() + trig.getNumberOfTracklets()) {
463+
trdSelID = mCurrentTRDTrigID + 1;
464+
foundTRDTrigger = true;
465+
}
466+
}
467+
}
468+
469+
size_t low = 0, up = trigsTRD.size() - 1;
470+
471+
// otherwise binary search
472+
while (low <= up && !foundTRDTrigger) {
473+
trdSelID = low + std::floor((up - low) / 2);
474+
const auto& trig = trigsTRD[trdSelID];
475+
if (trig.getFirstTracklet() > trkltId) {
476+
up = trdSelID - 1;
477+
} else {
478+
if (trig.getFirstTracklet() + trig.getNumberOfTracklets() <= trkltId) {
479+
low = trdSelID + 1;
480+
} else {
481+
foundTRDTrigger = true;
482+
}
483+
}
484+
}
485+
//-------------------
486+
mCurrentTRDTrigID = trdSelID;
487+
const auto& trigSel = trigsTRD[trdSelID];
488+
489+
// loop on other tracklets from the same trigger record
490+
for (const auto& trklt : trklets.subspan(trigSel.getFirstTracklet(), trigSel.getNumberOfTracklets())) {
491+
if (tracklet.getTrackletWord() == trklt.getTrackletWord() || tracklet.getDetector() != trklt.getDetector()) {
450492
continue;
451493
}
452494
if (std::abs(tracklet.getPadCol() - trklt.getPadCol()) <= 1 && std::abs(tracklet.getPadRow() - trklt.getPadRow()) == 1) {
453-
cor = mTRDLocalGain->getValue(trklt.getHCID() / 2, trklt.getPadCol(), trklt.getPadRow()) * trackletLength;
495+
cor = mTRDLocalGain->getValue(trklt.getHCID() / 2, trklt.getPadCol(), trklt.getPadRow()) * mTRDGainCalib->getMPVdEdx(tracklet.getDetector()) / o2::trd::constants::MPVDEDXDEFAULT * trackletLength;
454496
q0s[iLay] += trklt.getQ0();
455497
q1s[iLay] += trklt.getQ1();
456498
q2s[iLay] += trklt.getQ2();
@@ -574,7 +616,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
574616

575617
float weight = 0;
576618
static std::uniform_real_distribution<> distr(0., 1.);
577-
bool writeQAData = o2::math_utils::Tsallis::downsampleTsallisCharged(data.getTrackParam(trackIndex).getPt(), mTrackQCFraction, mSqrtS, weight, distr(mGenerator));
619+
bool writeQAData = o2::math_utils::Tsallis::downsampleTsallisCharged(data.getTrackParam(trackIndex).getPt(), mTrackQCFraction, mSqrtS, weight, distr(mGenerator)) || ((src != GIndex::TPC || mGIDUsedBySVtx.find(trackIndex) != mGIDUsedBySVtx.end() || mGIDUsedByStr.find(trackIndex) != mGIDUsedByStr.end()) && mTrackQCKeepGlobalTracks);
578620
auto extraInfoHolder = processBarrelTrack(collisionID, collisionBC, trackIndex, data, bcsMap);
579621

580622
if (writeQAData) {
@@ -1140,7 +1182,8 @@ void AODProducerWorkflowDPL::fillMCParticlesTable(o2::steer::MCKinematicsReader&
11401182
source == 0, // background
11411183
mMcParticleW,
11421184
mMcParticleMom,
1143-
mMcParticlePos);
1185+
mMcParticlePos,
1186+
mUseSigFiltMC);
11441187

11451188
mcReader.releaseTracksForSourceAndEvent(source, event);
11461189
}
@@ -1795,6 +1838,8 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
17951838
LOGP(warn, "Specified non-default empty streamer mask!");
17961839
}
17971840
}
1841+
mTrackQCKeepGlobalTracks = ic.options().get<bool>("trackqc-keepglobaltracks");
1842+
mTrackQCRetainOnlydEdx = ic.options().get<bool>("trackqc-retainonlydedx");
17981843
mTrackQCFraction = ic.options().get<float>("trackqc-fraction");
17991844
mTrackQCNTrCut = ic.options().get<int64_t>("trackqc-NTrCut");
18001845
mTrackQCDCAxy = ic.options().get<float>("trackqc-tpc-dca");
@@ -2215,9 +2260,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
22152260
0,
22162261
sourceID);
22172262
}
2218-
if (sourceID != 0 || !mUseSigFiltMC) {
2219-
mcColToEvSrc.emplace_back(std::vector<int>{iCol, sourceID, eventID}); // point background and injected signal events to one collision
2220-
}
2263+
mcColToEvSrc.emplace_back(std::vector<int>{iCol, sourceID, eventID}); // point background and injected signal events to one collision
22212264
}
22222265
}
22232266
}
@@ -2382,6 +2425,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
23822425
}
23832426
}
23842427

2428+
mCurrentTRDTrigID = 0; // reinitialize index for TRD trigger record search
23852429
// filling unassigned tracks first
23862430
// so that all unassigned tracks are stored in the beginning of the table together
23872431
auto& trackRef = primVer2TRefs.back(); // references to unassigned tracks are at the end
@@ -2390,6 +2434,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
23902434
ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
23912435
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
23922436

2437+
mCurrentTRDTrigID = 0; // reinitialize index for TRD trigger record search
23932438
// filling collisions and tracks into tables
23942439
collisionID = 0;
23952440
collisionsCursor.reserve(primVertices.size());
@@ -2735,6 +2780,12 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac
27352780
if (tpcOrig.getdEdx().dEdxTotTPC == 0) {
27362781
extraInfoHolder.flags |= o2::aod::track::TPCdEdxAlt;
27372782
}
2783+
if (tpcOrig.hasASideClusters()) {
2784+
extraInfoHolder.flags |= o2::aod::track::TPCSideA;
2785+
}
2786+
if (tpcOrig.hasCSideClusters()) {
2787+
extraInfoHolder.flags |= o2::aod::track::TPCSideC;
2788+
}
27382789
extraInfoHolder.tpcInnerParam = tpcOrig.getP() / tpcOrig.getAbsCharge();
27392790
extraInfoHolder.tpcChi2NCl = tpcOrig.getNClusters() ? tpcOrig.getChi2() / tpcOrig.getNClusters() : 0;
27402791
extraInfoHolder.tpcSignal = dEdx.dEdxTotTPC;
@@ -3096,6 +3147,7 @@ void AODProducerWorkflowDPL::updateTimeDependentParams(ProcessingContext& pc)
30963147
if (mEnableTRDextra) {
30973148
mTRDLocalGain = pc.inputs().get<o2::trd::LocalGainFactor*>("trdlocalgainfactors").get();
30983149
mTRDNoiseMap = pc.inputs().get<o2::trd::NoiseStatusMCM*>("trdnoisemap").get();
3150+
mTRDGainCalib = pc.inputs().get<o2::trd::CalGain*>("trdgaincalib").get(); // time dependent gain
30993151
}
31003152
}
31013153
if (mPropTracks) {
@@ -3368,11 +3420,8 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
33683420
OutputForTable<Collisions>::spec(),
33693421
OutputForTable<Decay3Bodys>::spec(),
33703422
OutputForTable<FDDs>::spec(),
3371-
OutputForTable<FDDsExtra>::spec(),
33723423
OutputForTable<FT0s>::spec(),
3373-
OutputForTable<FT0sExtra>::spec(),
33743424
OutputForTable<FV0As>::spec(),
3375-
OutputForTable<FV0AsExtra>::spec(),
33763425
OutputForTable<StoredFwdTracks>::spec(),
33773426
OutputForTable<StoredFwdTracksCov>::spec(),
33783427
OutputForTable<StoredMFTTracks>::spec(),
@@ -3410,6 +3459,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
34103459
outputs.push_back(OutputForTable<TRDsExtra>::spec());
34113460
dataRequest->inputs.emplace_back("trdlocalgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
34123461
dataRequest->inputs.emplace_back("trdnoisemap", "TRD", "NOISEMAP", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/NoiseMapMCM"));
3462+
dataRequest->inputs.emplace_back("trdgaincalib", "TRD", "CALGAIN", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/CalGain"));
34133463
}
34143464

34153465
if (useMC) {
@@ -3454,6 +3504,8 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
34543504
ConfigParamSpec{"hepmc-update", VariantType::String, "always", {"When to update HepMC Aux tables: always - force update, never - never update, all - if all keys are present, any - when any key is present (not valid yet)"}},
34553505
ConfigParamSpec{"propagate-muons", VariantType::Bool, false, {"Propagate muons to IP"}},
34563506
ConfigParamSpec{"thin-tracks", VariantType::Bool, false, {"Produce thinned track tables"}},
3507+
ConfigParamSpec{"trackqc-keepglobaltracks", VariantType::Bool, false, {"Always keep TrackQA for global tracks"}},
3508+
ConfigParamSpec{"trackqc-retainonlydedx", VariantType::Bool, false, {"Keep only dEdx information, zero out everything else"}},
34573509
ConfigParamSpec{"trackqc-fraction", VariantType::Float, float(0.1), {"Fraction of tracks to QC"}},
34583510
ConfigParamSpec{"trackqc-NTrCut", VariantType::Int64, 4L, {"Minimal length of the track - in amount of tracklets"}},
34593511
ConfigParamSpec{"trackqc-tpc-dca", VariantType::Float, 3.f, {"Keep TPC standalone track with this DCAxy to the PV"}},

0 commit comments

Comments
 (0)