rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

L3_2004_I645127

$\mu^+\mu^-$ and $\tau^+\tau^-$ production in two photon collisions at LEP
Experiment: L3 (LEP)
Inspire ID: 645127
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Phys.Lett. B585 (2004) 53-62, 2004
Beams: e- e+, 22 22
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:
  • e+e- -> gamma gamma producing muons and tau leptons

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}