rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2015_I1408516

$Z$ $p_T$ and $Z$ $\phi^*$
Experiment: ATLAS (LHC)
Inspire ID: 1408516
Status: VALIDATED
Authors:
  • Christian Gutschow
References: Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • inclusive Z production in the electron channel

Distributions of transverse momentum $p_\text{T}^{\ell\ell}$ and the angular variable $\phi^\ast_\eta$ of Drell-Yan lepton pairs are measured in $20.3\,\text{fb}^{-1}$ of proton-proton collisions at $\sqrt{s}=8$\,TeV with the ATLAS detector at the LHC. Measurements in electron-pair and muon-pair final states are corrected for detector effects. Compared to previous measurements in proton--proton collisions at $\sqrt{s}=7$ TeV, these new measurements benefit from a larger data sample and improved control of systematic uncertainties. Measurements are performed in bins of lepton-pair mass above, around and below the $Z$-boson mass peak. Specify the lepton channel (default is Z->ee) by using the LMODE variable. Only individual channels are available as particle-level measurements.

Source code: ATLAS_2015_I1408516.cc
  1#include "Rivet/Analysis.hh"
  2#include "Rivet/Projections/FinalState.hh"
  3#include "Rivet/Projections/DileptonFinder.hh"
  4
  5namespace Rivet {
  6
  7
  8  class ATLAS_2015_I1408516 : public Analysis {
  9  public:
 10
 11    /// Constructor
 12    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2015_I1408516);
 13
 14    /// @name Analysis methods
 15    /// @{
 16
 17    /// Book histograms and initialise projections before the run
 18    void init() {
 19
 20      // Get options
 21      _mode = 0;
 22      if ( getOption("LMODE") == "EL" ) _mode = 0;
 23      if ( getOption("LMODE") == "MU" ) _mode = 1;
 24
 25      // Configure projections
 26      Cut cuts = Cuts::abseta < 2.4 && Cuts::pT > 20*GeV;
 27      DileptonFinder zfinder(91.2*GeV, 0.1, cuts && Cuts::abspid == (_mode ? PID::MUON : PID::ELECTRON), Cuts::massIn(12*GeV, 150*GeV));
 28      declare(zfinder, _mode ? "DileptonFinder_mu" : "DileptonFinder_el");
 29
 30      // Book histograms
 31      const size_t offset = _mode ? 4 : 1;
 32
 33      book(_h["phistar_lo_00_08"] , 2, 1, offset);
 34      book(_h["phistar_lo_08_16"] , 3, 1, offset);
 35      book(_h["phistar_lo_16_24"] , 4, 1, offset);
 36
 37      book(_h["phistar_me_00_04"] , 5, 1, offset);
 38      book(_h["phistar_me_04_08"] , 6, 1, offset);
 39      book(_h["phistar_me_08_12"] , 7, 1, offset);
 40      book(_h["phistar_me_12_16"] , 8, 1, offset);
 41      book(_h["phistar_me_16_20"] , 9, 1, offset);
 42      book(_h["phistar_me_20_24"] ,10, 1, offset);
 43
 44      book(_h["phistar_hi_00_08"] ,11, 1, offset);
 45      book(_h["phistar_hi_08_16"] ,12, 1, offset);
 46      book(_h["phistar_hi_16_24"] ,13, 1, offset);
 47
 48      book(_h["phistar_mll_46_66"  ] ,14, 1, offset);
 49      book(_h["phistar_mll_66_116" ] ,15, 1, offset);
 50      book(_h["phistar_mll_116_150"] ,16, 1, offset);
 51
 52      book(_h["zpt_00_04"] ,17, 1, offset);
 53      book(_h["zpt_04_08"] ,18, 1, offset);
 54      book(_h["zpt_08_12"] ,19, 1, offset);
 55      book(_h["zpt_12_16"] ,20, 1, offset);
 56      book(_h["zpt_16_20"] ,21, 1, offset);
 57      book(_h["zpt_20_24"] ,22, 1, offset);
 58
 59      book(_h["zpt_mll_12_20"  ] ,23, 1, offset);
 60      book(_h["zpt_mll_20_30"  ] ,24, 1, offset);
 61      book(_h["zpt_mll_30_46"  ] ,25, 1, offset);
 62      book(_h["zpt_mll_46_66"  ] ,26, 1, offset);
 63      book(_h["zpt_mll_66_116" ] ,27, 1, offset);
 64      book(_h["zpt_mll_116_150"] ,28, 1, offset);
 65
 66      book(_h["zpt_00_04_xsec"] ,29, 1, offset);
 67      book(_h["zpt_04_08_xsec"] ,30, 1, offset);
 68      book(_h["zpt_08_12_xsec"] ,31, 1, offset);
 69      book(_h["zpt_12_16_xsec"] ,32, 1, offset);
 70      book(_h["zpt_16_20_xsec"] ,33, 1, offset);
 71      book(_h["zpt_20_24_xsec"] ,34, 1, offset);
 72
 73      book(_h["zpt_mll_12_20_xsec"  ] ,35, 1, offset);
 74      book(_h["zpt_mll_20_30_xsec"  ] ,36, 1, offset);
 75      book(_h["zpt_mll_30_46_xsec"  ] ,37, 1, offset);
 76      book(_h["zpt_mll_46_66_xsec"  ] ,38, 1, offset);
 77      book(_h["zpt_mll_66_116_xsec" ] ,39, 1, offset);
 78      book(_h["zpt_mll_116_150_xsec"] ,40, 1, offset);
 79
 80      book(_h["mll_xsec"] ,41, 1, 1 + _mode);
 81    }
 82
 83
 84    /// Perform the per-event analysis
 85    void analyze(const Event& event) {
 86
 87      // Get leptonic Z boson
 88      const DileptonFinder& zfinder = apply<DileptonFinder>(event, _mode ? "DileptonFinder_mu" : "DileptonFinder_el");
 89      if (zfinder.bosons().size() != 1 ) vetoEvent;
 90      const Particle& Zboson = zfinder.boson();
 91
 92      // Get/cut on heavily used Z boson properties
 93      const double zpt   = Zboson.pT();
 94      const double zrap  = Zboson.absrap();
 95      const double zmass = Zboson.mass();
 96      if (zrap > 2.4) vetoEvent;
 97
 98      // Get/cut on Z boson leptons
 99      const Particles& leptons = zfinder.constituents();
100      if (leptons.size() != 2 || leptons[0].charge3() * leptons[1].charge3() > 0) vetoEvent;
101      const Particle& lminus = leptons[0].charge() < 0 ? leptons[0] : leptons[1];
102      const Particle& lplus  = leptons[0].charge() < 0 ? leptons[1] : leptons[0];
103
104      // Compute phi*
105      const double phi_acop = M_PI - deltaPhi(lminus, lplus);
106      const double costhetastar = tanh( 0.5 * (lminus.eta() - lplus.eta()) );
107      const double sin2thetastar = (costhetastar > 1) ? 0.0 : (1.0 - sqr(costhetastar));
108      const double phistar = tan(0.5 * phi_acop) * sqrt(sin2thetastar);
109
110      // Inclusive mll
111      if (zmass > 46*GeV || zpt > 45*GeV) {
112        // 46 GeV < mll < 150 GeV OR (12 GeV < mll < 46 GeV AND ZpT >45 GeV)
113        _h["mll_xsec"]->fill(zmass);
114      }
115
116      // 12 GeV < mll < 150 GeV observables
117      if (zmass < 20*GeV) {
118        // 12 GeV < mll < 20 GeV
119        if (zpt > 45*GeV) { // ZpT cut only for low-mass regions
120          _h["zpt_mll_12_20_xsec"]->fill(zpt);
121          _h["zpt_mll_12_20"     ]->fill(zpt);
122        }
123      } else if (zmass < 30*GeV) {
124        // 20 GeV < mll < 30 GeV
125        if (zpt > 45*GeV) { // ZpT cut only for low-mass regions
126          _h["zpt_mll_20_30_xsec"]->fill(zpt);
127          _h["zpt_mll_20_30"     ]->fill(zpt);
128        }
129      } else if (zmass <  46*GeV) {
130        // 30 GeV < mll < 46 GeV
131        if (zpt > 45*GeV) { // ZpT cut only for low-mass regions
132          _h["zpt_mll_30_46_xsec"]->fill(zpt);
133          _h["zpt_mll_30_46"     ]->fill(zpt);
134        }
135      } else if (zmass <  66*GeV) {
136        // 46 GeV < mll < 66 GeV
137        _h["zpt_mll_46_66_xsec"]->fill(zpt);
138        _h["zpt_mll_46_66"     ]->fill(zpt);
139
140        _h["phistar_mll_46_66"]->fill(phistar);
141        if      (zrap < 0.8)  _h["phistar_lo_00_08"]->fill(phistar);
142        else if (zrap < 1.6)  _h["phistar_lo_08_16"]->fill(phistar);
143        else                  _h["phistar_lo_16_24"]->fill(phistar);
144
145      } else if (zmass < 116*GeV) {
146        // 66 GeV < mll < 116 GeV
147        _h["zpt_mll_66_116_xsec"]->fill(zpt);
148        _h["zpt_mll_66_116"     ]->fill(zpt);
149
150        if (zrap < 0.4) {
151          _h["zpt_00_04_xsec"]->fill(zpt);
152          _h["zpt_00_04"]->fill(zpt);
153        } else if (zrap < 0.8) {
154          _h["zpt_04_08_xsec"]->fill(zpt);
155          _h["zpt_04_08"]->fill(zpt);
156        } else if (zrap < 1.2) {
157          _h["zpt_08_12_xsec"]->fill(zpt);
158          _h["zpt_08_12"]->fill(zpt);
159        } else if (zrap < 1.6) {
160          _h["zpt_12_16_xsec"]->fill(zpt);
161          _h["zpt_12_16"]->fill(zpt);
162        } else if (zrap < 2.0) {
163          _h["zpt_16_20_xsec"]->fill(zpt);
164          _h["zpt_16_20"]->fill(zpt);
165        } else {
166          _h["zpt_20_24_xsec"]->fill(zpt);
167          _h["zpt_20_24"]->fill(zpt);
168        }
169
170        _h["phistar_mll_66_116"]->fill(phistar);
171        if      (zrap < 0.4)  _h["phistar_me_00_04"]->fill(phistar);
172        else if (zrap < 0.8)  _h["phistar_me_04_08"]->fill(phistar);
173        else if (zrap < 1.2)  _h["phistar_me_08_12"]->fill(phistar);
174        else if (zrap < 1.6)  _h["phistar_me_12_16"]->fill(phistar);
175        else if (zrap < 2.0)  _h["phistar_me_16_20"]->fill(phistar);
176        else                  _h["phistar_me_20_24"]->fill(phistar);
177
178      } else {
179
180        // 116 GeV < mll < 150 GeV
181        _h["zpt_mll_116_150_xsec"]->fill(zpt);
182        _h["zpt_mll_116_150"     ]->fill(zpt);
183
184        _h["phistar_mll_116_150"]->fill(phistar);
185        if      (zrap < 0.8)  _h["phistar_hi_00_08"]->fill(phistar);
186        else if (zrap < 1.6)  _h["phistar_hi_08_16"]->fill(phistar);
187        else                  _h["phistar_hi_16_24"]->fill(phistar);
188
189      }
190    }
191
192
193    /// Normalise histograms etc., after the run
194    void finalize() {
195      // Scale non-xsec plots to cross-section
196      const double sf = crossSection() / picobarn / sumOfWeights();
197      for (auto& key_hist : _h) {
198        scale(key_hist.second, sf);
199        if (!contains(key_hist.first, "_xsec")) normalize(key_hist.second);
200      }
201
202      // M(ll) plot isn't a differential cross section so shouldn't be divided by bin width
203      for (size_t i = 1; i < 7; ++i) {
204        double bw = _h["mll_xsec"]->bin(i).xWidth();
205        _h["mll_xsec"]->bin(i).scaleW(bw);
206      }
207    }
208    /// @}
209
210
211  protected:
212
213    size_t _mode;
214
215
216  private:
217
218    /// @name Histograms
219    /// @{
220    map<string, Histo1DPtr> _h;
221    /// @}
222
223  };
224
225
226  RIVET_DECLARE_PLUGIN(ATLAS_2015_I1408516);
227
228}