Skip to content

Commit 0e48b78

Browse files
committed
Added DCA histograms, started implementation of the efficiency analysis for the kinkbuilder algorithm in processFindable function
1 parent 5cfa046 commit 0e48b78

File tree

1 file changed

+66
-22
lines changed

1 file changed

+66
-22
lines changed

PWGLF/TableProducer/Strangeness/sigmaminustask.cxx

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,29 @@ struct sigmaminustask {
5555
{
5656
// Axes
5757
const AxisSpec ptAxis{100, -10, 10, "#it{p}_{T} (GeV/#it{c})"};
58-
const AxisSpec nSigmaPiAxis{1000, -1000, 1000, "n#sigma_{#pi}"};
59-
const AxisSpec nSigmaPrAxis{1000, -1000, 1000, "n#sigma_{p}"};
58+
const AxisSpec nSigmaPiAxis{60, -30, 30, "n#sigma_{#pi}"};
59+
const AxisSpec nSigmaPrAxis{60, -30, 30, "n#sigma_{p}"};
6060
const AxisSpec sigmaMassAxis{100, 1.1, 1.4, "m (GeV/#it{c}^{2})"};
6161
const AxisSpec xiMassAxis{100, 1.2, 1.6, "m_{#Xi} (GeV/#it{c}^{2})"};
6262
const AxisSpec pdgAxis{10001, -5000, 5000, "PDG code"};
6363
const AxisSpec vertexZAxis{100, -15., 15., "vrtx_{Z} [cm]"};
64+
const AxisSpec dcaMothAxis{100, 0, 1, "DCA [cm]"};
65+
const AxisSpec dcaDaugAxis{200, 0, 20, "DCA [cm]"};
6466

6567
const AxisSpec ptResolutionAxis{100, -0.5, 0.5, "#it{p}_{T}^{rec} - #it{p}_{T}^{gen} (GeV/#it{c})"};
6668
const AxisSpec massResolutionAxis{100, -0.1, 0.1, "m_{rec} - m_{gen} (GeV/#it{c}^{2})"};
69+
6770
const AxisSpec boolAxis{2, -0.5, 1.5, "Boolean value (0=false, 1=true)"};
71+
const AxisSpec filtersAxis{10, -0.5, 9.5, "Filter index"};
72+
6873
// Event selection
6974
rEventSelection.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}});
7075
// Sigma-minus reconstruction
7176
rSigmaMinus.add("h2MassSigmaMinusPt", "h2MassSigmaMinusPt", {HistType::kTH2F, {ptAxis, sigmaMassAxis}});
7277
rSigmaMinus.add("h2SigmaMassVsXiMass", "h2SigmaMassVsXiMass", {HistType::kTH2F, {xiMassAxis, sigmaMassAxis}});
7378
rSigmaMinus.add("h2NSigmaTPCPiPt", "h2NSigmaTPCPiPt", {HistType::kTH2F, {ptAxis, nSigmaPiAxis}});
79+
rSigmaMinus.add("h2DCAMothPt", "h2DCAMothPt", {HistType::kTH2F, {ptAxis, dcaMothAxis}});
80+
rSigmaMinus.add("h2DCADaugPt", "h2DCADaugPt", {HistType::kTH2F, {ptAxis, dcaDaugAxis}});
7481

