Skip to content

Commit e161e4f

Browse files
authored
added jet finder for mc (#5634)
1 parent 194473b commit e161e4f

File tree

1 file changed

+211
-5
lines changed

1 file changed

+211
-5
lines changed

PWGLF/Tasks/Nuspex/nuclei_in_jets.cxx

Lines changed: 211 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ struct nuclei_in_jets {
9393
Configurable<float> min_pt{"min_pt", 0.2f, "minimum pt of the tracks"};
9494
Configurable<float> min_eta{"min_eta", -0.8f, "minimum eta"};
9595
Configurable<float> max_eta{"max_eta", +0.8f, "maximum eta"};
96-
Configurable<float> min_y{"min_y", -0.5f, "minimum y"};
97-
Configurable<float> max_y{"max_y", +0.5f, "maximum y"};
96+
Configurable<float> min_y{"min_y", -5.0f, "minimum y"};
97+
Configurable<float> max_y{"max_y", +5.0f, "maximum y"};
9898
Configurable<float> max_dcaxy{"max_dcaxy", 0.1f, "Maximum DCAxy"};
9999
Configurable<float> max_dcaz{"max_dcaz", 0.1f, "Maximum DCAz"};
100100
Configurable<float> min_nsigmaTPC{"min_nsigmaTPC", -3.0f, "Minimum nsigma TPC"};
@@ -193,6 +193,10 @@ struct nuclei_in_jets {
193193
// DCA Templates
194194
registryMC.add("antiproton_dca_prim", "antiproton_dca_prim", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}});
195195
registryMC.add("antiproton_dca_sec", "antiproton_dca_sec", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}});
196+
197+
// Histograms for reweighting
198+
registryMC.add("antiproton_eta_pt_jet", "antiproton_eta_pt_jet", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {80, -0.8, 0.8, "#eta"}});
199+
registryMC.add("antiproton_eta_pt_ue", "antiproton_eta_pt_ue", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {80, -0.8, 0.8, "#eta"}});
196200
}
197201

