Rivet analyses referenceL3_2004_I645127$\mu^+\mu^-$ and $\tau^+\tau^-$ production in two photon collisions at LEPExperiment: L3 (LEP) Inspire ID: 645127 Status: VALIDATED Authors:
Beam energies: (80.5, 80.5); (86.0, 86.0); (91.5, 91.5); (94.5, 94.5); (98.0, 98.0); (103.0, 103.0); (1.8, 1.8); (2.2, 2.2); (2.8, 2.8); (3.2, 3.2); (3.8, 3.8); (4.5, 4.5); (6.2, 6.2); (8.8, 8.8); (15.0, 15.0) GeV Run details:
Measurement of $e^+e^-\to e^+e^-\gamma\gamma\to e^+e^-\to e^+e^-\mu^+\mu^-,\ \tau^+\tau^-$. This analysis can test approximations used to simulate this process, but also is a prototype for analyses of $\gamma\gamma$ collisions. There are two modes supported, the first PROCESS=EE, simulates for full process starting with $e^+e^-$ beams, while the second PROCESS=GG is the extracted cross section for $\gamma\gamma\to \mu^+\mu^-$. Source code: L3_2004_I645127.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/GammaGammaFinalState.hh"
5#include "Rivet/Projections/UnstableParticles.hh"
6
7namespace Rivet {
8
9
10 /// @brief mu+mu- and tau+tau- in gamma gamma
11 class L3_2004_I645127 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(L3_2004_I645127);
16
17
18 /// @name Analysis methods
19 /// @{
20
21 /// Book histograms and initialise projections before the run
22 void init() {
23
24 // get the mode and options
25 _mode =0;
26 if( getOption("PROCESS") == "EE" ) _mode = 0;
27 else if( getOption("PROCESS") == "GG") _mode = 1;
28
29 // Initialise and register projections
30 if(_mode==0) {
31 declare(GammaGammaFinalState(), "FS");
32 declare(UnstableParticles(),"UFS");
33 }
34 else if(_mode==1) {
35 declare(FinalState(), "FS");
36 }
37 // Book counters
38 book(_c_sigma_mu1, "/TMP/sigma_mu_1");
39 book(_c_sigma_mu2, "/TMP/sigma_mu_2");
40 book(_c_sigma_tau, "/TMP/sigma_tau");
41
42 }
43
44 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
45 for(const Particle &child : p.children()) {
46 if(child.children().empty()) {
47 --nRes[child.pid()];
48 --ncount;
49 }
50 else
51 findChildren(child,nRes,ncount);
52 }
53 }
54
55 /// Perform the per-event analysis
56 void analyze(const Event& event) {
57 // stuff for e+e- collisions
58 double W2 = sqr(sqrtS());
59 if(_mode==0) {
60 const GammaGammaKinematics& kin = apply<GammaGammaKinematics>(event, "Kinematics");
61 W2 = kin.W2();
62 if(W2<9.*sqr(GeV) ) vetoEvent;
63 }
64 const FinalState& fs = apply<FinalState>(event, "FS");
65 map<long,int> nCount;
66 int ntotal(0);
67 bool fiducal = true;
68 for(const Particle & p : fs.particles()) {
69 nCount[p.pid()] += 1;
70 ++ntotal;
71 if(abs(p.pid())==13) {
72 if(abs(cos(p.momentum().polarAngle()))>0.8) fiducal = false;
73 }
74 }
75 if( nCount[-13]==1 && nCount[13]==1 && ntotal==2+nCount[22]) {
76 if(W2<1600.*sqr(GeV)) {
77 _c_sigma_mu1->fill();
78 if(fiducal) {
79 _c_sigma_mu2->fill();
80 }
81 }
82 }
83 if(_mode==1) return;
84 bool foundTauPlus = false, foundTauMinus = true;
85 const UnstableParticles & ufs = apply<UnstableParticles>(event, "UFS");
86 for (const Particle& p : ufs.particles()) {
87 if(p.children().empty()) continue;
88 // find the taus
89 if(abs(p.pid())==15) {
90 if(p.pid()== 15) foundTauMinus=true;
91 if(p.pid()==-15) foundTauPlus =true;
92 findChildren(p,nCount,ntotal);
93 }
94 }
95 if(!foundTauPlus || !foundTauMinus)
96 vetoEvent;
97 bool matched = true;
98 for(auto const & val : nCount) {
99 if(val.first==22) {
100 continue;
101 }
102 else if(val.second!=0) {
103 matched = false;
104 break;
105 }
106 }
107 if(matched)
108 _c_sigma_tau->fill();
109 }
110
111
112 /// Normalise histograms etc., after the run
113 void finalize() {
114 // prefactor for the cross sections
115 double fact = crossSection()/picobarn/sumOfWeights();
116 if(_mode==1) fact /= 1000.;
117 scale(_c_sigma_mu1,fact);
118 scale(_c_sigma_mu2,fact);
119 scale(_c_sigma_tau,fact);
120 unsigned int imin=0, imax = 3;
121 if(_mode==1) {
122 imin=3;
123 imax=4;
124 }
125 for (unsigned int ihist=imin;ihist<imax;++ihist) {
126 unsigned int id=0, iy=0;
127 double sigma = 0., error = 0.;
128 if(ihist==0) {
129 id=1;
130 iy=1;
131 sigma = _c_sigma_mu2->val();
132 error = _c_sigma_mu2->err();
133 }
134 else if(ihist==1) {
135 id=1;
136 iy=2;
137 sigma = _c_sigma_mu1->val();
138 error = _c_sigma_mu1->err();
139 }
140 else if(ihist==2) {
141 id=2;
142 iy=1;
143 sigma = _c_sigma_tau->val();
144 error = _c_sigma_tau->err();
145 }
146 else if(ihist==3) {
147 id=3;
148 iy=5;
149 sigma = _c_sigma_mu1->val();
150 error = _c_sigma_mu1->err();
151 }
152 Estimate1DPtr mult;
153 book(mult, id, 1, iy);
154 for (auto& b : mult->bins()) {
155 if (inRange(sqrtS()/GeV, b.xMin(), b.xMax())) {
156 b.set(sigma, error);
157 }
158 }
159 }
160 }
161
162 /// @}
163
164
165 /// @name Histograms
166 /// @{
167 CounterPtr _c_sigma_mu1,_c_sigma_mu2,_c_sigma_tau;
168 unsigned int _mode;
169 /// @}
170
171
172 };
173
174
175 RIVET_DECLARE_PLUGIN(L3_2004_I645127);
176
177
178}
|