@@ -153,6 +153,9 @@ void TRDGlobalTracking::updateTimeDependentParams(ProcessingContext& pc)
153153 mBase ->init (pc);
154154 mBase ->setLocalGainFactors (pc.inputs ().get <o2::trd::LocalGainFactor*>(" localgainfactors" ).get ());
155155 }
156+
157+ pc.inputs ().get <std::array<int , constants::MAXCHAMBER >*>(" chamberstatus" ); // called to trigger finaliseCCDB
158+ pc.inputs ().get <o2::trd::PadStatus*>(" padstatus" ); // called to trigger finaliseCCDB
156159 }
157160
158161 const auto & trackTune = TrackTuneParams::Instance ();
@@ -198,6 +201,36 @@ void TRDGlobalTracking::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
198201 return ;
199202 }
200203#endif
204+ if (matcher == ConcreteDataMatcher (" TRD" , " CHAMBERSTATUS" , 0 )) {
205+ LOG (info) << " chamber status object updated" ;
206+ const std::array<int , constants::MAXCHAMBER >* chamberStatus = (const std::array<int , constants::MAXCHAMBER >*)obj;
207+ for (int iDet = 0 ; iDet < constants::MAXCHAMBER ; iDet++) {
208+ if ((*chamberStatus)[iDet] == 3 ) {
209+ mTracker ->SetChamberStatus (iDet, false ); // chamber is good
210+ }
211+ else {
212+ mTracker ->SetChamberStatus (iDet, true ); // chamber is bad
213+ }
214+ }
215+ return ;
216+ }
217+ if (matcher == ConcreteDataMatcher (" TRD" , " PADSTATUS" , 0 )) {
218+ LOG (info) << " pad status object updated" ;
219+ const o2::trd::PadStatus* padStatus = (const o2::trd::PadStatus*)obj;
220+ for (int iDet = 0 ; iDet < constants::MAXCHAMBER ; iDet++) {
221+ for (int iCol = 0 ; iCol < constants::NCOLUMN ; iCol++) {
222+ for (int iRow = 0 ; iRow < ((iDet%30 )/6 == 2 ? constants::NROWC0 : constants::NROWC1 ); iRow++) {
223+ if (padStatus->isMasked (iDet, iCol, iRow) || padStatus->isNotConnected (iDet, iCol, iRow)) {
224+ mTracker ->SetPadStatus (iDet * constants::NCOLUMN * constants::NROWC1 + iCol * constants::NROWC1 + iRow, true ); // pad is masked
225+ }
226+ else {
227+ mTracker ->SetPadStatus (iDet * constants::NCOLUMN * constants::NROWC1 + iCol * constants::NROWC1 + iRow, false ); // pad is not masked
228+ }
229+ }
230+ }
231+ }
232+ return ;
233+ }
201234}
202235
203236void TRDGlobalTracking::fillMCTruthInfo (const TrackTRD& trk, o2::MCCompLabel lblSeed, std::vector<o2::MCCompLabel>& lblContainerTrd, std::vector<o2::MCCompLabel>& lblContainerMatch, const o2::dataformats::MCTruthContainer<o2::MCCompLabel>* trkltLabels) const
@@ -500,6 +533,45 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
500533 if (trdTrack.getChi2 () / trdTrack.getNtracklets () > mTracker ->Param ().rec .trd .maxChi2Red ) {
501534 continue ;
502535 }
536+
537+ // Find most probable BCs and RMS for pile-up correction and error. Same BC is assumed for all tracklets
538+ float maxProb = 0 .f ;
539+ // The uncertainty is the RMS wrt the default correction of all possible corrections weighted by their probability
540+ float sumCorr = 0 .f ;
541+ float sumCorr2 = 0 .f ;
542+ float sumProb = 0 .f ;
543+ for (int iBC = 0 ; iBC < mTriggeredBCFT0 .size (); iBC++) {
544+ int deltaBC = roundf (mTriggeredBCFT0 [iBC] - mChainTracking ->mIOPtrs .trdTriggerTimes [trdTrack.getCollisionId ()] / o2::constants::lhc::LHCBunchSpacingMUS);
545+ if (deltaBC <= mRecoParam .getPileUpRangeBefore () || deltaBC >= mRecoParam .getPileUpRangeAfter ()) {
546+ continue ;
547+ }
548+ // collect the charges
549+ std::array<int , 6 > q0;
550+ std::array<int , 6 > q1;
551+ for (int iLy = 0 ; iLy < NLAYER ; iLy++) {
552+ int trkltId = trdTrack.getTrackletIndex (iLy);
553+ if (trkltId < 0 ) {
554+ q0[iLy] = -1 ;
555+ q1[iLy] = -1 ;
556+ } else {
557+ q0[iLy] = mTrackletsRaw [trkltId].getQ0 ();
558+ q1[iLy] = mTrackletsRaw [trkltId].getQ1 ();
559+ }
560+ }
561+ // get pile-up probability
562+ float probBC = mRecoParam .getPileUpProbTrack (deltaBC, q0, q1);
563+ sumCorr += probBC * deltaBC;
564+ sumCorr2 += probBC * deltaBC * deltaBC;
565+ sumProb += probBC;
566+ if (probBC > maxProb) {
567+ maxProb = probBC;
568+ mTCorrPileUp = -deltaBC;
569+ }
570+ }
571+ if (sumProb > 1e-6 ) {
572+ mTErrPileUp2 = sumCorr2 / sumProb - 2 * mTCorrPileUp * sumCorr / sumProb + mTCorrPileUp * mTCorrPileUp ;
573+ }
574+
503575 nTrackletsAttached += trdTrack.getNtracklets ();
504576 auto trackGID = trdTrack.getRefGlobalTrackId ();
505577 if (trackGID.includesDet (GTrackID::Source::ITS )) {
@@ -529,7 +601,7 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
529601 } else {
530602 tracksOutTPC.back ().setPileUpDistance (mTracker ->Param ().rec .trd .pileupBwdNBC , mTracker ->Param ().rec .trd .pileupFwdNBC );
531603 }
532- if (!refitTPCTRDTrack (tracksOutTPC.back (), mChainTracking ->mIOPtrs .trdTriggerTimes [trdTrack.getCollisionId ()], &inputTracks) || std::isnan (tracksOutTPC.back ().getSnp ())) {
604+ if (!refitTPCTRDTrack (tracksOutTPC.back (), mChainTracking ->mIOPtrs .trdTriggerTimes [trdTrack.getCollisionId ()] - mTCorrPileUp * o2::constants::lhc::LHCBunchSpacingMUS , &inputTracks) || std::isnan (tracksOutTPC.back ().getSnp ())) {
533605 tracksOutTPC.pop_back ();
534606 ++nTracksFailedTPCTRDRefit;
535607 continue ;
@@ -734,7 +806,8 @@ bool TRDGlobalTracking::refitTPCTRDTrack(TrackTRD& trk, float timeTRD, o2::globa
734806 return false ;
735807 }
736808 if (pileUpOn) { // account pileup time uncertainty in Z errors
737- timeZErr = mTPCVdrift * trk.getPileUpTimeErrorMUS ();
809+ // timeZErr = mTPCVdrift * trk.getPileUpTimeErrorMUS();
810+ timeZErr = mTPCVdrift * mTPCVdrift * mTErrPileUp2 ;
738811 outerParam.updateCov (timeZErr, o2::track::CovLabels::kSigZ2 );
739812 }
740813 if (!refitTRDTrack (trk, chi2Out, false , true )) {
@@ -818,46 +891,6 @@ bool TRDGlobalTracking::refitTRDTrack(TrackTRD& trk, float& chi2, bool inwards,
818891 }
819892 }
820893
821- // Find most probable BCs and RMS for pile-up correction and error. Same BC is assumed for all tracklets
822- float tCorrPileUp = 0 .;
823- float tErrPileUp2 = 0 ;
824- float maxProb = 0 .f ;
825- // The uncertainty is the RMS wrt the default correction of all possible corrections weighted by their probability
826- float sumCorr = 0 .f ;
827- float sumCorr2 = 0 .f ;
828- float sumProb = 0 .f ;
829- for (int iBC = 0 ; iBC < mTriggeredBCFT0 .size (); iBC++) {
830- int deltaBC = roundf (mTriggeredBCFT0 [iBC] - mChainTracking ->mIOPtrs .trdTriggerTimes [trk.getCollisionId ()] / o2::constants::lhc::LHCBunchSpacingMUS);
831- if (deltaBC <= mRecoParam .getPileUpRangeBefore () || deltaBC >= mRecoParam .getPileUpRangeAfter ()) {
832- continue ;
833- }
834- // collect the charges
835- std::array<int , 6 > q0;
836- std::array<int , 6 > q1;
837- for (int iLy = 0 ; iLy < NLAYER ; iLy++) {
838- int trkltId = trk.getTrackletIndex (iLy);
839- if (trkltId < 0 ) {
840- q0[iLy] = -1 ;
841- q1[iLy] = -1 ;
842- } else {
843- q0[iLy] = mTrackletsRaw [trkltId].getQ0 ();
844- q1[iLy] = mTrackletsRaw [trkltId].getQ1 ();
845- }
846- }
847- // get pile-up probability
848- float probBC = mRecoParam .getPileUpProbTrack (deltaBC, q0, q1);
849- sumCorr += probBC * deltaBC;
850- sumCorr2 += probBC * deltaBC * deltaBC;
851- sumProb += probBC;
852- if (probBC > maxProb) {
853- maxProb = probBC;
854- tCorrPileUp = -deltaBC;
855- }
856- }
857- if (sumProb > 1e-6 ) {
858- tErrPileUp2 = sumCorr2 / sumProb - 2 * tCorrPileUp * sumCorr / sumProb + tCorrPileUp * tCorrPileUp;
859- }
860-
861894 if (inwards) {
862895 // reset covariance to something big for inwards refit
863896 trkParam->resetCovariance (100 );
@@ -891,13 +924,27 @@ bool TRDGlobalTracking::refitTRDTrack(TrackTRD& trk, float& chi2, bool inwards,
891924
892925 // conversion from slope in pad per time bin to slope in cm per BC = tracklets[trkltIdx].getSlopeFloat() * padWidth / BCperTimeBin
893926 float slopeFactor = mTrackletsRaw [trkltId].getSlopeFloat () * pad->getWidthIPad () / 4 .f ;
894- float yCorrPileUp = tCorrPileUp * slopeFactor;
895- float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
927+ float yCorrPileUp = mTCorrPileUp * slopeFactor;
928+ float yAddErrPileUp2 = mTErrPileUp2 * slopeFactor * slopeFactor;
929+ float yPosCorrUp = mTrackletsCalib [trkltId].getY () - tiltCorrUp + yCorrPileUp;
896930
897931 int nTrackletsChamber = mTracker ->GetNtrackletsChamber (trk.getCollisionId (), trkltDet);
898932 float angularPull = (mTrackletsCalib [trkltId].getDy () + dyTiltCorr - mRecoParam .convertAngleToDy (trkParam->getSnp ())) / std::sqrt (mRecoParam .getDyRes (trkParam->getSnp (), nTrackletsChamber));
933+
934+ // Correction of y position based on angular pull
935+ if (mRec ->GetParam ().rec .trd .useAngularPull == 3 || mRec ->GetParam ().rec .trd .useAngularPull == 4 ) {
936+ float corrPull = - angularPull * mRecoParam .getCorrYDy (trkParam->getSnp ());
937+ // in the tails with very large angle difference, the correlation becomes flat
938+ if (mTrackletsCalib [trkltId].getDy () + dyTiltCorr - mRecoParam .convertAngleToDy (trkParam->getSnp ()) > 0.6 ) {
939+ corrPull = - 0.6 / mRecoParam .getDyRes (trkParam->getSnp (), nTrackletsChamber) * mRecoParam .getCorrYDy (trkParam->getSnp ());
940+ }
941+ if (mTrackletsCalib [trkltId].getDy () + dyTiltCorr - mRecoParam .convertAngleToDy (trkParam->getSnp ()) < -0.6 ) {
942+ corrPull = 0.6 / mRecoParam .getDyRes (trkParam->getSnp (), nTrackletsChamber) * mRecoParam .getCorrYDy (trkParam->getSnp ());
943+ }
944+ yPosCorrUp += corrPull;
945+ }
899946
900- std::array<float , 2 > trkltPosUp{mTrackletsCalib [trkltId]. getY () - tiltCorrUp + yCorrPileUp , zPosCorrUp};
947+ std::array<float , 2 > trkltPosUp{yPosCorrUp , zPosCorrUp};
901948 std::array<float , 3 > trkltCovUp;
902949 mRecoParam .recalcTrkltCov (tilt, trkParam->getSnp (), pad->getRowSize (mTrackletsRaw [trkltId].getPadRow ()), trkltCovUp, (mRec ->GetParam ().rec .trd .useAngularPull != 0 ? angularPull : 0 .), nTrackletsChamber);
903950 trkltCovUp[0 ] += yAddErrPileUp2;
@@ -1006,6 +1053,10 @@ DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, GTrackID::mask_t src, boo
10061053 // request calibration data
10071054 inputs.emplace_back (" localgainfactors" , " TRD" , " LOCALGAINFACTORS" , 0 , Lifetime::Condition, ccdbParamSpec (" TRD/Calib/LocalGainFactor" ));
10081055 }
1056+
1057+ // request list of bad chambers and masked pads to estimate better the number of findable tracklets
1058+ inputs.emplace_back (" chamberstatus" , " TRD" , " CHAMBERSTATUS" , 0 , Lifetime::Condition, ccdbParamSpec (" TRD/Calib/DCSDPsFedChamberStatus" ));
1059+ inputs.emplace_back (" padstatus" , " TRD" , " PADSTATUS" , 0 , Lifetime::Condition, ccdbParamSpec (" TRD/Calib/PadStatus" ));
10091060
10101061 if (GTrackID::includesSource (GTrackID::Source::ITSTPC , src)) {
10111062 outputs.emplace_back (o2::header::gDataOriginTRD , " MATCH_ITSTPC" , 0 , Lifetime::Timeframe);
0 commit comments