rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

UA5_1989_I267179

UA5 charged multiplicity measurements
Experiment: UA5 (CERN SPS)
Inspire ID: 267179
Status: VALIDATED
Authors:
  • Holger Schulz
  • Christophe L. J. Vaillant
  • Andy Buckley
References: Beams: p- p+
Beam energies: (100.0, 100.0); (450.0, 450.0) GeV
Run details:
  • Minimum bias events at $\sqrt{s} = 200$ and 900 GeV. Enable single and double diffractive events in addition to non-diffractive processes. Beam energy must be specified as analysis option "ENERGY" (200 or 900 GeV) when rivet-merge'ing samples.

Multiplicity distributions of charged particles produced in non-single-diffractive collisions between protons and antiprotons at centre-of-mass energies of 200 and 900 GeV. The data were recorded in the UA5 streamer chambers at the CERN collider, which was operated in a pulsed mode between the two energies. This analysis confirms the violation of KNO scaling in full phase space found by the UA5 group at an energy of 546 GeV, with similar measurements at 200 and 900 GeV. Beam energy must be specified as analysis option "ENERGY" (200 or 900 GeV) when rivet-merging samples.

Source code: UA5_1989_I267179.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/ChargedFinalState.hh"
  4#include "Rivet/Projections/TriggerUA5.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// UA5 min bias charged multiplicities in central \f$ \eta \f$ ranges
 10  class UA5_1989_I267179 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(UA5_1989_I267179);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and projections
 21    void init() {
 22      declare(TriggerUA5(), "Trigger");
 23      declare(ChargedFinalState(Cuts::abseta < 0.5), "CFS05");
 24      declare(ChargedFinalState(Cuts::abseta < 1.5), "CFS15");
 25      declare(ChargedFinalState(Cuts::abseta < 3.0), "CFS30");
 26      declare(ChargedFinalState(Cuts::abseta < 5.0), "CFS50");
 27
 28      // NB. _hist_nch and _hist_ncheta50 use the same data but different binning
 29      vector<double> tmp;
 30      if (isCompatibleWithSqrtS(200*GeV)) {
 31        book(_hist_nch,        1, 1, 1);
 32        book(_hist_nch_eta05,  3, 1, 1);
 33        book(_hist_nch_eta15,  4, 1, 1);
 34        book(_hist_nch_eta30,  5, 1, 1);
 35        book(_hist_nch_eta50,  6, 1, 1);
 36        book(_hist_mean_nch , 11, 1, 1);
 37        Ecm = 200;
 38
 39        // _hist_nch axis
 40        tmp.clear(); tmp.reserve(32);
 41        for (size_t i = 1; i < 30; ++i)  tmp.push_back(2*i-1);
 42        tmp.push_back(60); tmp.push_back(62); tmp.push_back(74);
 43        _axes[0] = YODA::Axis<double>(tmp);
 44
 45        // _hist_nch_eta05 axis
 46        _axes[1] = YODA::Axis<double>({-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5,
 47                                       7.5, 8.5, 9.5, 10.5, 11.5, 13.0, 19.0});
 48
 49        // _hist_nch_eta15 axis
 50        tmp.clear(); tmp.reserve(33);
 51        for (size_t i = 1; i < 31; ++i)  tmp.push_back(i-0.5);
 52        tmp.push_back(31); tmp.push_back(32); tmp.push_back(45);
 53        _axes[2] = YODA::Axis<double>(tmp);
 54
 55        // _hist_nch_eta30 axis
 56        tmp.clear(); tmp.reserve(54);
 57        for (size_t i = 0; i < 49; ++i)  tmp.push_back(i-0.5);
 58        tmp.push_back(49); tmp.push_back(50);
 59        tmp.push_back(51); tmp.push_back(53);
 60        tmp.push_back(81);
 61        _axes[3] = YODA::Axis<double>(tmp);
 62
 63        // _hist_nch_eta50 axis
 64        tmp.clear(); tmp.reserve(59);
 65        tmp.push_back(0);
 66        for (size_t i = 3; i < 56; ++i)  tmp.push_back(i-0.5);
 67        tmp.push_back(56); tmp.push_back(57);
 68        tmp.push_back(58); tmp.push_back(60);
 69        tmp.push_back(74);
 70        _axes[4] = YODA::Axis<double>(tmp);
 71      }
 72      else if (isCompatibleWithSqrtS(900*GeV)) {
 73        book(_hist_nch,        2, 1, 1);
 74        book(_hist_nch_eta05,  7, 1, 1);
 75        book(_hist_nch_eta15,  8, 1, 1);
 76        book(_hist_nch_eta30,  9, 1, 1);
 77        book(_hist_nch_eta50, 10, 1, 1);
 78        book(_hist_mean_nch,  12, 1, 1);
 79        Ecm = 900;
 80
 81        // _hist_nch axis
 82        tmp.clear(); tmp.reserve(55);
 83        for (size_t i = 4; i < 53; ++i)  tmp.push_back(2*i-1);
 84        tmp.push_back(106); tmp.push_back(108); tmp.push_back(110);
 85        tmp.push_back(112); tmp.push_back(116);
 86        _axes[0] = YODA::Axis<double>(tmp);
 87
 88        // _hist_nch_eta05 axis
 89        tmp.clear(); tmp.reserve(23);
 90        for (size_t i = 0; i < 21; ++i)  tmp.push_back(i-0.5);
 91        tmp.push_back(21); tmp.push_back(23); tmp.push_back(30);
 92        _axes[1] = YODA::Axis<double>(tmp);
 93
 94        // _hist_nch_eta15 axis
 95        tmp.clear(); tmp.reserve(53);
 96        for (size_t i = 0; i < 47; ++i)  tmp.push_back(i-0.5);
 97        tmp.push_back(47); tmp.push_back(48); tmp.push_back(49);
 98        tmp.push_back(51); tmp.push_back(55); tmp.push_back(71);
 99        _axes[2] = YODA::Axis<double>(tmp);
100
101        // _hist_nch_eta30 axis
102        tmp.clear(); tmp.reserve(84);
103        for (size_t i = 0; i < 76; ++i)  tmp.push_back(i-0.5);
104        tmp.push_back(76); tmp.push_back(77); tmp.push_back(78);
105        tmp.push_back(79); tmp.push_back(81); tmp.push_back(84);
106        tmp.push_back(90); tmp.push_back(113);
107        _axes[3] = YODA::Axis<double>(tmp);
108
109        // _hist_nch_eta50 axis
110        tmp.clear(); tmp.reserve(102);
111        tmp.push_back(0); tmp.push_back(2);
112        for (size_t i = 4; i < 95; ++i)  tmp.push_back(i-0.5);
113        tmp.push_back(95);  tmp.push_back(96);  tmp.push_back(97);
114        tmp.push_back(98);  tmp.push_back(99);  tmp.push_back(102);
115        tmp.push_back(106); tmp.push_back(112); tmp.push_back(130);
116        _axes[4] = YODA::Axis<double>(tmp);
117      }
118      book(_sumWPassed, "SumW");
119      /// @todo Moments of distributions
120    }
121
122
123    /// Do the analysis
124    void analyze(const Event& event) {
125      // Trigger
126      const TriggerUA5& trigger = apply<TriggerUA5>(event, "Trigger");
127      if (!trigger.nsdDecision()) vetoEvent;
128
129      _sumWPassed->fill();
130
131      // Count final state particles in several eta regions
132      const int numP05 = apply<ChargedFinalState>(event, "CFS05").size();
133      const int numP15 = apply<ChargedFinalState>(event, "CFS15").size();
134      const int numP30 = apply<ChargedFinalState>(event, "CFS30").size();
135      const int numP50 = apply<ChargedFinalState>(event, "CFS50").size();
136
137      // Fill histograms
138      _hist_nch->fill(map2string(numP50, 0));
139      _hist_nch_eta05->fill(map2string(numP05, 1));
140      _hist_nch_eta15->fill(map2string(numP15, 2));
141      _hist_nch_eta30->fill(map2string(numP30, 3));
142      _hist_nch_eta50->fill(map2string(numP50, 4));
143      _hist_mean_nch->fill(Ecm, numP50);
144    }
145
146    string map2string(const int n, const int b) const {
147      if (Ecm == 200) {
148        if (b == 0) {
149          if (64 <= n && n <= 76)  return "64.0 - 76.0";
150          if (60 <= n && n <= 62)  return "60.0 - 62.0";
151          if (58 == n)             return "58";
152        }
153        if (b == 1) {
154          if (13 <= n && n <= 19)  return "13.0 - 19.0";
155        }
156        if (b == 2) {
157          if (33 <= n && n <= 45)  return "33.0 - 45.0";
158          if (31 <= n && n <= 32)  return "31.0 - 32.0";
159          if (30 == n)             return "30.0";
160        }
161        if (b == 3) {
162          if (56 <= n && n <= 74)  return "56.0 - 74.0";
163          if (53 <= n && n <= 55)  return "53.0 - 55.0";
164          if (51 <= n && n <= 52)  return "51.0 - 52.0";
165          if (49 <= n && n <= 50)  return "49.0 - 50.0";
166          if (48 == n)             return "48.0";
167        }
168        if (b == 4) {
169          if (63 <= n && n <= 77)  return "63.0 - 77.0";
170          if (60 <= n && n <= 62)  return "60.0 - 62.0";
171          if (58 <= n && n <= 59)  return "58.0 - 59.0";
172          if (56 <= n && n <= 57)  return "56.0 - 57.0";
173          if (55 == n)             return "55.0";
174          if ( 0 <= n && n <=  2)  return "0.0 - 2.0";
175        }
176      }
177      if (Ecm == 600) {
178        if (b == 0) {
179          if (122 <= n && n <= 136)  return "122.0 - 136.0";
180          if (114 <= n && n <= 120)  return "114.0 - 120.0";
181          if (106 <= n && n <= 108)  return "106.0 - 108.0";
182          if (104 == n)              return "104.0";
183          if (  2 <= n && n <=   6)  return "2.0 - 6.0";
184        }
185        if (b == 1) {
186          if (24 <= n && n <= 31)  return "24.0 - 31.0";
187          if (21 <= n && n <= 23)  return "21.0 - 23.0";
188          if (20 == n)             return "20.0";
189        }
190        if (b == 2) {
191          if (59 <= n && n <= 75)  return "59.0 - 75.0";
192          if (54 <= n && n <= 58)  return "54.0 - 58.0";
193          if (51 <= n && n <= 53)  return "51.0 - 53.0";
194          if (49 <= n && n <= 50)  return "49.0 - 50.0";
195          if (47 <= n && n <= 48)  return "47.0 - 48.0";
196          if (46 == n)             return "46.0";
197        }
198        if (b == 3) {
199          if (96 <= n && n <= 119)  return "69.0 - 119.0";
200          if (89 <= n && n <=  95)  return "89.0 - 95.0";
201          if (85 <= n && n <=  88)  return "85.0 - 88.0";
202          if (82 <= n && n <=  84)  return "82.0 - 84.0";
203          if (80 <= n && n <=  81)  return "80.0 - 81.0";
204          if (78 <= n && n <=  79)  return "78.0 - 79.0";
205          if (76 <= n && n <=  77)  return "76.0 - 77.0";
206          if (75 == n)              return "75.0";
207        }
208        if (b == 4) {
209          if (119 <= n && n <=  137)  return "119.0 - 137.0";
210          if (112 <= n && n <=  118)  return "112.0 - 118.0";
211          if (107 <= n && n <=  111)  return "107.0 - 111.0";
212          if (103 <= n && n <=  106)  return "103.0 - 106.0";
213          if (101 <= n && n <=  102)  return "101.0 - 102.0";
214          if ( 99 <= n && n <=  100)  return "99.0 - 100.0";
215          if ( 97 <= n && n <=   98)  return "97.0 - 98.0";
216          if ( 95 <= n && n <=   96)  return "95.0 - 96.0";
217          if ( 94 == n)               return "94.0";
218          if (  0 <= n && n <=    2)  return "0.0 - 2.0";
219        }
220      }
221      const size_t idx = _axes[b].index((double)n);
222      double val = _axes[b].mid(idx);
223      val = val + 0.5 - (val<0);
224      return std::to_string((int)val) + ".0";
225    }
226
227    void finalize() {
228      scale(_hist_nch, 1.0 / *_sumWPassed);
229      scale(_hist_nch_eta05, 1.0 / *_sumWPassed);
230      scale(_hist_nch_eta15, 1.0 / *_sumWPassed);
231      scale(_hist_nch_eta30, 1.0 / *_sumWPassed);
232      scale(_hist_nch_eta50, 1.0 / *_sumWPassed);
233      scale(_hist_mean_nch,  1.0 / *_sumWPassed);
234      for (auto& b: _hist_nch->bins()) {
235        const size_t idx = b.index();
236        double sf = _axes[0].width(idx);
237        b.scaleW(1.0/sf);
238      }
239      for (auto& b: _hist_nch_eta05->bins()) {
240        const size_t idx = b.index();
241        double sf = _axes[1].width(idx);
242        b.scaleW(1.0/sf);
243      }
244      for (auto& b: _hist_nch_eta15->bins()) {
245        const size_t idx = b.index();
246        double sf = _axes[2].width(idx);
247        b.scaleW(1.0/sf);
248      }
249      for (auto& b: _hist_nch_eta30->bins()) {
250        const size_t idx = b.index();
251        double sf = _axes[3].width(idx);
252        b.scaleW(1.0/sf);
253      }
254      for (auto& b: _hist_nch_eta50->bins()) {
255        const size_t idx = b.index();
256        double sf = _axes[4].width(idx);
257        b.scaleW(1.0/sf);
258      }
259    }
260
261    /// @}
262
263
264  private:
265
266    /// Weight counter
267    CounterPtr _sumWPassed;
268
269    /// @name Histograms
270    /// @{
271    BinnedHistoPtr<string> _hist_nch;
272    BinnedHistoPtr<string> _hist_nch_eta05;
273    BinnedHistoPtr<string> _hist_nch_eta15;
274    BinnedHistoPtr<string> _hist_nch_eta30;
275    BinnedHistoPtr<string> _hist_nch_eta50;
276    BinnedHistoPtr<int> _hist_mean_nch;
277    YODA::Axis<double> _axes[5];
278    int Ecm;
279    /// @}
280
281  };
282
283
284
285  RIVET_DECLARE_ALIASED_PLUGIN(UA5_1989_I267179, UA5_1989_S1926373);
286
287}