rivet is hosted by Hepforge, IPPP Durham
CDF_1994_S2952106.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetYODA.hh"
00004 #include "Rivet/Tools/Logging.hh"
00005 #include "Rivet/Projections/FastJets.hh"
00006 #include "Rivet/Projections/VetoedFinalState.hh"
00007 #include "Rivet/Projections/VisibleFinalState.hh"
00008 #include "Rivet/Projections/MissingMomentum.hh"
00009 
00010 namespace Rivet {
00011 
00012 
00013   /// @brief CDF Run I color coherence analysis
00014   /// @author Andy Buckley
00015   /// @author Lars Sonnenschein
00016   class CDF_1994_S2952106 : public Analysis {
00017   public:
00018 
00019     /// Constructor
00020     CDF_1994_S2952106() : Analysis("CDF_1994_S2952106")
00021     {
00022     }
00023 
00024 
00025     /// @name Analysis methods
00026     //@{
00027 
00028     void init() {
00029       const FinalState fs(-4.2, 4.2);
00030       addProjection(fs, "FS");
00031       addProjection(FastJets(fs, FastJets::CDFJETCLU, 0.7), "Jets");
00032 
00033       // Zero passed-cuts event weight counters
00034       _sumw = 0;
00035 
00036       // Output histograms
00037       _histJet1Et  = bookHisto1D(1,1,1);
00038       _histJet2Et  = bookHisto1D(2,1,1);
00039       _histJet3eta = bookScatter2D(3,1,1);
00040       _histR23     = bookScatter2D(4,1,1);
00041       _histAlpha   = bookScatter2D(5,1,1);
00042 
00043       // Temporary histos: these are the ones we actually fill for the plots which require correction
00044       _tmphistJet3eta.reset(new Histo1D(referenceData(3,1,1)));
00045       _tmphistR23.reset(    new Histo1D(referenceData(4,1,1)));
00046       _tmphistAlpha.reset(  new Histo1D(referenceData(5,1,1)));
00047     }
00048 
00049 
00050 
00051     // Do the analysis
00052     void analyze(const Event & event) {
00053       const Jets jets = applyProjection<FastJets>(event, "Jets").jetsByEt();
00054       MSG_DEBUG("Jet multiplicity before any cuts = " << jets.size());
00055 
00056       // ETs only from jets:
00057       double et_sinphi_sum = 0;
00058       double et_cosphi_sum = 0;
00059       double et_sum = 0;
00060       for (size_t i = 0; i< jets.size(); ++i) {
00061         et_sinphi_sum += jets[i].momentum().Et() * sin(jets[i].phi());
00062         et_cosphi_sum += jets[i].momentum().Et() * cos(jets[i].phi());
00063         et_sum += jets[i].momentum().Et();
00064       }
00065 
00066       // ET requirement
00067       if (sqrt(sqr(et_sinphi_sum) + sqr(et_cosphi_sum))/et_sum > 6.0) vetoEvent;
00068 
00069       // Check jet requirements
00070       if (jets.size() < 3) vetoEvent;
00071       if (jets[0].momentum().pT() < 110*GeV) vetoEvent;
00072       if (jets[2].momentum().pT() < 10*GeV) vetoEvent;
00073 
00074       // More jet 1,2,3 checks
00075       FourMomentum pj1(jets[0].momentum()), pj2(jets[1].momentum()), pj3(jets[2].momentum());
00076       if (fabs(pj1.eta()) > 0.7 || fabs(pj2.eta()) > 0.7) vetoEvent;
00077       MSG_DEBUG("Jet 1 & 2 eta, pT requirements fulfilled");
00078 
00079       // Require that jets are back-to-back within 20 degrees in phi
00080       if ((PI - deltaPhi(pj1.phi(), pj2.phi())) > (20/180.0)*PI) vetoEvent;
00081       MSG_DEBUG("Jet 1 & 2 phi requirement fulfilled");
00082 
00083       const double weight = event.weight();
00084       _sumw += weight;
00085 
00086       // Fill histos
00087       _histJet1Et->fill(pj1.pT(), weight);
00088       _histJet2Et->fill(pj2.pT(), weight);
00089       _tmphistJet3eta->fill(pj3.eta(), weight);
00090       _tmphistR23->fill(deltaR(pj2, pj3), weight);
00091 
00092       // Calc and plot alpha
00093       const double dPhi = deltaPhi(pj3.phi(), pj2.phi());
00094       const double dH = sign(pj2.eta()) * (pj3.eta() - pj2.eta());
00095       const double alpha = atan(dH/dPhi);
00096       _tmphistAlpha->fill(alpha*180./PI, weight);
00097     }
00098 
00099 
00100     /// Apply bin-wise detector correction factors
00101     void finalize() {
00102 
00103       // Normal scalings
00104       normalize(_histJet1Et, 12.3);
00105       normalize(_histJet2Et, 12.3);
00106 
00107       // eta3 correction
00108       const double eta3_CDF_sim[] =
00109         { 0.0013, 0.0037, 0.0047, 0.0071, 0.0093, 0.0117, 0.0151, 0.0149, 0.0197, 0.0257,
00110           0.0344, 0.0409, 0.0481, 0.0454, 0.0394, 0.0409, 0.0387, 0.0387, 0.0322, 0.0313,
00111           0.0290, 0.0309, 0.0412, 0.0417, 0.0412, 0.0397, 0.0417, 0.0414, 0.0376, 0.0316,
00112           0.0270, 0.0186, 0.0186, 0.0132, 0.0127, 0.0106, 0.0071, 0.0040, 0.0020, 0.0013 };
00113       const double eta3_CDF_sim_err[] =
00114         { 0.0009, 0.0009, 0.0007, 0.0007, 0.0007, 0.0010, 0.0012, 0.0012, 0.0013, 0.0016,
00115           0.0017, 0.0020, 0.0020, 0.0022, 0.0020, 0.0020, 0.0018, 0.0018, 0.0016, 0.0017,
00116           0.0017, 0.0019, 0.0020, 0.0021, 0.0020, 0.0020, 0.0019, 0.0020, 0.0018, 0.0017,
00117           0.0017, 0.0014, 0.0014, 0.0009, 0.0010, 0.0009, 0.0009, 0.0008, 0.0008, 0.0009 };
00118       const double eta3_Ideal_sim[] =
00119         { 0.0017, 0.0030, 0.0033, 0.0062, 0.0062, 0.0112, 0.0177, 0.0164, 0.0196, 0.0274,
00120           0.0351, 0.0413, 0.0520, 0.0497, 0.0448, 0.0446, 0.0375, 0.0329, 0.0291, 0.0272,
00121           0.0233, 0.0288, 0.0384, 0.0396, 0.0468, 0.0419, 0.0459, 0.0399, 0.0355, 0.0329,
00122           0.0274, 0.0230, 0.0201, 0.0120, 0.0100, 0.0080, 0.0051, 0.0051, 0.0010, 0.0010 };
00123       vector<Point2D> points;
00124       for (size_t i = 0;  i < 40; ++i) {
00125         const double yval = _tmphistJet3eta->bin(i).area() * (eta3_CDF_sim[i]/eta3_Ideal_sim[i]);
00126         const double yerr = _tmphistJet3eta->bin(i).areaErr() * (eta3_CDF_sim_err[i]/eta3_Ideal_sim[i]);
00127     points.push_back(Point2D(0, yval/_sumw, 0, yerr/_sumw));
00128       }
00129       _histJet3eta->addPoints(points);
00130 
00131       // R23 correction
00132       const double R23_CDF_sim[] =
00133         { 0.0005, 0.0161, 0.0570, 0.0762, 0.0723, 0.0705, 0.0598, 0.0563, 0.0557, 0.0579,
00134           0.0538, 0.0522, 0.0486, 0.0449, 0.0418, 0.0361, 0.0326, 0.0304, 0.0252, 0.0212,
00135           0.0173, 0.0176, 0.0145, 0.0127, 0.0103, 0.0065, 0.0049, 0.0045, 0.0035, 0.0029,
00136           0.0024, 0.0014, 0.0011, 0.0010, 0.0009 };
00137       const double R23_CDF_sim_err[] =
00138         { 0.0013, 0.0009, 0.0022, 0.0029, 0.0026, 0.0024, 0.0022, 0.0025, 0.0023, 0.0024,
00139           0.0021, 0.0021, 0.0021, 0.0021, 0.0021, 0.0019, 0.0019, 0.0016, 0.0017, 0.0014,
00140           0.0010, 0.0014, 0.0012, 0.0013, 0.0010, 0.0011, 0.0010, 0.0010, 0.0010, 0.0011,
00141           0.0011, 0.0009, 0.0008, 0.0008, 0.0009 };
00142       const double R23_Ideal_sim[] =
00143         { 0.0005, 0.0176, 0.0585, 0.0862, 0.0843, 0.0756, 0.0673, 0.0635, 0.0586, 0.0619,
00144           0.0565, 0.0515, 0.0466, 0.0472, 0.0349, 0.0349, 0.0266, 0.0254, 0.0204, 0.0179,
00145           0.0142, 0.0134, 0.0101, 0.0090, 0.0080, 0.0034, 0.0030, 0.0033, 0.0027, 0.0021,
00146           0.0012, 0.0006, 0.0004, 0.0005, 0.0003 };
00147       points.clear();
00148       for (size_t i = 0;  i < 35; ++i) {
00149         const double yval = _tmphistR23->bin(i).area() * (R23_CDF_sim[i]/R23_Ideal_sim[i]);
00150         const double yerr = _tmphistR23->bin(i).areaErr() * (R23_CDF_sim_err[i]/R23_Ideal_sim[i]);
00151     points.push_back(Point2D(0, yval/_sumw, 0, yerr/_sumw));
00152       }
00153       _histR23->addPoints(points);
00154 
00155       // alpha correction
00156       const double alpha_CDF_sim[] =
00157         { 0.0517, 0.0461, 0.0490, 0.0452, 0.0451, 0.0435, 0.0317, 0.0287, 0.0294, 0.0261,
00158           0.0231, 0.0220, 0.0233, 0.0192, 0.0213, 0.0166, 0.0176, 0.0146, 0.0136, 0.0156,
00159           0.0142, 0.0152, 0.0151, 0.0147, 0.0164, 0.0186, 0.0180, 0.0210, 0.0198, 0.0189,
00160           0.0197, 0.0211, 0.0270, 0.0236, 0.0243, 0.0269, 0.0257, 0.0276, 0.0246, 0.0286 };
00161       const double alpha_CDF_sim_err[] =
00162         { 0.0024, 0.0025, 0.0024, 0.0024, 0.0024, 0.0022, 0.0019, 0.0018, 0.0019, 0.0016,
00163           0.0017, 0.0017, 0.0019, 0.0013, 0.0017, 0.0014, 0.0016, 0.0013, 0.0012, 0.0009,
00164           0.0014, 0.0014, 0.0014, 0.0014, 0.0014, 0.0015, 0.0014, 0.0016, 0.0016, 0.0015,
00165           0.0016, 0.0016, 0.0019, 0.0017, 0.0019, 0.0018, 0.0018, 0.0018, 0.0018, 0.0019 };
00166       const double alpha_Ideal_sim[] =
00167         { 0.0552, 0.0558, 0.0583, 0.0550, 0.0495, 0.0433, 0.0393, 0.0346, 0.0331, 0.0296,
00168           0.0258, 0.0196, 0.0171, 0.0179, 0.0174, 0.0141, 0.0114, 0.0096, 0.0076, 0.0087,
00169           0.0099, 0.0079, 0.0102, 0.0114, 0.0124, 0.0130, 0.0165, 0.0160, 0.0177, 0.0190,
00170           0.0232, 0.0243, 0.0238, 0.0248, 0.0235, 0.0298, 0.0292, 0.0291, 0.0268, 0.0316 };
00171       points.clear();
00172       for (size_t i = 0;  i < 40; ++i) {
00173         const double yval = _tmphistAlpha->bin(i).area() * (alpha_CDF_sim[i]/alpha_Ideal_sim[i]);
00174         const double yerr = _tmphistAlpha->bin(i).areaErr() * (alpha_CDF_sim_err[i]/alpha_Ideal_sim[i]);
00175         points.push_back(Point2D(0, yval/_sumw, 0, yerr/_sumw));
00176       }
00177       _histAlpha->addPoints(points);
00178     }
00179 
00180     //@}
00181 
00182 
00183   private:
00184 
00185     /// @name Event weight counters
00186     //@{
00187 
00188     double _sumw;
00189 
00190     //@}
00191 
00192 
00193     /// @name Histograms
00194     //@{
00195 
00196     /// Straightforward output histos
00197     Histo1DPtr _histJet1Et, _histJet2Et;
00198 
00199     /// Output histos which need to have correction factors applied
00200     Scatter2DPtr _histR23, _histJet3eta, _histAlpha;
00201 
00202     /// Temporary histos, to be converted to DPSes
00203     Histo1DPtr _tmphistR23, _tmphistJet3eta, _tmphistAlpha;
00204 
00205     //@}
00206 
00207   };
00208 
00209 
00210 
00211   // The hook for the plugin system
00212   DECLARE_RIVET_PLUGIN(CDF_1994_S2952106);
00213 
00214 }