Skip to content

Commit f676657

Browse files
authored
[Common,PWGEM] support muon propagation with z shift (#14611)
1 parent de582bd commit f676657

File tree

3 files changed

+94
-49
lines changed

3 files changed

+94
-49
lines changed

Common/Core/fwdtrackUtilities.h

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -48,33 +48,6 @@ using SMatrix55 = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double
4848
using SMatrix55Std = ROOT::Math::SMatrix<double, 5>;
4949
using SMatrix5 = ROOT::Math::SVector<double, 5>;
5050

51-
template <typename TFwdTrack, typename TFwdTrackCov>
52-
o2::track::TrackParCovFwd getTrackParCovFwd(TFwdTrack const& track, TFwdTrackCov const& cov)
53-
{
54-
// This function works for (glMuon, glMuon), (saMuon, saMuon) and (MFTTrack, MFTTrackCov).
55-
56-
double chi2 = track.chi2();
57-
if constexpr (std::is_same_v<std::decay_t<TFwdTrackCov>, aod::MFTTracksCov::iterator>) {
58-
chi2 = track.chi2();
59-
} else {
60-
if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
61-
chi2 = track.chi2();
62-
} else if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
63-
chi2 = track.chi2() * (2.f * track.nClusters() - 5.f);
64-
}
65-
}
66-
67-
SMatrix5 tpars(track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt());
68-
std::vector<double> v1{cov.cXX(), cov.cXY(), cov.cYY(), cov.cPhiX(), cov.cPhiY(),
69-
cov.cPhiPhi(), cov.cTglX(), cov.cTglY(), cov.cTglPhi(), cov.cTglTgl(),
70-
cov.c1PtX(), cov.c1PtY(), cov.c1PtPhi(), cov.c1PtTgl(), cov.c1Pt21Pt2()};
71-
SMatrix55 tcovs(v1.begin(), v1.end());
72-
o2::track::TrackParCovFwd trackparCov{track.z(), tpars, tcovs, chi2}; // this is chi2! Not chi2/ndf.
73-
v1.clear();
74-
v1.shrink_to_fit();
75-
return trackparCov;
76-
}
77-
7851
/// Produce TrackParCovFwds for MFT and FwdTracks, w/ or w/o cov, with z shift
7952
template <typename TFwdTrack, typename... TCovariance>
8053
o2::track::TrackParCovFwd getTrackParCovFwdShift(TFwdTrack const& track, float zshift, TCovariance const&... covOpt)
@@ -107,24 +80,55 @@ o2::track::TrackParCovFwd getTrackParCovFwdShift(TFwdTrack const& track, float z
10780
cov.cPhiPhi(), cov.cTglX(), cov.cTglY(), cov.cTglPhi(), cov.cTglTgl(),
10881
cov.c1PtX(), cov.c1PtY(), cov.c1PtPhi(), cov.c1PtTgl(), cov.c1Pt21Pt2()};
10982
tcovs = SMatrix55(v1.begin(), v1.end());
83+
v1.clear();
84+
v1.shrink_to_fit();
11085
} else {
11186
tcovs = SMatrix55{};
11287
}
11388

11489
return o2::track::TrackParCovFwd(track.z() + zshift, tpars, tcovs, chi2);
11590
}
11691

