Skip to content

Commit 74675ef

Browse files
authored
TRD: correction for pile-up and update of error parametrization (#15282)
* TRD: correction for pile-up * clang format * small update * clang format * small fix * move getPileUpProbTrack to the header * fix checkcode errors * update error parametrization * clang format
1 parent e8acf47 commit 74675ef

11 files changed

Lines changed: 503 additions & 65 deletions

File tree

Detectors/TRD/qc/include/TRDQC/Tracking.h

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "DataFormatsTRD/Constants.h"
2424
#include "ReconstructionDataFormats/TrackTPCITS.h"
2525
#include "ReconstructionDataFormats/GlobalTrackID.h"
26+
#include "DataFormatsTRD/TrackTriggerRecord.h"
2627
#include "DataFormatsTPC/TrackTPC.h"
2728
#include "DetectorsBase/Propagator.h"
2829
#include "GPUTRDRecoParam.h"
@@ -103,6 +104,10 @@ class Tracking
103104
mLocalGain = localGain;
104105
}
105106

107+
// quantities necessary for pile-up correction
108+
void setTriggeredBCFT0(std::vector<int> t) { mTriggeredBCFT0 = t; }
109+
void setFirstOrbit(uint32_t o) { mFirstOrbit = o; }
110+
106111
private:
107112
float mMaxSnp{o2::base::Propagator::MAX_SIN_PHI}; ///< max snp when propagating tracks
108113
float mMaxStep{o2::base::Propagator::MAX_STEP}; ///< maximum step for propagation
@@ -115,12 +120,20 @@ class Tracking
115120
std::vector<TrackQC> mTrackQC;
116121

117122
// input from DPL
118-
gsl::span<const o2::dataformats::TrackTPCITS> mTracksITSTPC; ///< ITS-TPC seeding tracks
119-
gsl::span<const o2::tpc::TrackTPC> mTracksTPC; ///< TPC seeding tracks
120-
gsl::span<const TrackTRD> mTracksITSTPCTRD; ///< TRD tracks reconstructed from TPC or ITS-TPC seeds
121-
gsl::span<const TrackTRD> mTracksTPCTRD; ///< TRD tracks reconstructed from TPC or TPC seeds
122-
gsl::span<const Tracklet64> mTrackletsRaw; ///< array of raw tracklets needed for TRD refit
123-
gsl::span<const CalibratedTracklet> mTrackletsCalib; ///< array of calibrated tracklets needed for TRD refit
123+
gsl::span<const o2::dataformats::TrackTPCITS> mTracksITSTPC; ///< ITS-TPC seeding tracks
124+
gsl::span<const o2::tpc::TrackTPC> mTracksTPC; ///< TPC seeding tracks
125+
gsl::span<const TrackTRD> mTracksITSTPCTRD; ///< TRD tracks reconstructed from TPC or ITS-TPC seeds
126+
gsl::span<const TrackTRD> mTracksTPCTRD; ///< TRD tracks reconstructed from TPC or TPC seeds
127+
gsl::span<const TrackTriggerRecord> mTrackTriggerRecordsITSTPCTRD; ///< TRD tracks reconstructed from TPC or ITS-TPC seeds
128+
gsl::span<const TrackTriggerRecord> mTrackTriggerRecordsTPCTRD; ///< TRD tracks reconstructed from TPC or TPC seeds
129+
gsl::span<const Tracklet64> mTrackletsRaw; ///< array of raw tracklets needed for TRD refit
130+
gsl::span<const CalibratedTracklet> mTrackletsCalib; ///< array of calibrated tracklets needed for TRD refit
131+
132+
// quantities necessary for pile-up correction
133+
std::vector<int> mTriggeredBCFT0; ///< array with the FT0 trigger times
134+
int mCurrentTriggerRecord;
135+
uint32_t mFirstOrbit;
136+
int mCurrentTrackId;
124137

125138
// corrections from ccdb, some need to be loaded only once hence an init flag
126139
o2::trd::LocalGainFactor mLocalGain; ///< local gain factors from krypton calibration

