Skip to content

Commit b14071d

Browse files
authored
Add systematic mapping analysis task
1 parent 7d969d2 commit b14071d

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
#include "PWGLF/DataModel/LFStrangenessTables.h"
12+
13+
#include "Common/DataModel/EventSelection.h"
14+
#include "Common/DataModel/PIDResponse.h"
15+
16+
#include "Framework/AnalysisDataModel.h"
17+
#include "Framework/AnalysisTask.h"
18+
#include "Framework/HistogramRegistry.h"
19+
#include "ReconstructionDataFormats/Track.h"
20+
21+
using namespace o2;
22+
using namespace o2::framework;
23+
24+
struct systematicsStudy {
25+
ConfigurableAxis ptBins{"ptBins", {100, 0.f, 10.f}, "Binning for pT (GeV/c)"};
26+
Configurable<float> cutEta{"cutEta", 0.8f, "Max |eta| for tracks and V0s"};
27+
Configurable<int> cutTPCClusters{"cutTPCClusters", 70, "Min TPC clusters for tracks"};
28+
Configurable<float> cutKaonNSigma{"cutKaonNSigma", 3.f, "Max |nSigma| for kaon PID"};
29+
Configurable<float> cutK0sMassWindow{"cutK0sMassWindow", 0.01f, "K0s mass window (GeV/c^2)"};
30+
ConfigurableAxis etaBins{"etaBins", {40, -1.0f, 1.0f}, "Binning for #eta"};
31+
ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * M_PI}, "Binning for #phi (rad)"};
32+
HistogramRegistry registry{"registry"};
33+
34+
void init(InitContext const&)
35+
{
36+
const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/c)"};
37+
const AxisSpec etaAxis{etaBins, "#eta"};
38+
const AxisSpec phiAxis{phiBins, "#phi (rad)"};
39+
registry.add("hKaonYieldData", "", HistType::kTH1F, {ptAxis});
40+
registry.add("hKaonYieldMC", "", HistType::kTH1F, {ptAxis});
41+
registry.add("hK0sYieldData", "", HistType::kTH1F, {ptAxis});
42+
registry.add("hK0sYieldMC", "", HistType::kTH1F, {ptAxis});
43+
registry.add("hKaonYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis});
44+
registry.add("hKaonYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis});
45+
registry.add("hK0sYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis});
46+
registry.add("hK0sYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis});
47+
}
48+
49+
void processData(aod::Collisions const& collisions,
50+
aod::Tracks const& tracks,
51+
aod::V0s const& v0s)
52+
{
53+
for (auto& collision : collisions) {
54+
if (!collision.sel8() || std::abs(collision.posZ()) > 10)
55+
continue; // MB selection
56+
if (collision.isMC()) continue;
57+
58+
// Kaon loop
59+
for (auto& track : tracks) {
60+
if (track.collisionId() != collision.globalIndex())
61+
continue;
62+
if (std::abs(track.eta()) > cutEta)
63+
continue;
64+
if (track.tpcNClsFound() < cutTPCClusters)
65+
continue;
66+
// PID selection for kaons
67+
if (std::abs(track.tpcNSigmaKa()) < cutKaonNSigma) {
68+
registry.fill(HIST("hKaonYieldData"), track.pt());
69+
registry.fill(HIST("hKaonYieldMapData"), track.pt(), track.eta(), track.phi());
70+
}
71+
}
72+
73+
// K0s loop
74+
for (auto& v0 : v0s) {
75+
if (v0.collisionId() != collision.globalIndex())
76+
continue;
77+
// Basic selection for K0s
78+
if (std::abs(v0.eta()) > cutEta)
79+
continue;
80+
if (std::abs(v0.mass() - constants::physics::MassK0Short) > cutK0sMassWindow)
81+
continue;
82+
registry.fill(HIST("hK0sYieldData"), v0.pt());
83+
registry.fill(HIST("hK0sYieldMapData"), v0.pt(), v0.eta(), v0.phi());
84+
}
85+
}
86+
}
87+
88+
void processMC(aod::Collisions const& collisions,
89+
aod::Tracks const& tracks,
90+
aod::V0s const& v0s)
91+
{
92+
for (auto& collision : collisions) {
93+
if (!collision.sel8() || std::abs(collision.posZ()) > 10)
94+
continue; // MB selection
95+
if (!collision.isMC()) continue;
96+
97+
// Kaon loop
98+
for (auto& track : tracks) {
99+
if (track.collisionId() != collision.globalIndex())
100+
continue;
101+
if (std::abs(track.eta()) > cutEta)
102+
continue;
103+
if (track.tpcNClsFound() < cutTPCClusters)
104+
continue;
105+
// PID selection for kaons
106+
if (std::abs(track.tpcNSigmaKa()) < cutKaonNSigma) {
107+
registry.fill(HIST("hKaonYieldMC"), track.pt());
108+
registry.fill(HIST("hKaonYieldMapMC"), track.pt(), track.eta(), track.phi());
109+
}
110+
}
111+
112+
// K0s loop
113+
for (auto& v0 : v0s) {
114+
if (v0.collisionId() != collision.globalIndex())
115+
continue;
116+
// Basic selection for K0s
117+
if (std::abs(v0.eta()) > cutEta)
118+
continue;
119+
if (std::abs(v0.mass() - constants::physics::MassK0Short) > cutK0sMassWindow)
120+
continue;
121+
registry.fill(HIST("hK0sYieldMC"), v0.pt());
122+
registry.fill(HIST("hK0sYieldMapMC"), v0.pt(), v0.eta(), v0.phi());
123+
}
124+
}
125+
}
126+
127+
void process(aod::Collisions const& collisions,
128+
aod::Tracks const& tracks,
129+
aod::V0s const& v0s)
130+
{
131+
processData(collisions, tracks, v0s);
132+
processMC(collisions, tracks, v0s);
133+
}
134+
};
135+
136+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
137+
{
138+
return WorkflowSpec{
139+
adaptAnalysisTask<systematicsStudy>(cfgc)};
140+
}

0 commit comments

Comments
 (0)