Skip to content

Commit 81d43c3

Browse files
authored
[PWGLF] higherMassResonances.cxx: add process with event plane (#16514)
1 parent 762af9c commit 81d43c3

1 file changed

Lines changed: 222 additions & 2 deletions

File tree

PWGLF/Tasks/Resonances/higherMassResonances.cxx

Lines changed: 222 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020

2121
#include "Common/CCDB/EventSelectionParams.h"
2222
#include "Common/CCDB/RCTSelectionFlags.h"
23+
#include "Common/Core/EventPlaneHelper.h"
2324
#include "Common/Core/RecoDecay.h"
2425
#include "Common/DataModel/Centrality.h"
2526
#include "Common/DataModel/EventSelection.h" //
2627
#include "Common/DataModel/Multiplicity.h"
2728
#include "Common/DataModel/PIDResponseTOF.h" //
2829
#include "Common/DataModel/PIDResponseTPC.h" //
30+
#include "Common/DataModel/Qvectors.h"
2931
#include "Common/DataModel/TrackSelectionTables.h"
3032

3133
#include <CommonConstants/MathConstants.h>
@@ -69,7 +71,8 @@ using namespace o2::framework;
6971
using namespace o2::framework::expressions;
7072
using namespace o2::soa;
7173
using namespace o2::aod::rctsel;
72-
// using namespace o2::constants::physics;
74+
using namespace o2::constants::physics;
75+
7376
using std::array;
7477
// FixME: Add INEL>0 selection for the derived data
7578

@@ -181,10 +184,16 @@ struct HigherMassResonances {
181184
// Configurable<float> tpcCrossedrowsOverfcls{"tpcCrossedrowsOverfcls", 0.8, "TPC crossed rows over findable clusters"};
182185
Configurable<int> rotationalCut{"rotationalCut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"};
183186

187+
// event plane configurables
188+
Configurable<int> cfgnTotalSystem{"cfgnTotalSystem", 7, "Total number of detectors in qVectorsTable"};
189+
Configurable<std::string> cfgDetName{"cfgDetName", "FT0C", "The name of detector to be analyzed"};
190+
Configurable<std::string> cfgRefAName{"cfgRefAName", "TPCPos", "The name of detector for reference A"};
191+
Configurable<std::string> cfgRefBName{"cfgRefBName", "TPCNeg", "The name of detector for reference B"};
192+
184193
// // Mass and pT axis as configurables
185194
ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 5., 10., 30., 50., 70., 100., 110., 150.}, "Binning of the centrality axis"};
186195
ConfigurableAxis configThnAxisPOL{"configThnAxisPOL", {20, -1.0, 1.0}, "Costheta axis"};
187-
ConfigurableAxis configThnAxisPhi{"configThnAxisPhi", {70, 0.0f, 7.0f}, "Phi axis"}; // 0 to 2pi
196+
ConfigurableAxis configThnAxisPhi{"configThnAxisPhi", {12, 0.0f, o2::constants::math::TwoPI}, "Phi axis"}; // 0 to 2pi
188197
ConfigurableAxis ksMassBins{"ksMassBins", {200, 0.45f, 0.55f}, "K0s invariant mass axis"};
189198
ConfigurableAxis cGlueMassBins{"cGlueMassBins", {200, 0.9f, 3.0f}, "Glueball invariant mass axis"};
190199
ConfigurableAxis cPtBins{"cPtBins", {200, 0.0f, 20.0f}, "Glueball pT axis"};
@@ -218,6 +227,12 @@ struct HigherMassResonances {
218227
// const double massK0s = o2::constants::physics::MassK0Short;
219228
bool isMix = false;
220229

230+
EventPlaneHelper helperEP;
231+
int detId;
232+
int refAId;
233+
int refBId;
234+
float minQvecAmp = 1e-5;
235+
221236
void init(InitContext const&)
222237
{
223238
rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad);
@@ -233,6 +248,9 @@ struct HigherMassResonances {
233248
AxisSpec deltaMAxis = {config.configAxisDeltaM, "#Delta M (GeV/#it{c}^{2})"};
234249
AxisSpec angleSepAxis = {config.configAxisAngleSep, "Angular separation between V0s"};
235250
AxisSpec ptCorrAxis = {config.configAxisPtCorr, "Pt correlation between two K0s"};
251+
AxisSpec axisCentQA = {100, 0, 100, ""};
252+
AxisSpec axisEvtPlQA = {100, -o2::constants::math::PI, o2::constants::math::PI, ""};
253+
AxisSpec axisEvtResPlQA = {102, -1.02, 1.02, ""};
236254

237255
// THnSparses
238256
std::array<int, 5> sparses = {config.activateHelicityFrame, config.activateCollinsSoperFrame, config.activateProductionFrame, config.activateBeamAxisFrame, config.activateRandomFrame};
@@ -341,6 +359,10 @@ struct HigherMassResonances {
341359
hglue.add("h3glueInvMassDS", "h3glueInvMassDS", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, deltaMAxis, angleSepAxis, ptCorrAxis}, true);
342360
hglue.add("h3glueInvMassME", "h3glueInvMassME", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, deltaMAxis, angleSepAxis, ptCorrAxis}, true);
343361
hglue.add("h3glueInvMassRot", "h3glueInvMassRot", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, deltaMAxis, angleSepAxis, ptCorrAxis}, true);
362+
if (doprocessSEEP) {
363+
hglue.add("h3glueInvMassEPDS", "h3glueInvMassEPDS", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPhi}, true);
364+
hglue.add("h3glueInvMassEPRot", "h3glueInvMassEPRot", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPhi}, true);
365+
}
344366
}
345367

