Skip to content

Commit 897adef

Browse files
authored
[Common] implement common muon-propagation task (AliceO2Group#10618)
1 parent ff1ddfe commit 897adef

File tree

5 files changed

+612
-2
lines changed

5 files changed

+612
-2
lines changed

Common/Core/fwdtrackUtilities.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file fwdtrackUtilities.h
13+
/// \brief Utilities for manipulating parameters of fwdtracks
14+
/// \author Maurice Coquet <[email protected]>
15+
/// \author Luca Micheletti <[email protected]>
16+
/// \author Daiki Sekihata <[email protected]>
17+
18+
#ifndef COMMON_CORE_FWDTRACKUTILITIES_H_
19+
#define COMMON_CORE_FWDTRACKUTILITIES_H_
20+
21+
#include <vector>
22+
#include <utility>
23+
#include "Math/SMatrix.h"
24+
#include "TGeoGlobalMagField.h"
25+
26+
namespace o2::aod
27+
{
28+
namespace fwdtrackutils
29+
{
30+
// Index used to set different options for muon propagation
31+
enum class propagationPoint : int {
32+
kToVertex = 0,
33+
kToDCA = 1,
34+
kToRabs = 2,
35+
};
36+
using SMatrix55 = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>>;
37+
using SMatrix5 = ROOT::Math::SVector<double, 5>;
38+
39+
/// propagate fwdtrack to a certain point.
40+
template <typename TFwdTrack, typename TCollision>
41+
o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision const& collision, const propagationPoint endPoint)
42+
{
43+
double chi2 = muon.chi2();
44+
SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt());
45+
std::vector<double> v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(),
46+
muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(),
47+
muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()};
48+
SMatrix55 tcovs(v1.begin(), v1.end());
49+
o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2};
50+
o2::dataformats::GlobalFwdTrack propmuon;
51+
o2::globaltracking::MatchGlobalFwd mMatching;
52+
53+
if (static_cast<int>(muon.trackType()) > 2) { // MCH-MID or MCH standalone
54+
o2::dataformats::GlobalFwdTrack track;
55+
track.setParameters(tpars);
56+
track.setZ(fwdtrack.getZ());
57+
track.setCovariances(tcovs);
58+
auto mchTrack = mMatching.FwdtoMCH(track);
59+
60+
if (endPoint == propagationPoint::kToVertex) {
61+
o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY());
62+
}
63+
if (endPoint == propagationPoint::kToDCA) {
64+
o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ());
65+
}
66+
if (endPoint == propagationPoint::kToRabs) {
67+
o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.);
68+
}
69+
70+
auto proptrack = mMatching.MCHtoFwd(mchTrack);
71+
propmuon.setParameters(proptrack.getParameters());
72+
propmuon.setZ(proptrack.getZ());
73+
propmuon.setCovariances(proptrack.getCovariances());
74+
} else if (static_cast<int>(muon.trackType()) < 2) { // MFT-MCH-MID
75+
const double centerMFT[3] = {0, 0, -61.4};
76+
o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
77+
auto Bz = field->getBz(centerMFT); // Get field at centre of MFT
78+
auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ());
79+
auto x2x0 = static_cast<float>(geoMan.meanX2X0);
80+
fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0);
81+
propmuon.setParameters(fwdtrack.getParameters());
82+
propmuon.setZ(fwdtrack.getZ());
83+
propmuon.setCovariances(fwdtrack.getCovariances());
84+
}
85+
86+
v1.clear();
87+
v1.shrink_to_fit();
88+
89+
return propmuon;
90+
}
91+
} // namespace fwdtrackutils
92+
} // namespace o2::aod
93+
94+
#endif // COMMON_CORE_FWDTRACKUTILITIES_H_

