1010// or submit itself to any jurisdiction.
1111
1212//
13- // Task performing forward track DCA computation
13+ // \file fwdtrackextension.cxx
14+ // \brief Task performing forward track DCA computation.
15+ // \author Maurice Coquet, maurice.louis.coquet@cern.ch
1416//
1517
18+ #include " Common/Core/fwdtrackUtilities.h"
1619#include " Common/DataModel/TrackSelectionTables.h"
1720
21+ #include < CCDB/BasicCCDBManager.h>
22+ #include < DataFormatsParameters/GRPMagField.h>
23+ #include < DetectorsBase/GeometryManager.h>
24+ #include < DetectorsBase/Propagator.h>
1825#include < Framework/AnalysisDataModel.h>
1926#include < Framework/AnalysisHelpers.h>
2027#include < Framework/AnalysisTask.h>
2128#include < Framework/DataTypes.h>
2229#include < Framework/runDataProcessing.h>
30+ #include < GlobalTracking/MatchGlobalFwd.h>
2331#include < ReconstructionDataFormats/TrackFwd.h>
2432
2533#include < Math/MatrixRepresentationsStatic.h>
2634#include < Math/SMatrix.h>
2735
36+ #include < string>
2837#include < vector>
2938
3039using namespace o2 ;
@@ -34,30 +43,62 @@ using namespace o2::framework::expressions;
3443using SMatrix55 = ROOT::Math::SMatrix<double , 5 , 5 , ROOT::Math::MatRepSym<double , 5 >>;
3544using SMatrix5 = ROOT::Math::SVector<double , 5 >;
3645
46+ using MuonsWithCov = soa::Join<aod::FwdTracks, aod::FwdTracksCov>;
47+
3748struct FwdTrackExtension {
38- Produces<aod::FwdTracksDCA> extendedTrackQuantities;
49+ Produces<aod::FwdTracksDCA> fwdDCA;
50+ Configurable<std::string> geoPath{" geoPath" , " GLO/Config/GeometryAligned" , " Path of the geometry file" };
51+ Configurable<std::string> grpmagPath{" grpmagPath" , " GLO/Config/GRPMagField" , " CCDB path of the GRPMagField object" };
52+ Configurable<std::string> configCcdbUrl{" configCcdbUrl" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository" };
53+ Configurable<bool > refitGlobalMuon{" refitGlobalMuon" , true , " Recompute parameters of global muons" };
54+
55+ Service<o2::ccdb::BasicCCDBManager> fCCDB ;
56+ o2::parameters::GRPMagField* grpmag = nullptr ; // for run 3, we access GRPMagField from GLO/Config/GRPMagField
57+ int fCurrentRun ; // needed to detect if the run changed and trigger update of magnetic field
3958
40- void process (aod::FwdTracks const & tracks, aod::Collisions const &)
59+ void init (o2::framework::InitContext &)
4160 {
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) {
61+ // Load geometry
62+ fCCDB ->setURL (configCcdbUrl);
63+ fCCDB ->setCaching (true );
64+ fCCDB ->setLocalObjectValidityChecking ();
4765
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 ());
66+ if (!o2::base::GeometryManager::isGeometryLoaded ()) {
67+ LOGF (info, " Load geometry from CCDB" );
68+ fCCDB ->get <TGeoManager>(geoPath);
69+ }
70+ }
5571
56- dcaX = (pars1.getX () - collision.posX ());
57- dcaY = (pars1.getY () - collision.posY ());
58- }
72+ void process (aod::Collisions::iterator const & collision, o2::aod::BCsWithTimestamps const & /* ...*/ , MuonsWithCov const & tracks, aod::MFTTracks const & /* ...*/ )
73+ {
74+ auto bc = collision.template bc_as <o2::aod::BCsWithTimestamps>();
75+ if (fCurrentRun != bc.runNumber ()) {
76+ grpmag = fCCDB ->getForTimeStamp <o2::parameters::GRPMagField>(grpmagPath, bc.timestamp ());
77+ if (grpmag != nullptr ) {
78+ LOGF (info, " Init field from GRP" );
79+ o2::base::Propagator::initFieldFromGRP (grpmag);
80+ }
81+ LOGF (info, " Set field for muons" );
82+ o2::mch::TrackExtrap::setField ();
83+ fCurrentRun = bc.runNumber ();
84+ }
85+ const float zField = grpmag->getNominalL3Field ();
86+ for (const auto & track : tracks) {
87+ const auto trackType = track.trackType ();
88+ o2::dataformats::GlobalFwdTrack fwdtrack = o2::aod::fwdtrackutils::getTrackParCovFwd (track, track);
89+ if (refitGlobalMuon && (trackType == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack || trackType == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalForwardTrack)) {
90+ auto muontrack = track.template matchMCHTrack_as <MuonsWithCov>();
91+ auto mfttrack = track.template matchMFTTrack_as <aod::MFTTracks>();
92+ o2::dataformats::GlobalFwdTrack propmuon = o2::aod::fwdtrackutils::propagateMuon (muontrack, muontrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , 0 .f , zField);
93+ SMatrix5 tpars (mfttrack.x (), mfttrack.y (), mfttrack.phi (), mfttrack.tgl (), mfttrack.signed1Pt ());
94+ SMatrix55 tcovs{};
95+ o2::track::TrackParCovFwd mft{mfttrack.z (), tpars, tcovs, mfttrack.chi2 ()};
96+ fwdtrack = o2::aod::fwdtrackutils::refitGlobalMuonCov (propmuon, mft);
5997 }
60- extendedTrackQuantities (dcaX, dcaY);
98+ const auto proptrack = o2::aod::fwdtrackutils::propagateTrackParCovFwd (fwdtrack, trackType, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , 0 .f , zField);
99+ const float dcaX = (proptrack.getX () - collision.posX ());
100+ const float dcaY = (proptrack.getY () - collision.posY ());
101+ fwdDCA (dcaX, dcaY);
61102 }
62103 }
63104};
0 commit comments