1+ // Code modified to obtain histograms for subsample division
2+
13// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
24// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
35// All rights not expressly granted are reserved.
6971#include < random>
7072#include < string>
7173#include < vector>
74+ #include < chrono>
7275
7376using namespace std ;
7477using namespace o2 ;
@@ -95,6 +98,9 @@ struct AntinucleiInJets {
9598 HistogramRegistry registryQC{" registryQC" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
9699 HistogramRegistry registryMult{" registryMult" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
97100 HistogramRegistry registryCorr{" registryCorr" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
101+
102+ // Random generator for subsample assignment
103+ TRandom3 mRand ;
98104
99105 // Event selection criteria
100106 Configurable<bool > rejectITSROFBorder{" rejectITSROFBorder" , true , " Reject events near the ITS ROF border" };
@@ -204,6 +210,10 @@ struct AntinucleiInJets {
204210 if (setMCDefaultItsParams) {
205211 itsResponse.setMCDefaultParameters ();
206212 }
213+
214+ // Initialize random seed using high-resolution clock to ensure unique sequences across parallel Grid jobs
215+ auto time_seed = std::chrono::high_resolution_clock::now ().time_since_epoch ().count ();
216+ mRand .SetSeed (time_seed);
207217
208218 // Load reweighting histograms from CCDB if antinuclei efficiency processing is enabled
209219 if (doprocessAntinucleiEfficiency || doprocessJetsMCgen || doprocessJetsMCrec) {
@@ -308,6 +318,7 @@ struct AntinucleiInJets {
308318 // Generated spectra of antiprotons
309319 registryMC.add (" antiproton_gen_jet" , " antiproton_gen_jet" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
310320 registryMC.add (" antiproton_gen_ue" , " antiproton_gen_ue" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
321+ registryMC.add (" antiproton_gen_full" , " antiproton_gen_full" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
311322
312323 // Normalization histogram
313324 registryMC.add (" antiproton_deltay_deltaphi_jet" , " antiproton_deltay_deltaphi_jet" , HistType::kTH2F , {{2000 , -1.0 , 1.0 , " #Delta#it{y}" }, {2000 , 0.0 , 2.0 , " #Delta#phi" }});
@@ -330,6 +341,8 @@ struct AntinucleiInJets {
330341 registryMC.add (" antiproton_rec_tof_jet" , " antiproton_rec_tof_jet" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
331342 registryMC.add (" antiproton_rec_tpc_ue" , " antiproton_rec_tpc_ue" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
332343 registryMC.add (" antiproton_rec_tof_ue" , " antiproton_rec_tof_ue" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
344+ registryMC.add (" antiproton_rec_tpc_full" , " antiproton_rec_tpc_full" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
345+ registryMC.add (" antiproton_rec_tof_full" , " antiproton_rec_tof_full" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
333346
334347 // Fraction of primary antiprotons
335348 registryMC.add (" antiproton_prim_jet" , " antiproton_prim_jet" , HistType::kTH1F , {{nbins, min, max, " #it{p}_{T} (GeV/#it{c})" }});
@@ -455,43 +468,46 @@ struct AntinucleiInJets {
455468 const AxisSpec nBarD2Axis{100 , 0.0 , 100.0 , " N_{#bar{d}}^{i} #times N_{#bar{d}}^{j}" };
456469 const AxisSpec nBarP2Axis{100 , 0.0 , 100.0 , " N_{#bar{p}}^{i} #times N_{#bar{p}}^{j}" };
457470 const AxisSpec nBarDnBarPAxis{100 , 0.0 , 100.0 , " N_{#bar{d}}^{i} #times N_{#bar{p}}^{j}" };
471+ const AxisSpec subsampleAxis{20 , 0 , 20 , " Subsample Index" };
472+
458473
459474 // Event counter
460475 registryCorr.add (" eventCounter" , " number of events" , HistType::kTH1F , {{20 , 0 , 20 , " counter" }});
461- registryCorr.add (" eventCounter_centrality_fullEvent" , " Number of events per centrality (Full Event)" , HistType::kTH1F , {multiplicityAxis});
462- registryCorr.add (" eventCounter_centrality_jet" , " Number of events per centrality (Jet)" , HistType::kTH1F , {multiplicityAxis});
463- registryCorr.add (" eventCounter_centrality_ue" , " Number of events per centrality (Underlying Event)" , HistType::kTH1F , {multiplicityAxis});
464-
476+
477+ registryCorr.add (" eventCounter_centrality_fullEvent" , " Number of events per centrality (Full Event)" , HistType::kTH2F , {multiplicityAxis, subsampleAxis});
478+ // registryCorr.add("eventCounter_centrality_jet", "Number of events per centrality (Jet)", HistType::kTH1F, {multiplicityAxis});
479+ // registryCorr.add("eventCounter_centrality_ue", "Number of events per centrality (Underlying Event)", HistType::kTH1F, {multiplicityAxis});
480+
465481 // Correlation histograms: antiproton vs. antideuteron number vs. event multiplicity
466- registryCorr.add (" rho_jet" , " rho_jet" , HistType::kTH3F , {nAntideuteronsAxis, nAntiprotonsAxis, multiplicityAxis});
467- registryCorr.add (" rho_ue" , " rho_ue" , HistType::kTH3F , {nAntideuteronsAxis, nAntiprotonsAxis, multiplicityAxis});
468- registryCorr.add (" rho_fullEvent" , " rho_fullEvent" , HistType::kTH3F , {nAntideuteronsAxis, nAntiprotonsAxis, multiplicityAxis});
469-
482+ // registryCorr.add("rho_jet", "rho_jet", HistType::kTH3F, {nAntideuteronsAxis, nAntiprotonsAxis, multiplicityAxis});
483+ // registryCorr.add("rho_ue", "rho_ue", HistType::kTH3F, {nAntideuteronsAxis, nAntiprotonsAxis, multiplicityAxis});
484+ registryCorr.add (" rho_fullEvent" , " rho_fullEvent" , HistType::kTHnSparseD , {nAntideuteronsAxis, nAntiprotonsAxis, multiplicityAxis, subsampleAxis });
485+
470486 // Correlation histograms: net antiproton vs. net antideuteron numbers
471- registryCorr.add (" rho_netP_netD_jet" , " rho_netP_netD_jet" , HistType::kTH2F , {nAntideuteronsAxis, nAntiprotonsAxis});
472- registryCorr.add (" rho_netP_netD_ue" , " rho_netP_netD_ue" , HistType::kTH2F , {nAntideuteronsAxis, nAntiprotonsAxis});
473- registryCorr.add (" rho_netP_netD_fullEvent" , " rho_netP_netD_fullEvent" , HistType::kTH2F , {nAntideuteronsAxis, nAntiprotonsAxis});
474-
487+ // registryCorr.add("rho_netP_netD_jet", "rho_netP_netD_jet", HistType::kTH2F, {nAntideuteronsAxis, nAntiprotonsAxis});
488+ // registryCorr.add("rho_netP_netD_ue", "rho_netP_netD_ue", HistType::kTH2F, {nAntideuteronsAxis, nAntiprotonsAxis});
489+ registryCorr.add (" rho_netP_netD_fullEvent" , " rho_netP_netD_fullEvent" , HistType::kTH3F , {nAntideuteronsAxis, nAntiprotonsAxis, subsampleAxis });
490+
475491 // Efficiency histograms jet
476- registryCorr.add (" q1d_jet" , " q1d_jet" , HistType::kTH3F , {nAntideuteronsAxis, ptPerNucleonAxis, multiplicityAxis});
477- registryCorr.add (" q1p_jet" , " q1p_jet" , HistType::kTH3F , {nAntiprotonsAxis, ptPerNucleonAxis, multiplicityAxis});
478- registryCorr.add (" q1d_square_jet" , " q1d_square_jet" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarD2Axis, multiplicityAxis});
479- registryCorr.add (" q1p_square_jet" , " q1p_square_jet" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarP2Axis, multiplicityAxis});
480- registryCorr.add (" q1d_q1p_jet" , " q1d_q1p_jet" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarDnBarPAxis, multiplicityAxis});
481-
482- // Efficiency histograms UE
483- registryCorr.add (" q1d_ue" , " q1d_ue" , HistType::kTH3F , {nAntideuteronsAxis, ptPerNucleonAxis, multiplicityAxis});
484- registryCorr.add (" q1p_ue" , " q1p_ue" , HistType::kTH3F , {nAntiprotonsAxis, ptPerNucleonAxis, multiplicityAxis});
485- registryCorr.add (" q1d_square_ue" , " q1d_square_ue" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarD2Axis, multiplicityAxis});
486- registryCorr.add (" q1p_square_ue" , " q1p_square_ue" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarP2Axis, multiplicityAxis});
487- registryCorr.add (" q1d_q1p_ue" , " q1d_q1p_ue" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarDnBarPAxis, multiplicityAxis});
488-
492+ // registryCorr.add("q1d_jet", "q1d_jet", HistType::kTH3F, {nAntideuteronsAxis, ptPerNucleonAxis, multiplicityAxis});
493+ // registryCorr.add("q1p_jet", "q1p_jet", HistType::kTH3F, {nAntiprotonsAxis, ptPerNucleonAxis, multiplicityAxis});
494+ // registryCorr.add("q1d_square_jet", "q1d_square_jet", HistType::kTHnSparseD, {ptPerNucleonAxis, ptPerNucleonAxis, nBarD2Axis, multiplicityAxis});
495+ // registryCorr.add("q1p_square_jet", "q1p_square_jet", HistType::kTHnSparseD, {ptPerNucleonAxis, ptPerNucleonAxis, nBarP2Axis, multiplicityAxis});
496+ // registryCorr.add("q1d_q1p_jet", "q1d_q1p_jet", HistType::kTHnSparseD, {ptPerNucleonAxis, ptPerNucleonAxis, nBarDnBarPAxis, multiplicityAxis});
497+
498+ // Efficiency histograms UE
499+ // registryCorr.add("q1d_ue", "q1d_ue", HistType::kTH3F, {nAntideuteronsAxis, ptPerNucleonAxis, multiplicityAxis});
500+ // registryCorr.add("q1p_ue", "q1p_ue", HistType::kTH3F, {nAntiprotonsAxis, ptPerNucleonAxis, multiplicityAxis});
501+ // registryCorr.add("q1d_square_ue", "q1d_square_ue", HistType::kTHnSparseD, {ptPerNucleonAxis, ptPerNucleonAxis, nBarD2Axis, multiplicityAxis});
502+ // registryCorr.add("q1p_square_ue", "q1p_square_ue", HistType::kTHnSparseD, {ptPerNucleonAxis, ptPerNucleonAxis, nBarP2Axis, multiplicityAxis});
503+ // registryCorr.add("q1d_q1p_ue", "q1d_q1p_ue", HistType::kTHnSparseD, {ptPerNucleonAxis, ptPerNucleonAxis, nBarDnBarPAxis, multiplicityAxis});
504+
489505 // Efficiency histograms full event
490- registryCorr.add (" q1d_fullEvent" , " q1d_fullEvent" , HistType::kTH3F , {nAntideuteronsAxis, ptPerNucleonAxis, multiplicityAxis});
491- registryCorr.add (" q1p_fullEvent" , " q1p_fullEvent" , HistType::kTH3F , {nAntiprotonsAxis, ptPerNucleonAxis, multiplicityAxis});
492- registryCorr.add (" q1d_square_fullEvent" , " q1d_square_fullEvent" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarD2Axis, multiplicityAxis});
493- registryCorr.add (" q1p_square_fullEvent" , " q1p_square_fullEvent" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarP2Axis, multiplicityAxis});
494- registryCorr.add (" q1d_q1p_fullEvent" , " q1d_q1p_fullEvent" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarDnBarPAxis, multiplicityAxis});
506+ registryCorr.add (" q1d_fullEvent" , " q1d_fullEvent" , HistType::kTHnSparseD , {nAntideuteronsAxis, ptPerNucleonAxis, multiplicityAxis, subsampleAxis });
507+ registryCorr.add (" q1p_fullEvent" , " q1p_fullEvent" , HistType::kTHnSparseD , {nAntiprotonsAxis, ptPerNucleonAxis, multiplicityAxis, subsampleAxis });
508+ registryCorr.add (" q1d_square_fullEvent" , " q1d_square_fullEvent" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarD2Axis, multiplicityAxis, subsampleAxis });
509+ registryCorr.add (" q1p_square_fullEvent" , " q1p_square_fullEvent" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarP2Axis, multiplicityAxis, subsampleAxis });
510+ registryCorr.add (" q1d_q1p_fullEvent" , " q1d_q1p_fullEvent" , HistType::kTHnSparseD , {ptPerNucleonAxis, ptPerNucleonAxis, nBarDnBarPAxis, multiplicityAxis, subsampleAxis });
495511 }
496512 }
497513
@@ -1801,6 +1817,7 @@ struct AntinucleiInJets {
18011817 if (particle.pdgCode () == PDG_t::kProtonBar ) {
18021818 TVector3 pVec (particle.px (), particle.py (), particle.pz ());
18031819 protonMomentum.emplace_back (pVec);
1820+ registryMC.fill (HIST (" antiproton_gen_full" ), particle.pt ());
18041821 }
18051822
18061823 // 4-momentum representation of a particle
@@ -2013,6 +2030,19 @@ struct AntinucleiInJets {
20132030 // Store track index for antiproton tracks
20142031 if (passedTrackSelection (track) && track.sign () < 0 && mcparticle.pdgCode () == PDG_t::kProtonBar ) {
20152032 antiprotonTrackIndex.emplace_back (id);
2033+
2034+ double nsigmaTPCPr = track.tpcNSigmaPr ();
2035+ double nsigmaTOFPr = track.tofNSigmaPr ();
2036+ double pt = track.pt ();
2037+ double dcaxy = track.dcaXY ();
2038+ double dcaz = track.dcaZ ();
2039+
2040+ if (mcparticle.isPhysicalPrimary () && std::fabs (dcaxy) < maxDcaxy && std::fabs (dcaz) < maxDcaz && nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc) {
2041+ registryMC.fill (HIST (" antiproton_rec_tpc_full" ), pt);
2042+ if (track.hasTOF () && nsigmaTOFPr > minNsigmaTof && nsigmaTOFPr < maxNsigmaTof) {
2043+ registryMC.fill (HIST (" antiproton_rec_tof_full" ), pt);
2044+ }
2045+ }
20162046 }
20172047
20182048 // Apply track selection for jet reconstruction
@@ -2649,11 +2679,14 @@ struct AntinucleiInJets {
26492679 return ;
26502680 registryCorr.fill (HIST (" eventCounter" ), 7.5 );
26512681
2682+ // Assign event to a random subsample (0-19)
2683+ double sampleId = mRand .Integer (20 ) + 0.5 ;
2684+
26522685 // Multiplicity percentile
26532686 const float multiplicity = collision.centFT0M ();
26542687
26552688 // Fill event counter vs centrality (full Event region)
2656- registryCorr.fill (HIST (" eventCounter_centrality_fullEvent" ), multiplicity);
2689+ registryCorr.fill (HIST (" eventCounter_centrality_fullEvent" ), multiplicity, sampleId );
26572690
26582691 // pt/A bins
26592692 std::vector<double > ptOverAbins = {0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 1.0 };
@@ -2732,23 +2765,25 @@ struct AntinucleiInJets {
27322765 // Fill correlation histograms
27332766 int netProtonFullEvent = nTotProtonFullEvent - nTotAntiprotonFullEvent;
27342767 int netDeuteronFullEvent = nTotDeuteronFullEvent - nTotAntideuteronFullEvent;
2735- registryCorr.fill (HIST (" rho_fullEvent" ), nTotAntideuteronFullEvent, nTotAntiprotonFullEvent, multiplicity);
2736- registryCorr.fill (HIST (" rho_netP_netD_fullEvent" ), netDeuteronFullEvent, netProtonFullEvent);
2768+
2769+ registryCorr.fill (HIST (" rho_fullEvent" ), nTotAntideuteronFullEvent, nTotAntiprotonFullEvent, multiplicity, sampleId);
2770+ registryCorr.fill (HIST (" rho_netP_netD_fullEvent" ), netDeuteronFullEvent, netProtonFullEvent, sampleId);
27372771
27382772 // Fill efficiency histograms
27392773 for (int i = 0 ; i < nBins; i++) {
27402774 double ptAcenteri = 0.5 * (ptOverAbins[i] + ptOverAbins[i + 1 ]);
27412775
2742- registryCorr.fill (HIST (" q1d_fullEvent" ), nAntideuteronFullEvent[i], ptAcenteri, multiplicity);
2743- registryCorr.fill (HIST (" q1p_fullEvent" ), nAntiprotonFullEvent[i], ptAcenteri, multiplicity);
2776+ registryCorr.fill (HIST (" q1d_fullEvent" ), nAntideuteronFullEvent[i], ptAcenteri, multiplicity, sampleId );
2777+ registryCorr.fill (HIST (" q1p_fullEvent" ), nAntiprotonFullEvent[i], ptAcenteri, multiplicity, sampleId );
27442778 for (int j = 0 ; j < nBins; j++) {
27452779 double ptAcenterj = 0.5 * (ptOverAbins[j] + ptOverAbins[j + 1 ]);
2746- registryCorr.fill (HIST (" q1d_square_fullEvent" ), ptAcenteri, ptAcenterj, nAntideuteronFullEvent[i] * nAntideuteronFullEvent[j], multiplicity);
2747- registryCorr.fill (HIST (" q1p_square_fullEvent" ), ptAcenteri, ptAcenterj, nAntiprotonFullEvent[i] * nAntiprotonFullEvent[j], multiplicity);
2748- registryCorr.fill (HIST (" q1d_q1p_fullEvent" ), ptAcenteri, ptAcenterj, nAntideuteronFullEvent[i] * nAntiprotonFullEvent[j], multiplicity);
2780+ registryCorr.fill (HIST (" q1d_square_fullEvent" ), ptAcenteri, ptAcenterj, ( nAntideuteronFullEvent[i] * nAntideuteronFullEvent[j]) , multiplicity, sampleId );
2781+ registryCorr.fill (HIST (" q1p_square_fullEvent" ), ptAcenteri, ptAcenterj, ( nAntiprotonFullEvent[i] * nAntiprotonFullEvent[j]) , multiplicity, sampleId );
2782+ registryCorr.fill (HIST (" q1d_q1p_fullEvent" ), ptAcenteri, ptAcenterj, ( nAntideuteronFullEvent[i] * nAntiprotonFullEvent[j]) , multiplicity, sampleId );
27492783 }
27502784 }
27512785
2786+ /*
27522787 // Loop over reconstructed tracks (refactoring: this part can be incorporated above)
27532788 int id(-1);
27542789 std::vector<fastjet::PseudoJet> fjParticles;
@@ -3013,6 +3048,7 @@ struct AntinucleiInJets {
30133048 registryCorr.fill(HIST("eventCounter"), 9.5);
30143049 registryCorr.fill(HIST("eventCounter_centrality_jet"), multiplicity);
30153050 }
3051+ */
30163052 }
30173053 PROCESS_SWITCH (AntinucleiInJets, processCorr, " Process Correlation analysis" , false );
30183054};
0 commit comments