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