Skip to content

Commit 5367291

Browse files
fmazzascFrancesco Mazzaschialibuild
authored
[PWGLF] Add debug table to kink builder + mc info for kink sigma (#11780)
Co-authored-by: Francesco Mazzaschi <fmazzasc@alipap1.cern.ch> Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent a6fac7d commit 5367291

File tree

3 files changed

+122
-32
lines changed

3 files changed

+122
-32
lines changed

PWGLF/DataModel/LFKinkDecayTables.h

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
/// \author Francesco Mazzaschi <francesco.mazzaschi@cern.ch>
1616
///
1717

18-
#include "Framework/AnalysisDataModel.h"
19-
#include "Framework/ASoAHelpers.h"
2018
#include "Common/Core/RecoDecay.h"
2119

20+
#include "Framework/ASoAHelpers.h"
21+
#include "Framework/AnalysisDataModel.h"
22+
2223
#ifndef PWGLF_DATAMODEL_LFKINKDECAYTABLES_H_
2324
#define PWGLF_DATAMODEL_LFKINKDECAYTABLES_H_
2425

@@ -77,6 +78,13 @@ DECLARE_SOA_DYNAMIC_COLUMN(MSigmaPlus, mSigmaPlus, //! mass under sigma plus hyp
7778
float pzneut = pzmoth - pzch;
7879
return RecoDecay::m(std::array{std::array{pxch, pych, pzch}, std::array{pxneut, pyneut, pzneut}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionNeutral}); });
7980

81+
DECLARE_SOA_DYNAMIC_COLUMN(MXiMinus, mXiMinus, //! mass under Xi minus hypothesis
82+
[](float pxmoth, float pymoth, float pzmoth, float pxch, float pych, float pzch) -> float {
83+
float pxneut = pxmoth - pxch;
84+
float pyneut = pymoth - pych;
85+
float pzneut = pzmoth - pzch;
86+
return RecoDecay::m(std::array{std::array{pxch, pych, pzch}, std::array{pxneut, pyneut, pzneut}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassLambda}); });
87+
8088
} // namespace kinkcand
8189

8290
DECLARE_SOA_TABLE(KinkCands, "AOD", "KINKCANDS",
@@ -93,7 +101,24 @@ DECLARE_SOA_TABLE(KinkCands, "AOD", "KINKCANDS",
93101
kinkcand::PtMoth<kinkcand::PxMoth, kinkcand::PyMoth>,
94102
kinkcand::PtDaug<kinkcand::PxDaug, kinkcand::PyDaug>,
95103
kinkcand::MSigmaMinus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>,
96-
kinkcand::MSigmaPlus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>);
104+
kinkcand::MSigmaPlus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>,
105+
kinkcand::MXiMinus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>);
106+
107+
DECLARE_SOA_TABLE(KinkCandsUnbound, "AOD", "UBKINKCANDS",
108+
o2::soa::Index<>, kinkcand::XDecVtx, kinkcand::YDecVtx, kinkcand::ZDecVtx,
109+
kinkcand::MothSign, kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth,
110+
kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug,
111+
kinkcand::DcaMothPv, kinkcand::DcaDaugPv, kinkcand::DcaKinkTopo,
112+
113+
// dynamic columns
114+
kinkcand::PxDaugNeut<kinkcand::PxMoth, kinkcand::PxDaug>,
115+
kinkcand::PyDaugNeut<kinkcand::PyMoth, kinkcand::PyDaug>,
116+
kinkcand::PzDaugNeut<kinkcand::PzMoth, kinkcand::PzDaug>,
117+
kinkcand::PtMoth<kinkcand::PxMoth, kinkcand::PyMoth>,
118+
kinkcand::PtDaug<kinkcand::PxDaug, kinkcand::PyDaug>,
119+
kinkcand::MSigmaMinus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>,
120+
kinkcand::MSigmaPlus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>,
121+
kinkcand::MXiMinus<kinkcand::PxMoth, kinkcand::PyMoth, kinkcand::PzMoth, kinkcand::PxDaug, kinkcand::PyDaug, kinkcand::PzDaug>);
97122