92+
template <typename TFwdTrack, typename TFwdTrackCov>
93+
o2::track::TrackParCovFwd getTrackParCovFwd(TFwdTrack const& track, TFwdTrackCov const& cov)
94+
{
95+
return getTrackParCovFwdShift(track, 0, cov);
96+
97+
// // This function works for (glMuon, glMuon), (saMuon, saMuon) and (MFTTrack, MFTTrackCov).
98+
99+
// double chi2 = track.chi2();
100+
// if constexpr (std::is_same_v<std::decay_t<TFwdTrackCov>, aod::MFTTracksCov::iterator>) {
101+
// chi2 = track.chi2();
102+
// } else {
103+
// if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
104+
// chi2 = track.chi2();
105+
// } else if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
106+
// chi2 = track.chi2() * (2.f * track.nClusters() - 5.f);
107+
// }
108+
// }
109+
110+
// SMatrix5 tpars(track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt());
111+
// std::vector<double> v1{cov.cXX(), cov.cXY(), cov.cYY(), cov.cPhiX(), cov.cPhiY(),
112+
// cov.cPhiPhi(), cov.cTglX(), cov.cTglY(), cov.cTglPhi(), cov.cTglTgl(),
113+
// cov.c1PtX(), cov.c1PtY(), cov.c1PtPhi(), cov.c1PtTgl(), cov.c1Pt21Pt2()};
114+
// SMatrix55 tcovs(v1.begin(), v1.end());
115+
// o2::track::TrackParCovFwd trackparCov{track.z(), tpars, tcovs, chi2}; // this is chi2! Not chi2/ndf.
116+
// v1.clear();
117+
// v1.shrink_to_fit();
118+
// return trackparCov;
119+
}
120+
117121
/// propagate fwdtrack to a certain point.
118122
template <typename TFwdTrack, typename TFwdTrackCov, typename TCollision>
119-
o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TFwdTrackCov const& cov, TCollision const& collision, const propagationPoint endPoint, const float matchingZ, const float bzkG)
123+
o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TFwdTrackCov const& cov, TCollision const& collision, const propagationPoint endPoint, const float matchingZ, const float bzkG, const float zshift = 0.f)
120124
{
121125
o2::track::TrackParCovFwd trackParCovFwd;
122126
if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
123-
trackParCovFwd = getTrackParCovFwd(muon, cov);
127+
trackParCovFwd = getTrackParCovFwdShift(muon, zshift, cov);
124128
} else if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
125-
trackParCovFwd = getTrackParCovFwd(muon, muon);
129+
trackParCovFwd = getTrackParCovFwdShift(muon, zshift, muon);
126130
} else {
127-
trackParCovFwd = getTrackParCovFwd(muon, muon);
131+
trackParCovFwd = getTrackParCovFwdShift(muon, zshift, muon);
128132
}
129133

130134
o2::dataformats::GlobalFwdTrack propmuon = propagateTrackParCovFwd(trackParCovFwd, muon.trackType(), collision, endPoint, matchingZ, bzkG);

PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ struct skimmerPrimaryMuon {
7171
Configurable<std::string> grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"};
7272
Configurable<std::string> geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"};
7373
Configurable<bool> fillQAHistograms{"fillQAHistograms", false, "flag to fill QA histograms"};
74-
Configurable<float> minPt{"minPt", 0.1, "min pt for muon"};
74+
Configurable<float> minPt{"minPt", 0.01, "min pt for muon"};
7575
Configurable<float> maxPt{"maxPt", 1e+10, "max pt for muon"};
7676
Configurable<float> minEtaSA{"minEtaSA", -4.0, "min. eta acceptance for MCH-MID"};
7777
Configurable<float> maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"};
7878
Configurable<float> minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"};
7979
Configurable<float> maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"};
80-
Configurable<float> minRabsGL{"minRabsGL", 27.6, "min. R at absorber end for global muon (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505.
80+
Configurable<float> minRabsGL{"minRabsGL", 17.6, "min. R at absorber end for global muon (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505.
8181
Configurable<float> minRabs{"minRabs", 17.6, "min. R at absorber end"};
8282
Configurable<float> midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"};
8383
Configurable<float> maxRabs{"maxRabs", 89.5, "max. R at absorber end"};
@@ -93,10 +93,16 @@ struct skimmerPrimaryMuon {
9393
Configurable<float> maxDEta{"maxDEta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"};
9494
Configurable<float> maxDPhi{"maxDPhi", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"};
9595

96+
// for z shift for propagation
97+
Configurable<bool> cfgApplyZShiftFromCCDB{"cfgApplyZShiftFromCCDB", false, "flag to apply z shift"};
98+
Configurable<std::string> cfgZShiftPath{"cfgZShiftPath", "Users/m/mcoquet/ZShift", "CCDB path for z shift to apply to forward tracks"};
99+
Configurable<float> cfgManualZShift{"cfgManualZShift", 0, "manual z-shift for propagation of global muon to PV"};
100+
96101
o2::ccdb::CcdbApi ccdbApi;
97102
Service<o2::ccdb::BasicCCDBManager> ccdb;
98103
int mRunNumber = 0;
99104
float mBz = 0;
105+
float mZShift = 0;
100106

101107
HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false};
102108
static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"};
@@ -114,6 +120,7 @@ struct skimmerPrimaryMuon {
114120
}
115121
mRunNumber = 0;
116122
mBz = 0;
123+
mZShift = 0;
117124
}
118125

119126
void initCCDB(aod::BCsWithTimestamps::iterator const& bc)
@@ -136,6 +143,20 @@ struct skimmerPrimaryMuon {
136143
o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
137144
mBz = field->getBz(centerMFT); // Get field at centre of MFT
138145
LOGF(info, "Bz at center of MFT = %f kZG", mBz);
146+
147+
if (cfgApplyZShiftFromCCDB) {
148+
auto* zShift = ccdb->getForTimeStamp<std::vector<float>>(cfgZShiftPath, bc.timestamp());
149+
if (zShift != nullptr && !zShift->empty()) {
150+
LOGF(info, "reading z shift %f from %s", (*zShift)[0], cfgZShiftPath.value);
151+
mZShift = (*zShift)[0];
152+
} else {
153+
LOGF(info, "z shift is not found in ccdb path %s. set to 0 cm", cfgZShiftPath.value);
154+
mZShift = 0;
155+
}
156+
} else {
157+
LOGF(info, "z shift is manually set to %f cm", cfgManualZShift.value);
158+
mZShift = cfgManualZShift;
159+
}
139160
}
140161

141162
void addHistograms()
@@ -238,7 +259,7 @@ struct skimmerPrimaryMuon {
238259
return false;
239260
}
240261

241-
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, matchingZ, mBz);
262+
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
242263
float pt = propmuonAtPV.getPt();
243264
float eta = propmuonAtPV.getEta();
244265
float phi = propmuonAtPV.getPhi();
@@ -314,31 +335,31 @@ struct skimmerPrimaryMuon {
314335
return false;
315336
}
316337

317-
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, matchingZ, mBz);
338+
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
318339
ptMatchedMCHMID = propmuonAtPV_Matched.getPt();
319340
etaMatchedMCHMID = propmuonAtPV_Matched.getEta();
320341
phiMatchedMCHMID = propmuonAtPV_Matched.getPhi();
321342
o2::math_utils::bringTo02Pi(phiMatchedMCHMID);
322343

323-
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, matchingZ, mBz);
344+
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, matchingZ, mBz, mZShift);
324345
float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX();
325346
float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY();
326347
float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
327348
pDCA = mchtrack.p() * dcaXY_Matched;
328349