Detectors/TRD/qc/src/Tracking.cxx

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,23 @@ void Tracking::setInput(const o2::globaltracking::RecoContainer& input)
3737
mTracksTPCTRD = input.getTPCTRDTracks<TrackTRD>();
3838
mTrackletsRaw = input.getTRDTracklets();
3939
mTrackletsCalib = input.getTRDCalibratedTracklets();
40+
mTrackTriggerRecordsITSTPCTRD = input.getITSTPCTRDTriggers();
41+
mTrackTriggerRecordsTPCTRD = input.getTPCTRDTriggers();
4042
}
4143

4244
void Tracking::run()
4345
{
46+
mCurrentTriggerRecord = 0;
47+
mCurrentTrackId = 0;
4448
for (const auto& trkTrd : mTracksTPCTRD) {
4549
checkTrack(trkTrd, true);
50+
mCurrentTrackId++;
4651
}
52+
mCurrentTriggerRecord = 0;
53+
mCurrentTrackId = 0;
4754
for (const auto& trkTrd : mTracksITSTPCTRD) {
4855
checkTrack(trkTrd, false);
56+
mCurrentTrackId++;
4957
}
5058
}
5159

@@ -65,6 +73,59 @@ void Tracking::checkTrack(const TrackTRD& trkTrd, bool isTPCTRD)
6573
qcStruct.dEdxTotTPC = isTPCTRD ? mTracksTPC[id].getdEdx().dEdxTotTPC : mTracksTPC[mTracksITSTPC[id].getRefTPC()].getdEdx().dEdxTotTPC;
6674
}
6775

76+
// find corresponding track trigger record to get track timing
77+
int triggeredBC = 0;
78+
for (; mCurrentTriggerRecord < (isTPCTRD ? mTrackTriggerRecordsTPCTRD.size() : mTrackTriggerRecordsITSTPCTRD.size()); mCurrentTriggerRecord++) {
79+
auto& tRecord = (isTPCTRD ? mTrackTriggerRecordsTPCTRD[mCurrentTriggerRecord] : mTrackTriggerRecordsITSTPCTRD[mCurrentTriggerRecord]);
80+
if (mCurrentTrackId >= tRecord.getFirstTrack() && mCurrentTrackId < tRecord.getFirstTrack() + tRecord.getNumberOfTracks()) {
81+
triggeredBC = tRecord.getBCData().differenceInBC({0, mFirstOrbit});
82+
break;
83+
}
84+
}
85+
86+
// Find most probable BCs and RMS for pile-up correction and error. Same BC is assumed for all tracklets
87+
float tCorrPileUp = 0.;
88+
float tErrPileUp2 = 0;
89+
float maxProb = 0.f;
90+
// The uncertainty is the RMS wrt the default correction of all possible corrections weighted by their probability
91+
float sumCorr = 0.f;
92+
float sumCorr2 = 0.f;
93+
float sumProb = 0.f;
94+
for (int iBC = 0; iBC < mTriggeredBCFT0.size(); iBC++) {
95+
int deltaBC = roundf(mTriggeredBCFT0[iBC] - triggeredBC);
96+
if (deltaBC <= mRecoParam.getPileUpRangeBefore()) {
97+
continue;
98+
}
99+
if (deltaBC >= mRecoParam.getPileUpRangeAfter()) {
100+
break;
101+
}
102+
// collect the charges
103+
std::array<int, 6> q0;
104+
std::array<int, 6> q1;
105+
for (int iLy = 0; iLy < NLAYER; iLy++) {
106+
int trkltId = trkTrd.getTrackletIndex(iLy);
107+
if (trkltId < 0) {
108+
q0[iLy] = -1;
109+
q1[iLy] = -1;
110+
} else {
111+
q0[iLy] = mTrackletsRaw[trkltId].getQ0();
112+
q1[iLy] = mTrackletsRaw[trkltId].getQ1();
113+
}
114+
}
115+
// get pile-up probability
116+
float probBC = mRecoParam.getPileUpProbTrack(deltaBC, q0, q1);
117+
sumCorr += probBC * deltaBC;
118+
sumCorr2 += probBC * deltaBC * deltaBC;
119+
sumProb += probBC;
120+
if (probBC > maxProb) {
121+
maxProb = probBC;
122+
tCorrPileUp = -deltaBC;
123+
}
124+
}
125+
if (sumProb > 1e-6) {
126+
tErrPileUp2 = sumCorr2 / sumProb - 2 * tCorrPileUp * sumCorr / sumProb + tCorrPileUp * tCorrPileUp;
127+
}
128+
68129
for (int iLayer = 0; iLayer < NLAYER; ++iLayer) {
69130
int trkltId = trkTrd.getTrackletIndex(iLayer);
70131
if (trkltId < 0) {
@@ -88,14 +149,24 @@ void Tracking::checkTrack(const TrackTRD& trkTrd, bool isTPCTRD)
88149
const PadPlane* pad = Geometry::instance()->getPadPlane(trkltDet);
89150
float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle()); // tilt is signed! and returned in degrees
90151
float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
152+
float dyTiltCorr = tilt * trk.getTgl() * Geometry::instance()->cdrHght();
91153
float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
92154
float padLength = pad->getRowSize(tracklet.getPadRow());
93155
if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
94156
tiltCorrUp = 0.f;
95157
}
96-
std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
158+
159+
// conversion from slope in pad per time bin to slope in cm per BC = tracklets[trkltIdx].getSlopeFloat() * padWidth / BCperTimeBin
160+
float slopeFactor = mTrackletsRaw[trkltId].getSlopeFloat() * pad->getWidthIPad() / 4.f;
161+
float yCorrPileUp = tCorrPileUp * slopeFactor;
162+
float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
163+
164+
float angularPull = (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trk.getSnp())) / std::sqrt(mRecoParam.getDyRes(trk.getSnp(), 0));
165+
166+
std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp, zPosCorrUp};
97167
std::array<float, 3> trkltCovUp;
98-
mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(tracklet.getPadRow()), trkltCovUp);
168+
mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(tracklet.getPadRow()), trkltCovUp, angularPull, 0);
169+
trkltCovUp[0] += yAddErrPileUp2;
99170
auto chi2trklt = trk.getPredictedChi2(trkltPosUp, trkltCovUp);
100171

