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
4446namespace 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
5649DECLARE_SOA_COLUMN (HasHFsignal, hasHFsignal, bool ); // !
5750DECLARE_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 {
718668WorkflowSpec 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