Skip to content

Commit 89cf1d9

Browse files
committed
Adapt MC validation task to HF time-based definition of amb tracks
1 parent e999d1b commit 89cf1d9

1 file changed

Lines changed: 21 additions & 72 deletions

File tree

PWGHF/Tasks/taskMcValidation.cxx

Lines changed: 21 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
///
1616
/// \author Antonio Palasciano <antonio.palasciano@cern.ch>, Università degli Studi di Bari & INFN, Sezione di Bari
1717
/// \author Vít Kučera <vit.kucera@cern.ch>, CERN
18+
/// \author Fabrizio Grosa <fabrizio.grosa@cern.ch>, CERN
1819

20+
#include "Common/DataModel/CollisionAssociation.h"
1921
#include "Framework/AnalysisTask.h"
2022
#include "Framework/HistogramRegistry.h"
2123
#include "Framework/runDataProcessing.h"
@@ -43,69 +45,12 @@ static const std::array<std::string, 2> originNames = {"Prompt", "NonPrompt"};
4345
/// Add relevant information about ambiguous tracks
4446
namespace o2::aod
4547
{
46-
// Columns to store the information about ambiguous tracks joinable with the track table
47-
DECLARE_SOA_COLUMN(IsAmbiguousTrack, isAmbiguousTrack, bool); //!
48-
DECLARE_SOA_COLUMN(NumBC, numBC, int); //!
49-
DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(AmbiguousCollisionIndices, ambiguousCollisionIndices); //!
50-
DECLARE_SOA_TABLE(TracksWithAmbiguousCollisionInfo, "AOD", "TRACKSWAMBINFO", //!
51-
IsAmbiguousTrack,
52-
NumBC,
53-
AmbiguousCollisionIndicesIds);
54-
5548
// Columns to store the information about the presence of HF signals in a MC collision
5649
DECLARE_SOA_COLUMN(HasHFsignal, hasHFsignal, bool); //!
5750
DECLARE_SOA_TABLE(CollWithHFSignal, "AOD", "COLLWHFSIGNAL", //!
5851
HasHFsignal);
5952
} // namespace o2::aod
6053

