@@ -283,6 +283,7 @@ struct OnTheFlyTracker {
283283 const float time = 0 ,
284284 const float timeError = 1 ,
285285 bool decayDauInput = false ,
286+ bool isPVContributorInput = false ,
286287 bool weakDecayDauInput = false ,
287288 int isUsedInCascadingInput = 0 ,
288289 int nSiliconHitsInput = 0 ,
@@ -291,6 +292,7 @@ struct OnTheFlyTracker {
291292 mcLabel{label},
292293 timeEst{time, timeError},
293294 isDecayDau (decayDauInput),
295+ isPVContributor (isPVContributorInput),
294296 isWeakDecayDau (weakDecayDauInput),
295297 isUsedInCascading (isUsedInCascadingInput),
296298 nSiliconHits (nSiliconHitsInput),
@@ -300,6 +302,7 @@ struct OnTheFlyTracker {
300302 int64_t mcLabel;
301303 TimeEst timeEst; // /< time estimate in ns
302304 bool isDecayDau;
305+ bool isPVContributor;
303306 bool isWeakDecayDau;
304307 int isUsedInCascading; // 0: not at all, 1: is a cascade, 2: is a bachelor, 3: is a pion, 4: is a proton
305308 int nSiliconHits;
@@ -992,13 +995,13 @@ struct OnTheFlyTracker {
992995 thisCascade.cascadeTrackId = trackTableOffset + 4 ;
993996
994997 float trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
995- tracksCascadeProngs.push_back (TrackAlice3{xiDaughterTrackParCovsPerfect[0 ], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , true , 1 , -1 , -1 , TrackType::kGenCascDaug });
998+ tracksCascadeProngs.push_back (TrackAlice3{xiDaughterTrackParCovsPerfect[0 ], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , false , true , 1 , -1 , -1 , TrackType::kGenCascDaug });
996999 trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
997- tracksCascadeProngs.push_back (TrackAlice3{xiDaughterTrackParCovsPerfect[1 ], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , true , 2 , -1 , -1 , TrackType::kGenCascDaug });
1000+ tracksCascadeProngs.push_back (TrackAlice3{xiDaughterTrackParCovsPerfect[1 ], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , false , true , 2 , -1 , -1 , TrackType::kGenCascDaug });
9981001 trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
999- tracksCascadeProngs.push_back (TrackAlice3{xiDaughterTrackParCovsPerfect[2 ], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , true , 3 , -1 , -1 , TrackType::kGenCascDaug });
1002+ tracksCascadeProngs.push_back (TrackAlice3{xiDaughterTrackParCovsPerfect[2 ], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , false , true , 3 , -1 , -1 , TrackType::kGenCascDaug });
10001003 trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
1001- tracksCascadeProngs.push_back (TrackAlice3{perfectCascadeTrack, mcParticle.globalIndex (), trackTime, timeResolutionUs, true , true , 3 , -1 , -1 , TrackType::kGenCascDaug });
1004+ tracksCascadeProngs.push_back (TrackAlice3{perfectCascadeTrack, mcParticle.globalIndex (), trackTime, timeResolutionUs, true , false , true , 3 , -1 , -1 , TrackType::kGenCascDaug });
10021005
10031006 for (int i = 0 ; i < kCascProngs ; i++) {
10041007 isReco[i] = false ;
@@ -1049,7 +1052,7 @@ struct OnTheFlyTracker {
10491052 trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
10501053 // TODO: add flag for whether it's a ghost track or not, currently assuming all are reconstructed tracks if they pass the fast tracker requirements
10511054 TrackType trackType = isReco[i] ? TrackType::kRecoCascDaug : TrackType::kGenCascDaug ;
1052- tracksCascadeProngs[i] = TrackAlice3{xiDaughterTrackParCovsTracked[i], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , true , i + 2 , nSiliconHitsCascadeProngs[i], nTPCHitsCascadeProngs[i], trackType};
1055+ tracksCascadeProngs[i] = TrackAlice3{xiDaughterTrackParCovsTracked[i], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , false , true , i + 2 , nSiliconHitsCascadeProngs[i], nTPCHitsCascadeProngs[i], trackType};
10531056 }
10541057
10551058 bool tryKinkReco = false ;
@@ -1260,7 +1263,7 @@ struct OnTheFlyTracker {
12601263 return ; // We didn't find enough hits for strangeness tracking
12611264 }
12621265 }
1263- tracksCascadeProngs[kCascProngs ] = TrackAlice3{cascadeTrack, mcParticle.globalIndex (), trackTime, timeResolutionUs, false , false , 1 , thisCascade.foundClusters , TrackType::kGenCascDaug };
1266+ tracksCascadeProngs[kCascProngs ] = TrackAlice3{cascadeTrack, mcParticle.globalIndex (), trackTime, timeResolutionUs, false , false , false , 1 , thisCascade.foundClusters , TrackType::kGenCascDaug };
12641267 fillCascadeTable = true ;
12651268 }
12661269 }
@@ -1331,7 +1334,7 @@ struct OnTheFlyTracker {
13311334 newCascadeTrack.setPID (pdgCodeToPID (PDG_t::kXiMinus )); // FIXME: not OK for omegas
13321335 float trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
13331336 if (reconstructedCascade) {
1334- tracksCascadeProngs[kCascProngs + 1 ] = TrackAlice3{newCascadeTrack, mcParticle.globalIndex (), trackTime, timeResolutionUs, false , false , 1 , thisCascade.foundClusters , TrackType::kRecoCascDaug };
1337+ tracksCascadeProngs[kCascProngs + 1 ] = TrackAlice3{newCascadeTrack, mcParticle.globalIndex (), trackTime, timeResolutionUs, false , false , false , 1 , thisCascade.foundClusters , TrackType::kRecoCascDaug };
13351338 }
13361339 fillCascadeTable = true ;
13371340 } // end fitter OK
@@ -1482,9 +1485,9 @@ struct OnTheFlyTracker {
14821485
14831486 // Store not reconstructed daughters, will update them in case reconstruction is successful
14841487 float trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
1485- tracksV0Daugs.push_back (TrackAlice3{v0DaughterTrackParCovsPerfect[0 ], mcParticle.globalIndex (), 0 .f , timeResolutionUs, true , true , 1 , TrackType::kGhostV0Daug });
1488+ tracksV0Daugs.push_back (TrackAlice3{v0DaughterTrackParCovsPerfect[0 ], mcParticle.globalIndex (), 0 .f , timeResolutionUs, true , false , true , 1 , TrackType::kGhostV0Daug });
14861489 trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
1487- tracksV0Daugs.push_back (TrackAlice3{v0DaughterTrackParCovsPerfect[1 ], mcParticle.globalIndex (), 0 .f , timeResolutionUs, true , true , 1 , TrackType::kGhostV0Daug });
1490+ tracksV0Daugs.push_back (TrackAlice3{v0DaughterTrackParCovsPerfect[1 ], mcParticle.globalIndex (), 0 .f , timeResolutionUs, true , false , true , 1 , TrackType::kGhostV0Daug });
14881491
14891492 bool fillV0Table{false };
14901493 for (int i = 0 ; i < kv0Prongs; i++) {
@@ -1521,7 +1524,7 @@ struct OnTheFlyTracker {
15211524 trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
15221525 // TODO: flag to separate ghost and reco tracks
15231526 TrackType trackType = isV0Reco[i] ? TrackType::kRecoV0Daug : TrackType::kGhostV0Daug ;
1524- tracksV0Daugs[i] = TrackAlice3{v0DaughterTrackParCovsTracked[i], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , true , i + 2 , trackType};
1527+ tracksV0Daugs[i] = TrackAlice3{v0DaughterTrackParCovsTracked[i], mcParticle.globalIndex (), trackTime, timeResolutionUs, true , false , true , i + 2 , trackType};
15251528 }
15261529 if (v0DecaySettings.doV0QA ) {
15271530 if (isV0Reco[0 ] && isV0Reco[1 ]) {
@@ -1672,8 +1675,8 @@ struct OnTheFlyTracker {
16721675 // / \param prmTrks the vector of tracks to be used for vertex reconstruction
16731676 // / \param primaryVertex the output variable where the computed primary vertex will be stored
16741677 // / \param icfg index of the current configuration, used for histogram filling
1675- template <typename McCollisionType, typename TrackType >
1676- void computeVertex (McCollisionType& mcCollision, const std::vector<TrackType >& prmTrks, o2::vertexing::PVertex& primaryVertex, const int icfg)
1678+ template <typename McCollisionType, typename TrackT >
1679+ void computeVertex (McCollisionType& mcCollision, std::vector<TrackT >& prmTrks, o2::vertexing::PVertex& primaryVertex, const int icfg)
16771680 {
16781681
16791682 if (!enablePrimaryVertexing) {
@@ -1725,7 +1728,18 @@ struct OnTheFlyTracker {
17251728 largestVertex = iv;
17261729 }
17271730 }
1731+
17281732 primaryVertex = vertices[largestVertex];
1733+
1734+ const auto & contributorRef = v2tRefs[largestVertex];
1735+ const int first = contributorRef.getFirstEntry ();
1736+ const int end = first + contributorRef.getEntries ();
1737+
1738+ for (int i = first; i < end; ++i) {
1739+ const auto trackIndex = vertexTrackIDs[i].getIndex ();
1740+ prmTrks[trackIndex].isPVContributor = true ;
1741+ }
1742+
17291743 if (doExtraQA) {
17301744 histos.fill (HIST (" h2dVerticesVsContributors" ), primaryVertex.getNContributors (), n_vertices);
17311745 }
@@ -1776,7 +1790,7 @@ struct OnTheFlyTracker {
17761790 trackParCov.getSigmaTgl2 (), trackParCov.getSigma1PtY (), trackParCov.getSigma1PtZ (), trackParCov.getSigma1PtSnp (), trackParCov.getSigma1PtTgl (),
17771791 trackParCov.getSigma1Pt2 ());
17781792 tableMcTrackLabels (trackParCov.mcLabel , 0 );
1779- tableTracksExtraA3 (trackParCov.nSiliconHits , trackParCov.nTPCHits , trackParCov.trackType , true );
1793+ tableTracksExtraA3 (trackParCov.nSiliconHits , trackParCov.nTPCHits , trackParCov.trackType , trackParCov. isPVContributor );
17801794
17811795 // populate extra tables if required to do so
17821796 if (populateTracksExtra) {
@@ -1969,10 +1983,11 @@ struct OnTheFlyTracker {
19691983 // Time associated to the mcParticle: collision time + smearing
19701984 float trackTime = (eventCollisionTimeNS + gRandom ->Gaus (0 ., timeResolutionNs)) * nsToMus;
19711985 TrackType trackType = reconstructed ? TrackType::kRecoPrimary : TrackType::kGhostPrimary ;
1986+ bool isPVContributor = trackType == TrackType::kRecoPrimary ;
19721987 if (reconstructed) {
1973- recoPrimaries.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), trackTime, timeResolutionUs, isDecayDaughter, false , 0 , nTrkHits, trackType});
1988+ recoPrimaries.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), trackTime, timeResolutionUs, isDecayDaughter, isPVContributor, false , 0 , nTrkHits, trackType});
19741989 } else {
1975- ghostPrimaries.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), trackTime, timeResolutionUs, isDecayDaughter, false , 0 , nTrkHits, trackType});
1990+ ghostPrimaries.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), trackTime, timeResolutionUs, isDecayDaughter, isPVContributor, false , 0 , nTrkHits, trackType});
19761991 }
19771992 }
19781993
@@ -2194,10 +2209,10 @@ struct OnTheFlyTracker {
21942209 }
21952210
21962211 if (reconstructed) {
2197- tracksAlice3.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), time, timeResolutionUs, isSecondary, false , 0 , nTrkHits, kRecoPrimary });
2212+ tracksAlice3.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), time, timeResolutionUs, isSecondary, false , true , false , 0 , nTrkHits, kRecoPrimary });
21982213 getHist (TH1 , histPath + " hPtReconstructedPr" )->Fill (trackParCov.getPt ());
21992214 } else {
2200- ghostTracksAlice3.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), time, timeResolutionUs, isSecondary, false , 0 , nTrkHits, kGhostPrimary });
2215+ ghostTracksAlice3.push_back (TrackAlice3{trackParCov, mcParticle.globalIndex (), time, timeResolutionUs, isSecondary, false , false , false , 0 , nTrkHits, kGhostPrimary });
22012216 }
22022217 }
22032218
0 commit comments