@@ -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