rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ALICE_2019_I1723697

Multi-particle correlations in pp, pPb, XeXe and PbPb
Experiment: ALICE (LHC)
Inspire ID: 1723697
Status: UNVALIDATED
Authors:
  • Christian Bierlich
References:
  • Phys.Rev.Lett.123(2019)no.14,142301
  • arXiv: 1903.01790
Beams: p+ p+, p+ 1000822080, 1000541290 1000541290, 1000822080 1000822080
Beam energies: (6500.0, 6500.0); (4000.0, 326560.0); (350880.0, 350880.0); (522392.0, 522392.0) GeV
Run details:
  • Minimum bias events for either system.

Multiparticle correlations and flow coefficients as function of number of charged particles in pp (13 TeV), pPb (5.02 TeV), XeXe (5.44 TeV) and PbPb (5.02 TeV). Be aware that in order to apply the high multiplicity trigger in pp, a calibration run must first be performed, using the analysis ALICE_2015_PPCentrality, and the resulting file pre-loaded to Rivet. Furthermore, the analysis option beam=<beam-type> (pp,pPb,XeXe,PbPb) must be used when running the analysis, if multiple runs should be merged by rivet-merge afterwards.

Source code: ALICE_2019_I1723697.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/ChargedFinalState.hh"
  4#include "Rivet/Tools/Correlators.hh"
  5#include "Rivet/Tools/AliceCommon.hh"
  6#include "Rivet/Projections/AliceCommon.hh"
  7
  8namespace Rivet {
  9
 10
 11  /// @brief Multiparticle azimuthal correlations pp, pPb, XeXe and PbPb.
 12  class ALICE_2019_I1723697 : public CumulantAnalysis {
 13  public:
 14
 15    /// Constructor
 16    ALICE_2019_I1723697() : 
 17      CumulantAnalysis("ALICE_2019_I1723697") {}
 18
 19
 20
 21    /// @name Analysis methods
 22    //@{
 23
 24    /// Book histograms and initialise projections before the run
 25    void init() {
 26      // Find system type.
 27      string bOpt = getOption<string>("beam","");
 28      const ParticlePair& beam = beams();
 29      if (beam.first.pid() == PID::PROTON && beam.second.pid() == PID::PROTON)
 30         sysType = pp;
 31      else if (beam.first.pid() == PID::PROTON && beam.second.pid() == PID::LEAD)
 32        sysType = pPb;
 33      else if (beam.first.pid() == PID::XENON && beam.second.pid() == PID::XENON)
 34        sysType = XeXe;
 35      else if (beam.first.pid() == PID::LEAD && beam.second.pid() == PID::LEAD)
 36        sysType = PbPb;
 37      else{
 38        MSG_WARNING("Suspicious beam. You're probably in reentrant mode. Fetching beam type from option.");
 39        if (bOpt == "pp") sysType = pp;
 40        else if (bOpt == "pPb") sysType = pPb;
 41        else if (bOpt == "XeXe") sysType = XeXe;
 42        else if (bOpt == "PbPb") sysType = PbPb;
 43        else MSG_ERROR("Could not decipher beam type. For rivet-merge, set -a ALICE_2019_I1723697:beam=OPT, where opt is pp, pPb, XeXe or PbPb.");        
 44        MSG_WARNING("Setting beam type to "+bOpt);
 45      }
 46      // Sanity check
 47      if ((sysType == pp && bOpt != "pp") || (sysType == pPb && bOpt != "pPb") ||
 48        (sysType == XeXe && bOpt != "XeXe") || (sysType == PbPb && bOpt != "PbPb"))
 49          MSG_WARNING("Beam option and registered beam don't match. Are you sure this is intentional?");
 50
 51      // Initialise and register projections
 52      // Declare the trigger projection.
 53      declare<ALICE::V0AndTrigger>(ALICE::V0AndTrigger(),"V0-AND");
 54      
 55      // Centrality projection for high multiplicity trigger in pp.
 56      if (sysType == pp)
 57        declareCentrality(ALICE::V0MMultiplicity(), 
 58	  "ALICE_2015_PPCentrality", "V0M","V0M");
 59
 60      // The full central charged final state.
 61      const ChargedFinalState& cfs = ChargedFinalState(Cuts::abseta < 0.8 &&
 62        Cuts::pT > 0.2*GeV && Cuts::pT < 5.0*GeV);
 63      declare(cfs, "CFS");
 64
 65      // The positive eta side used for rapidity gap = 1.4.
 66      const ChargedFinalState& cfsp14 = ChargedFinalState(Cuts::eta > 0.5 &&
 67        Cuts::eta < 0.8 && Cuts::pT > 0.2*GeV && Cuts::pT < 5.0*GeV);
 68      declare(cfsp14, "CFSP14");
 69      // ..negative ditto.
 70      const ChargedFinalState& cfsn14 = ChargedFinalState(Cuts::eta < -0.5 &&
 71        Cuts::eta > -0.8 && Cuts::pT > 0.2*GeV && Cuts::pT < 5.0*GeV);
 72      declare(cfsn14, "CFSN14");
 73      // The positive eta side used for rapidity gap = 1.0.
 74      const ChargedFinalState& cfsp10 = ChargedFinalState(Cuts::eta > 0.5 &&
 75        Cuts::eta < 0.8 && Cuts::pT > 0.2*GeV && Cuts::pT < 5.0*GeV);
 76      declare(cfsp10, "CFSP10");
 77      // ..negative ditto.
 78      const ChargedFinalState& cfsn10 = ChargedFinalState(Cuts::eta < -0.5 &&
 79        Cuts::eta > -0.8 && Cuts::pT > 0.2*GeV && Cuts::pT < 5.0*GeV);
 80      declare(cfsn10, "CFSN10");
 81
 82      // Book flow coeff scatters before booking the correlators
 83      // to have access to bin edges.
 84      int n1 = 0;
 85      int n2 = 0;
 86      int n3 = 0;
 87      if (sysType == pPb) n1 = 9, n2 = 1;
 88      else if (sysType == XeXe) n1 = 19, n2 = 1, n3 = 0;
 89      else if (sysType == PbPb) n1 = 30, n2 = 1, n3 = 1;
 90      book(h_v22gap, 1 + n1, 1, 1, true);
 91      book(h_v32gap, 2 + n1, 1, 1, true);
 92      book(h_v42gap, 3 + n1, 1, 1, true);
 93      if (sysType != pp)
 94        book(h_v24, 4 + n1, 1, 1, true);
 95      book(h_v26, 5 + n1 + n2, 1, 1, true);
 96      if (sysType == XeXe || sysType == PbPb)
 97        book(h_v28, 6 + n1 + n2 + n3, 1, 1, true);
 98
 99      // Book cumulant scatters.
100      book(h_c22gap, "c22gap", refData(1 + n1, 1, 1));
101      book(h_c32gap, "c32gap", refData(2 + n1, 1, 1));
102      book(h_c42gap, "c42gap", refData(3 + n1, 1, 1));
103      book(h_c24, "c24", refData(4 + n1, 1, 1));
104      book(h_c26, "c26", refData(5 + n1 + n2, 1, 1));
105      if (sysType == XeXe || sysType == PbPb)
106        book(h_c28, "c28", refData(6 + n1 + n2 + n3, 1, 1));
107     
108      // Book correlators. First the ungapped ones.
109      ec22 = bookECorrelator<2,2>("ec22", refData(4 + n1, 1, 1));
110      ec24 = bookECorrelator<2,4>("ec24", refData(4 + n1, 1, 1));
111      
112      ec622 = bookECorrelator<2,2>("ec622", refData(5 + n1 + n2, 1, 1));
113      ec624 = bookECorrelator<2,4>("ec624", refData(5 + n1 + n2, 1, 1));
114      ec626 = bookECorrelator<2,6>("ec626", refData(5 + n1 + n2, 1, 1));
115      
116      // And the ones just valid for XeXe and PbPb.
117      if (sysType == XeXe || sysType == PbPb) {
118	    ec822 = bookECorrelator<2,2>("ec822", refData(6 + n1 + n2 + n3, 1, 1));
119	    ec824 = bookECorrelator<2,4>("ec824", refData(6 + n1 + n2 + n3, 1, 1));
120	    ec826 = bookECorrelator<2,6>("ec826", refData(6 + n1 + n2 + n3, 1, 1));
121	    ec828 = bookECorrelator<2,8>("ec828", refData(6 + n1 + n2 + n3, 1, 1));
122      }
123      // ...and the gapped ones.
124      ec22gap = bookECorrelatorGap<2,2>("ec22gap", refData(1 + n1, 1, 1));
125      ec32gap = bookECorrelatorGap<3,2>("ec32gap", refData(2 + n1, 1, 1));
126      ec42gap = bookECorrelatorGap<4,2>("ec42gap", refData(3 + n1, 1, 1));
127      // Get the max order of booked correlators for the projections.
128      pair<int, int> max = getMaxValues();
129
130      // Declare correlator projections.
131      declare(Correlators(cfs, max.first, max.second), "Correlators");
132      declare(Correlators(cfsp14, max.first, max.second), "CorrelatorsPos14");
133      declare(Correlators(cfsn14, max.first, max.second), "CorrelatorsNeg14");
134      declare(Correlators(cfsp10, max.first, max.second), "CorrelatorsPos10");
135      declare(Correlators(cfsn10, max.first, max.second), "CorrelatorsNeg10");
136    }
137
138
139    /// Perform the per-event analysis
140    void analyze(const Event& event) {
141      // Event trigger.
142      if (!apply<ALICE::V0AndTrigger>(event, "V0-AND")() ) vetoEvent;
143
144      // High multiplicity trigger for pp.
145      if (sysType == pp && apply<CentralityProjection>(event, "V0M")() > 0.1) 
146        vetoEvent;
147      // Number of charged particles.
148      const double nch = apply<ChargedFinalState>(event, "CFS").size();
149      
150      // The correlators projections.
151      const Correlators& c = applyProjection<Correlators>(event,"Correlators");
152      const Correlators& cp10 =
153        applyProjection<Correlators>(event,"CorrelatorsPos10");
154      const Correlators& cn10 =
155        applyProjection<Correlators>(event,"CorrelatorsNeg10");
156      const Correlators& cp14 =
157        applyProjection<Correlators>(event,"CorrelatorsPos14");
158      const Correlators& cn14 =
159        applyProjection<Correlators>(event,"CorrelatorsNeg14");
160
161      // Fill correlators.
162      ec22->fill(nch, c);
163      ec24->fill(nch, c);
164
165      ec622->fill(nch, c);
166      ec624->fill(nch, c);
167      ec626->fill(nch, c);
168      
169      if (sysType == XeXe || sysType == PbPb) {
170        ec822->fill(nch, c);
171        ec824->fill(nch, c);
172        ec826->fill(nch, c);
173        ec828->fill(nch, c);
174      }
175
176      // Fill gapped correlators.
177      ec22gap->fill(nch, cp14, cn14);
178      ec32gap->fill(nch, cp10, cn10);
179      ec42gap->fill(nch, cp10, cn10);
180
181    }
182
183    /// Normalise histograms etc., after the run
184    void finalize() {
185      // Stream correlators to yoda file.
186      // Fill cumulant scatters.
187      cnTwoInt(h_c22gap, ec22gap);
188      cnTwoInt(h_c32gap, ec32gap);
189      cnTwoInt(h_c42gap, ec42gap);
190
191      cnFourInt(h_c24, ec22, ec24);
192      cnSixInt(h_c26, ec622, ec624, ec626);
193      if (sysType == XeXe || sysType == PbPb)
194        cnEightInt(h_c28, ec822, ec824, ec826, ec828);
195
196      // Fill flow scatters.
197      vnTwoInt(h_v22gap, ec22gap);
198      vnTwoInt(h_v32gap, ec32gap);
199      vnTwoInt(h_v42gap, ec42gap);
200      
201      if (sysType != pp)
202        vnFourInt(h_v24, ec22, ec24);
203      vnSixInt(h_v26, ec622, ec624, ec626);
204      if (sysType == XeXe || sysType == PbPb)
205        vnEightInt(h_v28, ec822, ec824, ec826, ec828);
206    }
207
208    //@}
209    // System check enum.
210    enum SysType {pp, pPb, XeXe, PbPb};
211    SysType sysType;
212
213    /// @name Histograms
214    //@{
215    // Flow coefficients.
216    Scatter2DPtr h_v22gap;
217    Scatter2DPtr h_v32gap;
218    Scatter2DPtr h_v42gap;
219    Scatter2DPtr h_v24;
220    Scatter2DPtr h_v26;
221    Scatter2DPtr h_v28;
222
223    // Cumulants.
224    Scatter2DPtr h_c22gap;
225    Scatter2DPtr h_c32gap;
226    Scatter2DPtr h_c42gap;
227    Scatter2DPtr h_c24;
228    Scatter2DPtr h_c26;
229    Scatter2DPtr h_c28;
230
231    // Correlators.
232    ECorrPtr ec22;
233    ECorrPtr ec24;
234
235    ECorrPtr ec622;
236    ECorrPtr ec624;
237    ECorrPtr ec626;
238    
239    ECorrPtr ec822;
240    ECorrPtr ec824;
241    ECorrPtr ec826;
242    ECorrPtr ec828;
243
244    // Gapped correlators.
245    ECorrPtr ec22gap;
246    ECorrPtr ec32gap;
247    ECorrPtr ec42gap;
248
249    //@}
250
251
252  };
253
254
255  // The hook for the plugin system
256  RIVET_DECLARE_PLUGIN(ALICE_2019_I1723697);
257
258
259}