35 xsecGen = cfg.
getParameter< vector<double> > (
"xsecGen");
36 ptHatEdges = cfg.
getParameter< vector<double> > (
"ptHatEdges");
44 m_file =
new TFile(HistoFileName.c_str(),
"RECREATE");
46 const int nMassBins = 103;
47 double massBoundaries[nMassBins+1] = {1, 3, 6, 10, 16, 23, 31, 40, 50, 61, 74, 88, 103, 119, 137, 156, 176, 197, 220, 244, 270, 296, 325, 354, 386, 419, 453, 489, 526, 565, 606, 649, 693, 740, 788, 838, 890, 944, 1000, 1058, 1118, 1181, 1246, 1313, 1383, 1455, 1530, 1607, 1687, 1770, 1856, 1945, 2037, 2132, 2231, 2332, 2438, 2546, 2659, 2775, 2895, 3019, 3147, 3279, 3416, 3558, 3704, 3854, 4010, 4171, 4337, 4509, 4686, 4869, 5058, 5253, 5455, 5663, 5877, 6099, 6328, 6564, 6808, 7060, 7320, 7589, 7866, 8152, 8447, 8752, 9067, 9391, 9726, 10072, 10430, 10798, 11179, 11571, 11977, 12395, 12827, 13272, 13732, 14000};
50 m_HistNames1D[hname] =
new TH1F(hname,hname,500,0,5000);
53 m_HistNames1D[hname] =
new TH1F(hname,hname,120,-6,6);
56 m_HistNames1D[hname] =
new TH1F(hname,hname,100,-
M_PI,
M_PI);
58 hname =
"NumberOfJets";
59 m_HistNames1D[hname] =
new TH1F(hname,hname,100,0,100);
62 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
64 hname =
"DijetMassWt";
65 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
66 m_HistNames1D.find(hname)->second->Sumw2();
68 hname =
"DijetMassIn";
69 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
71 hname =
"DijetMassInWt";
72 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
73 m_HistNames1D.find(hname)->second->Sumw2();
75 hname =
"DijetMassOut";
76 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
78 hname =
"DijetMassOutWt";
79 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
80 m_HistNames1D.find(hname)->second->Sumw2();
82 hname =
"ResonanceMass";
83 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
85 hname =
"DipartonMass";
86 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
88 hname =
"DipartonMassWt";
89 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
90 m_HistNames1D.find(hname)->second->Sumw2();
92 hname =
"DipartonMassIn";
93 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
95 hname =
"DipartonMassInWt";
96 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
97 m_HistNames1D.find(hname)->second->Sumw2();
99 hname =
"DipartonMassOut";
100 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
102 hname =
"DipartonMassOutWt";
103 m_HistNames1D[hname] =
new TH1F(hname,hname,nMassBins,massBoundaries);
104 m_HistNames1D.find(hname)->second->Sumw2();
107 m_HistNames1D[hname] =
new TH1F(hname,hname,1000,0,5000);
110 m_HistNames1D[hname] =
new TH1F(hname,hname,1000,0,5000);
111 m_HistNames1D.find(hname)->second->Sumw2();
114 m_HistNames1D[hname] =
new TH1F(hname,hname,5000,0,5000);
116 hname =
"PtHatFineWt";
117 m_HistNames1D[hname] =
new TH1F(hname,hname,5000,0,5000);
118 m_HistNames1D.find(hname)->second->Sumw2();
120 mcTruthTree_ =
new TTree(
"mcTruthTree",
"mcTruthTree");
121 mcTruthTree_->Branch(
"xsec", &xsec,
"xsec/F");
122 mcTruthTree_->Branch(
"weight", &
weight,
"weight/F");
123 mcTruthTree_->Branch(
"pt_hat", &pt_hat,
"pt_hat/F");
124 mcTruthTree_->Branch(
"nJets", &nJets,
"nJets/I");
125 mcTruthTree_->Branch(
"etaJet1", &etaJet1,
"etaJet1/F");
126 mcTruthTree_->Branch(
"etaJet2", &etaJet2,
"etaJet2/F");
127 mcTruthTree_->Branch(
"ptJet1", &ptJet1,
"ptJet1/F");
128 mcTruthTree_->Branch(
"ptJet2", &ptJet2,
"ptJet2/F");
129 mcTruthTree_->Branch(
"diJetMass", &diJetMass,
"diJetMass/F");
130 mcTruthTree_->Branch(
"etaPart1", &etaPart1,
"etaPart1/F");
131 mcTruthTree_->Branch(
"etaPart2", &etaPart2,
"etaPart2/F");
132 mcTruthTree_->Branch(
"ptPart1", &ptPart1,
"ptPart1/F");
133 mcTruthTree_->Branch(
"ptPart2", &ptPart2,
"ptPart2/F");
134 mcTruthTree_->Branch(
"diPartMass", &diPartMass,
"diPartMass/F");
157 double pthat = myGenEvent->event_scale();
158 pt_hat =
float(pthat);
162 if(anaLevel !=
"generating"){
167 if( ptHatEdges.size()>xsecGen.size() ){
168 for(
unsigned int i_pthat = 0; i_pthat < xsecGen.size(); ++i_pthat){
169 if( pthat >= ptHatEdges[i_pthat] && pthat < ptHatEdges[i_pthat+1])xsec=
float(xsecGen[i_pthat]);
174 std::cout <<
"Number of PtHat bin edges too small. Xsec set to zero" << std::endl;
181 if(
debug)
std::cout <<
"cross section=" <<xsec <<
" pb" << std::endl;
186 FillHist1D(hname, pt_hat, 1.0);
188 FillHist1D(hname, pt_hat, 1.0);
190 FillHist1D(hname, pt_hat,
weight);
191 hname =
"PtHatFineWt";
192 FillHist1D(hname, pt_hat,
weight);
193 if(anaLevel==
"PtHatOnly")
break;
201 typename JetCollection::const_iterator i_jet;
205 hname =
"NumberOfJets";
206 nJets = jets->size();
207 FillHist1D(hname,nJets,1.0);
211 for(i_jet = jets->begin(); i_jet != jets->end() && index < 2; ++i_jet)
214 FillHist1D(hname,i_jet->pt(),1.0);
216 FillHist1D(hname,i_jet->eta(),1.0);
218 FillHist1D(hname,i_jet->phi(),1.0);
219 p4jet[
index] = i_jet->p4();
220 etajet[
index] = i_jet->eta();
221 if(
debug)
std::cout <<
"jet " << index+1 <<
": pt=" <<i_jet->pt() <<
", eta=" <<etajet[
index] << std::endl;
228 ptJet1 = p4jet[0].pt();
229 ptJet2 = p4jet[1].pt();
230 diJetMass = (p4jet[0]+p4jet[1]).
mass();
233 if(index==2&&
abs(etaJet1)<1.3&&
abs(etaJet2)<1.3){
235 FillHist1D(hname,diJetMass ,1.0);
236 hname =
"DijetMassWt";
237 FillHist1D(hname,diJetMass ,
weight);
241 if(index==2&&
abs(etaJet1)<0.7&&
abs(etaJet2)<0.7){
242 hname =
"DijetMassIn";
243 FillHist1D(hname,diJetMass ,1.0);
244 hname =
"DijetMassInWt";
245 FillHist1D(hname,diJetMass ,
weight);
248 if(index==2 && (
abs(etaJet1)>0.7&&
abs(etaJet1)<1.3)
249 && (
abs(etaJet2)>0.7&&
abs(etaJet2)<1.3) ){
250 hname =
"DijetMassOut";
251 FillHist1D(hname, diJetMass ,1.0);
252 hname =
"DijetMassOutWt";
253 FillHist1D(hname,diJetMass ,
weight);
255 if(anaLevel==
"Jets")
break;
260 evt.
getByLabel(
"genParticles",genParticlesHandle_);
261 if(
debug)
for(
size_t i = 0;
i < genParticlesHandle_->size(); ++
i ) {
266 if(
i>=2&&
i<=8)
std::cout <<
"particle " <<
i <<
": id=" <<
id <<
", status=" << st <<
", mass=" << genP4.mass() <<
", pt=" << genP4.pt() <<
", eta=" << genP4.eta() << std::endl;
276 resonance_p = p.
p4();
277 hname =
"ResonanceMass";
278 FillHist1D(hname,resonance_p.mass() ,1.0);
283 if(
debug)
std::cout <<
"Resonance mass=" << resonance_p.mass() <<
", parton 1 pt=" << parton1_p.pt() <<
", parton 2 pt=" << parton2_p.pt() <<
", diparton mass=" << (parton1_p+parton2_p).
mass() << std::endl;
291 if(
debug)
std::cout <<
"parton 1 pt=" << parton1_p.pt() <<
", parton 2 pt=" << parton2_p.pt() <<
", diparton mass=" << (parton1_p+parton2_p).
mass() << std::endl;
294 etaPart1 = parton1_p.eta();
295 etaPart2 = parton2_p.eta();
296 ptPart1 = parton1_p.pt();
297 ptPart2 = parton2_p.pt();
298 diPartMass = (parton1_p+parton2_p).
mass();
300 if(
abs(etaPart1)<1.3&&
abs(etaPart2)<1.3){
301 hname =
"DipartonMass";
302 FillHist1D(hname,diPartMass ,1.0);
303 hname =
"DipartonMassWt";
304 FillHist1D(hname,diPartMass ,
weight);
307 if(
abs(etaPart1)<0.7&&
abs(etaPart2)<0.7){
308 hname =
"DipartonMassIn";
309 FillHist1D(hname,diPartMass ,1.0);
310 hname =
"DipartonMassInWt";
311 FillHist1D(hname,diPartMass ,
weight);
314 if( (
abs(etaPart1)>0.7&&
abs(etaPart1)<1.3)
315 && (
abs(etaPart2)>0.7&&
abs(etaPart2)<1.3) ){
316 hname =
"DipartonMassOut";
317 FillHist1D(hname,diPartMass ,1.0);
318 hname =
"DipartonMassOutWt";
319 FillHist1D(hname,diPartMass ,
weight);
323 mcTruthTree_->Fill();
334 if (m_file !=
nullptr)
337 mcTruthTree_->Write();
338 for (std::map<TString, TH1*>::iterator hid = m_HistNames1D.begin(); hid != m_HistNames1D.end(); hid++)
339 hid->second->Write();
348 std::map<TString, TH1*>::iterator hid=m_HistNames1D.find(histName);
349 if (hid==m_HistNames1D.end())
350 std::cout <<
"%fillHist -- Could not find histogram with name: " << histName << std::endl;
352 hid->second->Fill(value,wt);
T getParameter(std::string const &) const
int pdgId() const final
PDG identifier.
JetAnaPythia(edm::ParameterSet const &cfg)
JetAnaPythia< CaloJet > CaloJetAnaPythia
void FillHist1D(const TString &histName, const Double_t &x, const Double_t &wt)
#define DEFINE_FWK_MODULE(type)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
void analyze(edm::Event const &e, edm::EventSetup const &iSetup) override
Abs< T >::type abs(const T &t)
const LorentzVector & p4() const final
four-momentum Lorentz vector
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
const HepMC::GenEvent * GetEvent() const
JetAnaPythia< GenJet > GenJetAnaPythia
int status() const final
status word
JetAnaPythia< PFJet > PFJetAnaPythia