7582
if (doprocessMC) {
7683
// Add MC histograms if needed
@@ -93,6 +100,7 @@ struct sigmaminustask {
93100
if (doprocessFindable) {
94101
// Add findable Sigma histograms
95102
rSigmaMinus.add("h2MassPtFindable", "h2MassPtFindable", {HistType::kTH2F, {ptAxis, sigmaMassAxis}});
103+
rSigmaMinus.add("hFilterIndex", "hFilterIndex", {HistType::kTH1F, {filtersAxis}});
96104
}
97105
}
98106

@@ -113,6 +121,8 @@ struct sigmaminustask {
113121
rSigmaMinus.fill(HIST("h2MassSigmaMinusPt"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaMinus());
114122
rSigmaMinus.fill(HIST("h2SigmaMassVsXiMass"), kinkCand.mXiMinus(), kinkCand.mSigmaMinus());
115123
rSigmaMinus.fill(HIST("h2NSigmaPiPt"), kinkCand.mothSign() * kinkCand.ptMoth(), dauTrack.tpcNSigmaPi());
124+
rSigmaMinus.fill(HIST("h2DCAMothPt"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.dcaMothPv());
125+
rSigmaMinus.fill(HIST("h2DCADaugPt"), kinkCand.mothSign() * kinkCand.ptDaug(), kinkCand.dcaDaugPv());
116126

117127
if (fillOutputTree) {
118128
outputDataTable(kinkCand.xDecVtx(), kinkCand.yDecVtx(), kinkCand.zDecVtx(),
@@ -199,7 +209,9 @@ struct sigmaminustask {
199209
rSigmaMinus.fill(HIST("h2MassPtMCRec"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaMinus());
200210
rSigmaMinus.fill(HIST("h2MassResolution"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaMinus() - MotherMassMC);
201211
rSigmaMinus.fill(HIST("h2PtResolution"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.ptMoth() - MotherpTMC);
202-
212+
rSigmaMinus.fill(HIST("h2DCAMothPt"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.dcaMothPv());
213+
rSigmaMinus.fill(HIST("h2DCADaugPt"), kinkCand.mothSign() * kinkCand.ptDaug(), kinkCand.dcaDaugPv());
214+
203215
if (std::abs(mcTrackPiDau.pdgCode()) == 211) {
204216
rSigmaMinus.fill(HIST("h2NSigmaTOFPiPt"), kinkCand.mothSign() * kinkCand.ptMoth(), dauTrack.tofNSigmaPi());
205217
} else if (std::abs(mcTrackPiDau.pdgCode()) == 2212) {
@@ -272,12 +284,6 @@ struct sigmaminustask {
272284
void processFindable(TracksFull const& tracks, aod::McTrackLabels const& trackLabelsMC, aod::McParticles const&)
273285
{
274286
for (const auto& motherTrack : tracks) {
275-
276-
// Filter: ITS but no TPC (mother candidates)
277-
if (!motherTrack.hasITS() || motherTrack.hasTPC()) {
278-
continue;
279-
}
280-
281287
// Check if mother is Sigma in MC
282288
auto mcLabelMother = trackLabelsMC.rawIteratorAt(motherTrack.globalIndex());
283289
if (!mcLabelMother.has_mcParticle()) {
@@ -289,17 +295,11 @@ struct sigmaminustask {
289295
}
290296

291297
for (const auto& daughterTrack : tracks) {
292-
// Filter: ITS and TPC (daughter candidates)
293-
if (!daughterTrack.hasITS() || !daughterTrack.hasTPC()) {
294-
continue;
295-
}
296-
298+
// Check if daughter is pi/proton
297299
auto mcLabelDaughter = trackLabelsMC.rawIteratorAt(daughterTrack.globalIndex());
298300
if (!mcLabelDaughter.has_mcParticle()) {
299301
continue;
300302
}
301-
302-
// Check if daughter is pi/proton
303303
auto mcDaughter = mcLabelDaughter.mcParticle_as<aod::McParticles>();
304304
if (std::abs(mcDaughter.pdgCode()) != 211 && std::abs(mcDaughter.pdgCode()) != 2212) {
305305
continue;
@@ -315,13 +315,58 @@ struct sigmaminustask {
315315
}
316316
}
317317
}
318+
if (!isValidPair) {
319+
continue;
320+
}
321+
322+
float mcMass = std::sqrt(mcMother.e() * mcMother.e() - mcMother.p() * mcMother.p());
323+
int sigmaSign = mcMother.pdgCode() > 0 ? 1 : -1;
324+
rSigmaMinus.fill(HIST("h2MassPtFindable"), sigmaSign * mcMother.pt(), mcMass);
325+
326+
// Define filter index and progressively apply kinkbuilder cuts to track pairs
327+
int filterIndex = 0;
328+
rSigmaMinus.fill(HIST("hFilterIndex"), filterIndex);
329+
330+
// 1 - tracks with right ITS, TPC, TOF signals
331+
if (motherTrack.has_collision() && motherTrack.hasITS() && !motherTrack.hasTPC() && !motherTrack.hasTOF() &&
332+
daughterTrack.hasITS() && daughterTrack.hasTPC()) {
333+
filterIndex += 1;
334+
rSigmaMinus.fill(HIST("hFilterIndex"), filterIndex);
335+
} else {
336+
continue;
337+
}
318338

319-
if (isValidPair) {
320-
// All requirements satisfied: fill histogram
321-
float mcMass = std::sqrt(mcMother.e() * mcMother.e() - mcMother.p() * mcMother.p());
322-
int sigmaSign = mcMother.pdgCode() > 0 ? 1 : -1;
323-
rSigmaMinus.fill(HIST("h2MassPtFindable"), sigmaSign * mcMother.pt(), mcMass);
339+
// 2, 3 - mother track ITS properties
340+
if (motherTrack.itsNCls() < 6 &&
341+
motherTrack.itsNClsInnerBarrel() == 3 && motherTrack.itsChi2NCl() < 36) {
342+
filterIndex += 1;
343+
rSigmaMinus.fill(HIST("hFilterIndex"), filterIndex);
344+
}
345+
if (filterIndex > 1 && motherTrack.pt() > 0.5) {
346+
filterIndex += 1;
347+
rSigmaMinus.fill(HIST("hFilterIndex"), filterIndex);
348+
} else {
349+
continue; // Skip if mother track does not pass ITS cuts
324350
}
351+
352+
// 4 - daughter track ITS+TPC properties
353+
if (daughterTrack.itsNClsInnerBarrel() == 0 && daughterTrack.itsNCls() < 4 &&
354+
daughterTrack.tpcNClsCrossedRows() > 0.8 * daughterTrack.tpcNClsFindable() && daughterTrack.tpcNClsFound() > 80) {
355+
filterIndex += 1;
356+
rSigmaMinus.fill(HIST("hFilterIndex"), filterIndex);
357+
} else {
358+
continue; // Skip if daughter track does not pass ITS+TPC cuts
359+
}
360+
361+
// 5 - geometric cuts
362+
if (std::abs(motherTrack.eta()) < 1.0 && std::abs(daughterTrack.eta()) < 1.0 &&
363+
std::abs(motherTrack.phi() - daughterTrack.phi()) < 100.0) {
364+
filterIndex += 1;
365+
rSigmaMinus.fill(HIST("hFilterIndex"), filterIndex);
366+
} else {
367+
continue; // Skip if geometric cuts are not satisfied
368+
}
369+
325370
}
326371
}
327372
}
@@ -334,4 +379,3 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
334379
return WorkflowSpec{
335380
adaptAnalysisTask<sigmaminustask>(cfgc)};
336381
}
337-

0 commit comments

Comments
 (0)