Skip to content

Commit 00dda3a

Browse files
authored
[PWGUD] Add separate task for forward muon analysis (#14294)
1 parent dc6d69e commit 00dda3a

File tree

4 files changed

+582
-32
lines changed

4 files changed

+582
-32
lines changed

PWGUD/Core/UPCHelpers.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
#include "CommonConstants/LHCConstants.h"
2323
#include "Framework/AnalysisDataModel.h"
2424

25-
#include "TLorentzVector.h"
26-
2725
using BCsWithBcSels = o2::soa::Join<o2::aod::BCs, o2::aod::BcSels>;
2826

2927
using ForwardTracks = o2::soa::Join<o2::aod::FwdTracks, o2::aod::FwdTracksCov>;
@@ -96,14 +94,16 @@ struct FITInfo {
9694
int32_t distClosestBcT0A = 999;
9795
};
9896

97+
constexpr double AbsorberMid = 26.5;
98+
9999
template <typename T, typename TSelectorsArray>
100100
void applyFwdCuts(UPCCutparHolder& upcCuts, const T& track, TSelectorsArray& fwdSelectors)
101101
{
102-
fwdSelectors[kFwdSelPt] = track.pt() > upcCuts.getFwdPtLow() && track.pt() < upcCuts.getFwdPtHigh(); // check pt
103-
fwdSelectors[kFwdSelEta] = track.eta() > upcCuts.getFwdEtaLow() && track.eta() < upcCuts.getFwdEtaHigh(); // check pseudorapidity
104-
fwdSelectors[kFwdSelRabs] = track.rAtAbsorberEnd() > upcCuts.getMuonRAtAbsorberEndLow() && track.rAtAbsorberEnd() < upcCuts.getMuonRAtAbsorberEndHigh(); // check muon R
105-
fwdSelectors[kFwdSelpDCA] = track.pDca() < 26.5 ? track.pDca() < upcCuts.getMuonPDcaHighFirst() : track.pDca() < upcCuts.getMuonPDcaHighSecond(); // check pDCA
106-
fwdSelectors[kFwdSelChi2] = track.chi2() > upcCuts.getFwdChi2Low() && track.chi2() < upcCuts.getFwdChi2High(); // check chi2
102+
fwdSelectors[kFwdSelPt] = track.pt() > upcCuts.getFwdPtLow() && track.pt() < upcCuts.getFwdPtHigh(); // check pt
103+
fwdSelectors[kFwdSelEta] = track.eta() > upcCuts.getFwdEtaLow() && track.eta() < upcCuts.getFwdEtaHigh(); // check pseudorapidity
104+
fwdSelectors[kFwdSelRabs] = track.rAtAbsorberEnd() > upcCuts.getMuonRAtAbsorberEndLow() && track.rAtAbsorberEnd() < upcCuts.getMuonRAtAbsorberEndHigh(); // check muon R
105+
fwdSelectors[kFwdSelpDCA] = track.rAtAbsorberEnd() < AbsorberMid ? track.pDca() < upcCuts.getMuonPDcaHighFirst() : track.pDca() < upcCuts.getMuonPDcaHighSecond(); // check pDCA
106+
fwdSelectors[kFwdSelChi2] = track.chi2() > upcCuts.getFwdChi2Low() && track.chi2() < upcCuts.getFwdChi2High(); // check chi2
107107
}
108108

109109
template <typename T, typename TSelectorsArray>
@@ -131,7 +131,7 @@ void applyBarrelCuts(UPCCutparHolder& upcCuts, const T& track, TSelectorsArray&
131131

132132
if (upcCuts.getCheckMaxDcaXY()) {
133133
float dca = track.dcaXY();
134-
float maxDCA = 0.0105f + 0.0350f / pow(track.pt(), 1.1f);
134+
float maxDCA = 0.0105f + 0.0350f / std::pow(track.pt(), 1.1f);
135135
barrelSelectors[kBarrelSelDCAXY] = dca < maxDCA;
136136
} else {
137137
barrelSelectors[kBarrelSelDCAXY] = true;

PWGUD/TableProducer/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ o2physics_add_dpl_workflow(two-tracks-event-table-producer
4141
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
4242
COMPONENT_NAME Analysis)
4343

44-
o2physics_add_dpl_workflow(fwdtrack-propagation
44+
o2physics_add_dpl_workflow(fwd-track-propagation
4545
SOURCES fwdTrackPropagation.cxx
4646
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking
4747
COMPONENT_NAME Analysis)
@@ -60,3 +60,8 @@ o2physics_add_dpl_workflow(tau-three-prong-event-table-producer
6060
SOURCES tauThreeProngEventTableProducer.cxx
6161
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
6262
COMPONENT_NAME Analysis)
63+
64+
o2physics_add_dpl_workflow(upc-cand-producer-muon
65+
SOURCES upcCandProducerMuon.cxx
66+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::UPCCutparHolder O2::GlobalTracking
67+
COMPONENT_NAME Analysis)

PWGUD/TableProducer/fwdTrackPropagation.cxx

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,37 @@
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

3239
using namespace o2::framework;
3340
using namespace o2::framework::expressions;
41+
using o2::aod::fwdtrack::ForwardTrackTypeEnum;
3442

3543
struct 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

Comments
 (0)