rivet is hosted by Hepforge, IPPP Durham
CDF_1997_S3541940.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/Projections/FinalState.hh"
00004 #include "Rivet/Projections/FastJets.hh"
00005 #include "Rivet/Projections/SmearedJets.hh"
00006 
00007 namespace Rivet {
00008 
00009 
00010   /// @brief CDF properties of 6-jet events with large 6-jet mass
00011   class CDF_1997_S3541940 : public Analysis {
00012   public:
00013 
00014     CDF_1997_S3541940()
00015       : Analysis("CDF_1997_S3541940")
00016     {
00017     }
00018 
00019 
00020   public:
00021 
00022     void init() {
00023 
00024       const FinalState fs(-4.2, 4.2);
00025       FastJets fj (fs, FastJets::CDFJETCLU, 0.7);
00026       declare(fj, "Jets");
00027 
00028       // Smear Energy and mass with the 10% uncertainty quoted in the paper
00029       SmearedJets sj_E(fj, [](const Jet& jet){ return P4_SMEAR_MASS_GAUSS(P4_SMEAR_E_GAUSS(jet, 0.1*jet.E()), 0.1*jet.mass()); });
00030       declare(sj_E, "SmearedJets");
00031 
00032       _h_m6J = bookHisto1D(1, 1, 1);
00033       _h_X3ppp = bookHisto1D(2, 1, 1);
00034       _h_X4ppp = bookHisto1D(3, 1, 1);
00035       _h_costheta3ppp = bookHisto1D(4, 1, 1);
00036       _h_psi3ppp = bookHisto1D(5, 1, 1);
00037       _h_f3ppp = bookHisto1D(6, 1, 1);
00038       _h_f4ppp = bookHisto1D(6, 1, 2);
00039       _h_f5ppp = bookHisto1D(6, 1, 3);
00040       _h_XApp = bookHisto1D(7, 1, 1);
00041       _h_XCp = bookHisto1D(8, 1, 1);
00042       _h_XE = bookHisto1D(9, 1, 1);
00043       _h_psiAppBpp = bookHisto1D(10, 1, 1);
00044       _h_psiCpDp = bookHisto1D(11, 1, 1);
00045       _h_psiEF = bookHisto1D(12, 1, 1);
00046       _h_fApp = bookHisto1D(13, 1, 1);
00047       _h_fBpp = bookHisto1D(14, 1, 1);
00048       _h_fCp = bookHisto1D(15, 1, 1);
00049       _h_fDp = bookHisto1D(16, 1, 1);
00050       _h_fE = bookHisto1D(17, 1, 1);
00051       _h_fF = bookHisto1D(18, 1, 1);
00052     }
00053 
00054 
00055     void analyze(const Event& event) {
00056       Jets jets;
00057       double sumEt = 0.0;
00058       FourMomentum jetsystem(0.0, 0.0, 0.0, 0.0);
00059       foreach (const Jet& jet, apply<JetAlg>(event, "SmearedJets").jets(Cuts::Et>20*GeV && Cuts::abseta<3,cmpMomByEt)) {
00060         double Et = jet.Et();
00061         bool separated = true;
00062         foreach (const Jet& ref, jets) {
00063           if (deltaR(jet, ref) < 0.9) {
00064             separated = false;
00065             break;
00066           }
00067         }
00068         if (!separated) continue;
00069         jets.push_back(jet);
00070         sumEt += Et;
00071         jetsystem += jet.momentum();
00072         if (jets.size() >= 6) break;
00073       }
00074 
00075       if (jets.size() < 6) vetoEvent;
00076       if (sumEt < 320.0*GeV) vetoEvent;
00077 
00078       double m6J = _safeMass(jetsystem);
00079       if (m6J < 520.0*GeV) vetoEvent;
00080 
00081       const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(jetsystem.betaVec());
00082       vector<FourMomentum> jets6;
00083       foreach (Jet jet, jets) {
00084         jets6.push_back(cms_boost.transform(jet.momentum()));
00085       }
00086       std::sort(jets6.begin(), jets6.end(), FourMomentum::byEDescending());
00087 
00088       FourMomentum pE, pF;
00089       vector<FourMomentum> jets5(_reduce(jets6, pE, pF));
00090       std::sort(jets5.begin(), jets5.end(), FourMomentum::byEDescending());
00091 
00092       FourMomentum pCp, pDp;
00093       vector<FourMomentum> jets4(_reduce(jets5, pCp, pDp));
00094       std::sort(jets4.begin(), jets4.end(), FourMomentum::byEDescending());
00095 
00096       FourMomentum pApp, pBpp;
00097       vector<FourMomentum> jets3(_reduce(jets4, pApp, pBpp));
00098       std::sort(jets3.begin(), jets3.end(), FourMomentum::byEDescending());
00099       FourMomentum p3ppp(jets3[0]);
00100       FourMomentum p4ppp(jets3[1]);
00101       FourMomentum p5ppp(jets3[2]);
00102 
00103       double X3ppp = 2.0*p3ppp.E()/m6J;
00104       if (X3ppp > 0.9) vetoEvent;
00105 
00106       FourMomentum pAV = cms_boost.transform(_avg_beam_in_lab(m6J, jetsystem.rapidity()));
00107       double costheta3ppp = pAV.p3().unit().dot(p3ppp.p3().unit());
00108       if (fabs(costheta3ppp) > 0.9) vetoEvent;
00109 
00110       const double weight = event.weight();
00111 
00112       // 3-jet-system variables
00113       _h_m6J->fill(m6J, weight);
00114       _h_X3ppp->fill(X3ppp, weight);
00115       _h_X4ppp->fill(2.0*p4ppp.E()/m6J, weight);
00116       _h_costheta3ppp->fill(costheta3ppp, weight);
00117       double psi3ppp = _psi(p3ppp, pAV, p4ppp, p5ppp);
00118       _h_psi3ppp->fill(psi3ppp, weight);
00119       _h_f3ppp->fill(_safeMass(p3ppp)/m6J, weight);
00120       _h_f4ppp->fill(_safeMass(p4ppp)/m6J, weight);
00121       _h_f5ppp->fill(_safeMass(p5ppp)/m6J, weight);
00122 
00123       // 4 -> 3 jet variables
00124       _h_fApp->fill(_safeMass(pApp)/m6J, weight);
00125       _h_fBpp->fill(_safeMass(pApp)/m6J, weight);
00126       _h_XApp->fill(pApp.E()/(pApp.E()+pBpp.E()), weight);
00127       double psiAppBpp = _psi(pApp, pBpp, pApp+pBpp, pAV);
00128       _h_psiAppBpp->fill(psiAppBpp, weight);
00129 
00130       // 5 -> 4 jet variables
00131       _h_fCp->fill(_safeMass(pCp)/m6J, weight);
00132       _h_fDp->fill(_safeMass(pDp)/m6J, weight);
00133       _h_XCp->fill(pCp.E()/(pCp.E()+pDp.E()), weight);
00134       double psiCpDp = _psi(pCp, pDp, pCp+pDp, pAV);
00135       _h_psiCpDp->fill(psiCpDp, weight);
00136 
00137       // 6 -> 5 jet variables
00138       _h_fE->fill(_safeMass(pE)/m6J, weight);
00139       _h_fF->fill(_safeMass(pF)/m6J, weight);
00140       _h_XE->fill(pE.E()/(pE.E()+pF.E()), weight);
00141       double psiEF = _psi(pE, pF, pE+pF, pAV);
00142       _h_psiEF->fill(psiEF, weight);
00143     }
00144 
00145 
00146     void finalize() {
00147       normalize(_h_m6J);
00148       normalize(_h_X3ppp);
00149       normalize(_h_X4ppp);
00150       normalize(_h_costheta3ppp);
00151       normalize(_h_psi3ppp);
00152       normalize(_h_f3ppp);
00153       normalize(_h_f4ppp);
00154       normalize(_h_f5ppp);
00155       normalize(_h_XApp);
00156       normalize(_h_XCp);
00157       normalize(_h_XE);
00158       normalize(_h_psiAppBpp);
00159       normalize(_h_psiCpDp);
00160       normalize(_h_psiEF);
00161       normalize(_h_fApp);
00162       normalize(_h_fBpp);
00163       normalize(_h_fCp);
00164       normalize(_h_fDp);
00165       normalize(_h_fE);
00166       normalize(_h_fF);
00167     }
00168 
00169 
00170   private:
00171 
00172     vector<FourMomentum> _reduce(const vector<FourMomentum>& jets,
00173                                  FourMomentum& combined1,
00174                                  FourMomentum& combined2) {
00175       double minMass2 = 1e9;
00176       size_t idx1(jets.size()), idx2(jets.size());
00177       for (size_t i = 0; i < jets.size(); ++i) {
00178         for (size_t j = i+1; j < jets.size(); ++j) {
00179           double mass2 = FourMomentum(jets[i] + jets[j]).mass2();
00180           if (mass2 < minMass2) {
00181             idx1 = i;
00182             idx2 = j;
00183           }
00184         }
00185       }
00186       vector<FourMomentum> newjets;
00187       for (size_t i = 0; i < jets.size(); ++i) {
00188         if (i != idx1 && i != idx2) newjets.push_back(jets[i]);
00189       }
00190       newjets.push_back(jets[idx1] + jets[idx2]);
00191       combined1 = jets[idx1];
00192       combined2 = jets[idx2];
00193       return newjets;
00194     }
00195 
00196 
00197     FourMomentum _avg_beam_in_lab(const double& m, const double& y) {
00198       const double mt = m/2.0;
00199       FourMomentum beam1(mt, 0, 0,  mt);
00200       FourMomentum beam2(mt, 0, 0, -mt);
00201       if (fabs(y) > 1e-3) {
00202         FourMomentum boostvec(cosh(y), 0.0, 0.0, sinh(y));
00203         const LorentzTransform cms_boost = LorentzTransform::mkFrameTransformFromBeta(boostvec.betaVec()).inverse();
00204         beam1 = cms_boost.transform(beam1);
00205         beam2 = cms_boost.transform(beam2);
00206       }
00207       return (beam1.E() > beam2.E()) ? beam1 - beam2 : beam2 - beam1;
00208     }
00209 
00210 
00211     double _psi(const FourMomentum& p1, const FourMomentum& p2,
00212                 const FourMomentum& p3, const FourMomentum& p4) {
00213       Vector3 p1xp2 = p1.p3().cross(p2.p3());
00214       Vector3 p3xp4 = p3.p3().cross(p4.p3());
00215       return mapAngle0ToPi(acos(p1xp2.unit().dot(p3xp4.unit())));
00216     }
00217 
00218 
00219     double _safeMass(const FourMomentum& p) {
00220       double mass2 = p.mass2();
00221       if (mass2 > 0.0) return sqrt(mass2);
00222       if (mass2 < -1e-5) MSG_WARNING("m2 = " << m2 << ". Assuming m2=0.");
00223       return 0.0;
00224     }
00225 
00226 
00227   private:
00228 
00229     Histo1DPtr _h_m6J;
00230     Histo1DPtr _h_X3ppp, _h_X4ppp;
00231     Histo1DPtr _h_costheta3ppp;
00232     Histo1DPtr _h_psi3ppp;
00233     Histo1DPtr _h_f3ppp, _h_f4ppp, _h_f5ppp;
00234     Histo1DPtr _h_XApp, _h_XCp, _h_XE;
00235     Histo1DPtr _h_psiAppBpp, _h_psiCpDp, _h_psiEF;
00236     Histo1DPtr _h_fApp, _h_fBpp, _h_fCp, _h_fDp, _h_fE, _h_fF;
00237 
00238   };
00239 
00240 
00241 
00242   // The hook for the plugin system
00243   DECLARE_RIVET_PLUGIN(CDF_1997_S3541940);
00244 
00245 }