101172
qcStruct.trackProp[iLayer] = trk;

Detectors/TRD/workflow/include/TRDWorkflow/TRDGlobalTrackingQCSpec.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include "DataFormatsParameters/GRPObject.h"
3131
#include "ReconstructionDataFormats/GlobalTrackID.h"
3232
#include "DataFormatsGlobalTracking/RecoContainer.h"
33+
#include "DataFormatsFT0/RecPoints.h"
34+
#include "FT0Reconstruction/InteractionTag.h"
3335
#include "TRDQC/Tracking.h"
3436
#include <cstring>
3537

@@ -47,7 +49,7 @@ namespace trd
4749
class TRDGlobalTrackingQC : public Task
4850
{
4951
public:
50-
TRDGlobalTrackingQC(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, bool tpcAvailable) : mDataRequest(dr), mGGCCDBRequest(gr), mTPCavailable(tpcAvailable) {}
52+
TRDGlobalTrackingQC(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, bool tpcAvailable, o2::dataformats::GlobalTrackID::mask_t src) : mDataRequest(dr), mGGCCDBRequest(gr), mTPCavailable(tpcAvailable), mTrkMask(src) {}
5153
~TRDGlobalTrackingQC() override = default;
5254
void init(InitContext& ic) final
5355
{
@@ -67,6 +69,22 @@ class TRDGlobalTrackingQC : public Task
6769
updateTimeDependentParams(pc); // Make sure this is called after recoData.collectData, which may load some conditions
6870
mQC.reset();
6971
mQC.setInput(recoData);
72+
std::vector<int> triggeredBCFT0;
73+
if (mTrkMask[GTrackID::FT0]) { // pile-up tagging was requested
74+
auto ft0recPoints = recoData.getFT0RecPoints();
75+
uint32_t firstOrbit = 0;
76+
for (size_t ft0id = 0; ft0id < ft0recPoints.size(); ft0id++) {
77+
const auto& f0rec = ft0recPoints[ft0id];
78+
if (ft0id == 0) {
79+
firstOrbit = f0rec.getInteractionRecord().orbit;
80+
mQC.setFirstOrbit(firstOrbit);
81+
}
82+
if (o2::ft0::InteractionTag::Instance().isSelected(f0rec)) {
83+
triggeredBCFT0.push_back(f0rec.getInteractionRecord().differenceInBC({0, firstOrbit}));
84+
}
85+
}
86+
}
87+
mQC.setTriggeredBCFT0(triggeredBCFT0);
7088
mQC.run();
7189
pc.outputs().snapshot(Output{"TRD", "TRACKINGQC", 0}, mQC.getTrackQC());
7290
}
@@ -94,6 +112,7 @@ class TRDGlobalTrackingQC : public Task
94112
}
95113
}
96114

