Skip to content

Commit c5b6932

Browse files
fmazzascFrancesco Mazzaschiromainschotter
authored
[PWGLF] Add PV refit w/o ITS fake track (#11181)
Co-authored-by: Francesco Mazzaschi <fmazzasc@alipap1.cern.ch> Co-authored-by: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com>
1 parent d1345ff commit c5b6932

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

PWGLF/Tasks/Strangeness/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ o2physics_add_dpl_workflow(cascadecorrelations
5151

5252
o2physics_add_dpl_workflow(non-prompt-cascade
5353
SOURCES nonPromptCascade.cxx
54-
PUBLIC_LINK_LIBRARIES O2::Framework O2::ReconstructionDataFormats O2Physics::AnalysisCore O2::DetectorsBase O2Physics::EventFilteringUtils
54+
PUBLIC_LINK_LIBRARIES O2::Framework O2::ReconstructionDataFormats O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsVertexing O2Physics::EventFilteringUtils
5555
COMPONENT_NAME Analysis)
5656

5757
o2physics_add_dpl_workflow(k0mixedevents

PWGLF/Tasks/Strangeness/nonPromptCascade.cxx

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include "Common/DataModel/Multiplicity.h"
2525
#include "Common/Core/RecoDecay.h"
2626
#include "Common/Core/trackUtilities.h"
27+
#include "DetectorsVertexing/PVertexer.h"
28+
#include "ReconstructionDataFormats/Vertex.h"
2729
#include "DataFormatsParameters/GRPMagField.h"
2830
#include "DataFormatsParameters/GRPObject.h"
2931
#include "DataFormatsTPC/BetheBlochAleph.h"
@@ -171,8 +173,12 @@ struct NonPromptCascadeTask {
171173
using CollisionCandidatesRun3 = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults>;
172174
using CollisionCandidatesRun3MC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::FT0Mults>;
173175

176+
Preslice<TracksExtData> perCollision = aod::track::collisionId;
177+
Preslice<TracksExtMC> perCollisionMC = aod::track::collisionId;
178+
174179
Configurable<std::string> ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
175180
Configurable<bool> cfgPropToPCA{"cfgPropToPCA", true, "create tracks version propagated to PCA"};
181+
Configurable<bool> cfgRedoPV{"cfgRedoPV", true, "redo PV"};
176182
Configurable<bool> cfgUseAbsDCA{"cfgUseAbsDCA", true, "Minimise abs. distance rather than chi2"};
177183
Configurable<double> cfgMaxR{"cfgMaxR", 200., "reject PCA's above this radius"};
178184
Configurable<double> cfgMaxDZIni{"cfgMaxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"};
@@ -189,6 +195,7 @@ struct NonPromptCascadeTask {
189195

190196
Zorro mZorro;
191197
OutputObj<ZorroSummary> mZorroSummary{"ZorroSummary"};
198+
SliceCache cache;
192199

193200
Service<o2::ccdb::BasicCCDBManager> mCCDB;
194201
int mRunNumber = 0;
@@ -212,7 +219,7 @@ struct NonPromptCascadeTask {
212219

213220
if (static_cast<o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value) == o2::base::Propagator::MatCorrType::USEMatCorrLUT) {
214221
auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(mCCDB->getForRun<o2::base::MatLayerCylSet>("GLO/Param/MatLUT", mRunNumber));
215-
o2::base::Propagator::Instance(true)->setMatLUT(lut);
222+
o2::base::Propagator::Instance()->setMatLUT(lut);
216223
}
217224
}
218225

@@ -244,6 +251,38 @@ struct NonPromptCascadeTask {
244251
}
245252
}
246253

254+
template <typename CollisionType, typename TrackType>
255+
bool recalculatePV(CollisionType const& collision, TrackType const& tracks, int idToRemove, o2::dataformats::VertexBase& primaryVertex)
256+
{
257+
// slice tracks by collision
258+
o2::vertexing::PVertexer vertexer;
259+
std::vector<o2::track::TrackParCov> pvContributors = {};
260+
std::vector<bool> pvContributorsMask = {};
261+
262+
auto tracksInCollision = doprocessTrackedCascadesMC ? tracks.sliceBy(perCollisionMC, collision.globalIndex()) : tracks.sliceBy(perCollision, collision.globalIndex());
263+
// loop over tracks
264+
for (auto const& trkInColl : tracksInCollision) { // Loop on tracks
265+
if (trkInColl.isPVContributor()) {
266+
pvContributors.push_back(getTrackParCov(trkInColl));
267+
idToRemove == trkInColl.globalIndex() ? pvContributorsMask.push_back(false) : pvContributorsMask.push_back(true);
268+
}
269+
}
270+
LOG(debug) << "Tracks pushed to the vector: " << pvContributors.size();
271+
vertexer.init();
272+
bool canRefit = vertexer.prepareVertexRefit(pvContributors, primaryVertex);
273+
if (!canRefit) {
274+
return false;
275+
}
276+
// refit the vertex
277+
auto newPV = vertexer.refitVertex(pvContributorsMask, primaryVertex);
278+
// set the new vertex to primaryVertex
279+
primaryVertex.setX(newPV.getX());
280+
primaryVertex.setY(newPV.getY());
281+
primaryVertex.setZ(newPV.getZ());
282+
primaryVertex.setCov(newPV.getCov());
283+
return true;
284+
}
285+
247286
void zorroAccounting(const auto& collisions)
248287
{
249288
if (cfgSkimmedProcessing) {
@@ -261,7 +300,7 @@ struct NonPromptCascadeTask {
261300
}
262301

263302
template <typename TrackType, typename CollisionType>
264-
void fillCandidatesVector(CollisionType const&, auto const& cascades, auto& candidates)
303+
void fillCandidatesVector(CollisionType const&, TrackType const& tracks, auto const& cascades, auto& candidates)
265304
{
266305

267306
const auto& getCascade = [](auto const& candidate) {
@@ -279,7 +318,7 @@ struct NonPromptCascadeTask {
279318
auto bc = collision.template bc_as<aod::BCsWithTimestamps>();
280319
initCCDB(bc);
281320

282-
const auto primaryVertex = getPrimaryVertex(collision);
321+
auto primaryVertex = getPrimaryVertex(collision);
283322

284323
const auto& casc = getCascade(candidate);
285324
const auto& bachelor = casc.template bachelor_as<TrackType>();
@@ -435,6 +474,11 @@ struct NonPromptCascadeTask {
435474
if constexpr (requires { candidate.track(); }) {
436475
const auto& track = candidate.template track_as<TrackType>();
437476
const auto& ITStrack = candidate.template itsTrack_as<TrackType>();
477+
if (cfgRedoPV && ITStrack.isPVContributor()) {
478+
if (!recalculatePV(collision, tracks, ITStrack.globalIndex(), primaryVertex)) {
479+
continue;
480+
}
481+
}
438482
cascPVContribs |= ITStrack.isPVContributor() << 0;
439483
auto trackTrkParCov = getTrackParCov(track);
440484
o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackTrkParCov, mBz, 2.f, matCorr, &motherDCA);
@@ -555,19 +599,19 @@ struct NonPromptCascadeTask {
555599

556600
void processTrackedCascadesMC(CollisionCandidatesRun3MC const& collisions,
557601
aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/,
558-
aod::V0s const& /*v0s*/, TracksExtMC const& /*tracks*/,
602+
aod::V0s const& /*v0s*/, TracksExtMC const& tracks,
559603
aod::McParticles const& mcParticles, aod::McCollisions const&, aod::BCsWithTimestamps const&)
560604
{
561-
fillCandidatesVector<TracksExtMC>(collisions, trackedCascades, gCandidates);
605+
fillCandidatesVector<TracksExtMC>(collisions, tracks, trackedCascades, gCandidates);
562606
fillMCtable<aod::AssignedTrackedCascades>(mcParticles, collisions, gCandidates);
563607
}
564608
PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesMC, "process cascades from strangeness tracking: MC analysis", true);
565609

566610
void processCascadesMC(CollisionCandidatesRun3MC const& collisions, aod::Cascades const& cascades,
567-
aod::V0s const& /*v0s*/, TracksExtMC const& /*tracks*/,
611+
aod::V0s const& /*v0s*/, TracksExtMC const& tracks,
568612
aod::McParticles const& mcParticles, aod::McCollisions const&, aod::BCsWithTimestamps const&)
569613
{
570-
fillCandidatesVector<TracksExtMC>(collisions, cascades, gCandidatesNT);
614+
fillCandidatesVector<TracksExtMC>(collisions, tracks, cascades, gCandidatesNT);
571615
fillMCtable<aod::Cascades>(mcParticles, collisions, gCandidatesNT);
572616
}
573617
PROCESS_SWITCH(NonPromptCascadeTask, processCascadesMC, "process cascades: MC analysis", false);
@@ -603,21 +647,21 @@ struct NonPromptCascadeTask {
603647

604648
void processTrackedCascadesData(CollisionCandidatesRun3 const& collisions,
605649
aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/,
606-
aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/,
650+
aod::V0s const& /*v0s*/, TracksExtData const& tracks,
607651
aod::BCsWithTimestamps const&)
608652
{
609653
zorroAccounting(collisions);
610-
fillCandidatesVector<TracksExtData>(collisions, trackedCascades, gCandidates);
654+
fillCandidatesVector<TracksExtData>(collisions, tracks, trackedCascades, gCandidates);
611655
fillDataTable<aod::AssignedTrackedCascades>(gCandidates);
612656
}
613657
PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesData, "process cascades from strangeness tracking: Data analysis", false);
614658

615659
void processCascadesData(CollisionCandidatesRun3 const& collisions, aod::Cascades const& cascades,
616-
aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/,
660+
aod::V0s const& /*v0s*/, TracksExtData const& tracks,
617661
aod::BCsWithTimestamps const&)
618662
{
619663
zorroAccounting(collisions);
620-
fillCandidatesVector<TracksExtData>(collisions, cascades, gCandidatesNT);
664+
fillCandidatesVector<TracksExtData>(collisions, tracks, cascades, gCandidatesNT);
621665
fillDataTable<aod::Cascades>(gCandidatesNT);
622666
}
623667
PROCESS_SWITCH(NonPromptCascadeTask, processCascadesData, "process cascades: Data analysis", false);

0 commit comments

Comments
 (0)