rivet is hosted by Hepforge, IPPP Durham
ZEUS_2001_S4815815.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/Projections/Beam.hh"
00004 #include "Rivet/Projections/IdentifiedFinalState.hh"
00005 #include "Rivet/Projections/FastJets.hh"
00006 
00007 namespace Rivet {
00008 
00009 
00010   /// @brief ZEUS dijet photoproduction study used in the ZEUS jets PDF fit
00011   ///
00012   /// This class is a reproduction of the HZTool routine for the ZEUS
00013   /// dijet photoproduction paper which was used in the ZEUS jets PDF fit.
00014   ///
00015   /// @note Cleaning cuts on event pT/sqrt(Et) and y_e are not needed in MC analysis.
00016   ///
00017   /// @author Andy Buckley
00018   class ZEUS_2001_S4815815 : public Analysis {
00019   public:
00020 
00021     /// Constructor
00022     DEFAULT_RIVET_ANALYSIS_CTOR(ZEUS_2001_S4815815);
00023 
00024     /// @name Analysis methods
00025     //@{
00026 
00027     // Book projections and histograms
00028     void init() {
00029 
00030       /// @todo Acceptance
00031       FinalState fs;
00032       declare(FastJets(fs, FastJets::KT, 1.0), "Jets"); //< R=1 checked with Matt Wing
00033 
00034       /// @todo Dress the lepton?
00035       IdentifiedFinalState positrons(fs, PID::POSITRON);
00036       declare(positrons, "Positrons");
00037 
00038       // Table 1
00039       _h_costh[0] = bookHisto1D(1, 1, 1);
00040       _h_costh[1] = bookHisto1D(1, 1, 2);
00041       // Table 2
00042       _h_etjet1[1][0] = bookHisto1D(2, 1, 1);
00043       _h_etjet1[1][1] = bookHisto1D(3, 1, 1);
00044       _h_etjet1[1][2] = bookHisto1D(4, 1, 1);
00045       _h_etjet1[1][3] = bookHisto1D(5, 1, 1);
00046       _h_etjet1[1][4] = bookHisto1D(6, 1, 1);
00047       _h_etjet1[1][5] = bookHisto1D(7, 1, 1);
00048       // Table 3
00049       _h_etjet1[0][0] = bookHisto1D(8, 1, 1);
00050       _h_etjet1[0][1] = bookHisto1D(9, 1, 1);
00051       _h_etjet1[0][2] = bookHisto1D(10, 1, 1);
00052       _h_etjet1[0][3] = bookHisto1D(11, 1, 1);
00053       _h_etjet1[0][4] = bookHisto1D(12, 1, 1);
00054       _h_etjet1[0][5] = bookHisto1D(13, 1, 1);
00055       // Table 4
00056       _h_etajet2[1][0] = bookHisto1D(14, 1, 1);
00057       _h_etajet2[1][1] = bookHisto1D(15, 1, 1);
00058       _h_etajet2[1][2] = bookHisto1D(16, 1, 1);
00059       // Table 5
00060       _h_etajet2[0][0] = bookHisto1D(17, 1, 1);
00061       _h_etajet2[0][1] = bookHisto1D(18, 1, 1);
00062       _h_etajet2[0][2] = bookHisto1D(19, 1, 1);
00063       // Table 6
00064       _h_xobsy[0] = bookHisto1D(20, 1, 1);
00065       _h_xobsy[1] = bookHisto1D(21, 1, 1);
00066       _h_xobsy[2] = bookHisto1D(22, 1, 1);
00067       _h_xobsy[3] = bookHisto1D(23, 1, 1);
00068     }
00069 
00070 
00071     // Do the analysis
00072     void analyze(const Event& event) {
00073 
00074       // Determine event orientation, since coord system is for +z = proton direction
00075       const ParticlePair bs = event.beams();
00076       if (bs.first.pid() != PID::POSITRON && bs.second.pid() != PID::POSITRON) vetoEvent;
00077       const Particle& bpositron = (bs.first.pid() == PID::POSITRON ? bs.first : bs.second);
00078       if (bs.first.pid() != PID::PROTON && bs.second.pid() != PID::PROTON) vetoEvent;
00079       const Particle& bproton = (bs.first.pid() == PID::PROTON) ? bs.first : bs.second;
00080       const int orientation = sign(bproton.momentum().pz());
00081       MSG_DEBUG("Beam proton = " << bproton.mom() << " GeV => orientation = " << orientation);
00082 
00083       // Jet selection
00084       const Jets jets = apply<FastJets>(event, "Jets") \
00085         .jets(Cuts::pT > 11*GeV && Cuts::etaIn(-1*orientation, 2.4*orientation), cmpMomByEt);
00086       MSG_DEBUG("Jet multiplicity = " << jets.size());
00087       if (jets.size() < 2) vetoEvent;
00088       const Jet& j1 = jets[0];
00089       const Jet& j2 = jets[1];
00090       if (j1.pT() < 14*GeV) vetoEvent;
00091 
00092       // eta and cos(theta*) computation
00093       const double eta1 = orientation*j1.eta(), eta2 = orientation*j2.eta();
00094       const double etabar = (eta1 + eta2)/2;
00095       const double etadiff = eta1 - eta2;
00096       const double costhetastar = tanh(etadiff/2);
00097 
00098       // Get the scattered positron
00099       const Particles positrons = apply<FinalState>(event, "Positrons").particlesByPt();
00100       if (positrons.empty()) vetoEvent;
00101       const Particle& positron = positrons.front();
00102 
00103       // Calculate the photon 4-vector
00104       const FourMomentum qphoton = positron.mom() - bpositron.mom();
00105 
00106       // Computation and cut on inelasticity
00107       const double inelasticity = dot(bproton.mom(), qphoton) / dot(bproton.mom(), bpositron.mom());
00108       if (!inRange(inelasticity, 0.2, 0.85)) vetoEvent;
00109 
00110       // Computation of x_y^obs
00111       // (I assume Ee is the lab frame positron momentum, not in proton rest frame cf. the ambiguous phrase in the paper)
00112       const double xyobs = (j1.Et() * exp(-eta1) + j2.Et() * exp(-eta2)) / (2*inelasticity*bpositron.E());
00113       const size_t i_xyobs = (xyobs < 0.75) ? 0 : 1;
00114 
00115       // Fill histograms
00116       const double weight = event.weight();
00117       // T1
00118       if ((j1.mom()+j2.mom()).mass() > 42*GeV && inRange(etabar, 0.1, 0.3))
00119         _h_costh[i_xyobs]->fill(abs(costhetastar), weight);
00120       // T2, T3
00121       if (inRange(eta1, -1, 0) && inRange(eta2, -1, 0))
00122         _h_etjet1[i_xyobs][0]->fill(j1.Et()/GeV, weight);
00123       else if (inRange(eta1, 0, 1) && inRange(eta2, -1, 0))
00124         _h_etjet1[i_xyobs][1]->fill(j1.Et()/GeV, weight);
00125       else if (inRange(eta1, 0, 1) && inRange(eta2, 0, 1))
00126         _h_etjet1[i_xyobs][2]->fill(j1.Et()/GeV, weight);
00127       else if (inRange(eta1, 1, 2.4) && inRange(eta2, -1, 0))
00128         _h_etjet1[i_xyobs][3]->fill(j1.Et()/GeV, weight);
00129       else if (inRange(eta1, 1, 2.4) && inRange(eta2, 0, 1))
00130         _h_etjet1[i_xyobs][4]->fill(j1.Et()/GeV, weight);
00131       else if (inRange(eta1, 1, 2.4) && inRange(eta2, 1, 2.4))
00132         _h_etjet1[i_xyobs][5]->fill(j1.Et()/GeV, weight);
00133       // T4, T5
00134       if (inRange(eta1, -1, 0))
00135         _h_etajet2[i_xyobs][0]->fill(eta2, weight);
00136       else if (inRange(eta1, 0, 1))
00137         _h_etajet2[i_xyobs][1]->fill(eta2, weight);
00138       else if (inRange(eta1, 1, 2.4))
00139         _h_etajet2[i_xyobs][2]->fill(eta2, weight);
00140       // T6
00141       if (inRange(j1.Et()/GeV, 14, 17))
00142         _h_xobsy[0]->fill(xyobs, weight);
00143       else if (inRange(j1.Et()/GeV, 17, 25))
00144         _h_xobsy[1]->fill(xyobs, weight);
00145       else if (inRange(j1.Et()/GeV, 25, 35))
00146         _h_xobsy[2]->fill(xyobs, weight);
00147       else if (inRange(j1.Et()/GeV, 35, 90))
00148         _h_xobsy[3]->fill(xyobs, weight);
00149     }
00150 
00151 
00152     // Finalize
00153     void finalize() {
00154       const double sf = crossSection()/picobarn/sumOfWeights();
00155       for (size_t ix = 0; ix < 2; ++ix) {
00156         scale(_h_costh[ix], sf);
00157         for (auto& h : _h_etjet1[ix]) scale(h, sf);
00158         for (auto& h : _h_etajet2[ix]) scale(h, sf);
00159       }
00160       for (auto& h : _h_xobsy) scale(h, sf);
00161     }
00162 
00163     //@}
00164 
00165 
00166   private:
00167 
00168     /// @name Histograms
00169     //@{
00170     Histo1DPtr _h_costh[2], _h_etjet1[2][6], _h_etajet2[2][3], _h_xobsy[4];
00171     //@}
00172 
00173   };
00174 
00175 
00176   DECLARE_RIVET_PLUGIN(ZEUS_2001_S4815815);
00177 
00178 }