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 } Generated on Tue Dec 13 2016 16:32:41 for The Rivet MC analysis system by ![]() |