00001
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
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
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
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
00080 double d_ij=log10(sqrt(seq->exclusive_dmerge_max(i)));
00081
00082
00083 _h_log10_d[i]->fill(d_ij, weight);
00084
00085
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
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
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
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
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 }