Skip to content

Commit 9344efa

Browse files
committed
TRD: using slope to correct y position and reject more fakes
1 parent fc1aaf8 commit 9344efa

9 files changed

Lines changed: 229 additions & 74 deletions

File tree

‎Detectors/TRD/qc/src/Tracking.cxx‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,21 @@ void Tracking::checkTrack(const TrackTRD& trkTrd, bool isTPCTRD)
160160
float slopeFactor = mTrackletsRaw[trkltId].getSlopeFloat() * pad->getWidthIPad() / 4.f;
161161
float yCorrPileUp = tCorrPileUp * slopeFactor;
162162
float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
163+
float yPosCorrUp = mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp;
163164

164165
float angularPull = (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trk.getSnp())) / std::sqrt(mRecoParam.getDyRes(trk.getSnp(), 0));
166+
// Correction of y position based on angular pull
167+
float corrPull = - angularPull * mRecoParam.getCorrYDy(trk.getSnp());
168+
// in the tails with very large angle difference, the correlation becomes flat
169+
if (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trk.getSnp()) > 0.6) {
170+
corrPull = - 0.6 / mRecoParam.getDyRes(trk.getSnp(), 0) * mRecoParam.getCorrYDy(trk.getSnp());
171+
}
172+
if (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trk.getSnp()) < -0.6) {
173+
corrPull = 0.6 / mRecoParam.getDyRes(trk.getSnp(), 0) * mRecoParam.getCorrYDy(trk.getSnp());
174+
}
175+
yPosCorrUp += corrPull;
165176

166-
std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp, zPosCorrUp};
177+
std::array<float, 2> trkltPosUp{yPosCorrUp, zPosCorrUp};
167178
std::array<float, 3> trkltCovUp;
168179
mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(tracklet.getPadRow()), trkltCovUp, angularPull, 0);
169180
trkltCovUp[0] += yAddErrPileUp2;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class TRDGlobalTracking : public o2::framework::Task
7878
float mTPCTBinMUSInv{1.f / mTPCTBinMUS}; ///< inverse width of a TPC time bin in 1/us
7979
float mTPCVdrift{2.58f}; ///< TPC drift velocity (for shifting TPC tracks along Z)
8080
float mTPCTDriftOffset{0.f}; ///< TPC drift time additive offset
81+
int32_t mTCorrPileUp{0}; ///< most probable correction in number of BCs due to pile-up in TRD
82+
float mTErrPileUp2{0.f}; ///< error on correction in number of BCs due to pile-up in TRD
8183
std::shared_ptr<o2::globaltracking::DataRequest> mDataRequest; ///< seeding input (TPC-only, ITS-TPC or both)
8284
std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
8385
o2::tpc::VDriftHelper mTPCVDriftHelper{};

‎Detectors/TRD/workflow/src/TRDGlobalTrackingSpec.cxx‎

Lines changed: 96 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

203236
void 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);

‎GPU/GPUTracking/DataTypes/GPUTRDRecoParam.h‎

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ class GPUTRDRecoParam
4949
GPUd() float getRPhiRes(float snp, float pull = 0.f, int occupancy = 0) const;
5050
GPUd() float getDyRes(float snp, int occupancy = 0) const { return mDyA2 + mDyC2 * (snp - mLorentzAngle) * (snp - mLorentzAngle) + mOccDyA * occupancy; } // a^2 + c^2 * (snp - b)^2
5151
GPUd() float convertAngleToDy(float snp) const { return 3.f * snp / CAMath::Sqrt(1 - snp * snp); } // when calibrated, sin(phi) = (dy / xDrift) / sqrt(1+(dy/xDrift)^2) works well
52-
GPUd() float getDyLikelihood(float snp, float slope, int occupancy = 0) const;
53-
GPUd() float getCorrYDy() const { return mCorrYDy; }
52+
GPUd() double getDyLikelihood(float snp, float slope, int occupancy = 0) const;
53+
GPUd() double getZLikelihood(float deltaZ, float padLength, float sigmaZtrk) const;
54+
GPUd() float getCorrYDy(float snp) const { return CAMath::Sqrt(mCorrYDyA + mCorrYDyC * (snp - mLorentzAngle) * (snp - mLorentzAngle)); }
5455
GPUd() float getPileUpProbTracklet(int nBC, bool withChargeInfo, bool Q0 = true, bool Q1 = true) const;
5556
GPUd() float getPileUpProbTrack(int nBC, std::array<int, 6> Q0, std::array<int, 6> Q1) const;
5657

@@ -71,8 +72,9 @@ class GPUTRDRecoParam
7172
// angle
7273
float mDyA2{1.225e-3f}; ///< parameterization for tracklet angular resolution
7374
float mDyC2{0.f}; ///< parameterization for tracklet angular resolution
74-
// variation in y when dy variates by one sigma (= cov / sigma_dy = corr * sigma_y) (valid within 2sigma of dy)
75-
float mCorrYDy{0.13f};
75+
// variation in y when dy variates by one sigma (= cov / sigma_dy = corr * sigma_y) for tracklet (valid within ~[-0.6,0.6] of dy_trklt-dy_trk)
76+
float mCorrYDyA{7.8e-4f};
77+
float mCorrYDyC{2.2e-2f};
7678
// error parametrization vs angular pull (pol2)
7779
float mPullA{6.8e-3f};
7880
float mPullB{0.049f};
@@ -134,14 +136,13 @@ GPUdi() float GPUTRDRecoParam::getRPhiRes(float snp, float pull, int occupancy)
134136
return (resIdeal * resIdeal + mRPhiC2 * (snp - mLorentzAngle) * (snp - mLorentzAngle) + resPull * resPull + resOccupancy);
135137
}
136138

