rivet is hosted by Hepforge, IPPP Durham
DELPHI_2003_WUD_03_11.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetYODA.hh"
00004 #include "Rivet/Tools/ParticleIdUtils.hh"
00005 #include "Rivet/Projections/FastJets.hh"
00006 #include "Rivet/Projections/FinalState.hh"
00007 #include "Rivet/Projections/ChargedFinalState.hh"
00008 
00009 namespace Rivet {
00010 
00011 
00012   namespace {
00013 
00014     /// @name Jet angle calculator functions
00015     //@{
00016     /// @todo Move to utils?
00017 
00018     /// @todo Use Jet or FourMomentum interface rather than PseudoJet
00019     /// @todo Move to utils?
00020     double calc_BZ(const vector<fastjet::PseudoJet>& jets) {
00021       assert(jets.size() == 4);
00022       Vector3 p12 = cross( momentum3(jets[0]), momentum3(jets[1]));
00023       Vector3 p34 = cross( momentum3(jets[2]), momentum3(jets[3]));
00024       return dot(p12,p34) / (p12.mod()*p34.mod());
00025     }
00026 
00027 
00028     /// @todo Use Jet or FourMomentum interface rather than PseudoJet
00029     /// @todo Move to utils?
00030     double calc_KSW(const vector<fastjet::PseudoJet>& jets) {
00031       assert(jets.size() == 4);
00032       Vector3 p13 = cross( momentum3(jets[0]), momentum3(jets[2]));
00033       Vector3 p24 = cross( momentum3(jets[1]), momentum3(jets[3]));
00034       Vector3 p14 = cross( momentum3(jets[0]), momentum3(jets[3]));
00035       Vector3 p23 = cross( momentum3(jets[1]), momentum3(jets[2]));
00036       return cos (0.5*( acos (dot(p14,p23) / (p14.mod()*p23.mod())) +
00037                         acos (dot(p13,p24) / (p13.mod()*p24.mod())) ));
00038     }
00039 
00040 
00041     /// @todo Use Jet or FourMomentum interface rather than PseudoJet
00042     /// @todo Move to utils?
00043     double calc_NR(const vector<fastjet::PseudoJet>& jets) {
00044       assert(jets.size() == 4);
00045       Vector3 p12 = momentum3(jets[0]) - momentum3(jets[1]);
00046       Vector3 p34 = momentum3(jets[2]) - momentum3(jets[3]);
00047       return dot(p12,p34) / (p12.mod()*p34.mod());
00048     }
00049 
00050     /// @todo Use Jet or FourMomentum interface rather than PseudoJet
00051     /// @todo Move to utils?
00052     double calc_ALPHA34(const vector<fastjet::PseudoJet>& jets) {
00053       assert(jets.size() == 4);
00054       Vector3 p3 = momentum3(jets[2]);
00055       Vector3 p4 = momentum3(jets[3]);
00056       return dot(p3,p4) / (p3.mod()*p4.mod());
00057     }
00058 
00059     //@}
00060 
00061   }
00062 
00063 
00064   /**
00065    * @brief DELPHI 4-jet angular distributions
00066    * @author Hendrik Hoeth
00067    *
00068    * This is Hendrik Hoeth's Diploma thesis, measuring the 4-jet angular
00069    * distributions at LEP-1.
00070    *
00071    * @par Run conditions
00072    *
00073    * @arg LEP1 beam energy: \f$ \sqrt{s} = \f$ 91.2 GeV
00074    * @arg Run with generic QCD events.
00075    * @arg No \f$ p_\perp^\text{min} \f$ cutoff is required
00076    */
00077   class DELPHI_2003_WUD_03_11 : public Analysis {
00078   public:
00079 
00080     /// Constructor
00081     DELPHI_2003_WUD_03_11()
00082       : Analysis("DELPHI_2003_WUD_03_11")
00083     {
00084       _numdurjets = 0;
00085       _numjadejets = 0;
00086     }
00087 
00088 
00089     /// @name Analysis methods
00090     //@{
00091 
00092     void init() {
00093       const ChargedFinalState cfs;
00094       addProjection(cfs, "FS");
00095       addProjection(FastJets(cfs, FastJets::JADE, 0.7), "JadeJets");
00096       addProjection(FastJets(cfs, FastJets::DURHAM, 0.7), "DurhamJets");
00097 
00098       _histDurhamBZ      = bookHisto1D(1, 1, 1);
00099       _histDurhamKSW     = bookHisto1D(2, 1, 1);
00100       _histDurhamNR      = bookHisto1D(3, 1, 1);
00101       _histDurhamALPHA34 = bookHisto1D(4, 1, 1);
00102       _histJadeBZ        = bookHisto1D(1, 2, 1);
00103       _histJadeKSW       = bookHisto1D(2, 2, 1);
00104       _histJadeNR        = bookHisto1D(3, 2, 1);
00105       _histJadeALPHA34   = bookHisto1D(4, 2, 1);
00106     }
00107 
00108 
00109     void analyze(const Event& e) {
00110       // First, veto on leptonic events by requiring at least 4 charged FS particles
00111       const FinalState& fs = applyProjection<FinalState>(e, "FS");
00112       const size_t numParticles = fs.particles().size();
00113 
00114       // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
00115       if (numParticles < 2) {
00116         MSG_DEBUG("Failed multiplicity cut");
00117         vetoEvent;
00118       }
00119       MSG_DEBUG("Passed multiplicity cut");
00120 
00121       // Get event weight for histo filling
00122       const double weight = e.weight();
00123 
00124       // Jets
00125       const FastJets& durjet = applyProjection<FastJets>(e, "DurhamJets");
00126       vector<fastjet::PseudoJet> jets_durham;
00127       if (durjet.clusterSeq()) {
00128         jets_durham = fastjet::sorted_by_E(durjet.clusterSeq()->exclusive_jets_ycut(0.008));
00129         if (jets_durham.size() == 4) {
00130           _histDurhamBZ->fill(fabs(calc_BZ(jets_durham)), weight);
00131           _histDurhamKSW->fill(calc_KSW(jets_durham), weight);
00132           _histDurhamNR->fill(fabs(calc_NR(jets_durham)), weight);
00133           _histDurhamALPHA34->fill(calc_ALPHA34(jets_durham), weight);
00134         }
00135         if (durjet.clusterSeq()->exclusive_ymerge_max(3) > 0.008 &&
00136             durjet.clusterSeq()->exclusive_ymerge_max(4) < 0.008) {
00137           _numdurjets++;
00138         }
00139       }
00140 
00141       const FastJets& jadejet = applyProjection<FastJets>(e, "JadeJets");
00142       vector<fastjet::PseudoJet> jets_jade;
00143       if (jadejet.clusterSeq()) {
00144         jets_jade = fastjet::sorted_by_E(jadejet.clusterSeq()->exclusive_jets_ycut(0.015));
00145         if (jets_jade.size() == 4) {
00146           _histJadeBZ->fill(fabs(calc_BZ(jets_jade)), weight);
00147           _histJadeKSW->fill(calc_KSW(jets_jade), weight);
00148           _histJadeNR->fill(fabs(calc_NR(jets_jade)), weight);
00149           _histJadeALPHA34->fill(calc_ALPHA34(jets_jade), weight);
00150         }
00151         if (jadejet.clusterSeq()->exclusive_ymerge_max(3) > 0.015 &&
00152             jadejet.clusterSeq()->exclusive_ymerge_max(4) < 0.015) {
00153           _numjadejets++;
00154         }
00155       }
00156 
00157     }
00158 
00159 
00160     // Finalize
00161     void finalize() {
00162       // Normalize inclusive single particle distributions to the average number
00163       // of charged particles per event.
00164 
00165       MSG_INFO("Number of Durham jets = " << _numdurjets);
00166       MSG_INFO("Number of Jade jets   = " << _numjadejets);
00167 
00168       /// @todo Scale rather than normalize?
00169       normalize(_histDurhamBZ      , 0.0785);
00170       normalize(_histDurhamKSW     , 0.0785);
00171       normalize(_histDurhamNR      , 0.0785);
00172       normalize(_histDurhamALPHA34 , 0.0785);
00173       normalize(_histJadeBZ        , 0.0277);
00174       normalize(_histJadeKSW       , 0.0277);
00175       normalize(_histJadeNR        , 0.0277);
00176       normalize(_histJadeALPHA34   , 0.0277);
00177     }
00178 
00179     //@}
00180 
00181 
00182   private:
00183 
00184     int _numdurjets;
00185     int _numjadejets;
00186 
00187     /// @name Histograms
00188     //@{
00189     Histo1DPtr _histDurhamBZ;
00190     Histo1DPtr _histDurhamKSW;
00191     Histo1DPtr _histDurhamNR;
00192     Histo1DPtr _histDurhamALPHA34;
00193     Histo1DPtr _histJadeBZ;
00194     Histo1DPtr _histJadeKSW;
00195     Histo1DPtr _histJadeNR;
00196     Histo1DPtr _histJadeALPHA34;
00197     //@}
00198 
00199   };
00200 
00201 
00202 
00203   // The hook for the plugin system
00204   DECLARE_RIVET_PLUGIN(DELPHI_2003_WUD_03_11);
00205 
00206 }