Skip to content

Commit 73617c5

Browse files
ddobrigkalibuild
authored andcommitted
Extra builder QA (AliceO2Group#3931)
* Extra builder QA * Please consider the following formatting changes (AliceO2Group#188) --------- Co-authored-by: ALICE Builder <alibuild@users.noreply.github.com>
1 parent 0179214 commit 73617c5

File tree

2 files changed

+133
-17
lines changed

2 files changed

+133
-17
lines changed

PWGLF/TableProducer/cascadebuilder.cxx

Lines changed: 98 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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),

PWGLF/TableProducer/lambdakzerobuilder.cxx

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,11 @@ struct lambdakzeroBuilder {
207207

208208
HistogramRegistry registry{
209209
"registry",
210-
{{"hEventCounter", "hEventCounter", {HistType::kTH1F, {{1, 0.0f, 1.0f}}}},
211-
{"hCaughtExceptions", "hCaughtExceptions", {HistType::kTH1F, {{1, 0.0f, 1.0f}}}},
212-
{"hPositiveITSClusters", "hPositiveITSClusters", {HistType::kTH1F, {{10, -0.5f, 9.5f}}}},
213-
{"hNegativeITSClusters", "hNegativeITSClusters", {HistType::kTH1F, {{10, -0.5f, 9.5f}}}},
214-
{"hV0Criteria", "hV0Criteria", {HistType::kTH1F, {{10, -0.5f, 9.5f}}}}}};
210+
{{"hEventCounter", "hEventCounter", {HistType::kTH1D, {{1, 0.0f, 1.0f}}}},
211+
{"hCaughtExceptions", "hCaughtExceptions", {HistType::kTH1D, {{1, 0.0f, 1.0f}}}},
212+
{"hPositiveITSClusters", "hPositiveITSClusters", {HistType::kTH1D, {{10, -0.5f, 9.5f}}}},
213+
{"hNegativeITSClusters", "hNegativeITSClusters", {HistType::kTH1D, {{10, -0.5f, 9.5f}}}},
214+
{"hV0Criteria", "hV0Criteria", {HistType::kTH1D, {{10, -0.5f, 9.5f}}}}}};
215215

216216
float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ)
217217
{
@@ -820,6 +820,9 @@ struct lambdakzeroBuilder {
820820
struct lambdakzeroPreselector {
821821
Produces<aod::V0Tags> v0tags; // MC tags
822822

823+
// for bookkeeping
824+
HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject};
825+
823826
Configurable<bool> dIfMCgenerateK0Short{"dIfMCgenerateK0Short", true, "if MC, generate MC true K0Short (yes/no)"};
824827
Configurable<bool> dIfMCgenerateLambda{"dIfMCgenerateLambda", true, "if MC, generate MC true Lambda (yes/no)"};
825828
Configurable<bool> dIfMCgenerateAntiLambda{"dIfMCgenerateAntiLambda", true, "if MC, generate MC true AntiLambda (yes/no)"};
@@ -864,6 +867,17 @@ struct lambdakzeroPreselector {
864867
bitUsedInCascade,
865868
bitUsedInTrackedCascade };
866869

870+
void init(InitContext const&)
871+
{
872+
auto h = histos.add<TH1>("hPreselectorStatistics", "hPreselectorStatistics", kTH1D, {{6, -0.5f, 5.5f}});
873+
h->GetXaxis()->SetBinLabel(1, "All");
874+
h->GetXaxis()->SetBinLabel(2, "Tracks OK");
875+
h->GetXaxis()->SetBinLabel(3, "MC label OK");
876+
h->GetXaxis()->SetBinLabel(4, "dEdx OK");
877+
h->GetXaxis()->SetBinLabel(5, "Used in Casc");
878+
h->GetXaxis()->SetBinLabel(6, "Used in Tra-Casc");
879+
}
880+
867881
//*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
868882
/// function to check track quality
869883
template <class TTrackTo, typename TV0Object>
@@ -982,25 +996,41 @@ struct lambdakzeroPreselector {
982996
{
983997
// parse + publish tag table now
984998
for (int ii = 0; ii < selectionMask.size(); ii++) {
999+
histos.fill(HIST("hPreselectorStatistics"), 0.0f); // all V0s
9851000
bool validV0 = bitcheck(selectionMask[ii], bitTrackQuality);
1001+
if (validV0) {
1002+
histos.fill(HIST("hPreselectorStatistics"), 1.0f); // pass track quality
1003+
}
9861004
if (doprocessBuildMCAssociated || doprocessBuildValiddEdxMCAssociated)
9871005
validV0 = validV0 && ((bitcheck(selectionMask[ii], bitTrueK0Short) && dIfMCgenerateK0Short) ||
9881006
(bitcheck(selectionMask[ii], bitTrueLambda) && dIfMCgenerateLambda) ||
9891007
(bitcheck(selectionMask[ii], bitTrueAntiLambda) && dIfMCgenerateAntiLambda) ||
9901008
(bitcheck(selectionMask[ii], bitTrueGamma) && dIfMCgenerateGamma) ||
9911009
(bitcheck(selectionMask[ii], bitTrueHypertriton) && dIfMCgenerateHypertriton) ||
9921010
(bitcheck(selectionMask[ii], bitTrueAntiHypertriton) && dIfMCgenerateAntiHypertriton));
1011+
if (validV0) {
1012+
histos.fill(HIST("hPreselectorStatistics"), 2.0f); // pass MC
1013+
}
9931014
if (doprocessBuildValiddEdx || doprocessBuildValiddEdxMCAssociated)
9941015
validV0 = validV0 && ((bitcheck(selectionMask[ii], bitdEdxK0Short) && ddEdxPreSelectK0Short) ||
9951016
(bitcheck(selectionMask[ii], bitdEdxLambda) && ddEdxPreSelectLambda) ||
9961017
(bitcheck(selectionMask[ii], bitdEdxAntiLambda) && ddEdxPreSelectAntiLambda) ||
9971018
(bitcheck(selectionMask[ii], bitdEdxGamma) && ddEdxPreSelectGamma) ||
9981019
(bitcheck(selectionMask[ii], bitdEdxHypertriton) && ddEdxPreSelectHypertriton) ||
9991020
(bitcheck(selectionMask[ii], bitdEdxAntiHypertriton) && ddEdxPreSelectAntiHypertriton));
1021+
if (validV0) {
1022+
histos.fill(HIST("hPreselectorStatistics"), 3.0f); // pass dEdx
1023+
}
10001024
if (doprocessSkipV0sNotUsedInCascades)
10011025
validV0 = validV0 && bitcheck(selectionMask[ii], bitUsedInCascade);
1026+
if (validV0) {
1027+
histos.fill(HIST("hPreselectorStatistics"), 4.0f); // pass used in casc
1028+
}
10021029
if (doprocessSkipV0sNotUsedInTrackedCascades)
10031030
validV0 = validV0 && bitcheck(selectionMask[ii], bitUsedInTrackedCascade);
1031+
if (validV0) {
1032+
histos.fill(HIST("hPreselectorStatistics"), 5.0f); // pass used in tracasc
1033+
}
10041034
v0tags(validV0,
10051035
bitcheck(selectionMask[ii], bitTrueGamma), bitcheck(selectionMask[ii], bitTrueK0Short), bitcheck(selectionMask[ii], bitTrueLambda),
10061036
bitcheck(selectionMask[ii], bitTrueAntiLambda), bitcheck(selectionMask[ii], bitTrueHypertriton), bitcheck(selectionMask[ii], bitTrueAntiHypertriton),

0 commit comments

Comments
 (0)