Skip to content

Commit 8ac5f4c

Browse files
authored
[PWGCF] Add some QA histos and event selection cut
Add topological cut QA histograms. Add event selection in MCRec.
1 parent ce7c8d5 commit 8ac5f4c

File tree

2 files changed

+172
-35
lines changed

2 files changed

+172
-35
lines changed

PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx

Lines changed: 110 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ struct FlowEfficiencyCasc {
4343
O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 3.0f, "Maximal pT for tracks")
4444
O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks")
4545
O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters")
46+
O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy")
4647
// topological cut for V0
4748
O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius")
4849
O2_DEFINE_CONFIGURABLE(cfgv0_v0cospa, float, 0.995f, "minimum cosine of pointing angle")
@@ -67,7 +68,7 @@ struct FlowEfficiencyCasc {
6768
O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 0, "minimum number of Ratio crossed rows over findable clusters")
6869
O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not")
6970
O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not")
70-
O2_DEFINE_CONFIGURABLE(cfgcheckMCParticle, bool, false, "check the particle and deacy channel match or not")
71+
O2_DEFINE_CONFIGURABLE(cfgcheckMCParticle, bool, false, "check the particle and deacy channel is MC true or not")
7172
O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity")
7273

7374
O2_DEFINE_CONFIGURABLE(cfgNSigmatpctof, std::vector<float>, (std::vector<float>{3, 3, 3}), "tpc and tof NSigma for Pion Kaon Proton")
@@ -97,7 +98,7 @@ struct FlowEfficiencyCasc {
9798

9899
void init(InitContext const&)
99100
{
100-
const AxisSpec axisCounter{1, 0, +1, ""};
101+
const AxisSpec axisCounter{2, 0, 2, ""};
101102
// create histograms
102103
registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter});
103104
registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter});
@@ -111,13 +112,90 @@ struct FlowEfficiencyCasc {
111112
registry.add("h3DRecLambda", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisMultiplicity, axisLambdaMass}});
112113
registry.add("h3DRecXi", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisMultiplicity, axisXiMass}});
113114
registry.add("h3DRecOmega", "", {HistType::kTH3D, {cfgaxisPtOmega, cfgaxisMultiplicity, axisOmegaMass}});
115+
116+
// V0 QA
117+
registry.add("QAhisto/V0/hqaV0radiusbefore", "", {HistType::kTH1D, {{200, 0, 200}}});
118+
registry.add("QAhisto/V0/hqaV0radiusafter", "", {HistType::kTH1D, {{200, 0, 200}}});
119+
registry.add("QAhisto/V0/hqaV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}});
120+
registry.add("QAhisto/V0/hqaV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}});
121+
registry.add("QAhisto/V0/hqadcaV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}});
122+
registry.add("QAhisto/V0/hqadcaV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}});
123+
registry.add("QAhisto/V0/hqaarm_podobefore", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}});
124+
registry.add("QAhisto/V0/hqaarm_podoafter", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}});
125+
registry.add("QAhisto/V0/hqadcapostoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}});
126+
registry.add("QAhisto/V0/hqadcapostoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}});
127+
registry.add("QAhisto/V0/hqadcanegtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}});
128+
registry.add("QAhisto/V0/hqadcanegtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}});
129+
// Cascade QA
130+
registry.add("QAhisto/Casc/hqaCasccosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}});
131+
registry.add("QAhisto/Casc/hqaCasccosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}});
132+
registry.add("QAhisto/Casc/hqaCascV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}});
133+
registry.add("QAhisto/Casc/hqaCascV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}});
134+
registry.add("QAhisto/Casc/hqadcaCascV0toPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}});
135+
registry.add("QAhisto/Casc/hqadcaCascV0toPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}});
136+
registry.add("QAhisto/Casc/hqadcaCascBachtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}});
137+
registry.add("QAhisto/Casc/hqadcaCascBachtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}});
138+
registry.add("QAhisto/Casc/hqadcaCascdaubefore", "", {HistType::kTH1D, {{100, 0, 1}}});
139+
registry.add("QAhisto/Casc/hqadcaCascdauafter", "", {HistType::kTH1D, {{100, 0, 1}}});
140+
registry.add("QAhisto/Casc/hqadcaCascV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}});
141+
registry.add("QAhisto/Casc/hqadcaCascV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}});
114142
}
143+
template <typename TCollision>
144+
bool eventSelected(TCollision collision)
145+
{
146+
if (collision.alias_bit(kTVXinTRD)) {
147+
// TRD triggered
148+
return false;
149+
}
150+
if (!collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) {
151+
// reject collisions close to Time Frame borders
152+
// https://its.cern.ch/jira/browse/O2-4623
153+
return false;
154+
}
155+
if (!collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) {
156+
// reject events affected by the ITS ROF border
157+
// https://its.cern.ch/jira/browse/O2-4309
158+
return false;
159+
}
160+
if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
161+
// rejects collisions which are associated with the same "found-by-T0" bunch crossing
162+
// https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof
163+
return false;
164+
}
165+
if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) {
166+
// removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference
167+
// use this cut at low multiplicities with caution
168+
return false;
169+
}
170+
if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) {
171+
// no collisions in specified time range
172+
return false;
173+
}
174+
if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) {
175+
// cut time intervals with dead ITS staves
176+
return false;
177+
}
178+
179+
auto occupancy = collision.trackOccupancyInTimeRange();
180+
if (occupancy > cfgCutOccupancyHigh)
181+
return false;
182+
183+
// // V0A T0A 5 sigma cut
184+
// if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))
185+
// return false;
186+
187+
return true;
188+
}
189+
115190

116191
void processRec(MyCollisions::iterator const& collision, V0MCCandidates const& V0s, CascMCCandidates const& Cascades, DaughterTracks const&, soa::Join<aod::CascMCCores, aod::CascMCCollRefs> const&, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const&)
117192
{
118193
registry.fill(HIST("eventCounter"), 0.5);
119194
if (!collision.sel8())
120195
return;
196+
if (eventSelected(collision))
197+
return;
198+
registry.fill(HIST("eventCounter"), 1.5);
121199
int rectracknum = collision.multNTracksGlobal();
122200
registry.fill(HIST("h2DCentvsNch"), collision.centFT0C(), rectracknum);
123201
for (const auto& casc : Cascades) {
@@ -127,6 +205,13 @@ struct FlowEfficiencyCasc {
127205
auto negdau = casc.negTrackExtra_as<DaughterTracks>();
128206
auto posdau = casc.posTrackExtra_as<DaughterTracks>();
129207
auto bachelor = casc.bachTrackExtra_as<DaughterTracks>();
208+
// fill QA
209+
registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()));
210+
registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()));
211+
registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()));
212+
registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv());
213+
registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters());
214+
registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters());
130215
// track quality check
131216
if (bachelor.tpcNClsFound() < cfgtpcclusters)
132217
continue;
@@ -157,13 +242,20 @@ struct FlowEfficiencyCasc {
157242
continue;
158243
if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow)
159244
continue;
245+
// fill QA
246+
registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()));
247+
registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()));
248+
registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()));
249+
registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv());
250+
registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters());
251+
registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters());
160252
// Omega and antiOmega
161253
int pdgCode{cascMC.pdgCode()};
162254
if (!cfgcheckMCParticle || (std::abs(pdgCode) == kOmegaMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kKPlus)) {
163255
if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity &&
164256
(!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) {
165257
registry.fill(HIST("h3DRecOmega"), casc.pt(), rectracknum, casc.mOmega());
166-
} else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity &&
258+
} else if (casc.sign() > 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity &&
167259
(!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) {
168260
registry.fill(HIST("h3DRecOmega"), casc.pt(), rectracknum, casc.mOmega());
169261
}
@@ -173,7 +265,7 @@ struct FlowEfficiencyCasc {
173265
if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity &&
174266
(!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) {
175267
registry.fill(HIST("h3DRecXi"), casc.pt(), rectracknum, casc.mXi());
176-
} else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity &&
268+
} else if (casc.sign() > 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity &&
177269
(!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) {
178270
registry.fill(HIST("h3DRecXi"), casc.pt(), rectracknum, casc.mXi());
179271
}
@@ -187,6 +279,13 @@ struct FlowEfficiencyCasc {
187279
auto v0negdau = v0.negTrackExtra_as<DaughterTracks>();
188280
auto v0posdau = v0.posTrackExtra_as<DaughterTracks>();
189281

282+
// fill QA before cut
283+
registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius());
284+
registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA());
285+
registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters());
286+
registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv());
287+
registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv());
288+
registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm());
190289
// track quality check
191290
if (v0posdau.tpcNClsFound() < cfgtpcclusters)
192291
continue;
@@ -213,13 +312,20 @@ struct FlowEfficiencyCasc {
213312
continue;
214313
if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv)
215314
continue;
315+
// fill QA after cut
316+
registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius());
317+
registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA());
318+
registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters());
319+
registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv());
320+
registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv());
216321

217322
int pdgCode{v0MC.pdgCode()};
218323
// K0short
219324
if (!cfgcheckMCParticle || (std::abs(pdgCode) == kK0Short && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kPiMinus)) {
220325
if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow &&
221326
(!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) {
222327
registry.fill(HIST("h3DRecK0s"), v0.pt(), rectracknum, v0.mK0Short());
328+
registry.fill(HIST("QAhisto/V0/hqaarm_podoafter"), v0.alpha(), v0.qtarm());
223329
}
224330
}
225331
// Lambda and antiLambda

0 commit comments

Comments
 (0)