Rivet analyses referenceMC_ZZINCMonte Carlo validation observables for $Z[e^+ \, e^-]Z[\mu^+ \, \mu^-]$ productionExperiment: () Status: VALIDATED Authors:
Beams: * * Beam energies: ANY Run details:
Monte Carlo validation observables for $Z[e^+ \, e^-]Z[\mu^+ \, \mu^-]$ production Source code: MC_ZZINC.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/ZFinder.hh"
4#include "Rivet/Projections/VetoedFinalState.hh"
5
6namespace Rivet {
7
8
9 /// @brief MC validation analysis for Z[ee]Z[mumu] events
10 class MC_ZZINC : public Analysis {
11 public:
12
13 /// Default constructor
14 MC_ZZINC()
15 : Analysis("MC_ZZINC")
16 { }
17
18
19 /// @name Analysis methods
20 //@{
21
22 /// Book histograms
23 void init() {
24 Cut cut = Cuts::abseta < 3.5 && Cuts::pT > 25*GeV;
25 ZFinder zeefinder(FinalState(), cut, PID::ELECTRON, 65*GeV, 115*GeV,
26 0.2, ZFinder::ClusterPhotons::NODECAY, ZFinder::AddPhotons::YES);
27 declare(zeefinder, "ZeeFinder");
28
29 VetoedFinalState zmminput;
30 zmminput.addVetoOnThisFinalState(zeefinder);
31 ZFinder zmmfinder(zmminput, cut, PID::MUON, 65*GeV, 115*GeV,
32 0.2, ZFinder::ClusterPhotons::NODECAY, ZFinder::AddPhotons::YES);
33 declare(zmmfinder, "ZmmFinder");
34
35 // Properties of the pair momentum
36 double sqrts = sqrtS()>0. ? sqrtS() : 14000.;
37 book(_h_ZZ_pT ,"ZZ_pT", logspace(100, 1.0, 0.5*sqrts/GeV));
38 book(_h_ZZ_pT_peak ,"ZZ_pT_peak", 25, 0.0, 25.0);
39 book(_h_ZZ_eta ,"ZZ_eta", 40, -7.0, 7.0);
40 book(_h_ZZ_phi ,"ZZ_phi", 25, 0.0, TWOPI);
41 book(_h_ZZ_m ,"ZZ_m", logspace(100, 150.0, 180.0 + 0.25*sqrts/GeV));
42
43 // Correlations between the ZZ
44 book(_h_ZZ_dphi ,"ZZ_dphi", 25, 0.0, PI); /// @todo non-linear?
45 book(_h_ZZ_deta ,"ZZ_deta", 25, -7.0, 7.0);
46 book(_h_ZZ_dR ,"ZZ_dR", 25, 0.5, 7.0);
47 book(_h_ZZ_dpT ,"ZZ_dpT", logspace(100, 1.0, 0.5*sqrts/GeV));
48 book(_h_ZZ_costheta_planes ,"ZZ_costheta_planes", 25, -1.0, 1.0);
49
50 // Properties of the Z bosons
51 book(_h_Z_pT ,"Z_pT", logspace(100, 10.0, 0.25*sqrts/GeV));
52 book(_h_Z_eta ,"Z_eta", 70, -7.0, 7.0);
53
54 // Properties of the leptons
55 book(_h_Zl_pT ,"Zl_pT", logspace(100, 30.0, 0.1*sqrts/GeV));
56 book(_h_Zl_eta ,"Zl_eta", 40, -3.5, 3.5);
57
58 // Correlations between the opposite charge leptons
59 book(_h_ZeZm_dphi ,"ZeZm_dphi", 25, 0.0, PI);
60 book(_h_ZeZm_deta ,"ZeZm_deta", 25, -5.0, 5.0);
61 book(_h_ZeZm_dR ,"ZeZm_dR", 25, 0.5, 5.0);
62 book(_h_ZeZm_m ,"ZeZm_m", 100, 0.0, 300.0);
63
64 }
65
66
67
68 /// Do the analysis
69 void analyze(const Event& e) {
70 const ZFinder& zeefinder = apply<ZFinder>(e, "ZeeFinder");
71 if (zeefinder.bosons().size() != 1) vetoEvent;
72 const ZFinder& zmmfinder = apply<ZFinder>(e, "ZmmFinder");
73 if (zmmfinder.bosons().size() != 1) vetoEvent;
74
75 // Z momenta
76 const FourMomentum& zee = zeefinder.bosons()[0].momentum();
77 const FourMomentum& zmm = zmmfinder.bosons()[0].momentum();
78 const FourMomentum zz = zee + zmm;
79 // Lepton momenta
80 const FourMomentum& ep = zeefinder.constituents()[0].momentum();
81 const FourMomentum& em = zeefinder.constituents()[1].momentum();
82 const FourMomentum& mp = zmmfinder.constituents()[0].momentum();
83 const FourMomentum& mm = zmmfinder.constituents()[1].momentum();
84
85 const double weight = 1.0;
86 _h_ZZ_pT->fill(zz.pT()/GeV, weight);
87 _h_ZZ_pT_peak->fill(zz.pT()/GeV, weight);
88 _h_ZZ_eta->fill(zz.eta(), weight);
89 _h_ZZ_phi->fill(zz.phi(), weight);
90 if (zz.mass2() > 0.0) ///< @todo Protection still needed?
91 _h_ZZ_m->fill(zz.mass()/GeV, weight);
92
93 _h_ZZ_dphi->fill(deltaPhi(zee, zmm), weight);
94 _h_ZZ_deta->fill(zee.eta()-zmm.eta(), weight);
95 _h_ZZ_dR->fill(deltaR(zee,zmm), weight);
96 _h_ZZ_dpT->fill(fabs(zee.pT()-zmm.pT()), weight);
97
98 const Vector3 crossZee = ep.p3().cross(em.p3());
99 const Vector3 crossZmm = mp.p3().cross(mm.p3());
100 const double costheta = crossZee.dot(crossZmm)/crossZee.mod()/crossZmm.mod();
101 _h_ZZ_costheta_planes->fill(costheta, weight);
102
103 _h_Z_pT->fill(zee.pT()/GeV, weight);
104 _h_Z_pT->fill(zmm.pT()/GeV, weight);
105 _h_Z_eta->fill(zee.eta(), weight);
106 _h_Z_eta->fill(zmm.eta(), weight);
107
108 _h_Zl_pT->fill(ep.pT()/GeV, weight);
109 _h_Zl_pT->fill(em.pT()/GeV, weight);
110 _h_Zl_pT->fill(mp.pT()/GeV, weight);
111 _h_Zl_pT->fill(mm.pT()/GeV, weight);
112 _h_Zl_eta->fill(ep.eta(), weight);
113 _h_Zl_eta->fill(em.eta(), weight);
114 _h_Zl_eta->fill(mp.eta(), weight);
115 _h_Zl_eta->fill(mm.eta(), weight);
116
117 _h_ZeZm_dphi->fill(deltaPhi(ep, mm), weight);
118 _h_ZeZm_deta->fill(ep.eta()-mm.eta(), weight);
119 _h_ZeZm_dR->fill(deltaR(ep, mm), weight);
120 const FourMomentum epmm = ep + mm;
121 const double m_epmm = (epmm.mass2() > 0) ? epmm.mass() : 0; ///< @todo Protection still needed?
122 _h_ZeZm_m->fill(m_epmm/GeV, weight);
123 }
124
125
126 /// Finalize
127 void finalize() {
128 const double s = crossSection()/picobarn/sumOfWeights();
129 scale(_h_ZZ_pT, s);
130 scale(_h_ZZ_pT_peak, s);
131 scale(_h_ZZ_eta, s);
132 scale(_h_ZZ_phi, s);
133 scale(_h_ZZ_m, s);
134 scale(_h_ZZ_dphi, s);
135 scale(_h_ZZ_deta, s);
136 scale(_h_ZZ_dR, s);
137 scale(_h_ZZ_dpT, s);
138 scale(_h_ZZ_costheta_planes, s);
139 scale(_h_Z_pT, s);
140 scale(_h_Z_eta, s);
141 scale(_h_Zl_pT, s);
142 scale(_h_Zl_eta, s);
143 scale(_h_ZeZm_dphi, s);
144 scale(_h_ZeZm_deta, s);
145 scale(_h_ZeZm_dR, s);
146 scale(_h_ZeZm_m, s);
147 }
148
149 //@}
150
151
152 private:
153
154 /// @name Histograms
155 //@{
156 Histo1DPtr _h_ZZ_pT;
157 Histo1DPtr _h_ZZ_pT_peak;
158 Histo1DPtr _h_ZZ_eta;
159 Histo1DPtr _h_ZZ_phi;
160 Histo1DPtr _h_ZZ_m;
161 Histo1DPtr _h_ZZ_dphi;
162 Histo1DPtr _h_ZZ_deta;
163 Histo1DPtr _h_ZZ_dR;
164 Histo1DPtr _h_ZZ_dpT;
165 Histo1DPtr _h_ZZ_costheta_planes;
166 Histo1DPtr _h_Z_pT;
167 Histo1DPtr _h_Z_eta;
168 Histo1DPtr _h_Zl_pT;
169 Histo1DPtr _h_Zl_eta;
170 Histo1DPtr _h_ZeZm_dphi;
171 Histo1DPtr _h_ZeZm_deta;
172 Histo1DPtr _h_ZeZm_dR;
173 Histo1DPtr _h_ZeZm_m;
174 //@}
175
176 };
177
178
179
180 // The hook for the plugin system
181 RIVET_DECLARE_PLUGIN(MC_ZZINC);
182
183}
|