329350
if constexpr (withMFTCov) {
330351
auto mfttrackcov = mftCovs.rawIteratorAt(map_mfttrackcovs[mfttrack.globalIndex()]);
331-
auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, matchingZ, mBz); // propagated to matching plane
332-
o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwd(mfttrack, mfttrackcov); // values at innermost update
333-
mftsaAtMP.propagateToZhelix(matchingZ, mBz); // propagated to matching plane
352+
auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, matchingZ, mBz, mZShift); // propagated to matching plane
353+
o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update
354+
mftsaAtMP.propagateToZhelix(matchingZ, mBz); // propagated to matching plane
334355
etaMatchedMFTatMP = mftsaAtMP.getEta();
335356
phiMatchedMFTatMP = mftsaAtMP.getPhi();
336357
etaMatchedMCHMIDatMP = muonAtMP.getEta();
337358
phiMatchedMCHMIDatMP = muonAtMP.getPhi();
338359
o2::math_utils::bringTo02Pi(phiMatchedMCHMIDatMP);
339360
o2::math_utils::bringTo02Pi(phiMatchedMFTatMP);
340361

341-
o2::track::TrackParCovFwd mftsa = getTrackParCovFwd(mfttrack, mfttrackcov); // values at innermost update
362+
o2::track::TrackParCovFwd mftsa = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update
342363
o2::dataformats::GlobalFwdTrack globalMuonRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuonAtPV_Matched, mftsa); // this is track at IU.
343364
auto globalMuon = o2::aod::fwdtrackutils::propagateTrackParCovFwd(globalMuonRefit, fwdtrack.trackType(), collision, propagationPoint::kToVertex, matchingZ, mBz);
344365
pt = globalMuon.getPt();
@@ -367,12 +388,12 @@ struct skimmerPrimaryMuon {
367388
pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta)));
368389
}
369390
} else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
370-
o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToRabs, matchingZ, mBz); // this is necessary only for MuonStandaloneTrack
391+
o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToRabs, matchingZ, mBz, mZShift); // this is necessary only for MuonStandaloneTrack
371392
float xAbs = propmuonAtRabs.getX();
372393
float yAbs = propmuonAtRabs.getY();
373394
rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction
374395

375-
o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToDCA, matchingZ, mBz);
396+
o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToDCA, matchingZ, mBz, mZShift);
376397
cXX = propmuonAtDCA.getSigma2X();
377398
cYY = propmuonAtDCA.getSigma2Y();
378399
cXY = propmuonAtDCA.getSigmaXY();

PWGEM/Dilepton/Tasks/matchingMFT.cxx

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ struct matchingMFT {
8282
Configurable<int> minNclustersMFT{"minNclustersMFT", 5, "min nclusters MFT"};
8383
Configurable<bool> refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"};
8484

85+
// for z shift for propagation
86+
Configurable<bool> cfgApplyZShiftFromCCDB{"cfgApplyZShiftFromCCDB", false, "flag to apply z shift from CCDB"};
87+
Configurable<std::string> cfgZShiftPath{"cfgZShiftPath", "Users/m/mcoquet/ZShift", "CCDB path for z shift to apply to forward tracks"};
88+
Configurable<float> cfgManualZShift{"cfgManualZShift", 0, "manual z-shift for propagation of global muon to PV"};
89+
8590
Configurable<bool> requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"};
8691
Configurable<float> maxRelDPt{"maxRelDPt", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"};
8792
Configurable<float> maxDEta{"maxDEta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"};
@@ -130,6 +135,7 @@ struct matchingMFT {
130135
Service<o2::ccdb::BasicCCDBManager> ccdb;
131136
int mRunNumber = -1;
132137
float mBz = 0;
138+
float mZShift = 0;
133139

134140
template <typename TBC>
135141
void initCCDB(TBC const& bc)
@@ -152,6 +158,20 @@ struct matchingMFT {
152158
o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
153159
mBz = field->getBz(centerMFT); // Get field at centre of MFT
154160
LOGF(info, "Bz at center of MFT = %f kZG", mBz);
161+
162+
if (cfgApplyZShiftFromCCDB) {
163+
auto* zShift = ccdb->getForTimeStamp<std::vector<float>>(cfgZShiftPath, bc.timestamp());
164+
if (zShift != nullptr && !zShift->empty()) {
165+
LOGF(info, "reading z shift %f from %s", (*zShift)[0], cfgZShiftPath.value);
166+
mZShift = (*zShift)[0];
167+
} else {
168+
LOGF(info, "z shift is not found in ccdb path %s. set to 0 cm", cfgZShiftPath.value);
169+
mZShift = 0;
170+
}
171+
} else {
172+
LOGF(info, "z shift is manually set to %f cm", cfgManualZShift.value);
173+
mZShift = cfgManualZShift;
174+
}
155175
}
156176

157177
void addHistograms()
@@ -358,11 +378,11 @@ struct matchingMFT {
358378
return; // do nothing
359379
}
360380

361-
auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, matchingZ, mBz); // propagated to matching plane
381+
auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, matchingZ, mBz, mZShift); // propagated to matching plane
362382

363383
auto mfttrackcov = mftCovs.rawIteratorAt(map_mfttrackcovs[mfttrack.globalIndex()]);
364-
o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwd(mfttrack, mfttrackcov); // values at innermost update
365-
mftsaAtMP.propagateToZhelix(matchingZ, mBz); // propagated to matching plane
384+
o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update
385+
mftsaAtMP.propagateToZhelix(matchingZ, mBz); // propagated to matching plane
366386
dx = muonAtMP.getX() - mftsaAtMP.getX();
367387
dy = muonAtMP.getY() - mftsaAtMP.getY();
368388
// o2::math_utils::bringToPMPi(dphi);
@@ -430,9 +450,9 @@ struct matchingMFT {
430450
bool isPrimary = mcParticle_MCHMID.isPhysicalPrimary() || mcParticle_MCHMID.producedByGenerator();
431451
bool isMatched = (mcParticle_MFT.globalIndex() == mcParticle_MCHMID.globalIndex()) && (mcParticle_MFT.mcCollisionId() == mcParticle_MCHMID.mcCollisionId());
432452

433-
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, matchingZ, mBz);
434-
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, matchingZ, mBz);
435-
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, matchingZ, mBz);
453+
o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
454+
o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
455+
o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, matchingZ, mBz, mZShift);
436456

437457
float pt = propmuonAtPV.getPt();
438458
float eta = propmuonAtPV.getEta();
@@ -472,7 +492,7 @@ struct matchingMFT {
472492

473493
if constexpr (withMFTCov) {
474494
auto mfttrackcov = mftCovs.rawIteratorAt(map_mfttrackcovs[mfttrack.globalIndex()]);
475-
o2::track::TrackParCovFwd mftsa = getTrackParCovFwd(mfttrack, mfttrackcov); // values at innermost update
495+
o2::track::TrackParCovFwd mftsa = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update
476496
o2::dataformats::GlobalFwdTrack globalMuonRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuonAtPV_Matched, mftsa); // this is track at IU.
477497
auto globalMuonAtPV = o2::aod::fwdtrackutils::propagateTrackParCovFwd(globalMuonRefit, fwdtrack.trackType(), collision, propagationPoint::kToVertex, matchingZ, mBz);
478498

0 commit comments

Comments
 (0)