@@ -281,37 +281,6 @@ void AODProducerWorkflowDPL::collectBCs(const o2::globaltracking::RecoContainer&
281281 }
282282}
283283
284- uint64_t AODProducerWorkflowDPL::getTFNumber (const o2::InteractionRecord& tfStartIR, int runNumber)
285- {
286- auto & mgr = o2::ccdb::BasicCCDBManager::instance ();
287- o2::ccdb::CcdbApi ccdb_api;
288- const std::string rct_path = " RCT/Info/RunInformation/" ;
289- const std::string start_orbit_path = " Trigger/StartOrbit" ;
290-
291- mgr.setURL (o2::base::NameConf::getCCDBServer ());
292- ccdb_api.init (o2::base::NameConf::getCCDBServer ());
293-
294- std::map<int , int >* mapStartOrbit = mgr.get <std::map<int , int >>(start_orbit_path);
295- int64_t ts = 0 ;
296- std::map<std::string, std::string> metadata;
297- std::map<std::string, std::string> headers;
298- const std::string run_path = Form (" %s/%i" , rct_path.data (), runNumber);
299- headers = ccdb_api.retrieveHeaders (run_path, metadata, -1 );
300- ts = atol (headers[" SOR" ].c_str ());
301-
302- // ccdb returns timestamp in mus
303- // mus to ms
304- ts = ts / 1000 ;
305-
306- uint32_t initialOrbit = mapStartOrbit->at (runNumber);
307- uint16_t firstRecBC = tfStartIR.bc ;
308- uint32_t firstRecOrbit = tfStartIR.orbit ;
309- const o2::InteractionRecord firstRec (firstRecBC, firstRecOrbit);
310- ts += firstRec.bc2ns () / 1000000 ;
311-
312- return ts;
313- };
314-
315284template <typename TracksCursorType, typename TracksCovCursorType>
316285void AODProducerWorkflowDPL::addToTracksTable (TracksCursorType& tracksCursor, TracksCovCursorType& tracksCovCursor,
317286 const o2::track::TrackParCov& track, int collisionID, aod::track::TrackTypeEnum type)
@@ -472,7 +441,14 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
472441 << " timeErr=" << extraInfoHolder.trackTimeRes << " BCSlice: " << extraInfoHolder.bcSlice [0 ] << " :" << extraInfoHolder.bcSlice [1 ];
473442 continue ;
474443 }
475- addToTracksTable (tracksCursor, tracksCovCursor, data.getTrackParam (trackIndex), collisionID);
444+ o2::track::TrackParametrizationWithError<float > trackPar = data.getTrackParam (trackIndex);
445+ bool isProp = false ;
446+ if (mPropTracks ) {
447+ if (mGIDUsedBySVtx .find (trackIndex) == mGIDUsedBySVtx .end ())
448+ isProp = propagateTrackToPV (trackPar, data, collisionID);
449+ }
450+ auto trkType = isProp ? aod::track::Track : aod::track::TrackIU;
451+ addToTracksTable (tracksCursor, tracksCovCursor, trackPar, collisionID, trkType);
476452 addToTracksExtraTable (tracksExtraCursor, extraInfoHolder);
477453 // collecting table indices of barrel tracks for V0s table
478454 if (extraInfoHolder.bcSlice [0 ] >= 0 && collisionID < 0 ) {
@@ -1586,6 +1562,8 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
15861562 mCTPReadout = ic.options ().get <int >(" ctpreadout-create" );
15871563 mNThreads = std::max (1 , ic.options ().get <int >(" nthreads" ));
15881564 mEMCselectLeading = ic.options ().get <bool >(" emc-select-leading" );
1565+ mPropTracks = ic.options ().get <bool >(" propagate-tracks" );
1566+ mPropTracksCov = ic.options ().get <bool >(" propagate-tracks-cov" );
15891567#ifdef WITH_OPENMP
15901568 LOGP (info, " Multi-threaded parts will run with {} OpenMP threads" , mNThreads );
15911569#else
@@ -1648,6 +1626,14 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
16481626 mZDCTDCMap [ic] = -std::numeric_limits<float >::infinity ();
16491627 }
16501628
1629+ if (mPropTracks ) {
1630+ mCCDBAPI .init (mCCDBUrl );
1631+ auto & ccdbMgr = o2::ccdb::BasicCCDBManager::instance ();
1632+ ccdbMgr.setURL (mCCDBUrl );
1633+ ccdbMgr.setCaching (true );
1634+ ccdbMgr.setLocalObjectValidityChecking ();
1635+ }
1636+
16511637 mTimer .Reset ();
16521638}
16531639
@@ -1752,6 +1738,10 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
17521738 tfNumber = mTFNumber ;
17531739 }
17541740
1741+ if (mPropTracks ) {
1742+ fetchMeanVtxCCDB (runNumber);
1743+ }
1744+
17551745 std::vector<float > aAmplitudes;
17561746 std::vector<uint8_t > aChannels;
17571747 fv0aCursor.reserve (fv0RecPoints.size ());
@@ -1992,6 +1982,25 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
19921982 mGIDToTableFwdID .clear (); // reset the tables to be used by 'fillTrackTablesPerCollision'
19931983 mGIDToTableMFTID .clear ();
19941984
1985+ if (mPropTracks ) {
1986+ auto v0s = recoData.getV0s ();
1987+ auto cascades = recoData.getCascades ();
1988+ auto decays3Body = recoData.getDecays3Body ();
1989+ mGIDUsedBySVtx .reserve (v0s.size () * 2 + cascades.size () + decays3Body.size () * 3 );
1990+ for (const auto & v0 : v0s) {
1991+ mGIDUsedBySVtx .insert (v0.getProngID (0 ));
1992+ mGIDUsedBySVtx .insert (v0.getProngID (1 ));
1993+ }
1994+ for (const auto & cascade : cascades) {
1995+ mGIDUsedBySVtx .insert (cascade.getBachelorID ());
1996+ }
1997+ for (const auto & id3Body : decays3Body) {
1998+ mGIDUsedBySVtx .insert (id3Body.getProngID (0 ));
1999+ mGIDUsedBySVtx .insert (id3Body.getProngID (1 ));
2000+ mGIDUsedBySVtx .insert (id3Body.getProngID (2 ));
2001+ }
2002+ }
2003+
19952004 // filling unassigned tracks first
19962005 // so that all unassigned tracks are stored in the beginning of the table together
19972006 auto & trackRef = primVer2TRefs.back (); // references to unassigned tracks are at the end
@@ -2154,6 +2163,8 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21542163
21552164 mBCLookup .clear ();
21562165
2166+ mGIDUsedBySVtx .clear ();
2167+
21572168 originCursor (tfNumber);
21582169
21592170 // sending metadata to writer
@@ -2344,6 +2355,35 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac
23442355 return extraInfoHolder;
23452356}
23462357
2358+ bool AODProducerWorkflowDPL::propagateTrackToPV (o2::track::TrackParametrizationWithError<float >& trackPar,
2359+ const o2::globaltracking::RecoContainer& data,
2360+ int colID)
2361+ {
2362+ if (trackPar.getX () > mMinPropR )
2363+ return false ;
2364+ o2::dataformats::DCA dcaInfo;
2365+ dcaInfo.set (999 .f , 999 .f , 999 .f , 999 .f , 999 .f );
2366+ o2::dataformats::VertexBase v;
2367+ if (colID >= 0 ) {
2368+ const auto & vtx = data.getPrimaryVertex (colID);
2369+ v.setPos ({vtx.getXYZ ()});
2370+ if (mPropTracksCov ) {
2371+ v.setCov ({vtx.getCov ()});
2372+ }
2373+ } else {
2374+ v.setPos ({mVtx ->getXYZ ()});
2375+ if (mPropTracksCov ) {
2376+ v.setCov (mVtx ->getSigmaX () * mVtx ->getSigmaX (),
2377+ 0 .f ,
2378+ mVtx ->getSigmaY () * mVtx ->getSigmaY (),
2379+ 0 .f ,
2380+ 0 .f ,
2381+ mVtx ->getSigmaZ () * mVtx ->getSigmaZ ());
2382+ }
2383+ }
2384+ return o2::base::Propagator::Instance ()->propagateToDCABxByBz (v, trackPar, 2 .f , mMatCorr , &dcaInfo);
2385+ };
2386+
23472387void AODProducerWorkflowDPL::extrapolateToCalorimeters (TrackExtraInfo& extraInfoHolder, const o2::track::TrackPar& track)
23482388{
23492389 constexpr float XEMCAL = 440 .f , XPHOS = 460 .f , XEMCAL2 = XEMCAL * XEMCAL ;
@@ -2734,7 +2774,9 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
27342774 ConfigParamSpec{" nthreads" , VariantType::Int, std::max (1 , int (std::thread::hardware_concurrency () / 2 )), {" Number of threads" }},
27352775 ConfigParamSpec{" reco-mctracks-only" , VariantType::Int, 0 , {" Store only reconstructed MC tracks and their mothers/daughters. 0 -- off, != 0 -- on" }},
27362776 ConfigParamSpec{" ctpreadout-create" , VariantType::Int, 0 , {" Create CTP digits from detector readout and CTP inputs. !=1 -- off, 1 -- on" }},
2737- ConfigParamSpec{" emc-select-leading" , VariantType::Bool, false , {" Flag to select if only the leading contributing particle for an EMCal cell should be stored" }}}};
2777+ ConfigParamSpec{" emc-select-leading" , VariantType::Bool, false , {" Flag to select if only the leading contributing particle for an EMCal cell should be stored" }},
2778+ ConfigParamSpec{" propagate-tracks" , VariantType::Bool, false , {" Propagate tracks (not used for secondary vertices) to IP" }},
2779+ ConfigParamSpec{" propagate-tracks-cov" , VariantType::Bool, false , {" Propagate track (not used for secondary vertices) to IP using covariance matrix" }}}};
27382780}
27392781
27402782} // namespace o2::aodproducer
0 commit comments