61-
struct HfTaskMcValidationAddAmbiguousTrackInfo {
62-
Produces<o2::aod::TracksWithAmbiguousCollisionInfo> trackWithAmbiguousInfo;
63-
64-
using TracksWithSel = soa::Join<aod::Tracks, aod::TrackSelection>;
65-
66-
void process(TracksWithSel const& tracks,
67-
aod::AmbiguousTracks const& ambitracks,
68-
aod::Collisions const& collisions,
69-
aod::BCs const&)
70-
{
71-
// loop over ambiguous tracks
72-
std::vector<int> trackIndices{};
73-
std::vector<int> ambTrackIndices{};
74-
for (auto& ambitrack : ambitracks) {
75-
auto track = ambitrack.track_as<TracksWithSel>(); // Obtain the corresponding track
76-
if (track.isGlobalTrackWoDCA()) { // add info only for global tracks
77-
trackIndices.push_back(track.globalIndex());
78-
ambTrackIndices.push_back(ambitrack.globalIndex());
79-
}
80-
}
81-
// loop over tracks
82-
for (auto& track : tracks) {
83-
std::vector<int> collIndices{};
84-
bool isAmbiguous = false;
85-
std::size_t nBC = 0;
86-
if (track.isGlobalTrackWoDCA()) { // add info only for global tracks
87-
auto trackIdx = track.globalIndex();
88-
auto iter = std::find(trackIndices.begin(), trackIndices.end(), trackIdx);
89-
if (iter != trackIndices.end()) {
90-
isAmbiguous = true;
91-
auto ambitrack = ambitracks.rawIteratorAt(ambTrackIndices[std::distance(trackIndices.begin(), iter)]);
92-
nBC = ambitrack.bc().size();
93-
for (auto& collision : collisions) {
94-
uint64_t mostProbableBC = collision.bc().globalBC();
95-
for (auto& bc : ambitrack.bc()) {
96-
if (bc.globalBC() == mostProbableBC) {
97-
collIndices.push_back(collision.globalIndex());
98-
break;
99-
}
100-
}
101-
}
102-
}
103-
}
104-
trackWithAmbiguousInfo(isAmbiguous, nBC, collIndices);
105-
}
106-
}
107-
};
108-
10954
/// Generated Level Validation
11055
///
11156
/// - Number of HF quarks produced per collision
@@ -361,8 +306,8 @@ struct HfTaskMcValidationRec {
361306
using HfCand2ProngWithMCRec = soa::Join<aod::HfCand2Prong, aod::HfCand2ProngMcRec>;
362307
using HfCand3ProngWithMCRec = soa::Join<aod::HfCand3Prong, aod::HfCand3ProngMcRec>;
363308
using CollisionsWithMCLabels = soa::Join<aod::Collisions, aod::McCollisionLabels>;
364-
using TracksWithSel = soa::Join<aod::BigTracksMC, aod::TrackSelection, aod::TracksWithAmbiguousCollisionInfo>;
365-
using mcCollisionWithHFSignalInfo = soa::Join<aod::McCollisions, aod::CollWithHFSignal>;
309+
using TracksWithSel = soa::Join<aod::BigTracksMC, aod::TrackSelection, aod::TrackCompColls>;
310+
using McCollisionWithHFSignalInfo = soa::Join<aod::McCollisions, aod::CollWithHFSignal>;
366311

367312
Partition<TracksWithSel> tracksFilteredGlobalTrackWoDCA = requireGlobalTrackWoDCAInFilter();
368313
Partition<TracksWithSel> tracksInAcc = requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks);
@@ -386,7 +331,6 @@ struct HfTaskMcValidationRec {
386331
{"histYvtxReco", "Position of reco PV in #it{Y};#it{Y}^{reco} (cm);entries", {HistType::kTH1F, {axisDeltaVtx}}},
387332
{"histZvtxReco", "Position of reco PV in #it{Z};#it{Z}^{reco} (cm);entries", {HistType::kTH1F, {{200, -20, 20.}}}},
388333
{"histDeltaZvtx", "Residual distribution of PV in #it{Z} as a function of number of contributors;number of contributors;#it{Z}^{reco} - #it{Z}^{gen} (cm);entries", {HistType::kTH2F, {{100, -0.5, 99.5}, {1000, -0.5, 0.5}}}},
389-
{"histAmbiguousTrackNumBC", "Number of BCs associated to an ambiguous track;number of BCs;entries", {HistType::kTH1F, {{100, 0., 100.}}}},
390334
{"histAmbiguousTrackNumCollisions", "Number of collisions associated to an ambiguous track;number of collisions;entries", {HistType::kTH1F, {{30, -0.5, 29.5}}}},
391335
{"histAmbiguousTrackZvtxRMS", "RMS of #it{Z}^{reco} of collisions associated to a track;RMS(#it{Z}^{reco}) (cm);entries", {HistType::kTH1F, {{100, 0., 0.5}}}},
392336
{"histFracGoodContributors", "Fraction of PV contributors originating from the correct collision;fraction;entries", {HistType::kTH1F, {{101, 0., 1.01}}}},
@@ -453,14 +397,20 @@ struct HfTaskMcValidationRec {
453397
histContributors->GetXaxis()->SetBinLabel(2, "wrong MC collision");
454398
}
455399

456-
void process(HfCand2ProngWithMCRec const& cand2Prongs, HfCand3ProngWithMCRec const& cand3Prongs, TracksWithSel const& tracks, aod::McParticles const& particlesMC, mcCollisionWithHFSignalInfo const& mcCollisions, CollisionsWithMCLabels const& collisions, aod::BCs const&)
400+
void process(HfCand2ProngWithMCRec const& cand2Prongs,
401+
HfCand3ProngWithMCRec const& cand3Prongs,
402+
TracksWithSel const& tracks,
403+
aod::McParticles const& particlesMC,
404+
McCollisionWithHFSignalInfo const& mcCollisions,
405+
CollisionsWithMCLabels const& collisions,
406+
aod::BCs const&)
457407
{
458408
// loop over collisions
459409
for (auto collision = collisions.begin(); collision != collisions.end(); ++collision) {
460410
if (!collision.has_mcCollision()) {
461411
continue;
462412
}
463-
auto mcCollision = collision.mcCollision_as<mcCollisionWithHFSignalInfo>();
413+
auto mcCollision = collision.mcCollision_as<McCollisionWithHFSignalInfo>();
464414
if (checkAmbiguousTracksWithHfEventsOnly && !mcCollision.hasHFsignal()) {
465415
continue;
466416
}
@@ -534,19 +484,19 @@ struct HfTaskMcValidationRec {
534484
if (track.has_mcParticle()) {
535485
auto particle = track.mcParticle(); // get corresponding MC particle to check origin
536486
if (checkAmbiguousTracksWithHfEventsOnly) {
537-
auto mcCollision = particle.mcCollision_as<mcCollisionWithHFSignalInfo>();
487+
auto mcCollision = particle.mcCollision_as<McCollisionWithHFSignalInfo>();
538488
if (!mcCollision.hasHFsignal()) {
539489
continue;
540490
}
541491
}
542492
auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true);
543493
histTracks->Fill(origin, track.pt());
544-
if (track.isAmbiguousTrack()) {
545-
registry.fill(HIST("histAmbiguousTrackNumBC"), track.numBC());
546-
registry.fill(HIST("histAmbiguousTrackNumCollisions"), track.ambiguousCollisionIndicesIds().size());
494+
bool isAmbiguous = (track.compatibleCollIds().size() != 1);
495+
if (isAmbiguous) {
496+
registry.fill(HIST("histAmbiguousTrackNumCollisions"), track.compatibleCollIds().size());
547497
histAmbiguousTracks->Fill(origin, track.pt());
548498
std::vector<double> ambCollPosZ{};
549-
for (auto& collIdx : track.ambiguousCollisionIndicesIds()) {
499+
for (auto& collIdx : track.compatibleCollIds()) {
550500
auto ambCollision = collisions.rawIteratorAt(collIdx);
551501
ambCollPosZ.push_back(ambCollision.posZ());
552502
}
@@ -555,13 +505,13 @@ struct HfTaskMcValidationRec {
555505
float deltaZ = -999.f;
556506
if (index) {
557507
auto collision = track.collision_as<CollisionsWithMCLabels>();
558-
auto mcCollision = particle.mcCollision_as<mcCollisionWithHFSignalInfo>();
508+
auto mcCollision = particle.mcCollision_as<McCollisionWithHFSignalInfo>();
559509
deltaZ = collision.posZ() - mcCollision.posZ();
560510
if (collision.has_mcCollision() && collision.mcCollisionId() == particle.mcCollisionId()) {
561511
histOriginTracks[index + 1]->Fill(origin, track.pt(), track.eta(), deltaZ, track.isPVContributor(), track.hasTOF(), nITSlayers);
562-
} else { // if the most probable collision is not the good one, check if the tracks is ambiguous
563-
if (track.isAmbiguousTrack()) {
564-
for (auto& collIdx : track.ambiguousCollisionIndicesIds()) {
512+
} else { // if the default associated collision is not the good one, check if the tracks is ambiguous
513+
if (isAmbiguous) {
514+
for (auto& collIdx : track.compatibleCollIds()) {
565515
auto ambCollision = collisions.rawIteratorAt(collIdx);
566516

567517
if (ambCollision.has_mcCollision() && ambCollision.mcCollisionId() == particle.mcCollisionId()) {
@@ -718,7 +668,6 @@ struct HfTaskMcValidationRec {
718668
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
719669
{
720670
WorkflowSpec workflow{
721-
adaptAnalysisTask<HfTaskMcValidationAddAmbiguousTrackInfo>(cfgc),
722671
adaptAnalysisTask<HfTaskMcValidationGen>(cfgc),
723672
adaptAnalysisTask<HfTaskMcValidationRec>(cfgc)};
724673
return workflow;

0 commit comments

Comments
 (0)