@@ -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
10061212WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments