Skip to content

Commit 894c2fb

Browse files
committed
Merge remote-tracking branch 'upstream/master' into newspincorr777
2 parents 7b1f622 + 894709e commit 894c2fb

27 files changed

+2188
-917
lines changed

Common/Core/fwdtrackUtilities.h

Lines changed: 71 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#ifndef COMMON_CORE_FWDTRACKUTILITIES_H_
1919
#define COMMON_CORE_FWDTRACKUTILITIES_H_
2020

21+
#include "Framework/AnalysisDataModel.h"
2122
#include <DetectorsBase/GeometryManager.h>
2223
#include <Field/MagneticField.h>
2324
#include <GlobalTracking/MatchGlobalFwd.h>
@@ -29,6 +30,7 @@
2930
#include <Math/SMatrix.h>
3031
#include <TGeoGlobalMagField.h>
3132

33+
#include <type_traits>
3234
#include <vector>
3335

3436
namespace o2::aod
@@ -40,30 +42,71 @@ enum class propagationPoint : int {
4042
kToVertex = 0,
4143
kToDCA = 1,
4244
kToRabs = 2,
45+
kToMatchingPlane = 3,
4346
};
4447
using SMatrix55 = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>>;
4548
using SMatrix55Std = ROOT::Math::SMatrix<double, 5>;
4649
using SMatrix5 = ROOT::Math::SVector<double, 5>;
4750

48-
/// propagate fwdtrack to a certain point.
49-
template <typename TFwdTrack, typename TCollision>
50-
o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision const& collision, const propagationPoint endPoint)
51+
template <typename TFwdTrack, typename TFwdTrackCov>
52+
o2::track::TrackParCovFwd getTrackParCovFwd(TFwdTrack const& track, TFwdTrackCov const& cov)
5153
{
52-
double chi2 = muon.chi2();
53-
SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt());
54-
std::vector<double> v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(),
55-
muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(),
56-
muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()};
54+
// This function works for both (saMuon, saMuon) and (MFTTrack, MFTTrackCov).
55+
// Don't use covariant matrix of global muons stored in AO2D.root.
56+
57+
double chi2 = track.chi2();
58+
if constexpr (std::is_same_v<std::decay_t<TFwdTrackCov>, aod::MFTTracksCov::iterator>) {
59+
chi2 = track.chi2();
60+
} else {
61+
if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
62+
chi2 = track.chi2();
63+
} else if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
64+
chi2 = track.chi2() * (2.f * track.nClusters() - 5.f);
65+
}
66+
}
67+
68+
SMatrix5 tpars(track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt());
69+
std::vector<double> v1{cov.cXX(), cov.cXY(), cov.cYY(), cov.cPhiX(), cov.cPhiY(),
70+
cov.cPhiPhi(), cov.cTglX(), cov.cTglY(), cov.cTglPhi(), cov.cTglTgl(),
71+
cov.c1PtX(), cov.c1PtY(), cov.c1PtPhi(), cov.c1PtTgl(), cov.c1Pt21Pt2()};
5772
SMatrix55 tcovs(v1.begin(), v1.end());
58-
o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2};
73+
o2::track::TrackParCovFwd trackparCov{track.z(), tpars, tcovs, chi2}; // this is chi2! Not chi2/ndf.
74+
v1.clear();
75+
v1.shrink_to_fit();
76+
return trackparCov;
77+
}
78+
79+
/// propagate fwdtrack to a certain point.
80+
template <typename TFwdTrack, typename TFwdTrackCov, typename TCollision>
81+
o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TFwdTrackCov const& cov, TCollision const& collision, const propagationPoint endPoint, const float matchingZ, const float bzkG)
82+
{
83+
o2::track::TrackParCovFwd trackParCovFwd;
84+
if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
85+
trackParCovFwd = getTrackParCovFwd(muon, cov);
86+
} else if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
87+
trackParCovFwd = getTrackParCovFwd(muon, muon);
88+
} else {
89+
trackParCovFwd = getTrackParCovFwd(muon, muon);
90+
}
91+
92+
o2::dataformats::GlobalFwdTrack propmuon = propagateTrackParCovFwd(trackParCovFwd, muon.trackType(), collision, endPoint, matchingZ, bzkG);
93+
return propmuon;
94+
}
95+
96+
template <typename TFwdTrackParCov, typename TCollision>
97+
o2::dataformats::GlobalFwdTrack propagateTrackParCovFwd(TFwdTrackParCov const& fwdtrackORG, uint8_t trackType, TCollision const& collision, const propagationPoint endPoint, const float matchingZ, const float bzkG)
98+
{
99+
// TFwdTrackParCov is o2::track::TrackParCovFwd
100+
101+
o2::track::TrackParCovFwd fwdtrack(fwdtrackORG);
59102
o2::dataformats::GlobalFwdTrack propmuon;
60103
o2::globaltracking::MatchGlobalFwd mMatching;
61104

62-
if (static_cast<int>(muon.trackType()) > 2) { // MCH-MID or MCH standalone
105+
if (trackType > 2) { // MCH-MID or MCH standalone
63106
o2::dataformats::GlobalFwdTrack track;
64-
track.setParameters(tpars);
107+
track.setParameters(fwdtrack.getParameters());
65108
track.setZ(fwdtrack.getZ());
66-
track.setCovariances(tcovs);
109+
track.setCovariances(fwdtrack.getCovariances());
67110
auto mchTrack = mMatching.FwdtoMCH(track);
68111

69112
if (endPoint == propagationPoint::kToVertex) {
@@ -72,37 +115,42 @@ o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision
72115
o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ());
73116
} else if (endPoint == propagationPoint::kToRabs) {
74117
o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.);
118+
} else if (endPoint == propagationPoint::kToMatchingPlane) {
119+
o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, matchingZ);
75120
}
76121

