1 |
amagnan |
1.1 |
#include <iostream>
|
2 |
|
|
#include <fstream>
|
3 |
|
|
|
4 |
amagnan |
1.4 |
#include "Math/VectorUtil.h"
|
5 |
|
|
|
6 |
amagnan |
1.1 |
#include "UserCode/HbbAnalysis/interface/HistosJets.hh"
|
7 |
|
|
|
8 |
|
|
namespace HbbAnalysis {//namespace
|
9 |
|
|
|
10 |
amagnan |
1.6 |
void HistosJets::FillEventHistograms(const edm::Handle<std::vector<pat::Jet> >& aJetCol,
|
11 |
|
|
const JetFlavour & aFlavour){
|
12 |
amagnan |
1.1 |
|
13 |
|
|
p_nJets->Fill(aJetCol->size());
|
14 |
amagnan |
1.4 |
jetFlav_ = aFlavour;
|
15 |
amagnan |
1.1 |
|
16 |
|
|
}
|
17 |
|
|
|
18 |
amagnan |
1.6 |
|
19 |
|
|
|
20 |
|
|
void HistosJets::FillHistograms(const pat::Jet & aJet,
|
21 |
amagnan |
1.11 |
const edm::Handle<reco::GenParticleCollection> & aGenParticles){//FillHistograms
|
22 |
amagnan |
1.1 |
|
23 |
amagnan |
1.7 |
FillBaseHistograms(aJet.pt(),aJet.eta(),aJet.phi(),aJet.charge());
|
24 |
amagnan |
1.1 |
|
25 |
|
|
p_partonFlavour->Fill(aJet.partonFlavour());
|
26 |
amagnan |
1.13 |
p_hasJetCorrFactors->Fill(aJet.hasCorrFactors());
|
27 |
amagnan |
1.1 |
|
28 |
|
|
const std::vector<std::pair<std::string, float> > & lPairDiscri = aJet.getPairDiscri();
|
29 |
|
|
const unsigned int lNTags = lPairDiscri.size();
|
30 |
amagnan |
1.2 |
if (debug_ > 1) std::cout << "numberOfTags = " << lNTags << std::endl;
|
31 |
amagnan |
1.1 |
assert (lNTags <= 11);
|
32 |
|
|
|
33 |
amagnan |
1.9 |
for (unsigned int i(0); i<lNTags; i++){
|
34 |
|
|
p_bDiscriminator[i][0]->Fill(lPairDiscri.at(i).second);
|
35 |
|
|
}
|
36 |
|
|
|
37 |
|
|
|
38 |
amagnan |
1.5 |
if (jetFlav_.nPartons()){//if partons found....
|
39 |
|
|
|
40 |
amagnan |
1.10 |
unsigned int lFlav[3] = {0,0,0};
|
41 |
amagnan |
1.5 |
lFlav[0] = jetFlav_.partonMatchingGenJet(aJet,aGenParticles,0.4).second;
|
42 |
|
|
lFlav[1] = jetFlav_.leptonMatchingGenJet(aJet,aGenParticles,0.4);
|
43 |
|
|
lFlav[2] = jetFlav_.leptonMatchingRecoJet(aJet,aGenParticles,0.4);
|
44 |
|
|
assert (lFlav[0] < 4);
|
45 |
amagnan |
1.4 |
|
46 |
amagnan |
1.5 |
int lIndex = jetFlav_.partonMatchingGenJet(aJet,aGenParticles,0.4).first;
|
47 |
|
|
|
48 |
|
|
if (lIndex != -1 && aJet.genJet()){
|
49 |
amagnan |
1.4 |
|
50 |
amagnan |
1.5 |
int lPartonFlav = jetFlav_.partonFlavour(lIndex);
|
51 |
|
|
|
52 |
|
|
//fill all even if no match within 0.4 found to see the distribution
|
53 |
|
|
//referring to the first parton matched with genjet (lIndex), so it should be consistent....
|
54 |
|
|
p_dRgenjetparton[0]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.parton(aGenParticles,lIndex).p4(),aJet.genJet()->p4()));
|
55 |
|
|
p_dRrecojetparton[0]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.parton(aGenParticles,lIndex).p4(),aJet.p4()));
|
56 |
|
|
if (jetFlav_.hasStableElectron(lIndex)) {
|
57 |
|
|
p_dRgenjetlepton[0]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableElectron(aGenParticles,lIndex).p4(),aJet.genJet()->p4()));
|
58 |
|
|
p_dRrecojetlepton[0]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableElectron(aGenParticles,lIndex).p4(),aJet.p4()));
|
59 |
|
|
}
|
60 |
|
|
else if (jetFlav_.hasStableMuon(lIndex)) {
|
61 |
|
|
p_dRgenjetlepton[0]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableMuon(aGenParticles,lIndex).p4(),aJet.genJet()->p4()));
|
62 |
|
|
p_dRrecojetlepton[0]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableMuon(aGenParticles,lIndex).p4(),aJet.p4()));
|
63 |
|
|
}
|
64 |
amagnan |
1.4 |
|
65 |
amagnan |
1.5 |
if (lPartonFlav > 0) {
|
66 |
|
|
p_dRgenjetparton[lPartonFlav]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.parton(aGenParticles,lIndex).p4(),aJet.genJet()->p4()));
|
67 |
|
|
p_dRrecojetparton[lPartonFlav]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.parton(aGenParticles,lIndex).p4(),aJet.p4()));
|
68 |
|
|
if (jetFlav_.hasStableElectron(lIndex)) {
|
69 |
|
|
p_dRgenjetlepton[lPartonFlav]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableElectron(aGenParticles,lIndex).p4(),aJet.genJet()->p4()));
|
70 |
|
|
p_dRrecojetlepton[lPartonFlav]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableElectron(aGenParticles,lIndex).p4(),aJet.p4()));
|
71 |
|
|
}
|
72 |
|
|
else if (jetFlav_.hasStableMuon(lIndex)) {
|
73 |
|
|
p_dRgenjetlepton[lPartonFlav]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableMuon(aGenParticles,lIndex).p4(),aJet.genJet()->p4()));
|
74 |
|
|
p_dRrecojetlepton[lPartonFlav]->Fill(ROOT::Math::VectorUtil::DeltaR(jetFlav_.stableMuon(aGenParticles,lIndex).p4(),aJet.p4()));
|
75 |
|
|
}
|
76 |
amagnan |
1.4 |
}
|
77 |
amagnan |
1.5 |
else std::cout << "--- WARNING ! partonFlavour = " << lPartonFlav << ", should be 1, 2 or 3." << std::endl;
|
78 |
amagnan |
1.4 |
}
|
79 |
|
|
|
80 |
|
|
|
81 |
amagnan |
1.5 |
for (unsigned int i(0); i<lNTags; i++){
|
82 |
|
|
if (debug_ > 1) std::cout << "tag " << i << ", name=" << lPairDiscri.at(i).first << ",value = " << lPairDiscri.at(i).second << std::endl;
|
83 |
|
|
if (lFlav[0]){
|
84 |
amagnan |
1.9 |
//p_bDiscriminator[i][0]->Fill(lPairDiscri.at(i).second);
|
85 |
amagnan |
1.10 |
|
86 |
amagnan |
1.5 |
//if matching between parton and genjet
|
87 |
|
|
//+ matching between lepton and genjet and recojet
|
88 |
amagnan |
1.10 |
if ( ( (jetFlav_.flavourIni()>3 && jetFlav_.flavourIni()!= 21) &&
|
89 |
|
|
(lFlav[0] == 1 || (lFlav[0] > 1 && lFlav[1]>0 && lFlav[2]>0) ) ) ||
|
90 |
|
|
( (jetFlav_.flavourIni() == 3 || jetFlav_.flavourIni()== 21) && lFlav[0]>1)
|
91 |
|
|
)
|
92 |
amagnan |
1.5 |
p_bDiscriminator[i][lFlav[0]]->Fill(lPairDiscri.at(i).second);
|
93 |
|
|
}
|
94 |
amagnan |
1.4 |
}
|
95 |
|
|
|
96 |
|
|
|
97 |
amagnan |
1.5 |
if (lFlav[0] && aJet.genJet()){
|
98 |
|
|
p_pTgenjet[0]->Fill(aJet.genJet()->pt());
|
99 |
|
|
p_etagenjet[0]->Fill(aJet.genJet()->eta());
|
100 |
|
|
p_phigenjet[0]->Fill(aJet.genJet()->phi());
|
101 |
|
|
p_pTrecojet[0]->Fill(aJet.pt());
|
102 |
|
|
p_etarecojet[0]->Fill(aJet.eta());
|
103 |
|
|
p_phirecojet[0]->Fill(aJet.phi());
|
104 |
|
|
if (aJet.genJet()->pt() > 0) p_pTrecoOverpTgenjet[0]->Fill(aJet.pt()/aJet.genJet()->pt());
|
105 |
amagnan |
1.10 |
if ( lFlav[0] == 1 || (lFlav[0] >1 && lFlav[1]> 0 && lFlav[2] > 0)){
|
106 |
amagnan |
1.5 |
p_pTgenjet[lFlav[0]]->Fill(aJet.genJet()->pt());
|
107 |
|
|
p_etagenjet[lFlav[0]]->Fill(aJet.genJet()->eta());
|
108 |
|
|
p_phigenjet[lFlav[0]]->Fill(aJet.genJet()->phi());
|
109 |
|
|
p_pTrecojet[lFlav[0]]->Fill(aJet.pt());
|
110 |
|
|
p_etarecojet[lFlav[0]]->Fill(aJet.eta());
|
111 |
|
|
p_phirecojet[lFlav[0]]->Fill(aJet.phi());
|
112 |
|
|
if (aJet.genJet()->pt() > 0) p_pTrecoOverpTgenjet[lFlav[0]]->Fill(aJet.pt()/aJet.genJet()->pt());
|
113 |
|
|
}
|
114 |
amagnan |
1.4 |
}
|
115 |
|
|
|
116 |
amagnan |
1.5 |
if (aJet.genJet() && fabs(aJet.genJet()->eta())<2 && aJet.genJet()->pt()>20) {
|
117 |
|
|
int binEta = static_cast<int>((aJet.genJet()->eta()+2.)/0.2);
|
118 |
|
|
int binpt;
|
119 |
|
|
if (aJet.genJet()->pt() < 100) binpt = static_cast<int>((aJet.genJet()->pt()-20)/10.);
|
120 |
|
|
else if (aJet.genJet()->pt() < 120) binpt = 8;
|
121 |
|
|
else binpt = 9;
|
122 |
amagnan |
1.4 |
|
123 |
|
|
|
124 |
amagnan |
1.5 |
if (lFlav[0]){
|
125 |
|
|
p_pTrecoOverpTgenjet_vseta[0][binEta]->Fill(aJet.pt()/aJet.genJet()->pt());
|
126 |
|
|
p_pTrecoOverpTgenjet_vspt[0][binpt]->Fill(aJet.pt()/aJet.genJet()->pt());
|
127 |
amagnan |
1.10 |
if ( lFlav[0] == 1 || (lFlav[0] >1 && lFlav[1] > 0 && lFlav[2] > 0)){
|
128 |
amagnan |
1.5 |
p_pTrecoOverpTgenjet_vseta[lFlav[0]][binEta]->Fill(aJet.pt()/aJet.genJet()->pt());
|
129 |
|
|
p_pTrecoOverpTgenjet_vspt[lFlav[0]][binpt]->Fill(aJet.pt()/aJet.genJet()->pt());
|
130 |
|
|
}
|
131 |
amagnan |
1.4 |
}
|
132 |
|
|
}
|
133 |
amagnan |
1.5 |
}//if partons found
|
134 |
amagnan |
1.1 |
|
135 |
amagnan |
1.4 |
p_nAssociatedTracks->Fill((aJet.associatedTracks()).size());
|
136 |
|
|
p_isCaloJet->Fill(aJet.isCaloJet());
|
137 |
|
|
p_isPFJet->Fill(aJet.isPFJet());
|
138 |
|
|
p_isBasicJet->Fill(aJet.isBasicJet());
|
139 |
|
|
|
140 |
|
|
//================== Calo Jet specific information ====================
|
141 |
|
|
if (aJet.isCaloJet()) {
|
142 |
|
|
p_maxEInEmTowers->Fill(aJet.maxEInEmTowers());
|
143 |
|
|
p_maxEInHadTowers->Fill(aJet.maxEInHadTowers());
|
144 |
|
|
p_energyFractionHadronic->Fill(aJet.energyFractionHadronic());
|
145 |
|
|
p_emEnergyFraction->Fill(aJet.emEnergyFraction());
|
146 |
|
|
p_hadEnergyInHB->Fill(aJet.hadEnergyInHB());
|
147 |
|
|
p_hadEnergyInHO->Fill(aJet.hadEnergyInHO());
|
148 |
|
|
p_hadEnergyInHE->Fill(aJet.hadEnergyInHE());
|
149 |
|
|
p_hadEnergyInHF->Fill(aJet.hadEnergyInHF());
|
150 |
|
|
p_emEnergyInEB->Fill(aJet.emEnergyInEB());
|
151 |
|
|
p_emEnergyInEE->Fill(aJet.emEnergyInEE());
|
152 |
|
|
p_emEnergyInHF->Fill(aJet.emEnergyInHF());
|
153 |
|
|
p_towersArea->Fill(aJet.towersArea());
|
154 |
|
|
p_n90->Fill(aJet.n90());
|
155 |
|
|
p_n60->Fill(aJet.n60());
|
156 |
|
|
}
|
157 |
amagnan |
1.1 |
|
158 |
amagnan |
1.4 |
// //================== PF Jet specific information ====================
|
159 |
|
|
if (aJet.isPFJet()){
|
160 |
|
|
p_chargedHadronEnergy->Fill(aJet.chargedHadronEnergy());
|
161 |
|
|
p_chargedHadronEnergyFraction->Fill(aJet.chargedHadronEnergyFraction());
|
162 |
|
|
p_neutralHadronEnergy->Fill(aJet.neutralHadronEnergy());
|
163 |
|
|
p_neutralHadronEnergyFraction->Fill(aJet.neutralHadronEnergyFraction());
|
164 |
|
|
p_chargedEmEnergy->Fill(aJet.chargedEmEnergy());
|
165 |
|
|
p_chargedEmEnergyFraction->Fill(aJet.chargedEmEnergyFraction());
|
166 |
|
|
p_chargedMuEnergy->Fill(aJet.chargedMuEnergy());
|
167 |
|
|
p_chargedMuEnergyFraction->Fill(aJet.chargedMuEnergyFraction());
|
168 |
|
|
p_neutralEmEnergy->Fill(aJet.neutralEmEnergy());
|
169 |
|
|
p_neutralEmEnergyFraction->Fill(aJet.neutralEmEnergyFraction());
|
170 |
|
|
p_chargedMultiplicity->Fill(aJet.chargedMultiplicity());
|
171 |
|
|
p_neutralMultiplicity->Fill(aJet.neutralMultiplicity());
|
172 |
|
|
p_muonMultiplicity->Fill(aJet.muonMultiplicity());
|
173 |
|
|
}
|
174 |
amagnan |
1.1 |
|
175 |
|
|
|
176 |
|
|
}//FillHistograms
|
177 |
|
|
|
178 |
|
|
}//namespace
|