98123
} // namespace o2::aod
99124

PWGLF/TableProducer/Common/kinkBuilder.cxx

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,31 @@
1313
/// \brief Builder task for kink decay topologies using ITS standalone tracks for the mother
1414
/// \author Francesco Mazzaschi <francesco.mazzaschi@cern.ch>
1515

16-
#include <memory>
17-
#include <string>
18-
#include <array>
19-
#include <vector>
20-
#include <algorithm>
16+
#include "PWGLF/DataModel/LFKinkDecayTables.h"
17+
#include "PWGLF/DataModel/LFParticleIdentification.h"
18+
#include "PWGLF/Utils/svPoolCreator.h"
2119

22-
#include "Framework/runDataProcessing.h"
23-
#include "Framework/AnalysisTask.h"
24-
#include "Framework/AnalysisDataModel.h"
25-
#include "Framework/ASoAHelpers.h"
26-
#include "ReconstructionDataFormats/Track.h"
20+
#include "Common/DataModel/Centrality.h"
2721
#include "Common/DataModel/EventSelection.h"
2822
#include "Common/DataModel/Multiplicity.h"
29-
#include "Common/DataModel/Centrality.h"
30-
#include "DetectorsBase/Propagator.h"
31-
#include "DetectorsBase/GeometryManager.h"
32-
#include "DataFormatsParameters/GRPObject.h"
33-
#include "DataFormatsParameters/GRPMagField.h"
23+
3424
#include "CCDB/BasicCCDBManager.h"
3525
#include "DCAFitter/DCAFitterN.h"
26+
#include "DataFormatsParameters/GRPMagField.h"
27+
#include "DataFormatsParameters/GRPObject.h"
28+
#include "DetectorsBase/GeometryManager.h"
29+
#include "DetectorsBase/Propagator.h"
30+
#include "Framework/ASoAHelpers.h"
31+
#include "Framework/AnalysisDataModel.h"
32+
#include "Framework/AnalysisTask.h"
33+
#include "Framework/runDataProcessing.h"
34+
#include "ReconstructionDataFormats/Track.h"
3635

37-
#include "PWGLF/DataModel/LFParticleIdentification.h"
38-
#include "PWGLF/Utils/svPoolCreator.h"
39-
#include "PWGLF/DataModel/LFKinkDecayTables.h"
36+
#include <algorithm>
37+
#include <array>
38+
#include <memory>
39+
#include <string>
40+
#include <vector>
4041

4142
using namespace o2;
4243
using namespace o2::framework;
@@ -93,9 +94,12 @@ struct kinkBuilder {
9394
kHyperhelium4sigma };
9495

9596
Produces<aod::KinkCands> outputDataTable;
97+
Produces<aod::KinkCandsUnbound> outputDataTableUB;
98+
9699
Service<o2::ccdb::BasicCCDBManager> ccdb;
97100