115+
o2::dataformats::GlobalTrackID::mask_t mTrkMask; ///< seeding track sources (TPC, ITS-TPC)
97116
std::shared_ptr<DataRequest> mDataRequest;
98117
std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
99118
bool mTPCavailable{false};
@@ -133,7 +152,7 @@ DataProcessorSpec getTRDGlobalTrackingQCSpec(o2::dataformats::GlobalTrackID::mas
133152
"trd-tracking-qc",
134153
dataRequest->inputs,
135154
outputs,
136-
AlgorithmSpec{adaptFromTask<TRDGlobalTrackingQC>(dataRequest, ggRequest, isTPCavailable)},
155+
AlgorithmSpec{adaptFromTask<TRDGlobalTrackingQC>(dataRequest, ggRequest, isTPCavailable, src)},
137156
Options{}};
138157
}
139158

Detectors/TRD/workflow/include/TRDWorkflow/TRDGlobalTrackingSpec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class TRDGlobalTracking : public o2::framework::Task
103103
#endif
104104
std::array<float, 5> mCovDiagInner{}; ///< total cov.matrix extra diagonal error from TrackTuneParams
105105
std::array<float, 5> mCovDiagOuter{}; ///< total cov.matrix extra diagonal error from TrackTuneParams
106+
std::vector<int> mTriggeredBCFT0; ///< array with the FT0 trigger times
106107
// PID
107108
PIDPolicy mPolicy{PIDPolicy::DEFAULT}; ///< Model to load an evaluate
108109
bool mRequestCTPLumi{false}; ///< whether to request CTP lumi

Detectors/TRD/workflow/src/TRDGlobalTrackingSpec.cxx

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,25 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
406406
}
407407
LOGF(info, "%i tracks are loaded into the TRD tracker. Out of those %i ITS-TPC tracks and %i TPC tracks", nTracksLoadedITSTPC + nTracksLoadedTPC, nTracksLoadedITSTPC, nTracksLoadedTPC);
408408

409+
// Load the FT0 triggered BCs if this is requested
410+
411+
if (mTrkMask[GTrackID::FT0]) { // pile-up tagging was requested
412+
auto ft0recPoints = inputTracks.getFT0RecPoints();
413+
uint32_t firstOrbit = 0;
414+
for (size_t ft0id = 0; ft0id < ft0recPoints.size(); ft0id++) {
415+
const auto& f0rec = ft0recPoints[ft0id];
416+
if (ft0id == 0) {
417+
firstOrbit = f0rec.getInteractionRecord().orbit;
418+
}
419+
if (o2::ft0::InteractionTag::Instance().isSelected(f0rec)) {
420+
uint32_t currentOrbit = f0rec.getInteractionRecord().orbit;
421+
mTriggeredBCFT0.push_back(f0rec.getInteractionRecord().bc + (currentOrbit - firstOrbit) * o2::constants::lhc::LHCMaxBunches);
422+
}
423+
}
424+
}
425+
426+
mTracker->SetFT0TriggeredBC(mTriggeredBCFT0.data(), mTriggeredBCFT0.size());
427+
409428
// start the tracking
410429
// mTracker->DumpTracks();
411430
mChainTracking->DoTRDGPUTracking<GPUTRDTrackerKernels::o2Version>(mTracker);
@@ -788,6 +807,46 @@ bool TRDGlobalTracking::refitTRDTrack(TrackTRD& trk, float& chi2, bool inwards,
788807
}
789808
}
790809

