Skip to content

Commit 38887fc

Browse files
committed
Add barrel track propagation to PV at AOD creation stage
1 parent 8ac3090 commit 38887fc

2 files changed

Lines changed: 103 additions & 35 deletions

File tree

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "DataFormatsEMCAL/EventHandler.h"
2929
#include "DataFormatsPHOS/EventHandler.h"
3030
#include "DetectorsBase/GRPGeomHelper.h"
31+
#include "DetectorsBase/Propagator.h"
3132
#include "Framework/AnalysisDataModel.h"
3233
#include "Framework/AnalysisHelpers.h"
3334
#include "Framework/DataProcessorSpec.h"
@@ -248,6 +249,19 @@ class AODProducerWorkflowDPL : public Task
248249
return c;
249250
}
250251

252+
bool mPropTracks{false};
253+
bool mPropTracksCov{false};
254+
std::string mCCDBUrl{"http://alice-ccdb.cern.ch"};
255+
std::string mVtxPath{"GLO/Calib/MeanVertex"};
256+
257+
o2::ccdb::CcdbApi mCCDBAPI;
258+
259+
o2::base::Propagator::MatCorrType mMatCorr{o2::base::Propagator::MatCorrType::USEMatCorrLUT};
260+
o2::dataformats::MeanVertexObject* mVtx{nullptr};
261+
float mMinPropR{o2::constants::geom::XTPCInnerRef + 0.1f};
262+
263+
std::unordered_set<GIndex> mGIDUsedBySVtx;
264+
251265
int mNThreads = 1;
252266
bool mUseMC = true;
253267
bool mEnableSV = true; // enable secondary vertices
@@ -323,7 +337,6 @@ class AODProducerWorkflowDPL : public Task
323337
// production metadata
324338
std::vector<TString> mMetaDataKeys;
325339
std::vector<TString> mMetaDataVals;
326-
bool mIsMDSent{false};
327340

328341
std::shared_ptr<DataRequest> mDataRequest;
329342
std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
@@ -456,6 +469,19 @@ class AODProducerWorkflowDPL : public Task
456469
};
457470
std::vector<TPCCounters> mTPCCounters;
458471

472+
void fetchMeanVtxCCDB(int runNumber)
473+
{
474+
static int prevRunNumber = -1;
475+
if (runNumber == prevRunNumber)
476+
return;
477+
auto& ccdbMgr = o2::ccdb::BasicCCDBManager::instance();
478+
std::map<std::string, std::string> headers, metadataRCT;
479+
headers = mCCDBAPI.retrieveHeaders(Form("RCT/Info/RunInformation/%i", runNumber), metadataRCT, -1);
480+
int64_t ts = std::atol(headers["SOR"].c_str()); // timestamp in ms
481+
mVtx = ccdbMgr.getForTimeStamp<o2::dataformats::MeanVertexObject>(mVtxPath, ts);
482+
prevRunNumber = runNumber;
483+
}
484+
459485
void updateTimeDependentParams(ProcessingContext& pc);
460486

461487
void addRefGlobalBCsForTOF(const o2::dataformats::VtxTrackRef& trackRef, const gsl::span<const GIndex>& GIndices,
@@ -465,7 +491,6 @@ class AODProducerWorkflowDPL : public Task
465491
const std::vector<o2::InteractionTimeRecord>& mcRecords,
466492
std::map<uint64_t, int>& bcsMap);
467493

468-
uint64_t getTFNumber(const o2::InteractionRecord& tfStartIR, int runNumber);
469494
template <typename TracksCursorType, typename TracksCovCursorType>
470495
void addToTracksTable(TracksCursorType& tracksCursor, TracksCovCursorType& tracksCovCursor,
471496
const o2::track::TrackParCov& track, int collisionID, aod::track::TrackTypeEnum type = aod::track::TrackIU);
@@ -483,6 +508,7 @@ class AODProducerWorkflowDPL : public Task
483508
GIndex trackID, const o2::globaltracking::RecoContainer& data, int collisionID, std::uint64_t collisionBC, const std::map<uint64_t, int>& bcsMap);
484509

485510
TrackExtraInfo processBarrelTrack(int collisionID, std::uint64_t collisionBC, GIndex trackIndex, const o2::globaltracking::RecoContainer& data, const std::map<uint64_t, int>& bcsMap);
511+
bool propagateTrackToPV(o2::track::TrackParametrizationWithError<float>& trackPar, const o2::globaltracking::RecoContainer& data, int colID);
486512
void extrapolateToCalorimeters(TrackExtraInfo& extraInfoHolder, const o2::track::TrackPar& track);
487513
void cacheTriggers(const o2::globaltracking::RecoContainer& recoData);
488514

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 75 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
315284
template <typename TracksCursorType, typename TracksCovCursorType>
316285
void 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+
23472387
void 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

Comments
 (0)