98101
Configurable<int> hypoMoth{"hypoMoth", kSigmaMinus, "Mother particle hypothesis"};
102+
Configurable<bool> fillDebugTable{"fillDebugTable", false, "If true, fill the debug table with all candidates unbound"};
99103
// Selection criteria
100104
Configurable<float> maxDCAMothToPV{"maxDCAMothToPV", 0.1, "Max DCA of the mother to the PV"};
101105
Configurable<float> minDCADaugToPV{"minDCADaugToPV", 0., "Min DCA of the daughter to the PV"};
@@ -430,11 +434,18 @@ struct kinkBuilder {
430434
std::sort(kinkCandidates.begin(), kinkCandidates.end(), [](const kinkCandidate& a, const kinkCandidate& b) { return a.collisionID < b.collisionID; });
431435

432436
for (const auto& kinkCand : kinkCandidates) {
433-
outputDataTable(kinkCand.collisionID, kinkCand.mothTrackID, kinkCand.daugTrackID,
434-
kinkCand.decVtx[0], kinkCand.decVtx[1], kinkCand.decVtx[2],
435-
kinkCand.mothSign, kinkCand.momMoth[0], kinkCand.momMoth[1], kinkCand.momMoth[2],
436-
kinkCand.momDaug[0], kinkCand.momDaug[1], kinkCand.momDaug[2],
437-
kinkCand.dcaXYmoth, kinkCand.dcaXYdaug, kinkCand.dcaKinkTopo);
437+
if (fillDebugTable) {
438+
outputDataTableUB(kinkCand.decVtx[0], kinkCand.decVtx[1], kinkCand.decVtx[2],
439+
kinkCand.mothSign, kinkCand.momMoth[0], kinkCand.momMoth[1], kinkCand.momMoth[2],
440+
kinkCand.momDaug[0], kinkCand.momDaug[1], kinkCand.momDaug[2],
441+
kinkCand.dcaXYmoth, kinkCand.dcaXYdaug, kinkCand.dcaKinkTopo);
442+
} else {
443+
outputDataTable(kinkCand.collisionID, kinkCand.mothTrackID, kinkCand.daugTrackID,
444+
kinkCand.decVtx[0], kinkCand.decVtx[1], kinkCand.decVtx[2],
445+
kinkCand.mothSign, kinkCand.momMoth[0], kinkCand.momMoth[1], kinkCand.momMoth[2],
446+
kinkCand.momDaug[0], kinkCand.momDaug[1], kinkCand.momDaug[2],
447+
kinkCand.dcaXYmoth, kinkCand.dcaXYdaug, kinkCand.dcaKinkTopo);
448+
}
438449
}
439450
}
440451
};

PWGLF/Tasks/Strangeness/sigmaminustask.cxx

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
/// \brief Example of a simple task for the analysis of the Sigma-minus
1414
/// \author Francesco Mazzaschi <francesco.mazzaschi@cern.ch>
1515

16-
#include "Framework/runDataProcessing.h"
17-
#include "Framework/AnalysisTask.h"
18-
#include "Common/DataModel/EventSelection.h"
1916
#include "PWGLF/DataModel/LFKinkDecayTables.h"
17+
18+
#include "Common/DataModel/EventSelection.h"
2019
#include "Common/DataModel/PIDResponse.h"
20+
21+
#include "Framework/AnalysisTask.h"
22+
#include "Framework/runDataProcessing.h"
2123
#include "ReconstructionDataFormats/PID.h"
2224

2325
using namespace o2;
@@ -26,6 +28,7 @@ using namespace o2::framework::expressions;
2628

2729
using TracksFull = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCPi>;
2830
using CollisionsFull = soa::Join<aod::Collisions, aod::EvSel>;
31+
using CollisionsFullMC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
2932

3033
struct sigmaminustask {
3134
// Histograms are defined with HistogramRegistry
@@ -42,18 +45,24 @@ struct sigmaminustask {
4245
const AxisSpec ptAxis{50, -10, 10, "#it{p}_{T} (GeV/#it{c})"};
4346
const AxisSpec nSigmaPiAxis{100, -5, 5, "n#sigma_{#pi}"};
4447
const AxisSpec sigmaMassAxis{100, 1.1, 1.4, "m (GeV/#it{c}^{2})"};
48+
const AxisSpec xiMassAxis{100, 1.2, 1.6, "m_{#Xi} (GeV/#it{c}^{2})"};
49+
const AxisSpec pdgAxis{10001, -5000, 5000, "PDG code"};
4550
const AxisSpec vertexZAxis{100, -15., 15., "vrtx_{Z} [cm]"};
4651

4752
// Event selection
4853
rEventSelection.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}});
49-
5054
// Sigma-minus reconstruction
5155
rSigmaMinus.add("h2MassSigmaMinusPt", "h2MassSigmaMinusPt", {HistType::kTH2F, {ptAxis, sigmaMassAxis}});
56+
rSigmaMinus.add("h2SigmaMassVsXiMass", "h2SigmaMassVsXiMass", {HistType::kTH2F, {xiMassAxis, sigmaMassAxis}});
5257
rSigmaMinus.add("h2NSigmaPiPt", "h2NSigmaPiPt", {HistType::kTH2F, {ptAxis, nSigmaPiAxis}});
58+
59+
if (doprocessMC) {
60+
// Add MC histograms if needed
61+
rSigmaMinus.add("h2MassSigmaMinusPtMC", "h2MassSigmaMinusPtMC", {HistType::kTH2F, {ptAxis, sigmaMassAxis}});
62+
}
5363
}
5464