198202
// Single-Track Selection for the Particle of Interest
@@ -457,9 +461,6 @@ struct nuclei_in_jets {
457461
void processData(SelectedCollisions::iterator const& collision, FullTracks const& tracks)
458462
{
459463

460-
// Seed
461-
gRandom->SetSeed(0);
462-
463464
// Event Counter: before event selection
464465
registryQC.fill(HIST("number_of_events_data"), 0.5);
465466

@@ -999,8 +1000,213 @@ struct nuclei_in_jets {
9991000
}
10001001
}
10011002

1003+
void processWeights(o2::aod::McCollisions const& mcCollisions,
1004+
aod::McParticles const& mcParticles)
1005+
{
1006+
1007+
for (const auto& mccollision : mcCollisions) {
1008+
1009+
if (abs(mccollision.posZ()) > 10)
1010+
continue;
1011+
1012+
auto mcParticles_per_coll =
1013+
mcParticles.sliceBy(perMCCollision, mccollision.globalIndex());
1014+
1015+
// Reduced Event
1016+
std::vector<int> particle_ID;
1017+
int leading_ID;
1018+
float pt_max(0);
1019+
1020+
// Track Index Initialization
1021+
int i = -1;
1022+
1023+
// Generated Particles
1024+
for (auto& particle : mcParticles_per_coll) {
1025+
1026+
if (!particle.isPhysicalPrimary())
1027+
continue;
1028+
if (particle.pdgCode() != -2212)
1029+
continue;
1030+
1031+
// Index
1032+
i++;
1033+
1034+
// Find pt Leading
1035+
if (particle.pt() > pt_max) {
1036+
leading_ID = i;
1037+
pt_max = particle.pt();
1038+
}
1039+
1040+
// Store Array Element
1041+
particle_ID.push_back(i);
1042+
}
1043+
1044+
// Skip Events with pt<pt_leading_min
1045+
if (pt_max < min_pt_leading)
1046+
return;
1047+
1048+
// Number of Stored Particles
1049+
int nParticles = static_cast<int>(particle_ID.size());
1050+
1051+
// Momentum of the Leading Particle
1052+
auto const& leading_track = mcParticles_per_coll.iteratorAt(leading_ID);
1053+
TVector3 p_leading(leading_track.px(), leading_track.py(),
1054+
leading_track.pz());
1055+
1056+
// Array of Particles inside Jet
1057+
std::vector<int> jet_particle_ID;
1058+
jet_particle_ID.push_back(leading_ID);
1059+
1060+
// Labels
1061+
Int_t exit(0);
1062+
Int_t nPartAssociated(0);
1063+
1064+
// Jet Finder
1065+
do {
1066+
// Initialization
1067+
float distance_jet_min(1e+08);
1068+
float distance_bkg_min(1e+08);
1069+
int label_jet_particle(0);
1070+
int i_jet_particle(0);
1071+
1072+
for (int i = 0; i < nParticles; i++) {
1073+
1074+
// Skip Leading Particle & Elements already associated to the Jet
1075+
if (particle_ID[i] == leading_ID || particle_ID[i] == -1)
1076+
continue;
1077+
1078+
// Get Particle Momentum
1079+
auto stored_track = mcParticles_per_coll.iteratorAt(particle_ID[i]);
1080+
TVector3 p_particle(stored_track.px(), stored_track.py(),
1081+
stored_track.pz());
1082+
1083+
// Variables
1084+
float one_over_pt2_part = 1.0 / (p_particle.Pt() * p_particle.Pt());
1085+
float one_over_pt2_lead = 1.0 / (p_leading.Pt() * p_leading.Pt());
1086+
float deltaEta = p_particle.Eta() - p_leading.Eta();
1087+
float deltaPhi = GetDeltaPhi(p_particle.Phi(), p_leading.Phi());
1088+
float min = Minimum(one_over_pt2_part, one_over_pt2_lead);
1089+
float Delta2 = deltaEta * deltaEta + deltaPhi * deltaPhi;
1090+
1091+
// Distances
1092+
float distance_jet = min * Delta2 / (Rparameter_jet * Rparameter_jet);
1093+
float distance_bkg = one_over_pt2_part;
1094+
1095+
// Find Minimum Distance Jet
1096+
if (distance_jet < distance_jet_min) {
1097+
distance_jet_min = distance_jet;
1098+
label_jet_particle = particle_ID[i];
1099+
i_jet_particle = i;
1100+
}
1101+
1102+
// Find Minimum Distance Bkg
1103+
if (distance_bkg < distance_bkg_min) {
1104+
distance_bkg_min = distance_bkg;
1105+
}
1106+
}
1107+
1108+
if (distance_jet_min <= distance_bkg_min) {
1109+
1110+
// Add Particle to Jet
1111+
jet_particle_ID.push_back(label_jet_particle);
1112+
1113+
// Update Momentum of Leading Particle
1114+
auto jet_track = mcParticles_per_coll.iteratorAt(label_jet_particle);
1115+
TVector3 p_i(jet_track.px(), jet_track.py(), jet_track.pz());
1116+
p_leading = p_leading + p_i;
1117+
1118+
// Remove Element
1119+
particle_ID[i_jet_particle] = -1;
1120+
nPartAssociated++;
1121+
}
1122+
1123+
if (nPartAssociated >= (nParticles - 1))
1124+
exit = 1;
1125+
if (distance_jet_min > distance_bkg_min)
1126+
exit = 2;
1127+
1128+
} while (exit == 0);
1129+
1130+
// Multiplicity inside Jet + UE
1131+
int nParticlesJetUE = static_cast<int>(jet_particle_ID.size());
1132+
1133+
// Event Counter: Skip Events with jet not fully inside acceptance
1134+
float eta_jet_axis = p_leading.Eta();
1135+
if ((TMath::Abs(eta_jet_axis) + Rmax_jet_ue) > max_eta)
1136+
return;
1137+
1138+
// Perpendicular Cones for UE Estimate
1139+
TVector3 ue_axis1(0.0, 0.0, 0.0);
1140+
TVector3 ue_axis2(0.0, 0.0, 0.0);
1141+
get_perpendicular_cone(p_leading, ue_axis1, +1.0);
1142+
get_perpendicular_cone(p_leading, ue_axis2, -1.0);
1143+
1144+
// Protection against delta<0
1145+
if (ue_axis1.X() == 0 && ue_axis1.Y() == 0 && ue_axis1.Z() == 0)
1146+
return;
1147+
if (ue_axis2.X() == 0 && ue_axis2.Y() == 0 && ue_axis2.Z() == 0)
1148+
return;
1149+
1150+
// Store UE
1151+
std::vector<int> ue_particle_ID;
1152+
1153+
for (int i = 0; i < nParticles; i++) {
1154+
1155+
// Skip Leading Particle & Elements already associated to the Jet
1156+
if (particle_ID[i] == leading_ID || particle_ID[i] == -1)
1157+
continue;
1158+
1159+
// Get UE Track
1160+
const auto& ue_track = mcParticles_per_coll.iteratorAt(particle_ID[i]);
1161+
1162+
// Variables
1163+
float deltaEta1 = ue_track.eta() - ue_axis1.Eta();
1164+
float deltaPhi1 = GetDeltaPhi(ue_track.phi(), ue_axis1.Phi());
1165+
float dr1 = TMath::Sqrt(deltaEta1 * deltaEta1 + deltaPhi1 * deltaPhi1);
1166+
float deltaEta2 = ue_track.eta() - ue_axis2.Eta();
1167+
float deltaPhi2 = GetDeltaPhi(ue_track.phi(), ue_axis2.Phi());
1168+
float dr2 = TMath::Sqrt(deltaEta2 * deltaEta2 + deltaPhi2 * deltaPhi2);
1169+
1170+
// Store Particles in the UE
1171+
if (dr1 < Rmax_jet_ue) {
1172+
ue_particle_ID.push_back(particle_ID[i]);
1173+
}
1174+
1175+
if (dr2 < Rmax_jet_ue) {
1176+
ue_particle_ID.push_back(particle_ID[i]);
1177+
}
1178+
}
1179+
1180+
// UE Multiplicity
1181+
int nParticlesUE = static_cast<int>(ue_particle_ID.size());
1182+
1183+
// Loop over particles inside Jet
1184+
for (int i = 0; i < nParticlesJetUE; i++) {
1185+
1186+
const auto& jet_track = mcParticles_per_coll.iteratorAt(particle_ID[i]);
1187+
1188+
float deltaEta = jet_track.eta() - p_leading.Eta();
1189+
float deltaPhi = GetDeltaPhi(jet_track.phi(), p_leading.Phi());
1190+
float R = TMath::Sqrt(deltaEta * deltaEta + deltaPhi * deltaPhi);
1191+
if (R > Rmax_jet_ue)
1192+
continue;
1193+
1194+
registryMC.fill(HIST("antiproton_eta_pt_jet"), jet_track.pt(),
1195+
jet_track.eta());
1196+
}
1197+
// Loop over particles inside UE
1198+
for (int i = 0; i < nParticlesUE; i++) {
1199+
1200+
const auto& ue_track = mcParticles_per_coll.iteratorAt(ue_particle_ID[i]);
1201+
registryMC.fill(HIST("antiproton_eta_pt_ue"), ue_track.pt(),
1202+
ue_track.eta());
1203+
}
1204+
}
1205+
}
1206+
10021207
PROCESS_SWITCH(nuclei_in_jets, processGen, "process Gen MC", false);
10031208
PROCESS_SWITCH(nuclei_in_jets, processRec, "process Rec MC", false);
1209+
PROCESS_SWITCH(nuclei_in_jets, processWeights, "process Weights MC", false);
10041210
};
10051211

10061212
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)