63 auto id = trkTrd.getRefGlobalTrackId();
69 LOGF(
debug,
"Got track with %i tracklets and ID %i", trkTrd.getNtracklets(), (
int)
id);
73 qcStruct.
dEdxTotTPC = isTPCTRD ? mTracksTPC[
id].getdEdx().dEdxTotTPC : mTracksTPC[mTracksITSTPC[
id].getRefTPC()].getdEdx().dEdxTotTPC;
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});
87 float tCorrPileUp = 0.;
88 float tErrPileUp2 = 0;
94 for (
int iBC = 0; iBC < mTriggeredBCFT0.size(); iBC++) {
95 int deltaBC = roundf(mTriggeredBCFT0[iBC] - triggeredBC);
96 if (deltaBC <= mRecoParam.getPileUpRangeBefore()) {
99 if (deltaBC >= mRecoParam.getPileUpRangeAfter()) {
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);
111 q0[iLy] = mTrackletsRaw[trkltId].getQ0();
112 q1[iLy] = mTrackletsRaw[trkltId].getQ1();
116 float probBC = mRecoParam.getPileUpProbTrack(deltaBC, q0, q1);
117 sumCorr += probBC * deltaBC;
118 sumCorr2 += probBC * deltaBC * deltaBC;
120 if (probBC > maxProb) {
122 tCorrPileUp = -deltaBC;
125 if (sumProb > 1e-6) {
126 tErrPileUp2 = sumCorr2 / sumProb - 2 * tCorrPileUp * sumCorr / sumProb + tCorrPileUp * tCorrPileUp;
129 for (
int iLayer = 0; iLayer <
NLAYER; ++iLayer) {
130 int trkltId = trkTrd.getTrackletIndex(iLayer);
134 const auto& tracklet = mTrackletsRaw[trkltId];
135 qcStruct.
trklt64[iLayer] = tracklet;
136 qcStruct.
trkltCalib[iLayer] = mTrackletsCalib[trkltId];
137 int trkltDet = tracklet.getDetector();
141 LOGF(
debug,
"Track could not be rotated in tracklet coordinate system");
145 if (!propagator->PropagateToXBxByBz(trk, mTrackletsCalib[trkltId].getX(), mMaxSnp, mMaxStep, mMatCorr)) {
146 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLayer, trk.getPt(), trk.getX(), mTrackletsCalib[trkltId].getX());
150 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
151 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trk.getZ());
153 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trk.getTgl();
154 float padLength = pad->getRowSize(tracklet.getPadRow());
155 if (!((trk.getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trk.getZ()) < padLength))) {
160 float slopeFactor = mTrackletsRaw[trkltId].getSlopeFloat() * pad->getWidthIPad() / 4.f;
161 float yCorrPileUp = tCorrPileUp * slopeFactor;
162 float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
164 float angularPull = (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trk.getSnp())) / std::sqrt(mRecoParam.getDyRes(trk.getSnp(), 0));
166 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp, zPosCorrUp};
167 std::array<float, 3> trkltCovUp;
168 mRecoParam.recalcTrkltCov(tilt, trk.getSnp(), pad->getRowSize(tracklet.getPadRow()), trkltCovUp, angularPull, 0);
169 trkltCovUp[0] += yAddErrPileUp2;
170 auto chi2trklt = trk.getPredictedChi2(trkltPosUp, trkltCovUp);
173 qcStruct.
trackletY[iLayer] = trkltPosUp[0];
174 qcStruct.
trackletZ[iLayer] = trkltPosUp[1];
181 auto tphi = trk.getSnp() / std::sqrt((1.f - trk.getSnp()) * (1.f + trk.getSnp()));
182 auto trackletLength = std::sqrt(1.f + tphi * tphi + trk.getTgl() * trk.getTgl());
183 auto cor = mLocalGain.
getValue(tracklet.getHCID() / 2, tracklet.getPadCol(mApplyShift), tracklet.getPadRow()) * trackletLength;
184 float q0{tracklet.getQ0() / cor}, q1{tracklet.getQ1() / cor}, q2{tracklet.getQ2() / cor};
187 if (trkTrd.getIsCrossingNeighbor(iLayer) && trkTrd.getHasNeighbor()) {
188 for (
const auto& trklt : mTrackletsRaw) {
189 if (tracklet.getTrackletWord() == trklt.getTrackletWord()) {
192 if (std::abs(tracklet.getPadCol(mApplyShift) - trklt.getPadCol(mApplyShift)) <= 1 && std::abs(tracklet.getPadRow() - trklt.getPadRow()) == 1) {
194 auto cor = mLocalGain.
getValue(trklt.getHCID() / 2, trklt.getPadCol(mApplyShift), trklt.getPadRow()) * trackletLength;
195 q0 += trklt.getQ0() / cor;
196 q1 += trklt.getQ1() / cor;
197 q2 += trklt.getQ2() / cor;
205 mTrackQC.push_back(qcStruct);