77122
auto proptrack = mMatching.MCHtoFwd(mchTrack);
78123
propmuon.setParameters(proptrack.getParameters());
79124
propmuon.setZ(proptrack.getZ());
80125
propmuon.setCovariances(proptrack.getCovariances());
81-
} else if (static_cast<int>(muon.trackType()) < 2) { // MFT-MCH-MID
82-
const double centerMFT[3] = {0, 0, -61.4};
83-
o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
84-
auto Bz = field->getBz(centerMFT); // Get field at centre of MFT
85-
auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ());
126+
} else if (trackType < 2) { // MFT-MCH-MID
127+
// const double centerMFT[3] = {0, 0, -61.4};
128+
// o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
129+
// auto Bz = field->getBz(centerMFT); // Get field at centre of MFT in kG.
130+
131+
auto geoMan = o2::base::GeometryManager::meanMaterialBudget(fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), collision.posX(), collision.posY(), collision.posZ());
86132
auto x2x0 = static_cast<float>(geoMan.meanX2X0);
133+
87134
if (endPoint == propagationPoint::kToVertex) {
88-
fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0);
135+
fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, bzkG, x2x0);
89136
} else if (endPoint == propagationPoint::kToDCA) {
90-
fwdtrack.propagateToZhelix(collision.posZ(), Bz);
137+
fwdtrack.propagateToZhelix(collision.posZ(), bzkG);
138+
} else if (endPoint == propagationPoint::kToMatchingPlane) {
139+
fwdtrack.propagateToZhelix(matchingZ, bzkG);
91140
}
92141
propmuon.setParameters(fwdtrack.getParameters());
93142
propmuon.setZ(fwdtrack.getZ());
94143
propmuon.setCovariances(fwdtrack.getCovariances());
95144
}
96145

97-
v1.clear();
98-
v1.shrink_to_fit();
99-
100146
return propmuon;
101147
}
102148

