1 |
#include <iostream>
|
2 |
#include <fstream>
|
3 |
|
4 |
#include "Math/VectorUtil.h"
|
5 |
|
6 |
#include "FWCore/MessageLogger/interface/MessageLogger.h"
|
7 |
|
8 |
#include "DataFormats/TauReco/interface/PFTau.h"
|
9 |
#include "DataFormats/TauReco/interface/CaloTau.h"
|
10 |
|
11 |
|
12 |
#include "UserCode/HbbAnalysis/interface/HistosTaus.hh"
|
13 |
|
14 |
namespace HbbAnalysis {//namespace
|
15 |
|
16 |
void HistosTaus::FillEventHistograms(const edm::Handle<std::vector<pat::Tau> > & aCol){
|
17 |
|
18 |
if (doGenMatched_) {
|
19 |
unsigned int nMatched = 0;
|
20 |
for (std::vector<pat::Tau>::const_iterator iTau = aCol->begin();
|
21 |
iTau != aCol->end();
|
22 |
iTau++)
|
23 |
{
|
24 |
if (MatchesGenTau(*iTau)) nMatched++;
|
25 |
}
|
26 |
p_nTaus->Fill(nMatched);
|
27 |
}
|
28 |
else p_nTaus->Fill(aCol->size());
|
29 |
|
30 |
}
|
31 |
|
32 |
void HistosTaus::FillHistograms(const pat::Tau & aTau, const edm::Handle<std::vector<reco::Vertex> > & aRecoVertices, bool isLead){//FillHistograms
|
33 |
|
34 |
bool lIsGenMatched = !doGenMatched_ || (doGenMatched_ && MatchesGenTau(aTau));
|
35 |
if (lIsGenMatched) {//genMatched
|
36 |
if (isLead) {
|
37 |
if ( aTau.leadTrack().isAvailable() && aTau.leadTrack().isNonnull() ) {
|
38 |
p_leadTrk_pT->Fill(aTau.leadTrack()->pt());
|
39 |
p_leadTrk_eta->Fill(aTau.leadTrack()->eta());
|
40 |
p_leadTrk_phi->Fill(aTau.leadTrack()->phi());
|
41 |
|
42 |
p_leadTrk_matchDist->Fill(reco::deltaR(aTau.leadTrack()->momentum(), aTau.p4()));
|
43 |
|
44 |
if ( aRecoVertices->size() >= 1 ) {
|
45 |
const reco::Vertex& thePrimaryEventVertex = (*aRecoVertices->begin());
|
46 |
p_leadTrk_IPxy->Fill(aTau.leadTrack()->dxy(thePrimaryEventVertex.position()));
|
47 |
p_leadTrk_IPz->Fill(aTau.leadTrack()->dz(thePrimaryEventVertex.position()));
|
48 |
}
|
49 |
}
|
50 |
|
51 |
p_nIsolationTracks->Fill(aTau.isolationTracks().size());
|
52 |
|
53 |
p_nSignalTracks->Fill(aTau.signalTracks().size());
|
54 |
|
55 |
if (aTau.genJet()) {
|
56 |
p_genJet_pT->Fill(aTau.genJet()->pt());
|
57 |
p_genJet_eta->Fill(aTau.genJet()->eta());
|
58 |
p_genJet_phi->Fill(aTau.genJet()->phi());
|
59 |
p_deltaRGenJet->Fill(ROOT::Math::VectorUtil::DeltaR(aTau.p4(),aTau.genJet()->p4()));
|
60 |
}
|
61 |
|
62 |
const std::vector<std::pair<std::string,float> > & lIDs = aTau.tauIDs();
|
63 |
|
64 |
bool lPrint = false;
|
65 |
//a few warning if additional discriminants are found:
|
66 |
if ((aTau.isPFTau() && lIDs.size() != 7) ||
|
67 |
(aTau.isCaloTau() && lIDs.size() != 3))
|
68 |
lPrint = true;
|
69 |
|
70 |
if (lPrint) {
|
71 |
std::cout << "!!!!!!! Discriminants changed, please update histograms !!!!!!!" << std::endl;
|
72 |
std::cout << "--- isCaloTau = " << aTau.isCaloTau() << ", isPFTau = " << aTau.isPFTau() << std::endl;
|
73 |
std::cout << "------ ID names = " << std::endl;
|
74 |
}
|
75 |
for (unsigned int id(0); id<lIDs.size(); id++){
|
76 |
|
77 |
std::string lName = lIDs.at(id).first;
|
78 |
float lDiscri = lIDs.at(id).second;
|
79 |
|
80 |
if (lPrint) std::cout << "--------- " << lName << " = " << lDiscri << std::endl;
|
81 |
|
82 |
//pf
|
83 |
if (aTau.isPFTau()) {
|
84 |
if (lName.find("leadingTrackFinding") != lName.npos) p_pfTauID_ByLeadingTrackFinding->Fill(lDiscri);
|
85 |
if (lName.find("leadingTrackPtCut") != lName.npos) p_pfTauID_ByLeadingTrackPtCut->Fill(lDiscri);
|
86 |
if (lName.find("trackIsolation") != lName.npos) p_pfTauID_ByTrackIsolation->Fill(lDiscri);
|
87 |
if (lName.find("ecalIsolation") != lName.npos) p_pfTauID_ByECALIsolation->Fill(lDiscri);
|
88 |
if (lName.find("byIsolation") != lName.npos) p_pfTauID_ByIsolation->Fill(lDiscri);
|
89 |
if (lName.find("againstElectron") != lName.npos) p_pfTauID_AgainstElectron->Fill(lDiscri);
|
90 |
if (lName.find("againstMuon") != lName.npos) p_pfTauID_AgainstMuon->Fill(lDiscri);
|
91 |
}
|
92 |
if (aTau.isCaloTau()){
|
93 |
if (lName.find("byIsolation") != lName.npos) p_caloTauID_ByIsolation->Fill(lDiscri);
|
94 |
if (lName.find("leadingTrackFinding") != lName.npos) p_caloTauID_ByLeadingTrackFinding->Fill(lDiscri);
|
95 |
if (lName.find("leadingTrackPtCut") != lName.npos) p_caloTauID_ByLeadingTrackPtCut->Fill(lDiscri);
|
96 |
}
|
97 |
|
98 |
}
|
99 |
|
100 |
if (aTau.isCaloTau()) {//caloTaus
|
101 |
p_tauType->Fill(0);
|
102 |
|
103 |
//for calo taus
|
104 |
p_leadTracksignedSipt->Fill(aTau.leadTracksignedSipt());
|
105 |
p_leadTrackHCAL3x3hitsEtSum->Fill(aTau.leadTrackHCAL3x3hitsEtSum());
|
106 |
p_leadTrackHCAL3x3hottesthitDEta->Fill(aTau.leadTrackHCAL3x3hottesthitDEta());
|
107 |
p_signalTracksInvariantMass->Fill(aTau.signalTracksInvariantMass());
|
108 |
p_TracksInvariantMass->Fill(aTau.TracksInvariantMass());
|
109 |
p_isolationTracksPtSum->Fill(aTau.isolationTracksPtSum());
|
110 |
p_isolationECALhitsEtSum->Fill(aTau.isolationECALhitsEtSum());
|
111 |
p_maximumHCALhitEt->Fill(aTau.maximumHCALhitEt());
|
112 |
|
113 |
}//caloTaus
|
114 |
|
115 |
//for PF taus
|
116 |
if (aTau.isPFTau()) {//pfTaus
|
117 |
p_tauType->Fill(1);
|
118 |
|
119 |
|
120 |
if ( aTau.leadPFChargedHadrCand().isAvailable() && aTau.leadPFChargedHadrCand().isNonnull() ) {
|
121 |
p_leadPFChargedHadrCand_pT->Fill(aTau.leadPFChargedHadrCand()->pt());
|
122 |
p_leadPFChargedHadrCand_eta->Fill(aTau.leadPFChargedHadrCand()->eta());
|
123 |
p_leadPFChargedHadrCand_phi->Fill(aTau.leadPFChargedHadrCand()->phi());
|
124 |
}
|
125 |
|
126 |
p_leadPFChargedHadrCandsignedSipt->Fill(aTau.leadPFChargedHadrCandsignedSipt());
|
127 |
p_nSignalPFCands->Fill(aTau.signalPFCands().size());
|
128 |
p_nSignalPFChargedHadrCands->Fill(aTau.signalPFChargedHadrCands().size());
|
129 |
p_nSignalPFNeutrHadrCands->Fill(aTau.signalPFNeutrHadrCands().size());
|
130 |
p_nSignalPFGammaCands->Fill(aTau.signalPFGammaCands().size());
|
131 |
p_nIsolationPFCands->Fill(aTau.isolationPFCands().size());
|
132 |
p_nIsolationPFChargedHadrCands->Fill(aTau.isolationPFChargedHadrCands().size());
|
133 |
p_nIsolationPFNeutrHadrCands->Fill(aTau.isolationPFNeutrHadrCands().size());
|
134 |
p_nIsolationPFGammaCands->Fill(aTau.isolationPFGammaCands().size());
|
135 |
|
136 |
p_isolationPFChargedHadrCandsPtSum->Fill(aTau.isolationPFChargedHadrCandsPtSum());
|
137 |
p_isolationPFGammaCandsEtSum->Fill(aTau.isolationPFGammaCandsEtSum());
|
138 |
p_maximumHCALPFClusterEt->Fill(aTau.maximumHCALPFClusterEt());
|
139 |
p_emFraction->Fill(aTau.emFraction());
|
140 |
p_hcalTotOverPLead->Fill(aTau.hcalTotOverPLead());
|
141 |
p_hcalMaxOverPLead->Fill(aTau.hcalMaxOverPLead());
|
142 |
p_hcal3x3OverPLead->Fill(aTau.hcal3x3OverPLead());
|
143 |
p_ecalStripSumEOverPLead->Fill(aTau.ecalStripSumEOverPLead());
|
144 |
p_bremsRecoveryEOverPLead->Fill(aTau.bremsRecoveryEOverPLead());
|
145 |
|
146 |
if ( aTau.electronPreIDTrack().isAvailable() && aTau.electronPreIDTrack().isNonnull() ) {
|
147 |
p_electronPreIDTrack_pT->Fill(aTau.electronPreIDTrack()->pt());
|
148 |
p_electronPreIDTrack_eta->Fill(aTau.electronPreIDTrack()->eta());
|
149 |
p_electronPreIDTrack_phi->Fill(aTau.electronPreIDTrack()->phi());
|
150 |
}
|
151 |
|
152 |
p_electronPreIDOutput->Fill(aTau.electronPreIDOutput());
|
153 |
p_electronPreIDDecision->Fill(aTau.electronPreIDDecision());
|
154 |
p_caloComp->Fill(aTau.caloComp());
|
155 |
p_segComp->Fill(aTau.segComp());
|
156 |
p_muonDecision->Fill(aTau.muonDecision());
|
157 |
|
158 |
//std::cout << "CaloComp = " << aTau.caloComp() << ", segComp = " << aTau.segComp() << ", bremRec = " << aTau.bremsRecoveryEOverPLead() << ", elecPredIDoutput " << aTau.electronPreIDOutput() << std::endl;
|
159 |
|
160 |
|
161 |
p_particleIso->Fill(aTau.particleIso());
|
162 |
p_chargedParticleIso->Fill(aTau.chargedHadronIso());
|
163 |
p_neutralParticleIso->Fill(aTau.neutralHadronIso());
|
164 |
p_gammaParticleIso->Fill(aTau.photonIso());
|
165 |
|
166 |
}//pfTaus
|
167 |
|
168 |
|
169 |
FillBaseHistograms(aTau.pt(),aTau.eta(),aTau.phi(),aTau.charge());
|
170 |
|
171 |
}//isLead
|
172 |
}//genMatched
|
173 |
|
174 |
}//FillHistograms
|
175 |
|
176 |
bool HistosTaus::MatchesGenTau(const pat::Tau& aPatTau)
|
177 |
{
|
178 |
|
179 |
bool isGenMatched = false;
|
180 |
|
181 |
const std::vector<reco::GenParticleRef> & lVec = aPatTau.genParticleRefs();
|
182 |
|
183 |
if (lVec.size() == 0) return (aPatTau.genJet());
|
184 |
|
185 |
for ( std::vector<reco::GenParticleRef>::const_iterator it = lVec.begin();
|
186 |
it != lVec.end(); ++it ) {
|
187 |
if ( it->ref().isNonnull() && it->ref().isValid() ) {
|
188 |
const reco::GenParticleRef & genParticle = (*it);
|
189 |
if ( genParticle->pdgId() == -15 || genParticle->pdgId() == +15 ) isGenMatched = true;
|
190 |
} else {
|
191 |
edm::LogWarning("MatchesGenTau") << " edm::Ref of genParticle associated to pat::Tau is invalid !!";
|
192 |
return (aPatTau.genJet());
|
193 |
}
|
194 |
}
|
195 |
return isGenMatched;
|
196 |
}
|
197 |
|
198 |
}//namespace
|
199 |
|
200 |
|