DELPHI_2003_WUD_03_11.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetAIDA.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    *
00072    * @par Run conditions
00073    *
00074    * @arg LEP1 beam energy: \f$ \sqrt{s} = \$f 91.2 GeV
00075    * @arg Run with generic QCD events.
00076    * @arg No \f$ p_\perp^\text{min} \f$ cutoff is required
00077    */
00078   class DELPHI_2003_WUD_03_11 : public Analysis {
00079   public:
00080 
00081     /// Constructor
00082     DELPHI_2003_WUD_03_11()
00083       : Analysis("DELPHI_2003_WUD_03_11")
00084     {
00085       _numdurjets = 0;
00086       _numjadejets = 0;
00087     }
00088 
00089 
00090     /// @name Analysis methods
00091     //@{
00092 
00093     void init() {
00094       const ChargedFinalState cfs;
00095       addProjection(cfs, "FS");
00096       addProjection(FastJets(cfs, FastJets::JADE, 0.7), "JadeJets");
00097       addProjection(FastJets(cfs, FastJets::DURHAM, 0.7), "DurhamJets");
00098 
00099       _histDurhamBZ      = bookHistogram1D(1, 1, 1);
00100       _histDurhamKSW     = bookHistogram1D(2, 1, 1);
00101       _histDurhamNR      = bookHistogram1D(3, 1, 1);
00102       _histDurhamALPHA34 = bookHistogram1D(4, 1, 1);
00103       _histJadeBZ        = bookHistogram1D(1, 2, 1);
00104       _histJadeKSW       = bookHistogram1D(2, 2, 1);
00105       _histJadeNR        = bookHistogram1D(3, 2, 1);
00106       _histJadeALPHA34   = bookHistogram1D(4, 2, 1);
00107     }
00108 
00109 
00110     void analyze(const Event& e) {
00111       // First, veto on leptonic events by requiring at least 4 charged FS particles
00112       const FinalState& fs = applyProjection<FinalState>(e, "FS");
00113       const size_t numParticles = fs.particles().size();
00114    
00115       // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
00116       if (numParticles < 2) {
00117         getLog() << Log::DEBUG << "Failed multiplicity cut" << endl;
00118         vetoEvent;
00119       }
00120       getLog() << Log::DEBUG << "Passed multiplicity cut" << endl;
00121    
00122       // Get event weight for histo filling
00123       const double weight = e.weight();
00124    
00125       // Jets
00126       const FastJets& durjet = applyProjection<FastJets>(e, "DurhamJets");
00127       vector<fastjet::PseudoJet> jets_durham;
00128       if (durjet.clusterSeq()) {
00129         jets_durham = fastjet::sorted_by_E(durjet.clusterSeq()->exclusive_jets_ycut(0.008));
00130         if (jets_durham.size() == 4) {
00131           _histDurhamBZ->fill(fabs(calc_BZ(jets_durham)), weight);
00132           _histDurhamKSW->fill(calc_KSW(jets_durham), weight);
00133           _histDurhamNR->fill(fabs(calc_NR(jets_durham)), weight);
00134           _histDurhamALPHA34->fill(calc_ALPHA34(jets_durham), weight);
00135         }
00136         if (durjet.clusterSeq()->exclusive_ymerge(3) > 0.008 &&
00137             durjet.clusterSeq()->exclusive_ymerge(4) < 0.008) {
00138           _numdurjets++;
00139         }
00140       }
00141    
00142       const FastJets& jadejet = applyProjection<FastJets>(e, "JadeJets");
00143       vector<fastjet::PseudoJet> jets_jade;
00144       if (jadejet.clusterSeq()) {
00145         jets_jade = fastjet::sorted_by_E(jadejet.clusterSeq()->exclusive_jets_ycut(0.015));
00146         if (jets_jade.size() == 4) {
00147           _histJadeBZ->fill(fabs(calc_BZ(jets_jade)), weight);
00148           _histJadeKSW->fill(calc_KSW(jets_jade), weight);
00149           _histJadeNR->fill(fabs(calc_NR(jets_jade)), weight);
00150           _histJadeALPHA34->fill(calc_ALPHA34(jets_jade), weight);
00151         }
00152         if (jadejet.clusterSeq()->exclusive_ymerge(3) > 0.015 &&
00153             jadejet.clusterSeq()->exclusive_ymerge(4) < 0.015) {
00154           _numjadejets++;
00155         }
00156       }
00157    
00158     }
00159  
00160  
00161     // Finalize
00162     void finalize() {
00163       // Normalize inclusive single particle distributions to the average number
00164       // of charged particles per event.
00165    
00166       getLog() << Log::INFO << "Number of Durham jets = " << _numdurjets << endl;
00167       getLog() << Log::INFO << "Number of Jade jets   = " << _numjadejets << endl;
00168 
00169       /// @todo Scale rather than normalize?
00170       normalize(_histDurhamBZ      , 0.0785);
00171       normalize(_histDurhamKSW     , 0.0785);
00172       normalize(_histDurhamNR      , 0.0785);
00173       normalize(_histDurhamALPHA34 , 0.0785);
00174       normalize(_histJadeBZ        , 0.0277);
00175       normalize(_histJadeKSW       , 0.0277);
00176       normalize(_histJadeNR        , 0.0277);
00177       normalize(_histJadeALPHA34   , 0.0277);
00178     }
00179 
00180     //@}
00181 
00182 
00183   private:
00184 
00185     int _numdurjets;
00186     int _numjadejets;
00187 
00188     /// @name Histograms
00189     //@{
00190     AIDA::IHistogram1D *_histDurhamBZ;
00191     AIDA::IHistogram1D *_histDurhamKSW;
00192     AIDA::IHistogram1D *_histDurhamNR;
00193     AIDA::IHistogram1D *_histDurhamALPHA34;
00194     AIDA::IHistogram1D *_histJadeBZ;
00195     AIDA::IHistogram1D *_histJadeKSW;
00196     AIDA::IHistogram1D *_histJadeNR;
00197     AIDA::IHistogram1D *_histJadeALPHA34;
00198     //@}
00199 
00200   };
00201 
00202 
00203 
00204   // This global object acts as a hook for the plugin system
00205   AnalysisBuilder<DELPHI_2003_WUD_03_11> plugin_DELPHI_2003_WUD_03_11;
00206 
00207 }