Skip to content

Commit 67785a4

Browse files
author
Maurice Coquet
committed
Use helix propagation to compute fwdtrack DCA
1 parent b15420a commit 67785a4

File tree

2 files changed

+58
-20
lines changed

2 files changed

+58
-20
lines changed

Common/TableProducer/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ o2physics_add_dpl_workflow(fwdtrackextension
104104
SOURCES fwdtrackextension.cxx
105105
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
106106
O2::ReconstructionDataFormats
107-
O2::DetectorsBase
108-
O2::DetectorsCommonDataFormats
107+
O2::GlobalTracking
108+
O2::MCHTracking
109109
COMPONENT_NAME Analysis)
110110

111111
o2physics_add_dpl_workflow(track-to-collision-associator

Common/TableProducer/fwdtrackextension.cxx

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
//
1515

1616
#include "Common/DataModel/TrackSelectionTables.h"
17+
#include "Common/Core/fwdtrackUtilities.h"
18+
#include "CCDB/BasicCCDBManager.h"
19+
#include "DataFormatsParameters/GRPMagField.h"
20+
#include "DetectorsBase/GeometryManager.h"
21+
#include "DetectorsBase/Propagator.h"
22+
#include "GlobalTracking/MatchGlobalFwd.h"
1723

1824
#include <Framework/AnalysisDataModel.h>
1925
#include <Framework/AnalysisHelpers.h>
@@ -34,30 +40,62 @@ using namespace o2::framework::expressions;
3440
using SMatrix55 = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>>;
3541
using SMatrix5 = ROOT::Math::SVector<double, 5>;
3642

43+
using MuonsWithCov = soa::Join<aod::FwdTracks, aod::FwdTracksCov>;
44+
3745
struct FwdTrackExtension {
38-
Produces<aod::FwdTracksDCA> extendedTrackQuantities;
46+
Produces<aod::FwdTracksDCA> fwdDCA;
47+
Configurable<std::string> geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"};
48+
Configurable<std::string> grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"};
49+
Configurable<std::string> fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
50+
Configurable<bool> fRefitGlobalMuon{"refitGlobal", true, "Recompute parameters of global muons"};
51+
52+
Service<o2::ccdb::BasicCCDBManager> fCCDB;
53+
o2::parameters::GRPMagField* grpmag = nullptr; // for run 3, we access GRPMagField from GLO/Config/GRPMagField
54+
int fCurrentRun; // needed to detect if the run changed and trigger update of magnetic field
3955

40-
void process(aod::FwdTracks const& tracks, aod::Collisions const&)
56+
void init(o2::framework::InitContext&)
4157
{
42-
for (auto& track : tracks) {
43-
float dcaX = -999;
44-
float dcaY = -999;
45-
if (track.has_collision()) {
46-
if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack || track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalForwardTrack || track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
58+
// Load geometry
59+
fCCDB->setURL(fConfigCcdbUrl);
60+
fCCDB->setCaching(true);
61+
fCCDB->setLocalObjectValidityChecking();
4762

48-
auto const& collision = track.collision();
49-
double chi2 = track.chi2();
50-
SMatrix5 tpars(track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt());
51-
std::vector<double> v1;
52-
SMatrix55 tcovs(v1.begin(), v1.end());
53-
o2::track::TrackParCovFwd pars1{track.z(), tpars, tcovs, chi2};
54-
pars1.propagateToZlinear(collision.posZ());
63+
if (!o2::base::GeometryManager::isGeometryLoaded()) {
64+
LOGF(info, "Load geometry from CCDB");
65+
fCCDB->get<TGeoManager>(geoPath);
66+
}
67+
}
5568

56-
dcaX = (pars1.getX() - collision.posX());
57-
dcaY = (pars1.getY() - collision.posY());
58-
}
69+
void process(aod::Collisions::iterator const& collision, o2::aod::BCsWithTimestamps const& /*...*/, MuonsWithCov const& tracks, aod::MFTTracks const& /*...*/)
70+
{
71+
auto bc = collision.template bc_as<o2::aod::BCsWithTimestamps>();
72+
if (fCurrentRun != bc.runNumber()) {
73+
grpmag = fCCDB->getForTimeStamp<o2::parameters::GRPMagField>(grpmagPath, bc.timestamp());
74+
if (grpmag != nullptr) {
75+
LOGF(info, "Init field from GRP");
76+
o2::base::Propagator::initFieldFromGRP(grpmag);
5977
}
60-
extendedTrackQuantities(dcaX, dcaY);
78+
LOGF(info, "Set field for muons");
79+
o2::mch::TrackExtrap::setField();
80+
fCurrentRun = bc.runNumber();
81+
}
82+
const float zField = grpmag->getNominalL3Field();
83+
for (auto& track : tracks) {
84+
const auto trackType = track.trackType();
85+
o2::dataformats::GlobalFwdTrack fwdtrack = o2::aod::fwdtrackutils::getTrackParCovFwd(track,track);
86+
if (fRefitGlobalMuon && (trackType == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack || trackType == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalForwardTrack)) {
87+
auto muontrack = track.template matchMCHTrack_as<MuonsWithCov>();
88+
auto mfttrack = track.template matchMFTTrack_as<aod::MFTTracks>();
89+
o2::dataformats::GlobalFwdTrack propmuon = o2::aod::fwdtrackutils::propagateMuon(muontrack, muontrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex, 0.f, zField);
90+
SMatrix5 tpars(mfttrack.x(), mfttrack.y(), mfttrack.phi(), mfttrack.tgl(), mfttrack.signed1Pt());
91+
SMatrix55 tcovs{};
92+
o2::track::TrackParCovFwd mft{mfttrack.z(), tpars, tcovs, mfttrack.chi2()};
93+
fwdtrack = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuon,mft);
94+
}
95+
const auto proptrack = o2::aod::fwdtrackutils::propagateTrackParCovFwd(fwdtrack, trackType, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA, 0.f, zField);
96+
const float dcaX = (proptrack.getX() - collision.posX());
97+
const float dcaY = (proptrack.getY() - collision.posY());
98+
fwdDCA(dcaX, dcaY);
6199
}
62100
}
63101
};

0 commit comments

Comments
 (0)