137-
GPUdi() float GPUTRDRecoParam::getDyLikelihood(float snp, float slope, int occupancy) const
139+
GPUdi() double GPUTRDRecoParam::getDyLikelihood(float snp, float slope, int occupancy) const
138140
{
139141
// Gaussian + left exponential + right exponential
140-
float nSigma = (slope - GPUTRDRecoParam::convertAngleToDy(snp)) / GPUTRDRecoParam::getDyRes(snp, occupancy);
141-
float likelihood = CAMath::Exp(- 0.5f * nSigma * nSigma);
142+
double likelihood = CAMath::Exp(- 0.5f * (slope - GPUTRDRecoParam::convertAngleToDy(snp)) * (slope - GPUTRDRecoParam::convertAngleToDy(snp)) / GPUTRDRecoParam::getDyRes(snp, occupancy));
142143

143144
// Normalization for the exponential is parametrized with respect to the Gaussian, it is smaller at lorentz angle
144-
float expNorm = CAMath::Sqrt(mDyExpNormA + mDyExpNormC * (snp - mLorentzAngle) * (snp - mLorentzAngle));
145+
double expNorm = CAMath::Sqrt(mDyExpNormA + mDyExpNormC * (snp - mLorentzAngle) * (snp - mLorentzAngle));
145146
if (slope < convertAngleToDy(snp)) {
146147
// left tail in this case, larger tail for large positive snp
147148
likelihood += expNorm * CAMath::Exp((mDyExpA + mDyExpC * (snp - mLorentzAngle)) * (slope - GPUTRDRecoParam::convertAngleToDy(snp)));
@@ -156,6 +157,14 @@ GPUdi() float GPUTRDRecoParam::getDyLikelihood(float snp, float slope, int occup
156157
return likelihood;
157158
}
158159

160+
GPUdi() double GPUTRDRecoParam::getZLikelihood(float deltaZ, float padLength, float sigmaZtrk) const
161+
{
162+
// logistic function as approximation of convolution between uniform tracklet Z and gaussian track, depends on sqrt(3)/pi times the track resolution
163+
// normalized so that maximum is 1
164+
double lmax = 1.f/(1.f + CAMath::Exp(- 0.5f * padLength / 0.5513f / sigmaZtrk)) - 1.f/(1.f + CAMath::Exp(0.5f * padLength / 0.5513f / sigmaZtrk));
165+
return 1.f / lmax / (1.f + CAMath::Exp((deltaZ - 0.5f * padLength) / 0.5513f / sigmaZtrk)) - 1.f / lmax / (1.f + CAMath::Exp((deltaZ + 0.5f * padLength) / 0.5513f / sigmaZtrk));
166+
}
167+
159168
GPUdi() float GPUTRDRecoParam::getPileUpProbTracklet(int nBC, bool withChargeInfo, bool Q0, bool Q1) const
160169
{
161170
// get the probability that the tracklet with charges Q0 and Q1 belongs to a given BC, with a (signed) distance nBC from the TRD-triggered BC

‎GPU/GPUTracking/Definitions/GPUSettingsList.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ AddOptionRTC(nTrackletsMin, uint8_t, 3, "", 0, "Tracks with less attached trackl
195195
AddOptionRTC(matCorrType, uint8_t, 2, "", 0, "Material correction to use: 0 - none, 1 - TGeo, 2 - matLUT")
196196
AddOptionRTC(pileupFwdNBC, uint8_t, 70, "", 0, "Post-trigger Pile-up integration time in BCs")
197197
AddOptionRTC(pileupBwdNBC, uint8_t, 130, "", 0, "Pre-trigger Pile-up integration time in BCs")
198-
AddOptionRTC(useAngularPull, uint8_t, 1, "", 0, "0 = don't use angular pull; 1 = additional error based on angular pull for refit only; 2 = add error also for chi2")
198+
AddOptionRTC(useAngularPull, uint8_t, 3, "", 0, "0 = don't use angular pull; 1 = additional error based on angular pull for refit only; 2 = add error also for chi2; 3 and 4 = correction of the average position based on angular pull")
199199
AddHelp("help", 'h')
200200
EndConfig()
201201

‎GPU/GPUTracking/TRDTracking/GPUTRDGeometry.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class GPUTRDpadPlane : private o2::trd::PadPlane
4242
GPUd() float GetNrows() const { return getNrows(); }
4343
GPUd() float GetNcols() const { return getNcols(); }
4444
GPUd() int32_t GetPadRowNumber(double z) const { return getPadRowNumber(z); }
45+
GPUd() int32_t GetPadColNumber(double y) const { return getPadColNumber(y); }
4546
};
4647

4748
class GPUTRDGeometry : private o2::trd::GeometryFlat

‎GPU/GPUTracking/TRDTracking/GPUTRDInterfaces.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class trackInterface<GPUTPCGMTrackParam> : public GPUTPCGMTrackParam
152152
GPUd() float getSigmaY2() const { return GetErr2Y(); }
153153
GPUd() float getSigmaZ2() const { return GetErr2Z(); }
154154
GPUd() float getSigmaZY() const { return GetCov(1); }
155+
GPUd() float getSigmaSnpY() const { return GetCov(3); }
156+
GPUd() float getSigmaSnpZ() const { return GetCov(4); }
155157

156158
GPUd() const float* getPar() const { return GetPar(); }
157159
GPUd() const float* getCov() const { return GetCov(); }

0 commit comments

Comments
 (0)