346368
// K0s topological/PID cuts
@@ -417,6 +439,42 @@ struct HigherMassResonances {
417439
hMChists.add("MCcorrections/hSignalLossNumerator3", "Kstar generated after event selection", kTH2F, {{ptAxis}, {multiplicityAxis}});
418440
hMChists.add("MCcorrections/hMultvsCent", "Kstar generated after event selection", kTH2F, {{multiplicityAxis}, {multiplicityAxis}});
419441
}
442+
443+
if (doprocessSEEP) {
444+
detId = getdetId(config.cfgDetName);
445+
refAId = getdetId(config.cfgRefAName);
446+
refBId = getdetId(config.cfgRefBName);
447+
448+
hglue.add("EpDet", "", {HistType::kTH2F, {axisCentQA, axisEvtPlQA}});
449+
hglue.add("EpRefA", "", {HistType::kTH2F, {axisCentQA, axisEvtPlQA}});
450+
hglue.add("EpRefB", "", {HistType::kTH2F, {axisCentQA, axisEvtPlQA}});
451+
452+
hglue.add("EpResDetRefA", "", {HistType::kTH2F, {axisCentQA, axisEvtResPlQA}});
453+
hglue.add("EpResDetRefB", "", {HistType::kTH2F, {axisCentQA, axisEvtResPlQA}});
454+
hglue.add("EpResRefARefB", "", {HistType::kTH2F, {axisCentQA, axisEvtResPlQA}});
455+
}
456+
}
457+
458+
template <typename T>
459+
int getdetId(const T& name)
460+
{
461+
if (name.value == "FT0C") {
462+
return 0;
463+
} else if (name.value == "FT0A") {
464+
return 1;
465+
} else if (name.value == "FT0M") {
466+
return 2;
467+
} else if (name.value == "FV0A") {
468+
return 3;
469+
} else if (name.value == "TPCPos") {
470+
return 4;
471+
} else if (name.value == "TPCNeg") {
472+
return 5;
473+
} else if (name.value == "TPCTot") {
474+
return 6;
475+
} else {
476+
return 0;
477+
}
420478
}
421479

