1919#include " Common/Core/TrackSelection.h"
2020#include " Common/DataModel/TrackSelectionTables.h"
2121#include " Common/Core/trackUtilities.h"
22+ #include " ReconstructionDataFormats/DCA.h"
23+ #include " DetectorsBase/Propagator.h"
24+ #include " DetectorsBase/GeometryManager.h"
25+ #include " DetectorsCommonDataFormats/NameConf.h"
2226
2327using namespace o2 ;
2428using namespace o2 ::framework;
@@ -32,21 +36,44 @@ using namespace o2::framework::expressions;
3236 */
3337// ****************************************************************************************
3438struct TrackExtensionTask {
39+ Configurable<int > cfgDcaMethod{" dcamethod" , 1 , " Method to estimate the track DCA: 0 = crude, 1 = minimum, 2 = rigorous. Default minimum" };
3540
3641 Produces<aod::TracksExtended> extendedTrackQuantities;
3742
3843 void process (aod::FullTracks const & tracks, aod::Collisions const &)
3944 {
45+ o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT;
46+ if ((cfgDcaMethod == 1 ) or (cfgDcaMethod == 2 )) {
47+ o2::base::GeometryManager::loadGeometry ();
48+ o2::base::Propagator::initFieldFromGRP ();
49+ if (cfgDcaMethod == 2 ) {
50+ auto matLUTFile = o2::base::NameConf::getMatLUTFileName ();
51+ if (o2::utils::Str::pathExists (matLUTFile)) {
52+ auto * lut = o2::base::MatLayerCylSet::loadFromFile (matLUTFile);
53+ o2::base::Propagator::Instance ()->setMatLUT (lut);
54+ }
55+ }
56+ }
4057 for (auto & track : tracks) {
4158
4259 std::array<float , 2 > dca{1e10f, 1e10f};
4360 if (track.has_collision ()) {
4461 if ((track.trackType () == o2::aod::track::TrackTypeEnum::Track) ||
4562 (track.trackType () == o2::aod::track::TrackTypeEnum::Run2Track && track.itsChi2NCl () != 0 .f && track.tpcChi2NCl () != 0 .f && std::abs (track.x ()) < 10 .f )) {
46- float magField = 5.0 ; // in kG (FIXME: get this from CCDB)
4763 auto trackPar = getTrackPar (track);
4864 auto const & collision = track.collision ();
49- trackPar.propagateParamToDCA ({collision.posX (), collision.posY (), collision.posZ ()}, magField, &dca);
65+ if (cfgDcaMethod == 1 ) {
66+ trackPar.propagateParamToDCA ({collision.posX (), collision.posY (), collision.posZ ()}, o2::base::Propagator::Instance ()->getNominalBz (), &dca);
67+ } else if (cfgDcaMethod == 2 ) {
68+ o2::dataformats::DCA dcaInfo;
69+ if (o2::base::Propagator::Instance ()->propagateToDCABxByBz ({collision.posX (), collision.posY (), collision.posZ ()}, trackPar, 2 ., matCorr, &dca)) {
70+ dca[0 ] = dcaInfo.getY ();
71+ dca[1 ] = dcaInfo.getZ ();
72+ }
73+ } else {
74+ float magField = 5.0 ; // in kG (FIXME: get this from CCDB)
75+ trackPar.propagateParamToDCA ({collision.posX (), collision.posY (), collision.posZ ()}, magField, &dca);
76+ }
5077 }
5178 }
5279 extendedTrackQuantities (dca[0 ], dca[1 ]);
0 commit comments