@@ -198,6 +198,7 @@ struct cascadeBuilder {
198198 // Define o2 fitter, 2-prong, active memory (no need to redefine per event)
199199 o2::vertexing::DCAFitterN<2 > fitter;
200200 enum cascstep { kCascAll = 0 ,
201+ kCascHasV0Data ,
201202 kCascLambdaMass ,
202203 kBachTPCrefit ,
203204 kBachDCAxy ,
@@ -254,12 +255,11 @@ struct cascadeBuilder {
254255
255256 HistogramRegistry registry{
256257 " registry" ,
257- {{" hEventCounter" , " hEventCounter" , {HistType::kTH1F , {{1 , 0 .0f , 1 .0f }}}},
258- {" hCaughtExceptions" , " hCaughtExceptions" , {HistType::kTH1F , {{1 , 0 .0f , 1 .0f }}}},
259- {" hPositiveITSClusters" , " hPositiveITSClusters" , {HistType::kTH1F , {{10 , -0 .5f , 9 .5f }}}},
260- {" hNegativeITSClusters" , " hNegativeITSClusters" , {HistType::kTH1F , {{10 , -0 .5f , 9 .5f }}}},
261- {" hBachelorITSClusters" , " hBachelorITSClusters" , {HistType::kTH1F , {{10 , -0 .5f , 9 .5f }}}},
262- {" hCascadeCriteria" , " hCascadeCriteria" , {HistType::kTH1F , {{10 , -0 .5f , 9 .5f }}}}}};
258+ {{" hEventCounter" , " hEventCounter" , {HistType::kTH1D , {{1 , 0 .0f , 1 .0f }}}},
259+ {" hCaughtExceptions" , " hCaughtExceptions" , {HistType::kTH1D , {{1 , 0 .0f , 1 .0f }}}},
260+ {" hPositiveITSClusters" , " hPositiveITSClusters" , {HistType::kTH1D , {{10 , -0 .5f , 9 .5f }}}},
261+ {" hNegativeITSClusters" , " hNegativeITSClusters" , {HistType::kTH1D , {{10 , -0 .5f , 9 .5f }}}},
262+ {" hBachelorITSClusters" , " hBachelorITSClusters" , {HistType::kTH1D , {{10 , -0 .5f , 9 .5f }}}}}};
263263
264264 void resetHistos ()
265265 {
@@ -294,6 +294,17 @@ struct cascadeBuilder {
294294 resetHistos ();
295295 registry.add (" hKFParticleStatistics" , " hKFParticleStatistics" , kTH1F , {{10 , -0 .5f , 9 .5f }});
296296
297+ auto h = registry.add <TH1>(" hCascadeCriteria" , " hCascadeCriteria" , kTH1D , {{10 , -0 .5f , 9 .5f }});
298+ h->GetXaxis ()->SetBinLabel (1 , " All sel" );
299+ h->GetXaxis ()->SetBinLabel (2 , " has V0Data" );
300+ h->GetXaxis ()->SetBinLabel (3 , " Lam mass" );
301+ h->GetXaxis ()->SetBinLabel (4 , " TPC refit" );
302+ h->GetXaxis ()->SetBinLabel (5 , " track DCAxy" );
303+ h->GetXaxis ()->SetBinLabel (6 , " DCA dau" );
304+ h->GetXaxis ()->SetBinLabel (7 , " CosPA" );
305+ h->GetXaxis ()->SetBinLabel (8 , " Radius" );
306+ h->GetXaxis ()->SetBinLabel (9 , " Tracked" );
307+
297308 // Optionally, add extra QA histograms to processing chain
298309 if (d_doQA) {
299310 // Basic histograms containing invariant masses of all built candidates
@@ -748,6 +759,9 @@ struct cascadeBuilder {
748759 template <class TTrackTo , typename TCascObject>
749760 bool buildCascadeCandidate (TCascObject const & cascade)
750761 {
762+ // value 0.5: any considered cascade
763+ statisticsRegistry.cascstats [kCascAll ]++;
764+
751765 // Track casting
752766 auto bachTrack = cascade.template bachelor_as <TTrackTo>();
753767 auto v0index = cascade.template v0_as <o2::aod::V0sLinked>();
@@ -770,7 +784,7 @@ struct cascadeBuilder {
770784 }
771785
772786 // value 0.5: any considered cascade
773- statisticsRegistry.cascstats [kCascAll ]++;
787+ statisticsRegistry.cascstats [kCascHasV0Data ]++;
774788
775789 // Overall cascade charge
776790 cascadecandidate.charge = bachTrack.signed1Pt () > 0 ? +1 : -1 ;
@@ -1607,6 +1621,9 @@ struct cascadePreselector {
16071621 // context-aware selections
16081622 Configurable<bool > dPreselectOnlyBaryons{" dPreselectOnlyBaryons" , false , " apply TPC dE/dx and quality only to baryon daughters" };
16091623
1624+ // extra QA
1625+ Configurable<bool > doQA{" doQA" , false , " do extra selector QA" };
1626+
16101627 // for bit-packed maps
16111628 std::vector<uint16_t > selectionMask;
16121629 enum v0bit { bitInteresting = 0 ,
@@ -1620,11 +1637,55 @@ struct cascadePreselector {
16201637 bitdEdxOmegaMinus,
16211638 bitdEdxOmegaPlus,
16221639 bitUsedInTrackedCascade };
1640+ enum trackbit { bitITS = 0 ,
1641+ bitTPC,
1642+ bitTRD,
1643+ bitTOF };
16231644
16241645 void init (InitContext const &)
16251646 {
1626- histos.add (" hPreselectorStatistics" , " hPreselectorStatistics" , kTH1F , {{5 , -0 .5f , 4 .5f }});
1647+ auto h = histos.add <TH1>(" hPreselectorStatistics" , " hPreselectorStatistics" , kTH1D , {{5 , -0 .5f , 4 .5f }});
1648+ h->GetXaxis ()->SetBinLabel (1 , " All" );
1649+ h->GetXaxis ()->SetBinLabel (2 , " Tracks OK" );
1650+ h->GetXaxis ()->SetBinLabel (3 , " MC label OK" );
1651+ h->GetXaxis ()->SetBinLabel (4 , " dEdx OK" );
1652+ h->GetXaxis ()->SetBinLabel (5 , " Used in tracked OK" );
1653+
1654+ if (doQA) {
1655+ const AxisSpec traPropAx{16 , -0 .5f , 15 .5f , " Track flags" };
1656+ histos.add (" hTrackStat" , " hTrackStat" , kTH3D , {traPropAx, traPropAx, traPropAx});
1657+
1658+ const AxisSpec nCluAx{10 , -0 .5f , 9 .5f , " N(ITS clu)" };
1659+ histos.add (" hPosNClu" , " hPosNClu" , kTH1D , {nCluAx});
1660+ histos.add (" hNegNClu" , " hNegNClu" , kTH1D , {nCluAx});
1661+ histos.add (" hBachNClu" , " hBachNClu" , kTH1D , {nCluAx});
1662+ histos.add (" hPosNCluNoTPC" , " hPosNCluNoTPC" , kTH1D , {nCluAx});
1663+ histos.add (" hNegNCluNoTPC" , " hNegNCluNoTPC" , kTH1D , {nCluAx});
1664+ histos.add (" hBachNCluNoTPC" , " hBachNCluNoTPC" , kTH1D , {nCluAx});
1665+ }
1666+ }
1667+
1668+ // *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
1669+ // / function to pack track properties into an uint16_t
1670+ template <class TTrackTo >
1671+ uint16_t packTrackProperties (TTrackTo const & track)
1672+ {
1673+ uint16_t prop = 0 ;
1674+ if (track.hasITS ()) {
1675+ bitset (prop, bitITS);
1676+ }
1677+ if (track.hasTPC ()) {
1678+ bitset (prop, bitTPC);
1679+ }
1680+ if (track.hasTRD ()) {
1681+ bitset (prop, bitTRD);
1682+ }
1683+ if (track.hasTOF ()) {
1684+ bitset (prop, bitTOF);
1685+ }
1686+ return prop;
16271687 }
1688+ // *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
16281689
16291690 // *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
16301691 // / function to check track quality
@@ -1642,6 +1703,23 @@ struct cascadePreselector {
16421703 auto lNegTrack = v0data.template negTrack_as <TTrackTo>();
16431704 auto lPosTrack = v0data.template posTrack_as <TTrackTo>();
16441705
1706+ if (doQA) {
1707+ histos.fill (HIST (" hTrackStat" ), packTrackProperties (lPosTrack), packTrackProperties (lNegTrack), packTrackProperties (lBachTrack));
1708+
1709+ histos.fill (HIST (" hPosNClu" ), lPosTrack.itsNCls ());
1710+ histos.fill (HIST (" hNegNClu" ), lNegTrack.itsNCls ());
1711+ histos.fill (HIST (" hBachNClu" ), lBachTrack.itsNCls ());
1712+ if (!lPosTrack.hasTPC ()) {
1713+ histos.fill (HIST (" hPosNCluNoTPC" ), lPosTrack.itsNCls ());
1714+ }
1715+ if (!lNegTrack.hasTPC ()) {
1716+ histos.fill (HIST (" hNegNCluNoTPC" ), lNegTrack.itsNCls ());
1717+ }
1718+ if (!lBachTrack.hasTPC ()) {
1719+ histos.fill (HIST (" hBachNCluNoTPC" ), lBachTrack.itsNCls ());
1720+ }
1721+ }
1722+
16451723 if ((bitcheck (maskElement, bitdEdxXiMinus) || bitcheck (maskElement, bitdEdxOmegaMinus) || passdEdx) && (lPosTrack.tpcNClsCrossedRows () >= dTPCNCrossedRows && (lNegTrack.tpcNClsCrossedRows () >= dTPCNCrossedRows || dPreselectOnlyBaryons) && (lBachTrack.tpcNClsCrossedRows () >= dTPCNCrossedRows || dPreselectOnlyBaryons)))
16461724 bitset (maskElement, bitTrackQuality);
16471725 if ((bitcheck (maskElement, bitdEdxXiPlus) || bitcheck (maskElement, bitdEdxOmegaPlus) || passdEdx) && (lNegTrack.tpcNClsCrossedRows () >= dTPCNCrossedRows && (lPosTrack.tpcNClsCrossedRows () >= dTPCNCrossedRows || dPreselectOnlyBaryons) && (lBachTrack.tpcNClsCrossedRows () >= dTPCNCrossedRows || dPreselectOnlyBaryons)))
@@ -1769,22 +1847,30 @@ struct cascadePreselector {
17691847 for (int ii = 0 ; ii < selectionMask.size (); ii++) {
17701848 histos.fill (HIST (" hPreselectorStatistics" ), 0 .0f ); // All cascades
17711849 bool validCascade = bitcheck (selectionMask[ii], bitTrackQuality);
1772- histos.fill (HIST (" hPreselectorStatistics" ), 1 .0f ); // pass MC assoc (if requested)
1850+ if (validCascade) {
1851+ histos.fill (HIST (" hPreselectorStatistics" ), 1 .0f ); // pass MC assoc (if requested)
1852+ }
17731853 if (doprocessBuildMCAssociated || doprocessBuildValiddEdxMCAssociated)
17741854 validCascade = validCascade && ((bitcheck (selectionMask[ii], bitTrueXiMinus) && dIfMCgenerateXiMinus) ||
17751855 (bitcheck (selectionMask[ii], bitTrueXiPlus) && dIfMCgenerateXiPlus) ||
17761856 (bitcheck (selectionMask[ii], bitTrueOmegaMinus) && dIfMCgenerateOmegaMinus) ||
17771857 (bitcheck (selectionMask[ii], bitTrueOmegaPlus) && dIfMCgenerateOmegaPlus));
1778- histos.fill (HIST (" hPreselectorStatistics" ), 2 .0f ); // pass MC assoc (if requested)
1858+ if (validCascade) {
1859+ histos.fill (HIST (" hPreselectorStatistics" ), 2 .0f ); // pass MC assoc (if requested)
1860+ }
17791861 if (doprocessBuildValiddEdx || doprocessBuildValiddEdxMCAssociated)
17801862 validCascade = validCascade && ((bitcheck (selectionMask[ii], bitdEdxXiMinus) && ddEdxPreSelectXiMinus) ||
17811863 (bitcheck (selectionMask[ii], bitdEdxXiPlus) && ddEdxPreSelectXiPlus) ||
17821864 (bitcheck (selectionMask[ii], bitdEdxOmegaMinus) && ddEdxPreSelectOmegaMinus) ||
17831865 (bitcheck (selectionMask[ii], bitdEdxOmegaPlus) && ddEdxPreSelectOmegaPlus));
1784- histos.fill (HIST (" hPreselectorStatistics" ), 3 .0f ); // pass dEdx (if requested)
1866+ if (validCascade) {
1867+ histos.fill (HIST (" hPreselectorStatistics" ), 3 .0f ); // pass dEdx (if requested)
1868+ }
17851869 if (doprocessSkipCascadesNotUsedInTrackedCascades)
17861870 validCascade = validCascade && bitcheck (selectionMask[ii], bitUsedInTrackedCascade);
1787- histos.fill (HIST (" hPreselectorStatistics" ), 4 .0f ); // All cascades
1871+ if (validCascade) {
1872+ histos.fill (HIST (" hPreselectorStatistics" ), 4 .0f ); // All cascades
1873+ }
17881874 casctags (validCascade,
17891875 bitcheck (selectionMask[ii], bitTrueXiMinus), bitcheck (selectionMask[ii], bitTrueXiPlus),
17901876 bitcheck (selectionMask[ii], bitTrueOmegaMinus), bitcheck (selectionMask[ii], bitTrueOmegaPlus),
0 commit comments