Common/DataModel/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ o2physics_add_header_only_library(DataModel
2424
MftmchMatchingML.h
2525
ZDCInterCalib.h
2626
EseTable.h
27-
FwdTrackReAlignTables.h)
27+
FwdTrackReAlignTables.h
28+
PropagatedFwdTrackTables.h)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file PropagatedFwdTrackTables.h
13+
/// \brief Table definitions for propagated forward tracks
14+
/// \author Maurice Coquet <[email protected]>
15+
/// \author Luca Micheletti <[email protected]>
16+
/// \author Daiki Sekihata <[email protected]>
17+
18+
#ifndef COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_
19+
#define COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_
20+
21+
#include "Framework/AnalysisDataModel.h"
22+
23+
namespace o2::aod
24+
{
25+
namespace propfwdtrack
26+
{
27+
DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index
28+
DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA
29+
DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA
30+
DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA
31+
DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV
32+
DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV
33+
DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is assigned to the most probable collision (relevant to TTCA)
34+
DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous (relevant to TTCA)
35+
} // namespace propfwdtrack
36+
37+
DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracks, "PropagatedFwdTracks", "AOD", "PROPFWDTRACK",
38+
o2::soa::Index<>, fwdtrack::CollisionId, fwdtrack::TrackType,
39+
fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl,
40+
fwdtrack::Signed1Pt, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd,
41+
fwdtrack::Px<fwdtrack::Pt, fwdtrack::Phi>,
42+
fwdtrack::Py<fwdtrack::Pt, fwdtrack::Phi>,
43+
fwdtrack::Pz<fwdtrack::Pt, fwdtrack::Tgl>,
44+
fwdtrack::Sign<fwdtrack::Signed1Pt>,
45+
fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT,
46+
fwdtrack::MatchScoreMCHMFT, propfwdtrack::FwdTrackId, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId,
47+
fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards,
48+
fwdtrack::TrackTime, fwdtrack::TrackTimeRes,
49+
propfwdtrack::CXXatDCA, propfwdtrack::CYYatDCA, propfwdtrack::CXYatDCA,
50+
propfwdtrack::EtaMatchedMCHMID, propfwdtrack::PhiMatchedMCHMID,
51+
propfwdtrack::IsAssociatedToMPC, propfwdtrack::IsAmbiguous, o2::soa::Marker<1>);
52+
53+
DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracksCov, "PropagatedFwdTracksCov", "AOD", "PROPFWDTRACKCOV", //!
54+
fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt,
55+
fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY,
56+
fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl, o2::soa::Marker<1>);
57+
58+
// extended table with expression columns that can be used as arguments of dynamic columns
59+
DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracks, StoredPropagatedFwdTracks, "PROPFWDTRACKEXT", //!
60+
fwdtrack::Pt,
61+
fwdtrack::Eta,
62+
fwdtrack::P);
63+
64+
// extended table with expression columns that can be used as arguments of dynamic columns
65+
DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracksCov, StoredPropagatedFwdTracksCov, "PROPFWDTRACKCOVEXT", //!
66+
fwdtrack::CXX,
67+
fwdtrack::CXY,
68+
fwdtrack::CYY,
69+
fwdtrack::CPhiX,
70+
fwdtrack::CPhiY,
71+
fwdtrack::CPhiPhi,
72+
fwdtrack::CTglX,
73+
fwdtrack::CTglY,
74+
fwdtrack::CTglPhi,
75+
fwdtrack::CTglTgl,
76+
fwdtrack::C1PtX,
77+
fwdtrack::C1PtY,
78+
fwdtrack::C1PtPhi,
79+
fwdtrack::C1PtTgl,
80+
fwdtrack::C1Pt21Pt2);
81+
} // namespace o2::aod
82+
83+
#endif // COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_

Common/TableProducer/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,10 @@ o2physics_add_dpl_workflow(mftmch-matching-data-mc
148148
o2physics_add_dpl_workflow(muon-realignment
149149
SOURCES muonRealignment.cxx
150150
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsCommonDataFormats O2::MathUtils O2::MCHTracking O2::DataFormatsMCH O2::GlobalTracking O2::MCHBase O2::MCHGeometryTransformer O2::CommonUtils
151-
COMPONENT_NAME Analysis)
151+
COMPONENT_NAME Analysis)
152+
153+
o2physics_add_dpl_workflow(fwdtrack-propagation
154+
SOURCES fwdtrackPropagation.cxx
155+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::GlobalTracking
156+
COMPONENT_NAME Analysis)
157+

0 commit comments

Comments
 (0)