Skip to content

Commit 5ac224f

Browse files
committed
fix TRD extra information
1 parent 2f20900 commit 5ac224f

File tree

2 files changed

+60
-9
lines changed

2 files changed

+60
-9
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "DataFormatsTRD/TrackTRD.h"
2222
#include "TRDBase/PadCalibrationsAliases.h"
2323
#include "DataFormatsTRD/NoiseCalibration.h"
24+
#include "DataFormatsTRD/CalGain.h"
25+
#include "DataFormatsTRD/Constants.h"
2426
#include "DetectorsBase/GRPGeomHelper.h"
2527
#include "DetectorsBase/Propagator.h"
2628
#include "Framework/DataProcessorSpec.h"
@@ -253,6 +255,7 @@ class AODProducerWorkflowDPL : public Task
253255
float mMaxPropXiu{5.0f}; // max X_IU for which track is to be propagated if mPropTracks is true. (other option: o2::constants::geom::XTPCInnerRef + 0.1f)
254256

255257
const o2::trd::LocalGainFactor* mTRDLocalGain; // TRD local gain factors from krypton calibration
258+
const o2::trd::CalGain* mTRDGainCalib; // TRD time-dependent gain calib at chamber level
256259
const o2::trd::NoiseStatusMCM* mTRDNoiseMap; // TRD noise map
257260

258261
std::unordered_set<GIndex> mGIDUsedBySVtx;
@@ -284,6 +287,7 @@ class AODProducerWorkflowDPL : public Task
284287
TStopwatch mTimer;
285288
bool mEMCselectLeading{false};
286289
uint64_t mEMCALTrgClassMask = 0;
290+
size_t mCurrentTRDTrigID = 0; // current index of the TRD trigger record, to speed up search
287291

288292
// unordered map connects global indices and table indices of barrel tracks
289293
std::unordered_map<GIndex, int> mGIDToTableID;

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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,20 +443,66 @@ 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+
}
459+
else {
460+
// then check next trigger
461+
if (mCurrentTRDTrigID < trigsTRD.size() - 1) {
462+
const auto& trig = trigsTRD[mCurrentTRDTrigID+1];
463+
if (trkltId >= trig.getFirstTracklet() && trkltId < trig.getFirstTracklet() + trig.getNumberOfTracklets()) {
464+
trdSelID = mCurrentTRDTrigID+1;
465+
foundTRDTrigger = true;
466+
}
467+
}
468+
}
469+
470+
size_t low = 0, up = trigsTRD.size() - 1;
471+
472+
// otherwise binary search
473+
while (low <= up && !foundTRDTrigger) {
474+
trdSelID = low + std::floor( (up - low)/2 );
475+
const auto& trig = trigsTRD[trdSelID];
476+
if (trig.getFirstTracklet() > trkltId) {
477+
up = trdSelID - 1;
478+
}
479+
else {
480+
if (trig.getFirstTracklet() + trig.getNumberOfTracklets() <= trkltId) {
481+
low = trdSelID + 1;
482+
}
483+
else {
484+
foundTRDTrigger = true;
485+
}
486+
}
487+
}
488+
//-------------------
489+
mCurrentTRDTrigID = trdSelID;
490+
const auto& trigSel = trigsTRD[trdSelID];
491+
492+
// loop on other tracklets from the same trigger record
493+
for (const auto& trklt : trklets.subspan(trigSel.getFirstTracklet(), trigSel.getNumberOfTracklets())) {
494+
if (tracklet.getTrackletWord() == trklt.getTrackletWord() || tracklet.getDetector() != trklt.getDetector()) {
450495
continue;
451496
}
452497
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;
498+
cor = mTRDLocalGain->getValue(trklt.getHCID() / 2, trklt.getPadCol(), trklt.getPadRow()) * mTRDGainCalib->getMPVdEdx(tracklet.getDetector()) / o2::trd::constants::MPVDEDXDEFAULT * trackletLength;
454499
q0s[iLay] += trklt.getQ0();
455500
q1s[iLay] += trklt.getQ1();
456501
q2s[iLay] += trklt.getQ2();
457502
q0sCor[iLay] += (float)trklt.getQ0() / cor;
458503
q1sCor[iLay] += (float)trklt.getQ1() / cor;
459504
q2sCor[iLay] += (float)trklt.getQ2() / cor;
505+
460506
}
461507
}
462508
}
@@ -2382,7 +2428,8 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
23822428
mGIDUsedByStr.emplace(sTrk.mITSRef, GIndex::ITS);
23832429
}
23842430
}
2385-
2431+
2432+
mCurrentTRDTrigID = 0; // reinitialize index for TRD trigger record search
23862433
// filling unassigned tracks first
23872434
// so that all unassigned tracks are stored in the beginning of the table together
23882435
auto& trackRef = primVer2TRefs.back(); // references to unassigned tracks are at the end
@@ -2391,6 +2438,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
23912438
ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
23922439
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
23932440

2441+
mCurrentTRDTrigID = 0; // reinitialize index for TRD trigger record search
23942442
// filling collisions and tracks into tables
23952443
collisionID = 0;
23962444
collisionsCursor.reserve(primVertices.size());
@@ -3103,6 +3151,7 @@ void AODProducerWorkflowDPL::updateTimeDependentParams(ProcessingContext& pc)
31033151
if (mEnableTRDextra) {
31043152
mTRDLocalGain = pc.inputs().get<o2::trd::LocalGainFactor*>("trdlocalgainfactors").get();
31053153
mTRDNoiseMap = pc.inputs().get<o2::trd::NoiseStatusMCM*>("trdnoisemap").get();
3154+
mTRDGainCalib = pc.inputs().get<o2::trd::CalGain*>("trdgaincalib").get(); // time dependent gain
31063155
}
31073156
}
31083157
if (mPropTracks) {
@@ -3375,11 +3424,8 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
33753424
OutputForTable<Collisions>::spec(),
33763425
OutputForTable<Decay3Bodys>::spec(),
33773426
OutputForTable<FDDs>::spec(),
3378-
OutputForTable<FDDsExtra>::spec(),
33793427
OutputForTable<FT0s>::spec(),
3380-
OutputForTable<FT0sExtra>::spec(),
33813428
OutputForTable<FV0As>::spec(),
3382-
OutputForTable<FV0AsExtra>::spec(),
33833429
OutputForTable<StoredFwdTracks>::spec(),
33843430
OutputForTable<StoredFwdTracksCov>::spec(),
33853431
OutputForTable<StoredMFTTracks>::spec(),
@@ -3417,6 +3463,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
34173463
outputs.push_back(OutputForTable<TRDsExtra>::spec());
34183464
dataRequest->inputs.emplace_back("trdlocalgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
34193465
dataRequest->inputs.emplace_back("trdnoisemap", "TRD", "NOISEMAP", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/NoiseMapMCM"));
3466+
dataRequest->inputs.emplace_back("trdgaincalib", "TRD", "CALGAIN", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/CalGain"));
34203467
}
34213468

34223469
if (useMC) {

0 commit comments

Comments
 (0)