422480
template <typename Coll>
@@ -799,6 +857,7 @@ struct HigherMassResonances {
799857
using EventCandidates = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::MultZeqs, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As, aod::Mults, aod::PVMults>>;
800858
using TrackCandidates = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra, aod::TracksDCA, aod::pidTPCFullPi, aod::pidTOFFullPi>>;
801859
using V0TrackCandidate = soa::Join<aod::V0Datas, aod::V0TOFPIDs, aod::V0TOFNSigmas>;
860+
using EventCandidateEPs = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::MultZeqs, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As, aod::Mults, aod::PVMults, aod::Qvectors>>;
802861
// For Monte Carlo
803862
using EventCandidatesMC = soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::MultZeqs, aod::FT0Mults, aod::PVMults, aod::CentFV0As>;
804863
using TrackCandidatesMC = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::pidTPCFullKa, aod::pidTOFFullKa, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::McTrackLabels>>;
@@ -1157,6 +1216,167 @@ struct HigherMassResonances {
11571216
}
11581217
PROCESS_SWITCH(HigherMassResonances, processSE, "same event process", true);
11591218

1219+
void processSEEP(EventCandidateEPs::iterator const& collision, TrackCandidates const& /*tracks*/, V0TrackCandidate const& V0s)
1220+
{
1221+
multiplicity = 0.0;
1222+
1223+
if (config.cSelectMultEstimator == kFT0M) {
1224+
multiplicity = collision.centFT0M();
1225+
} else if (config.cSelectMultEstimator == kFT0A) {
1226+
multiplicity = collision.centFT0A();
1227+
} else if (config.cSelectMultEstimator == kFT0C) {
1228+
multiplicity = collision.centFT0C();
1229+
} else if (config.cSelectMultEstimator == kFV0A) {
1230+
multiplicity = collision.centFV0A();
1231+
} else {
1232+
multiplicity = collision.centFT0C(); // default
1233+
}
1234+
1235+
if (!selectionEvent(collision, true)) {
1236+
return;
1237+
}
1238+
1239+
if (collision.qvecAmp()[detId] < minQvecAmp || collision.qvecAmp()[refAId] < minQvecAmp || collision.qvecAmp()[refBId] < minQvecAmp) {
1240+
return;
1241+
}
1242+
1243+
if (config.qAevents) {
1244+
rEventSelection.fill(HIST("hVertexZRec"), collision.posZ());
1245+
rEventSelection.fill(HIST("hmultiplicity"), multiplicity);
1246+
}
1247+
1248+
float eps[3] = {0.};
1249+
eps[0] = helperEP.GetEventPlane(collision.qvecRe()[4 * detId + 3], collision.qvecIm()[4 * detId + 3], 2);
1250+
eps[1] = helperEP.GetEventPlane(collision.qvecRe()[4 * refAId + 3], collision.qvecIm()[4 * refAId + 3], 2);
1251+
eps[2] = helperEP.GetEventPlane(collision.qvecRe()[4 * refBId + 3], collision.qvecIm()[4 * refBId + 3], 2);
1252+
1253+
float resNumA = helperEP.GetResolution(eps[0], eps[1], 2);
1254+
float resNumB = helperEP.GetResolution(eps[0], eps[2], 2);
1255+
float resDenom = helperEP.GetResolution(eps[1], eps[2], 2);
1256+
1257+
hglue.fill(HIST("EpDet"), multiplicity, eps[0]);
1258+
hglue.fill(HIST("EpRefA"), multiplicity, eps[1]);
1259+
hglue.fill(HIST("EpRefB"), multiplicity, eps[2]);
1260+
1261+
hglue.fill(HIST("EpResDetRefA"), multiplicity, resNumA);
1262+
hglue.fill(HIST("EpResDetRefB"), multiplicity, resNumB);
1263+
hglue.fill(HIST("EpResRefARefB"), multiplicity, resDenom);
1264+
1265+
std::vector<int> v0indexes;
1266+
1267+
for (const auto& [v1, v2] : combinations(CombinationsFullIndexPolicy(V0s, V0s))) {
1268+
1269+
if (v1.size() == 0 || v2.size() == 0) {
1270+
continue;
1271+
}
1272+
1273+
if (!selectionV0(collision, v1, multiplicity)) {
1274+
continue;
1275+
}
1276+
if (!selectionV0(collision, v2, multiplicity)) {
1277+
continue;
1278+
}
1279+
1280+
auto postrack1 = v1.template posTrack_as<TrackCandidates>();
1281+
auto negtrack1 = v1.template negTrack_as<TrackCandidates>();
1282+
auto postrack2 = v2.template posTrack_as<TrackCandidates>();
1283+
auto negtrack2 = v2.template negTrack_as<TrackCandidates>();
1284+
1285+
double nTPCSigmaPos1{postrack1.tpcNSigmaPi()};
1286+
double nTPCSigmaNeg1{negtrack1.tpcNSigmaPi()};
1287+
double nTPCSigmaPos2{postrack2.tpcNSigmaPi()};
1288+
double nTPCSigmaNeg2{negtrack2.tpcNSigmaPi()};
1289+
1290+
if (!(isSelectedV0Daughter(negtrack1, -1, nTPCSigmaNeg1, v1) && isSelectedV0Daughter(postrack1, 1, nTPCSigmaPos1, v1))) {
1291+
continue;
1292+
}
1293+
if (!(isSelectedV0Daughter(postrack2, 1, nTPCSigmaPos2, v2) && isSelectedV0Daughter(negtrack2, -1, nTPCSigmaNeg2, v2))) {
1294+
continue;
1295+
}
1296+
1297+
if (std::find(v0indexes.begin(), v0indexes.end(), v1.globalIndex()) == v0indexes.end()) {
1298+
v0indexes.push_back(v1.globalIndex());
1299+
}
1300+
1301+
if (v2.globalIndex() <= v1.globalIndex()) {
1302+
continue;
1303+
}
1304+
1305+
if (postrack1.globalIndex() == postrack2.globalIndex()) {
1306+
continue;
1307+
}
1308+
if (negtrack1.globalIndex() == negtrack2.globalIndex()) {
1309+
continue;
1310+
}
1311+
1312+
double deltaRDaugherPos = std::sqrt(TVector2::Phi_mpi_pi(postrack1.phi() - negtrack1.phi()) * TVector2::Phi_mpi_pi(postrack1.phi() - negtrack1.phi()) + (postrack1.eta() - negtrack1.eta()) * (postrack1.eta() - negtrack1.eta()));
1313+
double deltaRDaugherNeg = std::sqrt(TVector2::Phi_mpi_pi(postrack2.phi() - negtrack2.phi()) * TVector2::Phi_mpi_pi(postrack2.phi() - negtrack2.phi()) + (postrack2.eta() - negtrack2.eta()) * (postrack2.eta() - negtrack2.eta()));
1314+
1315+
if (config.qAv0) {
1316+
rKzeroShort.fill(HIST("hDauDeltaR"), deltaRDaugherPos, deltaRDaugherNeg);
1317+
}
1318+
1319+
if (deltaRDaugherPos < config.deltaRDaugherCut || deltaRDaugherNeg < config.deltaRDaugherCut) {
1320+
continue;
1321+
}
1322+
1323+
if (config.isApplyEtaCutK0s && (v1.eta() < config.confDaughEta || v2.eta() < config.confDaughEta)) {
1324+
continue;
1325+
}
1326+
1327+
daughter1 = ROOT::Math::PxPyPzMVector(v1.px(), v1.py(), v1.pz(), o2::constants::physics::MassK0Short); // Kshort
1328+
daughter2 = ROOT::Math::PxPyPzMVector(v2.px(), v2.py(), v2.pz(), o2::constants::physics::MassK0Short); // Kshort
1329+
1330+
mother = daughter1 + daughter2; // invariant mass of Kshort pair
1331+
isMix = false;
1332+
1333+
const double deltaMass = deltaM(v1.mK0Short(), v2.mK0Short());
1334+
if (config.qAv0) {
1335+
rKzeroShort.fill(HIST("hK0ShortMassCorr"), v1.mK0Short(), v2.mK0Short(), deltaMass);
1336+
}
1337+
1338+
if (!config.qAOptimisation) {
1339+
if (deltaMass > config.cMaxDeltaM) {
1340+
continue;
1341+
}
1342+
}
1343+
1344+
const double ptCorr = (mother.Pt() - daughter1.Pt() != 0.) ? daughter1.Pt() / (mother.Pt() - daughter1.Pt()) : 0.;
1345+
if (config.qAv0) {
1346+
rKzeroShort.fill(HIST("hK0sPtCorrelation"), ptCorr);
1347+
}
1348+
1349+
double deltaRvalue = std::sqrt(TVector2::Phi_mpi_pi(v1.phi() - v2.phi()) * TVector2::Phi_mpi_pi(v1.phi() - v2.phi()) + (v1.eta() - v2.eta()) * (v1.eta() - v2.eta()));
1350+
1351+
if (!config.qAOptimisation) {
1352+
if (deltaRvalue < config.deltaRK0sCut) {
1353+
continue;
1354+
}
1355+
}
1356+
1357+
if (!config.isselectTWOKsOnly && config.qAOptimisation) {
1358+
1359+
if (std::abs(mother.Rapidity()) < config.rapidityMotherData) {
1360+
hglue.fill(HIST("h3glueInvMassEPDS"), multiplicity, mother.Pt(), mother.M(), RecoDecay::constrainAngle(2.0 * mother.Phi() - 2.0 * eps[0]));
1361+
}
1362+
1363+
for (int i = 0; i < config.cRotations; i++) {
1364+
double theta2 = rn->Uniform(o2::constants::math::PI - o2::constants::math::PI / config.rotationalCut, o2::constants::math::PI + o2::constants::math::PI / config.rotationalCut);
1365+
1366+
daughterRot = ROOT::Math::PxPyPzMVector(daughter1.Px() * std::cos(theta2) - daughter1.Py() * std::sin(theta2), daughter1.Px() * std::sin(theta2) + daughter1.Py() * std::cos(theta2), daughter1.Pz(), daughter1.M());
1367+
1368+
motherRot = daughterRot + daughter2;
1369+
1370+
if (motherRot.Rapidity() < config.rapidityMotherData) {
1371+
hglue.fill(HIST("h3glueInvMassEPRot"), multiplicity, motherRot.Pt(), motherRot.M(), RecoDecay::constrainAngle(2.0 * motherRot.Phi() - 2.0 * eps[0]));
1372+
}
1373+
}
1374+
}
1375+
}
1376+
v0indexes.clear();
1377+
}
1378+
PROCESS_SWITCH(HigherMassResonances, processSEEP, "same event process with EP table", true);
1379+
11601380
ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for ME mixing"};
11611381
// ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {10, 0, 100}, "multiplicity percentile for ME mixing"};
11621382
ConfigurableAxis axisMultiplicity{"axisMultiplicity", {2000, 0, 10000}, "TPC multiplicity axis for ME mixing"};

0 commit comments

Comments
 (0)