103149
template <typename TFwdTrack, typename TMFTTrack>
104150
o2::dataformats::GlobalFwdTrack refitGlobalMuonCov(TFwdTrack const& muon, TMFTTrack const& mft)
105151
{
152+
// TFwdTrack and TMFTTrack are o2::track::TrackParCovFwd.
153+
106154
auto muonCov = muon.getCovariances();
107155
auto mftCov = mft.getCovariances();
108156

@@ -135,6 +183,7 @@ o2::dataformats::GlobalFwdTrack refitGlobalMuonCov(TFwdTrack const& muon, TMFTTr
135183

136184
o2::dataformats::GlobalFwdTrack globalTrack;
137185
globalTrack.setParameters(mft.getParameters());
186+
globalTrack.setZ(mft.getZ());
138187
globalTrack.setInvQPt(invQPtGlob);
139188
globalTrack.setCovariances(globalCov);
140189

PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ struct FemtoUniverseProducerTask {
188188
Configurable<std::vector<float>> confTrkDCAzMax{FemtoUniverseTrackSelection::getSelectionName(femto_universe_track_selection::kDCAzMax, "ConfTrk"), std::vector<float>{0.2f}, FemtoUniverseTrackSelection::getSelectionHelper(femto_universe_track_selection::kDCAzMax, "Track selection: ")}; /// \todo Reintegrate PID to the general selection container
189189
Configurable<std::vector<float>> confTrkPIDnSigmaMax{FemtoUniverseTrackSelection::getSelectionName(femto_universe_track_selection::kPIDnSigmaMax, "ConfTrk"), std::vector<float>{3.5f, 3.f, 2.5f}, FemtoUniverseTrackSelection::getSelectionHelper(femto_universe_track_selection::kPIDnSigmaMax, "Track selection: ")};
190190
Configurable<std::vector<int>> confTrkPIDspecies{"confTrkPIDspecies", std::vector<int>{o2::track::PID::Pion, o2::track::PID::Kaon, o2::track::PID::Proton, o2::track::PID::Deuteron}, "Trk sel: Particles species for PID (Pion=2, Kaon=3, Proton=4, Deuteron=5)"};
191+
Configurable<bool> confIsOnlyMCTrack{"confIsOnlyMCTrack", false, "Enable filling of only MC Tracks"};
191192
// Numbers from ~/alice/O2/DataFormats/Reconstruction/include/ReconstructionDataFormats/PID.h //static constexpr ID Pion = 2; static constexpr ID Kaon = 3; static constexpr ID Proton = 4; static constexpr ID Deuteron = 5;
192193
} ConfTrkSelection;
193194

@@ -737,6 +738,12 @@ struct FemtoUniverseProducerTask {
737738
particle.tofNSigmaOmLaPr(), particle.tofNSigmaOmKa(),
738739
particle.dcacascdaughters(), particle.cascradius(),
739740
particle.x(), particle.y(), particle.z(), -999.);
741+
} else {
742+
outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., -999.,
743+
-999., -999., -999., -999., -999., -999., -999., -999.,
744+
-999., -999., -999., -999., -999.,
745+
particle.dcacascdaughters(), particle.cascradius(),
746+
particle.x(), particle.y(), particle.z(), -999.);
740747
}
741748
} else {
742749
// LOGF(info, "isTrack0orV0: %d, isPhi: %d", isTrackOrV0, isPhiOrD0);
@@ -1349,6 +1356,27 @@ struct FemtoUniverseProducerTask {
13491356
}
13501357
}
13511358

1359+
template <typename MCParticlesType>
1360+
void fillTracksMCTruth(MCParticlesType const& mcParticles)
1361+
{
1362+
for (const auto& mc : mcParticles) { // Loop over all MC Truth particles
1363+
1364+
std::vector<int> childIDs = {0, 0};
1365+
outputParts(outputCollision.lastIndex(),
1366+
mc.pt(),
1367+
mc.eta(),
1368+
mc.phi(),
1369+
aod::femtouniverseparticle::ParticleType::kMCTruthTrack,
1370+
0,
1371+
0,
1372+
mc.pdgCode(),
1373+
childIDs,
1374+
0,
1375+
0);
1376+
fillMCTruthParticle(mc, aod::femtouniverseparticle::ParticleType::kMCTruthTrack);
1377+
}
1378+
}
1379+
13521380
template <bool isMC, typename CollisionType, typename CascadeType, typename TrackType>
13531381
void fillCascade(CollisionType const& col, CascadeType const& fullCascades, TrackType const&)
13541382
{
@@ -2534,7 +2562,11 @@ struct FemtoUniverseProducerTask {
25342562
if (colcheck) {
25352563
auto groupedMCParticles = mcParticles.sliceBy(perMCCollision, mccol.globalIndex());
25362564
outputCollExtra(1.0, 1.0);
2537-
fillParticles<decltype(groupedMCParticles), true, true>(groupedMCParticles, recoMcIds); // fills mc particles
2565+
if (!ConfTrkSelection.confIsOnlyMCTrack) {
2566+
fillParticles<decltype(groupedMCParticles), true, true>(groupedMCParticles, recoMcIds); // fills mc particles
2567+
} else {
2568+
fillTracksMCTruth(groupedMCParticles);
2569+
}
25382570
}
25392571
}
25402572
}

0 commit comments

Comments
 (0)