810+
// Find most probable BCs and RMS for pile-up correction and error. Same BC is assumed for all tracklets
811+
float tCorrPileUp = 0.;
812+
float tErrPileUp2 = 0;
813+
float maxProb = 0.f;
814+
// The uncertainty is the RMS wrt the default correction of all possible corrections weighted by their probability
815+
float sumCorr = 0.f;
816+
float sumCorr2 = 0.f;
817+
float sumProb = 0.f;
818+
for (int iBC = 0; iBC < mTriggeredBCFT0.size(); iBC++) {
819+
int deltaBC = roundf(mTriggeredBCFT0[iBC] - mChainTracking->mIOPtrs.trdTriggerTimes[trk.getCollisionId()] / o2::constants::lhc::LHCBunchSpacingMUS);
820+
if (deltaBC <= mRecoParam.getPileUpRangeBefore() || deltaBC >= mRecoParam.getPileUpRangeAfter()) {
821+
continue;
822+
}
823+
// collect the charges
824+
std::array<int, 6> q0;
825+
std::array<int, 6> q1;
826+
for (int iLy = 0; iLy < NLAYER; iLy++) {
827+
int trkltId = trk.getTrackletIndex(iLy);
828+
if (trkltId < 0) {
829+
q0[iLy] = -1;
830+
q1[iLy] = -1;
831+
} else {
832+
q0[iLy] = mTrackletsRaw[trkltId].getQ0();
833+
q1[iLy] = mTrackletsRaw[trkltId].getQ1();
834+
}
835+
}
836+
// get pile-up probability
837+
float probBC = mRecoParam.getPileUpProbTrack(deltaBC, q0, q1);
838+
sumCorr += probBC * deltaBC;
839+
sumCorr2 += probBC * deltaBC * deltaBC;
840+
sumProb += probBC;
841+
if (probBC > maxProb) {
842+
maxProb = probBC;
843+
tCorrPileUp = -deltaBC;
844+
}
845+
}
846+
if (sumProb > 1e-6) {
847+
tErrPileUp2 = sumCorr2 / sumProb - 2 * tCorrPileUp * sumCorr / sumProb + tCorrPileUp * tCorrPileUp;
848+
}
849+
791850
if (inwards) {
792851
// reset covariance to something big for inwards refit
793852
trkParam->resetCovariance(100);
@@ -811,16 +870,26 @@ bool TRDGlobalTracking::refitTRDTrack(TrackTRD& trk, float& chi2, bool inwards,
811870
}
812871
const PadPlane* pad = Geometry::instance()->getPadPlane(trkltDet);
813872
float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle()); // tilt is signed! and returned in degrees
873+
float dyTiltCorr = tilt * trkParam->getTgl() * Geometry::instance()->cdrHght();
814874
float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trkParam->getZ());
815875
float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trkParam->getTgl();
816876
float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
817877
if (!((trkParam->getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trkParam->getZ()) < padLength))) {
818878
tiltCorrUp = 0.f;
819879
}
820880

821-
std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp, zPosCorrUp};
881+
// conversion from slope in pad per time bin to slope in cm per BC = tracklets[trkltIdx].getSlopeFloat() * padWidth / BCperTimeBin
882+
float slopeFactor = mTrackletsRaw[trkltId].getSlopeFloat() * pad->getWidthIPad() / 4.f;
883+
float yCorrPileUp = tCorrPileUp * slopeFactor;
884+
float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
885+
886+
int nTrackletsChamber = mTracker->GetNtrackletsChamber(trk.getCollisionId(), trkltDet);
887+
float angularPull = (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trkParam->getSnp())) / std::sqrt(mRecoParam.getDyRes(trkParam->getSnp(), nTrackletsChamber));
888+
889+
std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp, zPosCorrUp};
822890
std::array<float, 3> trkltCovUp;
823-
mRecoParam.recalcTrkltCov(tilt, trkParam->getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp);
891+
mRecoParam.recalcTrkltCov(tilt, trkParam->getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp, (mRec->GetParam().rec.trd.useAngularPull != 0 ? angularPull : 0.), nTrackletsChamber);
892+
trkltCovUp[0] += yAddErrPileUp2;
824893

