@@ -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,34 @@ 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+ } else {
211+ mTracker ->SetChamberStatus (iDet, true ); // chamber is bad
212+ }
213+ }
214+ return ;
215+ }
216+ /* if (matcher == ConcreteDataMatcher("TRD", "PADSTATUS", 0)) {
217+ LOG(info) << "pad status object updated";
218+ const o2::trd::PadStatus* padStatus = (const o2::trd::PadStatus*)obj;
219+ for (int iDet = 0; iDet < constants::MAXCHAMBER; iDet++) {
220+ for (int iCol = 0; iCol < constants::NCOLUMN; iCol++) {
221+ for (int iRow = 0; iRow < ((iDet % 30) / 6 == 2 ? constants::NROWC0 : constants::NROWC1); iRow++) {
222+ if (padStatus->isMasked(iDet, iCol, iRow) || padStatus->isNotConnected(iDet, iCol, iRow)) {
223+ mTracker->SetPadStatus(iDet * constants::NCOLUMN * constants::NROWC1 + iCol * constants::NROWC1 + iRow, true); // pad is masked
224+ } else {
225+ mTracker->SetPadStatus(iDet * constants::NCOLUMN * constants::NROWC1 + iCol * constants::NROWC1 + iRow, false); // pad is not masked
226+ }
227+ }
228+ }
229+ }
230+ return;
231+ }*/
201232}
202233
203234void 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 +531,45 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
500531 if (trdTrack.getChi2 () / trdTrack.getNtracklets () > mTracker ->Param ().rec .trd .maxChi2Red ) {
501532 continue ;
502533 }
534+
535+ // Find most probable BCs and RMS for pile-up correction and error. Same BC is assumed for all tracklets
536+ float maxProb = 0 .f ;
537+ // The uncertainty is the RMS wrt the default correction of all possible corrections weighted by their probability
538+ float sumCorr = 0 .f ;
539+ float sumCorr2 = 0 .f ;
540+ float sumProb = 0 .f ;
541+ for (int iBC = 0 ; iBC < mTriggeredBCFT0 .size (); iBC++) {
542+ int deltaBC = roundf (mTriggeredBCFT0 [iBC] - mChainTracking ->mIOPtrs .trdTriggerTimes [trdTrack.getCollisionId ()] / o2::constants::lhc::LHCBunchSpacingMUS);
543+ if (deltaBC <= mRecoParam .getPileUpRangeBefore () || deltaBC >= mRecoParam .getPileUpRangeAfter ()) {
544+ continue ;
545+ }
546+ // collect the charges
547+ std::array<int , 6 > q0;
548+ std::array<int , 6 > q1;
549+ for (int iLy = 0 ; iLy < NLAYER ; iLy++) {
550+ int trkltId = trdTrack.getTrackletIndex (iLy);
551+ if (trkltId < 0 ) {
552+ q0[iLy] = -1 ;
553+ q1[iLy] = -1 ;
554+ } else {
555+ q0[iLy] = mTrackletsRaw [trkltId].getQ0 ();
556+ q1[iLy] = mTrackletsRaw [trkltId].getQ1 ();
557+ }
558+ }
559+ // get pile-up probability
560+ float probBC = mRecoParam .getPileUpProbTrack (deltaBC, q0, q1);
561+ sumCorr += probBC * deltaBC;
562+ sumCorr2 += probBC * deltaBC * deltaBC;
563+ sumProb += probBC;
564+ if (probBC > maxProb) {
565+ maxProb = probBC;
566+ mTCorrPileUp = -deltaBC;
567+ }
568+ }
569+ if (sumProb > 1e-6 ) {
570+ mTErrPileUp2 = sumCorr2 / sumProb - 2 * mTCorrPileUp * sumCorr / sumProb + mTCorrPileUp * mTCorrPileUp ;
571+ }
572+
503573 nTrackletsAttached += trdTrack.getNtracklets ();
504574 auto trackGID = trdTrack.getRefGlobalTrackId ();
505575 if (trackGID.includesDet (GTrackID::Source::ITS )) {
@@ -529,7 +599,7 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
529599 } else {
530600 tracksOutTPC.back ().setPileUpDistance (mTracker ->Param ().rec .trd .pileupBwdNBC , mTracker ->Param ().rec .trd .pileupFwdNBC );
531601 }
532- if (!refitTPCTRDTrack (tracksOutTPC.back (), mChainTracking ->mIOPtrs .trdTriggerTimes [trdTrack.getCollisionId ()], &inputTracks) || std::isnan (tracksOutTPC.back ().getSnp ())) {
602+ if (!refitTPCTRDTrack (tracksOutTPC.back (), mChainTracking ->mIOPtrs .trdTriggerTimes [trdTrack.getCollisionId ()] - mTCorrPileUp * o2::constants::lhc::LHCBunchSpacingMUS , &inputTracks) || std::isnan (tracksOutTPC.back ().getSnp ())) {
533603 tracksOutTPC.pop_back ();
534604 ++nTracksFailedTPCTRDRefit;
535605 continue ;
@@ -734,7 +804,8 @@ bool TRDGlobalTracking::refitTPCTRDTrack(TrackTRD& trk, float timeTRD, o2::globa
734804 return false ;
735805 }
736806 if (pileUpOn) { // account pileup time uncertainty in Z errors
737- timeZErr = mTPCVdrift * trk.getPileUpTimeErrorMUS ();
807+ // timeZErr = mTPCVdrift * trk.getPileUpTimeErrorMUS();
808+ timeZErr = mTPCVdrift * mTPCVdrift * mTErrPileUp2 ;
738809 outerParam.updateCov (timeZErr, o2::track::CovLabels::kSigZ2 );
739810 }
740811 if (!refitTRDTrack (trk, chi2Out, false , true )) {
@@ -818,46 +889,6 @@ bool TRDGlobalTracking::refitTRDTrack(TrackTRD& trk, float& chi2, bool inwards,
818889 }
819890 }
820891
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-
861892 if (inwards) {
862893 // reset covariance to something big for inwards refit
863894 trkParam->resetCovariance (100 );
@@ -891,13 +922,20 @@ bool TRDGlobalTracking::refitTRDTrack(TrackTRD& trk, float& chi2, bool inwards,
891922
892923 // conversion from slope in pad per time bin to slope in cm per BC = tracklets[trkltIdx].getSlopeFloat() * padWidth / BCperTimeBin
893924 float slopeFactor = mTrackletsRaw [trkltId].getSlopeFloat () * pad->getWidthIPad () / 4 .f ;
894- float yCorrPileUp = tCorrPileUp * slopeFactor;
895- float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
925+ float yCorrPileUp = mTCorrPileUp * slopeFactor;
926+ float yAddErrPileUp2 = mTErrPileUp2 * slopeFactor * slopeFactor;
927+ float yPosCorrUp = mTrackletsCalib [trkltId].getY () - tiltCorrUp + yCorrPileUp;
896928
897929 int nTrackletsChamber = mTracker ->GetNtrackletsChamber (trk.getCollisionId (), trkltDet);
898930 float angularPull = (mTrackletsCalib [trkltId].getDy () + dyTiltCorr - mRecoParam .convertAngleToDy (trkParam->getSnp ())) / std::sqrt (mRecoParam .getDyRes (trkParam->getSnp (), nTrackletsChamber));
899931
900- std::array<float , 2 > trkltPosUp{mTrackletsCalib [trkltId].getY () - tiltCorrUp + yCorrPileUp, zPosCorrUp};
932+ // Correction of y position based on angular pull
933+ if (mRec ->GetParam ().rec .trd .useAngularPull == 3 || mRec ->GetParam ().rec .trd .useAngularPull == 4 ) {
934+ float corrPull = -angularPull * mRecoParam .getCorrYDy (trkParam->getSnp ());
935+ yPosCorrUp += corrPull;
936+ }
937+
938+ std::array<float , 2 > trkltPosUp{yPosCorrUp, zPosCorrUp};
901939 std::array<float , 3 > trkltCovUp;
902940 mRecoParam .recalcTrkltCov (tilt, trkParam->getSnp (), pad->getRowSize (mTrackletsRaw [trkltId].getPadRow ()), trkltCovUp, (mRec ->GetParam ().rec .trd .useAngularPull != 0 ? angularPull : 0 .), nTrackletsChamber);
903941 trkltCovUp[0 ] += yAddErrPileUp2;
@@ -1007,6 +1045,10 @@ DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, GTrackID::mask_t src, boo
10071045 inputs.emplace_back (" localgainfactors" , " TRD" , " LOCALGAINFACTORS" , 0 , Lifetime::Condition, ccdbParamSpec (" TRD/Calib/LocalGainFactor" ));
10081046 }
10091047
1048+ // request list of bad chambers and masked pads to estimate better the number of findable tracklets
1049+ inputs.emplace_back (" chamberstatus" , " TRD" , " CHAMBERSTATUS" , 0 , Lifetime::Condition, ccdbParamSpec (" TRD/Calib/DCSDPsFedChamberStatus" ));
1050+ // inputs.emplace_back("padstatus", "TRD", "PADSTATUS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/PadStatus"));
1051+
10101052 if (GTrackID::includesSource (GTrackID::Source::ITSTPC , src)) {
10111053 outputs.emplace_back (o2::header::gDataOriginTRD , " MATCH_ITSTPC" , 0 , Lifetime::Timeframe);
10121054 outputs.emplace_back (o2::header::gDataOriginTRD , " TRGREC_ITSTPC" , 0 , Lifetime::Timeframe);
0 commit comments