MC_JetAnalysis.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analyses/MC_JetAnalysis.hh"
00003 #include "Rivet/Tools/Logging.hh"
00004 #include "Rivet/Projections/FastJets.hh"
00005 #include "Rivet/RivetAIDA.hh"
00006 
00007 namespace Rivet {
00008 
00009 
00010   MC_JetAnalysis::MC_JetAnalysis(const string& name,
00011                                  const size_t& njet, 
00012                                  const string& jetpro_name)
00013     : Analysis(name), m_njet(njet), m_jetpro_name(jetpro_name),
00014     _h_log10_d(njet, NULL), _h_log10_R(njet+1, NULL), _h_pT_jet(njet, NULL),
00015     _h_eta_jet(njet, NULL)
00016   {
00017     setNeedsCrossSection(true);
00018   }
00019 
00020 
00021 
00022   // Book histograms
00023   void MC_JetAnalysis::init() {
00024  
00025     for (size_t i=0; i<m_njet; ++i) {
00026       stringstream dname;
00027       dname<<"log10_d_"<<i<<i+1;
00028       
00029       _h_log10_d[i] = bookHistogram1D(dname.str(), 50, 0.2, log10(0.5*sqrtS()));
00030    
00031       stringstream Rname;
00032       Rname<<"log10_R_"<<i;
00033       _h_log10_R[i] = bookDataPointSet(Rname.str(), 50, 0.2, log10(0.5*sqrtS()));
00034    
00035       stringstream pTname;
00036       pTname<<"jet_pT_"<<i+1;
00037       double pTmax = 1.0/(double(i)+2.0)*sqrtS()/GeV/2.0;
00038       int nbins = 100/(i+1);
00039       _h_pT_jet[i] = bookHistogram1D(pTname.str(), logBinEdges(nbins, 10.0, pTmax));
00040    
00041       stringstream etaname;
00042       etaname<<"jet_eta_"<<i+1;
00043       _h_eta_jet[i] = bookHistogram1D(etaname.str(), i>1 ? 25 : 50, -5.0, 5.0);
00044    
00045       for (size_t j=i+1; j<m_njet; ++j) {
00046         std::pair<size_t, size_t> ij(std::make_pair(i, j));
00047      
00048         stringstream detaname;
00049         detaname<<"jets_deta_"<<i+1<<j+1;
00050         _h_deta_jets.insert(make_pair(ij, bookHistogram1D(detaname.str(), 25, -5.0, 5.0)));
00051      
00052         stringstream dRname;
00053         dRname<<"jets_dR_"<<i+1<<j+1;
00054         _h_dR_jets.insert(make_pair(ij, bookHistogram1D(dRname.str(), 25, 0.0, 5.0)));
00055       }
00056     }
00057     stringstream Rname;
00058     Rname<<"log10_R_"<<m_njet;
00059     _h_log10_R[m_njet] = bookDataPointSet(Rname.str(), 50, 0.2, log10(0.5*sqrtS()));
00060  
00061     _h_jet_multi_exclusive = bookHistogram1D("jet_multi_exclusive", m_njet+3, -0.5, m_njet+3-0.5);
00062     _h_jet_multi_inclusive = bookHistogram1D("jet_multi_inclusive", m_njet+3, -0.5, m_njet+3-0.5);
00063     _h_jet_multi_ratio = bookDataPointSet("jet_multi_ratio", m_njet+2, 0.5, m_njet+3-0.5);
00064   }
00065 
00066 
00067 
00068   // Do the analysis
00069   void MC_JetAnalysis::analyze(const Event & e) {
00070     double weight = e.weight();
00071  
00072     const FastJets& jetpro = applyProjection<FastJets>(e, m_jetpro_name);
00073 
00074     // jet resolutions and integrated jet rates
00075     const fastjet::ClusterSequence* seq = jetpro.clusterSeq();
00076     if (seq!=NULL) {
00077       double previous_dij = 10.0;
00078       for (size_t i=0; i<m_njet; ++i) {
00079         // jet resolution i -> j
00080         double d_ij=log10(sqrt(seq->exclusive_dmerge_max(i)));
00081      
00082         // fill differential jet resolution
00083         _h_log10_d[i]->fill(d_ij, weight);
00084      
00085         // fill integrated jet resolution
00086         for (int ibin=0; ibin<_h_log10_R[i]->size(); ++ibin) {
00087           IDataPoint* dp=_h_log10_R[i]->point(ibin);
00088           double dcut=dp->coordinate(0)->value();
00089           if (d_ij<dcut && previous_dij>dcut) {
00090             dp->coordinate(1)->setValue(dp->coordinate(1)->value()+weight);
00091           }
00092         }
00093         previous_dij = d_ij;
00094       }
00095       // one remaining integrated jet resolution
00096       for (int ibin=0; ibin<_h_log10_R[m_njet]->size(); ++ibin) {
00097         IDataPoint* dp=_h_log10_R[m_njet]->point(ibin);
00098         double dcut=dp->coordinate(0)->value();
00099         if (previous_dij>dcut) {
00100           dp->coordinate(1)->setValue(dp->coordinate(1)->value()+weight);
00101         }
00102       }
00103     }
00104 
00105     const Jets& jets = jetpro.jetsByPt(20.0);
00106  
00107     // the remaining direct jet observables
00108     for (size_t i=0; i<m_njet; ++i) {
00109       if (jets.size()<i+1) continue;
00110       _h_pT_jet[i]->fill(jets[i].momentum().pT(), weight);
00111       _h_eta_jet[i]->fill(jets[i].momentum().eta(), weight);
00112    
00113       for (size_t j=i+1; j<m_njet; ++j) {
00114         if (jets.size()<j+1) continue;
00115         std::pair<size_t, size_t> ij(std::make_pair(i, j));
00116         double deta = jets[i].momentum().eta()-jets[j].momentum().eta();
00117         double dR = deltaR(jets[i].momentum(), jets[j].momentum());
00118         _h_deta_jets[ij]->fill(deta, weight);
00119         _h_dR_jets[ij]->fill(dR, weight);
00120       }
00121     }
00122     _h_jet_multi_exclusive->fill(jets.size(), weight);
00123 
00124     for (size_t i=0; i<m_njet+2; ++i) {
00125       if (jets.size()>=i) {
00126         _h_jet_multi_inclusive->fill(i, weight);
00127       }
00128     }
00129   }
00130 
00131 
00132   // Finalize
00133   void MC_JetAnalysis::finalize() {
00134     for (size_t i=0; i<m_njet; ++i) {
00135       scale(_h_log10_d[i], crossSection()/sumOfWeights());
00136       for (int ibin=0; ibin<_h_log10_R[i]->size(); ++ibin) {
00137         IDataPoint* dp=_h_log10_R[i]->point(ibin);
00138         dp->coordinate(1)->setValue(dp->coordinate(1)->value()*crossSection()/sumOfWeights());
00139       }
00140    
00141       scale(_h_pT_jet[i], crossSection()/sumOfWeights());
00142       scale(_h_eta_jet[i], crossSection()/sumOfWeights());
00143    
00144       for (size_t j=i+1; j<m_njet; ++j) {
00145       }
00146     }
00147     for (int ibin=0; ibin<_h_log10_R[m_njet]->size(); ++ibin) {
00148       IDataPoint* dp=_h_log10_R[m_njet]->point(ibin);
00149       dp->coordinate(1)->setValue(dp->coordinate(1)->value()*crossSection()/sumOfWeights());
00150     }
00151 
00152     // fill inclusive jet multi ratio
00153     int Nbins=_h_jet_multi_inclusive->axis().bins();
00154     std::vector<double> ratio(Nbins-1, 0.0);
00155     std::vector<double> err(Nbins-1, 0.0);
00156     for (int i=0; i<Nbins-1; ++i) {
00157       if (_h_jet_multi_inclusive->binHeight(i)>0.0 && _h_jet_multi_inclusive->binHeight(i+1)>0.0) {
00158         ratio[i]=_h_jet_multi_inclusive->binHeight(i+1)/_h_jet_multi_inclusive->binHeight(i);
00159         double relerr_i=_h_jet_multi_inclusive->binError(i)/_h_jet_multi_inclusive->binHeight(i);
00160         double relerr_j=_h_jet_multi_inclusive->binError(i+1)/_h_jet_multi_inclusive->binHeight(i+1);
00161         err[i]=ratio[i]*(relerr_i+relerr_j);
00162       }
00163     }
00164     _h_jet_multi_ratio->setCoordinate(1, ratio, err);
00165 
00166     scale(_h_jet_multi_exclusive, crossSection()/sumOfWeights());
00167     scale(_h_jet_multi_inclusive, crossSection()/sumOfWeights());
00168   }
00169 
00170 
00171 }