OPAL_2004_S6132243.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetAIDA.hh"
00004 #include "Rivet/Tools/Logging.hh"
00005 #include "Rivet/Projections/Beam.hh"
00006 #include "Rivet/Projections/ChargedFinalState.hh"
00007 #include "Rivet/Projections/Sphericity.hh"
00008 #include "Rivet/Projections/Thrust.hh"
00009 #include "Rivet/Projections/FastJets.hh"
00010 #include "Rivet/Projections/ParisiTensor.hh"
00011 #include "Rivet/Projections/Hemispheres.hh"
00012 
00013 namespace Rivet {
00014 
00015 
00016   class OPAL_2004_S6132243 : public Analysis {
00017   public:
00018 
00019     /// Constructor
00020     OPAL_2004_S6132243() 
00021       : Analysis("OPAL_2004_S6132243"),
00022         _isqrts(-1), _sumWTrack2(0.0), _sumWJet3(0.0)
00023     {
00024       //
00025     }
00026 
00027 
00028     /// @name Analysis methods
00029     //@{
00030 
00031     /// Energies: 91, 133, 177 (161-183), 197 (189-209) => index 0..4
00032     int getHistIndex(double sqrts) {
00033       int ih = -1;
00034       if (inRange(sqrts/GeV, 89.9, 91.5)) {
00035         ih = 0;
00036       } else if (fuzzyEquals(sqrts/GeV, 133)) {
00037         ih = 1;
00038       } else if (fuzzyEquals(sqrts/GeV, 177)) { // (161-183)
00039         ih = 2;
00040       } else if (fuzzyEquals(sqrts/GeV, 197)) { // (189-209)
00041         ih = 3;
00042       } else {
00043         stringstream ss;
00044         ss << "Invalid energy for OPAL_2004 analysis: "
00045            << sqrts/GeV << " GeV != 91, 133, 177, or 197 GeV";
00046         throw Error(ss.str());
00047       }
00048       assert(ih >= 0);
00049       return ih;
00050     }
00051 
00052 
00053     void init() {
00054       // Projections
00055       addProjection(Beam(), "Beams");
00056       const ChargedFinalState cfs;
00057       addProjection(cfs, "FS");
00058       addProjection(FastJets(cfs, FastJets::DURHAM, 0.7), "DurhamJets");
00059       addProjection(Sphericity(cfs), "Sphericity");
00060       addProjection(ParisiTensor(cfs), "Parisi");
00061       const Thrust thrust(cfs);
00062       addProjection(thrust, "Thrust");
00063       addProjection(Hemispheres(thrust), "Hemispheres");
00064 
00065       // Get beam energy index
00066       _isqrts = getHistIndex(sqrtS());
00067 
00068       // Book histograms
00069       _hist1MinusT[_isqrts]    = bookHistogram1D(1, 1, _isqrts+1);
00070       _histHemiMassH[_isqrts]  = bookHistogram1D(2, 1, _isqrts+1);
00071       _histCParam[_isqrts]     = bookHistogram1D(3, 1, _isqrts+1);
00072       _histHemiBroadT[_isqrts] = bookHistogram1D(4, 1, _isqrts+1);
00073       _histHemiBroadW[_isqrts] = bookHistogram1D(5, 1, _isqrts+1);
00074       _histY23Durham[_isqrts]  = bookHistogram1D(6, 1, _isqrts+1);
00075       _histTMajor[_isqrts]     = bookHistogram1D(7, 1, _isqrts+1);
00076       _histTMinor[_isqrts]     = bookHistogram1D(8, 1, _isqrts+1);
00077       _histAplanarity[_isqrts] = bookHistogram1D(9, 1, _isqrts+1);
00078       _histSphericity[_isqrts] = bookHistogram1D(10, 1, _isqrts+1);
00079       _histOblateness[_isqrts] = bookHistogram1D(11, 1, _isqrts+1);
00080       _histHemiMassL[_isqrts]  = bookHistogram1D(12, 1, _isqrts+1);
00081       _histHemiBroadN[_isqrts] = bookHistogram1D(13, 1, _isqrts+1);
00082       _histDParam[_isqrts]     = bookHistogram1D(14, 1, _isqrts+1);
00083       //
00084       _hist1MinusTMom[_isqrts]    = bookHistogram1D(15, 1, _isqrts+1);
00085       _histHemiMassHMom[_isqrts]  = bookHistogram1D(16, 1, _isqrts+1);
00086       _histCParamMom[_isqrts]     = bookHistogram1D(17, 1, _isqrts+1);
00087       _histHemiBroadTMom[_isqrts] = bookHistogram1D(18, 1, _isqrts+1);
00088       _histHemiBroadWMom[_isqrts] = bookHistogram1D(19, 1, _isqrts+1);
00089       _histY23DurhamMom[_isqrts]  = bookHistogram1D(20, 1, _isqrts+1);
00090       _histTMajorMom[_isqrts]     = bookHistogram1D(21, 1, _isqrts+1);
00091       _histTMinorMom[_isqrts]     = bookHistogram1D(22, 1, _isqrts+1);
00092       _histSphericityMom[_isqrts] = bookHistogram1D(23, 1, _isqrts+1);
00093       _histOblatenessMom[_isqrts] = bookHistogram1D(24, 1, _isqrts+1);
00094       _histHemiMassLMom[_isqrts]  = bookHistogram1D(25, 1, _isqrts+1);
00095       _histHemiBroadNMom[_isqrts] = bookHistogram1D(26, 1, _isqrts+1);
00096     }
00097 
00098 
00099     void analyze(const Event& event) {
00100       // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
00101       const FinalState& cfs = applyProjection<FinalState>(event, "FS");
00102       if (cfs.size() < 2) vetoEvent;
00103 
00104       // Increment passed-cuts weight sum
00105       const double weight = event.weight();
00106       _sumWTrack2 += weight;
00107 
00108       // Thrusts
00109       const Thrust& thrust = applyProjection<Thrust>(event, "Thrust");
00110       _hist1MinusT[_isqrts]->fill(1-thrust.thrust(), weight);
00111       _histTMajor[_isqrts]->fill(thrust.thrustMajor(), weight);
00112       _histTMinor[_isqrts]->fill(thrust.thrustMinor(), weight);
00113       _histOblateness[_isqrts]->fill(thrust.oblateness(), weight);
00114       for (int n = 1; n <= 5; ++n) {
00115         _hist1MinusTMom[_isqrts]->fill(n, pow(1-thrust.thrust(), n)*weight);
00116         _histTMajorMom[_isqrts]->fill(n, pow(thrust.thrustMajor(), n)*weight);
00117         _histTMinorMom[_isqrts]->fill(n, pow(thrust.thrustMinor(), n)*weight);
00118         _histOblatenessMom[_isqrts]->fill(n, pow(thrust.oblateness(), n)*weight);
00119       }
00120 
00121       // Jets
00122       const FastJets& durjet = applyProjection<FastJets>(event, "DurhamJets");
00123       if (durjet.clusterSeq()) {
00124         _sumWJet3 += weight;
00125         const double y23 = durjet.clusterSeq()->exclusive_ymerge(2);
00126         _histY23Durham[_isqrts]->fill(y23, weight);
00127         for (int n = 1; n <= 5; ++n) {
00128           _histY23DurhamMom[_isqrts]->fill(n, pow(y23, n)*weight);
00129         }
00130       }
00131 
00132       // Sphericities
00133       const Sphericity& sphericity = applyProjection<Sphericity>(event, "Sphericity");
00134       const double sph = sphericity.sphericity();
00135       const double apl = sphericity.aplanarity();
00136       _histSphericity[_isqrts]->fill(sph, weight);
00137       _histAplanarity[_isqrts]->fill(apl, weight);
00138       for (int n = 1; n <= 5; ++n) {
00139         _histSphericityMom[_isqrts]->fill(n, pow(sph, n)*weight);
00140       }
00141 
00142       // C & D params
00143       const ParisiTensor& parisi = applyProjection<ParisiTensor>(event, "Parisi");
00144       const double cparam = parisi.C();
00145       const double dparam = parisi.D();
00146       _histCParam[_isqrts]->fill(cparam, weight);
00147       _histDParam[_isqrts]->fill(dparam, weight);
00148       for (int n = 1; n <= 5; ++n) {
00149         _histCParamMom[_isqrts]->fill(n, pow(cparam, n)*weight);
00150       }
00151    
00152       // Hemispheres
00153       const Hemispheres& hemi = applyProjection<Hemispheres>(event, "Hemispheres");
00154       // The paper says that M_H/L are scaled by sqrt(s), but scaling by E_vis is the way that fits the data...
00155       const double hemi_mh = hemi.scaledMhigh();
00156       const double hemi_ml = hemi.scaledMlow();
00157       //
00158       const double hemi_bmax = hemi.Bmax();
00159       const double hemi_bmin = hemi.Bmin();
00160       const double hemi_bsum = hemi.Bsum();
00161       _histHemiMassH[_isqrts]->fill(hemi_mh, weight);
00162       _histHemiMassL[_isqrts]->fill(hemi_ml, weight);
00163       _histHemiBroadW[_isqrts]->fill(hemi_bmax, weight);
00164       _histHemiBroadN[_isqrts]->fill(hemi_bmin, weight);
00165       _histHemiBroadT[_isqrts]->fill(hemi_bsum, weight);
00166       for (int n = 1; n <= 5; ++n) {
00167         _histHemiMassHMom[_isqrts]->fill(n, pow(hemi_mh, n)*weight);
00168         _histHemiMassLMom[_isqrts]->fill(n, pow(hemi_ml, n)*weight);
00169         _histHemiBroadWMom[_isqrts]->fill(n, pow(hemi_bmax, n)*weight);
00170         _histHemiBroadNMom[_isqrts]->fill(n, pow(hemi_bmin, n)*weight);
00171         _histHemiBroadTMom[_isqrts]->fill(n, pow(hemi_bsum, n)*weight);
00172       }
00173     }
00174 
00175 
00176     void finalize() {
00177       scale(_hist1MinusT[_isqrts], 1.0/_sumWTrack2);
00178       scale(_histTMajor[_isqrts], 1.0/_sumWTrack2);
00179       scale(_histTMinor[_isqrts], 1.0/_sumWTrack2);
00180       scale(_histOblateness[_isqrts], 1.0/_sumWTrack2);
00181       scale(_histSphericity[_isqrts], 1.0/_sumWTrack2);
00182       scale(_histAplanarity[_isqrts], 1.0/_sumWTrack2);
00183       scale(_histHemiMassH[_isqrts], 1.0/_sumWTrack2);
00184       scale(_histHemiMassL[_isqrts], 1.0/_sumWTrack2);
00185       scale(_histHemiBroadW[_isqrts], 1.0/_sumWTrack2);
00186       scale(_histHemiBroadN[_isqrts], 1.0/_sumWTrack2);
00187       scale(_histHemiBroadT[_isqrts], 1.0/_sumWTrack2);
00188       scale(_histCParam[_isqrts], 1.0/_sumWTrack2);
00189       scale(_histDParam[_isqrts], 1.0/_sumWTrack2);
00190       scale(_histY23Durham[_isqrts], 1.0/_sumWJet3);
00191       //
00192       scale(_hist1MinusTMom[_isqrts], 1.0/_sumWTrack2);
00193       scale(_histTMajorMom[_isqrts], 1.0/_sumWTrack2);
00194       scale(_histTMinorMom[_isqrts], 1.0/_sumWTrack2);
00195       scale(_histOblatenessMom[_isqrts], 1.0/_sumWTrack2);
00196       scale(_histSphericityMom[_isqrts], 1.0/_sumWTrack2);
00197       scale(_histHemiMassHMom[_isqrts], 1.0/_sumWTrack2);
00198       scale(_histHemiMassLMom[_isqrts], 1.0/_sumWTrack2);
00199       scale(_histHemiBroadWMom[_isqrts], 1.0/_sumWTrack2);
00200       scale(_histHemiBroadNMom[_isqrts], 1.0/_sumWTrack2);
00201       scale(_histHemiBroadTMom[_isqrts], 1.0/_sumWTrack2);
00202       scale(_histCParamMom[_isqrts], 1.0/_sumWTrack2);
00203       scale(_histY23DurhamMom[_isqrts], 1.0/_sumWJet3);
00204     }
00205     
00206     //@}
00207     
00208     
00209   private:
00210     
00211     /// Beam energy index for histograms
00212     int _isqrts;
00213     
00214     /// @name Counters of event weights passing the cuts
00215     //@{
00216     double _sumWTrack2, _sumWJet3;
00217     //@}
00218 
00219     /// @name Event shape histos at 4 energies
00220     //@{
00221     AIDA::IHistogram1D* _hist1MinusT[4];
00222     AIDA::IHistogram1D* _histHemiMassH[4];
00223     AIDA::IHistogram1D* _histCParam[4];
00224     AIDA::IHistogram1D* _histHemiBroadT[4];
00225     AIDA::IHistogram1D* _histHemiBroadW[4];
00226     AIDA::IHistogram1D* _histY23Durham[4];
00227     AIDA::IHistogram1D* _histTMajor[4];
00228     AIDA::IHistogram1D* _histTMinor[4];
00229     AIDA::IHistogram1D* _histAplanarity[4];
00230     AIDA::IHistogram1D* _histSphericity[4];
00231     AIDA::IHistogram1D* _histOblateness[4];
00232     AIDA::IHistogram1D* _histHemiMassL[4];
00233     AIDA::IHistogram1D* _histHemiBroadN[4];
00234     AIDA::IHistogram1D* _histDParam[4];
00235     //@}
00236 
00237     /// @name Event shape moment histos at 4 energies
00238     //@{
00239     AIDA::IHistogram1D* _hist1MinusTMom[4];
00240     AIDA::IHistogram1D* _histHemiMassHMom[4];
00241     AIDA::IHistogram1D* _histCParamMom[4];
00242     AIDA::IHistogram1D* _histHemiBroadTMom[4];
00243     AIDA::IHistogram1D* _histHemiBroadWMom[4];
00244     AIDA::IHistogram1D* _histY23DurhamMom[4];
00245     AIDA::IHistogram1D* _histTMajorMom[4];
00246     AIDA::IHistogram1D* _histTMinorMom[4];
00247     AIDA::IHistogram1D* _histSphericityMom[4];
00248     AIDA::IHistogram1D* _histOblatenessMom[4];
00249     AIDA::IHistogram1D* _histHemiMassLMom[4];
00250     AIDA::IHistogram1D* _histHemiBroadNMom[4];
00251     //@}
00252 
00253   };
00254 
00255 
00256 
00257   // This global object acts as a hook for the plugin system
00258   AnalysisBuilder<OPAL_2004_S6132243> plugin_OPAL_2004_S6132243;
00259 
00260 }