55-
void process(soa::Join<aod::Collisions, aod::EvSels>::iterator const& collision,
56-
aod::KinkCands const& KinkCands, TracksFull const&)
65+
void processData(CollisionsFull::iterator const& collision, aod::KinkCands const& KinkCands, TracksFull const&)
5766
{
5867
if (std::abs(collision.posZ()) > cutzvertex || !collision.sel8()) {
5968
return;
@@ -65,9 +74,54 @@ struct sigmaminustask {
6574
continue;
6675
}
6776
rSigmaMinus.fill(HIST("h2MassSigmaMinusPt"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaMinus());
77+
rSigmaMinus.fill(HIST("h2SigmaMassVsXiMass"), kinkCand.mXiMinus(), kinkCand.mSigmaMinus());
6878
rSigmaMinus.fill(HIST("h2NSigmaPiPt"), kinkCand.mothSign() * kinkCand.ptMoth(), dauTrack.tpcNSigmaPi());
6979
}
7080
}
81+
PROCESS_SWITCH(sigmaminustask, processData, "Data processing", true);
82+
83+
void processMC(CollisionsFullMC::iterator const& collision, aod::KinkCands const& KinkCands, aod::McTrackLabels const& trackLabelsMC, aod::McParticles const&, TracksFull const&)
84+
{
85+
if (std::abs(collision.posZ()) > cutzvertex || !collision.sel8()) {
86+
return;
87+
}
88+
rEventSelection.fill(HIST("hVertexZRec"), collision.posZ());
89+
for (const auto& kinkCand : KinkCands) {
90+
auto dauTrack = kinkCand.trackDaug_as<TracksFull>();
91+
auto mothTrack = kinkCand.trackMoth_as<TracksFull>();
92+
if (dauTrack.sign() != mothTrack.sign()) {
93+
LOG(info) << "Skipping kink candidate with opposite sign daughter and mother: " << kinkCand.globalIndex();
94+
continue; // Skip if the daughter has the opposite sign as the mother
95+
}
96+
if (abs(dauTrack.tpcNSigmaPi()) > cutNSigmaPi) {
97+
continue;
98+
}
99+
100+
rSigmaMinus.fill(HIST("h2MassSigmaMinusPt"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaMinus());
101+
rSigmaMinus.fill(HIST("h2SigmaMassVsXiMass"), kinkCand.mXiMinus(), kinkCand.mSigmaMinus());
102+
rSigmaMinus.fill(HIST("h2NSigmaPiPt"), kinkCand.mothSign() * kinkCand.ptMoth(), dauTrack.tpcNSigmaPi());
103+
// do MC association
104+
auto mcLabSigma = trackLabelsMC.rawIteratorAt(mothTrack.globalIndex());
105+
auto mcLabPiDau = trackLabelsMC.rawIteratorAt(dauTrack.globalIndex());
106+
if (mcLabSigma.has_mcParticle() && mcLabPiDau.has_mcParticle()) {
107+
auto mcTrackSigma = mcLabSigma.mcParticle_as<aod::McParticles>();
108+
auto mcTrackPiDau = mcLabPiDau.mcParticle_as<aod::McParticles>();
109+
if (!mcTrackPiDau.has_mothers()) {
110+
continue;
111+
}
112+
for (auto& piMother : mcTrackPiDau.mothers_as<aod::McParticles>()) {
113+
if (piMother.globalIndex() != mcTrackSigma.globalIndex()) {
114+
continue;
115+
}
116+
if (std::abs(mcTrackSigma.pdgCode()) != 3112 || std::abs(mcTrackPiDau.pdgCode()) != 211) {
117+
continue;
118+
}
119+
rSigmaMinus.fill(HIST("h2MassSigmaMinusPtMC"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaMinus());
120+
}
121+
}
122+
}
123+
}
124+
PROCESS_SWITCH(sigmaminustask, processMC, "MC processing", false);
71125
};
72126

73127
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)