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;
3440using SMatrix55 = ROOT::Math::SMatrix<double , 5 , 5 , ROOT::Math::MatRepSym<double , 5 >>;
3541using SMatrix5 = ROOT::Math::SVector<double , 5 >;
3642
43+ using MuonsWithCov = soa::Join<aod::FwdTracks, aod::FwdTracksCov>;
44+
3745struct 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