88// In applying this license CERN does not waive the privileges and immunities
99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
11+
12+ // / \file fwdTrackPropagation.cxx
13+ // / \brief Forward track propagation task for UD tasks
1114// / \author Nazar Burmasov, nazar.burmasov@cern.ch
1215// / \author Diana Krupova, diana.krupova@cern.ch
1316// / \since 04.06.2024
1417
15- #include " Framework/AnalysisDataModel.h"
16- #include " Framework/AnalysisTask.h"
17- #include " Framework/runDataProcessing.h"
18+ #include " PWGUD/DataModel/UDTables.h"
1819
1920#include " CCDB/BasicCCDBManager.h"
2021#include " DataFormatsParameters/GRPMagField.h"
21- #include " TGeoGlobalMagField.h"
22- #include " Field/MagneticField.h"
2322#include " DetectorsBase/Propagator.h"
23+ #include " Field/MagneticField.h"
24+ #include " Framework/AnalysisDataModel.h"
25+ #include " Framework/AnalysisTask.h"
26+ #include " Framework/DataTypes.h"
27+ #include " Framework/runDataProcessing.h"
2428#include " GlobalTracking/MatchGlobalFwd.h"
2529#include " MCHTracking/TrackExtrap.h"
26- #include " MCHTracking/TrackParam.h"
27- #include " Math/SMatrix.h"
2830#include " ReconstructionDataFormats/TrackFwd.h"
2931
30- #include " PWGUD/DataModel/UDTables.h"
32+ #include " Math/SMatrix.h"
33+ #include " TGeoGlobalMagField.h"
34+
35+ #include < map>
36+ #include < string>
37+ #include < vector>
3138
3239using namespace o2 ::framework;
3340using namespace o2 ::framework::expressions;
41+ using o2::aod::fwdtrack::ForwardTrackTypeEnum;
3442
3543struct FwdTrackPropagation {
3644 using ForwardTracks = o2::soa::Join<o2::aod::FwdTracks, o2::aod::FwdTracksCov>;
@@ -65,27 +73,27 @@ struct FwdTrackPropagation {
6573 muon.cPhiPhi (), muon.cTglX (), muon.cTglY (), muon.cTglPhi (), muon.cTglTgl (),
6674 muon.c1PtX (), muon.c1PtY (), muon.c1PtPhi (), muon.c1PtTgl (), muon.c1Pt21Pt2 ()};
6775 SMatrix55 tcovs (v1.begin (), v1.end ());
68- o2::track::TrackParCovFwd fwdtrack{muon.z (), tpars, tcovs, chi2};
6976 o2::dataformats::GlobalFwdTrack propmuon;
7077
71- if (static_cast < int >( muon.trackType ()) > 2 ) {
78+ if (muon.trackType () > ForwardTrackTypeEnum::GlobalForwardTrack ) { // tracks without MFT
7279 o2::dataformats::GlobalFwdTrack track;
7380 track.setParameters (tpars);
74- track.setZ (fwdtrack. getZ ());
81+ track.setZ (muon. z ());
7582 track.setCovariances (tcovs);
7683 auto mchTrack = fMatching .FwdtoMCH (track);
7784 o2::mch::TrackExtrap::extrapToVertex (mchTrack, vtx[0 ], vtx[1 ], vtx[2 ], vtxCov[0 ], vtxCov[1 ]);
7885 auto proptrack = fMatching .MCHtoFwd (mchTrack);
7986 propmuon.setParameters (proptrack.getParameters ());
8087 propmuon.setZ (proptrack.getZ ());
8188 propmuon.setCovariances (proptrack.getCovariances ());
82- } else if (static_cast < int >( muon.trackType ()) < 2 ) {
89+ } else if (muon.trackType () <= ForwardTrackTypeEnum::GlobalForwardTrack ) { // tracks with MFT
8390 double centerMFT[3 ] = {0 , 0 , -61.4 };
84- o2::field::MagneticField* field = static_cast <o2::field::MagneticField*>(TGeoGlobalMagField::Instance ()->GetField ());
85- auto Bz = field->getBz (centerMFT); // Get field at centre of MFT
91+ o2::track::TrackParCovFwd fwdtrack{muon.z (), tpars, tcovs, chi2};
92+ auto * field = dynamic_cast <o2::field::MagneticField*>(TGeoGlobalMagField::Instance ()->GetField ());
93+ auto bz = field->getBz (centerMFT); // Get field at centre of MFT
8694 auto geoMan = o2::base::GeometryManager::meanMaterialBudget (muon.x (), muon.y (), muon.z (), vtx[0 ], vtx[1 ], vtx[2 ]);
8795 auto x2x0 = static_cast <float >(geoMan.meanX2X0 );
88- fwdtrack.propagateToVtxhelixWithMCS (vtx[2 ], {vtx[0 ], vtx[1 ]}, {vtxCov[0 ], vtxCov[1 ]}, Bz , x2x0);
96+ fwdtrack.propagateToVtxhelixWithMCS (vtx[2 ], {vtx[0 ], vtx[1 ]}, {vtxCov[0 ], vtxCov[1 ]}, bz , x2x0);
8997 propmuon.setParameters (fwdtrack.getParameters ());
9098 propmuon.setZ (fwdtrack.getZ ());
9199 propmuon.setCovariances (fwdtrack.getCovariances ());
@@ -112,11 +120,12 @@ struct FwdTrackPropagation {
112120 propFwdTracks.reserve (fwdTracks.size ());
113121 propFwdTracksCov.reserve (fwdTracks.size ());
114122
123+ constexpr float ZAbsorberFront = -90 .f ;
115124 for (const auto & t : fwdTracks) {
116- if (t.z () < - 90 . f ) {
125+ if (t.z () < ZAbsorberFront ) {
117126 std::array<float , 3 > vtx = {0 .f , 0 .f , 0 .f };
118127 std::array<float , 2 > vtxCov = {0 .f , 0 .f };
119- if (t.has_collision ()) {
128+ if (t.has_collision () && t. trackType () <= ForwardTrackTypeEnum::GlobalForwardTrack) { // propagate only global muon tracks to collision vtx
120129 auto col = cols.iteratorAt (t.collisionId ());
121130 vtx[0 ] = col.posX ();
122131 vtx[1 ] = col.posY ();
@@ -129,19 +138,19 @@ struct FwdTrackPropagation {
129138 pft.getX (), pft.getY (), pft.getZ (), pft.getPhi (), pft.getTgl (), pft.getInvQPt (),
130139 pft.getEta (), pft.getPt (), pft.getP (),
131140 t.nClusters (), t.pDca (), t.rAtAbsorberEnd (),
132- pft. getTrackChi2 (), t.chi2MatchMCHMID (), t.chi2MatchMCHMFT (),
141+ t. chi2 (), t.chi2MatchMCHMID (), t.chi2MatchMCHMFT (),
133142 t.matchScoreMCHMFT (), t.matchMFTTrackId (), t.matchMCHTrackId (),
134143 t.mchBitMap (), t.midBoards (), t.midBitMap (),
135144 t.trackTime (), t.trackTimeRes ());
136145 // debug
137146 // LOGP(info, "track {}, before: {} {} {} {} {} {}", t.globalIndex(), t.x(), t.y(), t.z(), t.phi(), t.tgl(), t.signed1Pt());
138147 // LOGP(info, "track {}, after: {} {} {} {} {} {}", t.globalIndex(), pft.getX(), pft.getY(), pft.getZ(), pft.getPhi(), pft.getTgl(), pft.getInvQPt());
139148 SMatrix55 cov = pft.getCovariances ();
140- float sigX = TMath::Sqrt (cov (0 , 0 ));
141- float sigY = TMath::Sqrt (cov (1 , 1 ));
142- float sigPhi = TMath::Sqrt (cov (2 , 2 ));
143- float sigTgl = TMath::Sqrt (cov (3 , 3 ));
144- float sig1Pt = TMath::Sqrt (cov (4 , 4 ));
149+ float sigX = std::sqrt (cov (0 , 0 ));
150+ float sigY = std::sqrt (cov (1 , 1 ));
151+ float sigPhi = std::sqrt (cov (2 , 2 ));
152+ float sigTgl = std::sqrt (cov (3 , 3 ));
153+ float sig1Pt = std::sqrt (cov (4 , 4 ));
145154 auto rhoXY = static_cast <int8_t >(128 . * cov (0 , 1 ) / (sigX * sigY));
146155 auto rhoPhiX = static_cast <int8_t >(128 . * cov (0 , 2 ) / (sigPhi * sigX));
147156 auto rhoPhiY = static_cast <int8_t >(128 . * cov (1 , 2 ) / (sigPhi * sigY));
0 commit comments