825894
chi2 += trkParam->getPredictedChi2(trkltPosUp, trkltCovUp);
826895
if (!trkParam->update(trkltPosUp, trkltCovUp)) {

GPU/GPUTracking/DataTypes/GPUTRDRecoParam.cxx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,21 @@ using namespace o2::gpu;
2424
// error parameterizations taken from http://cds.cern.ch/record/2724259 Appendix A
2525
void GPUTRDRecoParam::init(float bz, const GPUSettingsRec* rec)
2626
{
27-
float resRPhiIdeal2 = 1.6e-3f;
27+
float resRPhiIdeal = 0.04f;
28+
float resVsTanPhiMisalign = 0.f;
2829
if (rec) {
29-
resRPhiIdeal2 = rec->trd.trkltResRPhiIdeal * rec->trd.trkltResRPhiIdeal;
30+
resRPhiIdeal = rec->trd.trkltResRPhiIdeal;
31+
resVsTanPhiMisalign = rec->trd.trkltResVsTanPhiMisalign;
32+
mPileUpRangeBefore = -rec->trd.pileupBwdNBC;
33+
mPileUpRangeAfter = rec->trd.pileupFwdNBC;
3034
}
3135
#ifndef GPUCA_STANDALONE
3236
else {
3337
const auto& rtrd = GPU_GET_CONFIG(GPUSettingsRecTRD);
34-
resRPhiIdeal2 = rtrd.trkltResRPhiIdeal * rtrd.trkltResRPhiIdeal;
38+
resRPhiIdeal = rtrd.trkltResRPhiIdeal;
39+
resVsTanPhiMisalign = rtrd.trkltResVsTanPhiMisalign;
40+
mPileUpRangeBefore = -rtrd.pileupBwdNBC;
41+
mPileUpRangeAfter = rtrd.pileupFwdNBC;
3542
}
3643
#endif
3744

@@ -55,23 +62,22 @@ void GPUTRDRecoParam::init(float bz, const GPUSettingsRec* rec)
5562
LOGP(warning, "No error parameterization available for Bz= {}. Keeping default value (sigma_y = const. = 1cm)", bz);
5663
}
5764

58-
mRPhiA2 = resRPhiIdeal2;
65+
mRPhiA = resRPhiIdeal;
66+
mRPhiATgp = resVsTanPhiMisalign;
5967
mLorentzAngle = -0.02f + 0.13f * bz / 5.f;
6068

6169
mDyA2 = 6e-3f;
6270
mDyC2 = 0.3f;
63-
mCorrYDyA = 0.27f;
64-
mCorrYDyC = -0.44f;
6571

66-
LOGP(info, "Loaded parameterizations for Bz={}: PhiRes:[{},{},{}] DyRes:[{},{},{}] CorrYDy:[{},{},{}]",
67-
bz, mRPhiA2, mLorentzAngle, mRPhiC2, mDyA2, mLorentzAngle, mDyC2, mCorrYDyA, mLorentzAngle, mCorrYDyC);
72+
LOGP(info, "Loaded parameterizations for Bz={}: PhiRes:[{},{},{},{}] DyRes:[{},{},{}]",
73+
bz, mRPhiA, mRPhiATgp, mLorentzAngle, mRPhiC2, mDyA2, mLorentzAngle, mDyC2);
6874
}
6975

70-
void GPUTRDRecoParam::recalcTrkltCov(const float tilt, const float snp, const float rowSize, float* cov) const
76+
void GPUTRDRecoParam::recalcTrkltCov(const float tilt, const float snp, const float rowSize, float* cov, const float pull, const int occupancy) const
7177
{
7278
float t2 = tilt * tilt; // tan^2 (tilt)
7379
float c2 = 1.f / (1.f + t2); // cos^2 (tilt)
74-
float sy2 = getRPhiRes(snp);
80+
float sy2 = getRPhiRes(snp, CAMath::Abs(pull), occupancy);
7581
float sz2 = rowSize * rowSize / 12.f;
7682
cov[0] = c2 * (sy2 + t2 * sz2);
7783
cov[1] = c2 * tilt * (sz2 - sy2);

0 commit comments

Comments
 (0)