ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/JetAnalyzer.cc
Revision: 1.13
Committed: Fri Nov 6 08:03:06 2009 UTC (15 years, 5 months ago) by lethuill
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.12: +290 -287 lines
Error occurred while calculating annotation data.
Log Message:
Add antikt5 algo

File Contents

# Content
1 #include "../interface/JetAnalyzer.h"
2
3 using namespace std;
4 using namespace reco;
5 using namespace edm;
6
7 JetAnalyzer::JetAnalyzer(const edm::ParameterSet& producersNames, const edm::ParameterSet& myConfig, int verbosity):verbosity_(verbosity)
8 {
9 dataType_ = producersNames.getUntrackedParameter<string>("dataType","unknown");
10 jetProducer_ = producersNames.getParameter<edm::InputTag>("jetProducer");
11 useMC_ = myConfig.getUntrackedParameter<bool>("doJetMC");
12 allowMissingCollection_ = producersNames.getUntrackedParameter<bool>("allowMissingCollection", false);
13 }
14
15 JetAnalyzer::~JetAnalyzer()
16 {
17 }
18
19 bool Rsortrule (std::pair <double,double> p1, std::pair <double,double> p2 )
20 {
21 return p1.second<p2.second;
22 }
23
24 bool JetAnalyzer::process(const edm::Event& iEvent, TClonesArray* rootJets)
25 {
26
27 unsigned int nJets=0;
28
29 // reco::CaloJet or reco::PFJet ?
30 std::string jetType = "BASIC";
31 if( jetProducer_.label()=="kt4CaloJets"
32 || jetProducer_.label()=="kt6CaloJets"
33 || jetProducer_.label()=="iterativeCone5CaloJets"
34 || jetProducer_.label()=="sisCone5CaloJets"
35 || jetProducer_.label()=="sisCone7CaloJets"
36 || jetProducer_.label()=="antikt5CaloJets"
37 ) jetType="CALO";
38
39 if( jetProducer_.label()=="kt4PFJets"
40 || jetProducer_.label()=="kt6PFJets"
41 || jetProducer_.label()=="iterativeCone5PFJets"
42 || jetProducer_.label()=="sisCone5PFJets"
43 || jetProducer_.label()=="sisCone7PFJets"
44 || jetProducer_.label()=="antikt5PFJets"
45 ) jetType="PF";
46
47 edm::Handle < std::vector <reco::CaloJet> > recoCaloJets;
48 if( dataType_=="RECO" && jetType=="CALO" )
49 {
50 try
51 {
52 iEvent.getByLabel(jetProducer_, recoCaloJets);
53 nJets = recoCaloJets->size();
54 }
55 catch (cms::Exception& exception)
56 {
57 if ( !allowMissingCollection_ )
58 {
59 cout << " ##### ERROR IN JetAnalyzer::process => reco::CaloJet collection is missing #####"<<endl;
60 throw exception;
61 }
62 if(verbosity_>1) cout << " ===> No reco::CaloJet collection, skip jet info" << endl;
63 return false;
64 }
65 }
66
67 edm::Handle < std::vector <reco::PFJet> > recoPFJets;
68 if( dataType_=="RECO" && jetType=="PF" )
69 {
70 try
71 {
72 iEvent.getByLabel(jetProducer_, recoPFJets);
73 nJets = recoPFJets->size();
74 }
75 catch (cms::Exception& exception)
76 {
77 if ( !allowMissingCollection_ )
78 {
79 cout << " ##### ERROR IN JetAnalyzer::process => reco::PFJet collection is missing #####"<<endl;
80 throw exception;
81 }
82 if(verbosity_>1) cout << " ===> No reco::PFJet collection, skip jet info" << endl;
83 return false;
84 }
85 }
86
87 edm::Handle < std::vector <pat::Jet> > patJets;
88 if( dataType_=="PAT" )
89 {
90 try
91 {
92 iEvent.getByLabel(jetProducer_, patJets);
93 nJets = patJets->size();
94 }
95 catch (cms::Exception& exception)
96 {
97 if ( !allowMissingCollection_ )
98 {
99 cout << " ##### ERROR IN JetAnalyzer::process => pat::Jet collection is missing #####"<<endl;
100 throw exception;
101 }
102 if(verbosity_>1) cout << " ===> No pat::Jet collection, skip jet info" << endl;
103 return false;
104 }
105 }
106
107 if(verbosity_>1) std::cout << " Number of jets = " << nJets << " Label: " << jetProducer_.label() << " Instance: " << jetProducer_.instance() << std::endl;
108
109 for (unsigned int j=0; j<nJets; j++)
110 {
111 const reco::Jet* jet = 0;
112 if( dataType_=="RECO" && jetType=="CALO" ) jet = (const reco::Jet*) ( & ((*recoCaloJets)[j]) );
113 if( dataType_=="RECO" && jetType=="PF" ) jet = (const reco::Jet*) ( & ((*recoPFJets)[j]) );
114 if( dataType_=="PAT" )
115 {
116 jet = (const reco::Jet*) ( & ((*patJets)[j]) );
117 if( (*patJets)[j].isCaloJet() ) jetType="CALO";
118 if( (*patJets)[j].isPFJet() ) jetType="PF";
119 }
120
121 TRootJet localJet(
122 jet->px()
123 ,jet->py()
124 ,jet->pz()
125 ,jet->energy()
126 ,jet->vx()
127 ,jet->vy()
128 ,jet->vz()
129 ,jet->pdgId()
130 ,jet->charge()
131 );
132
133 localJet.setNConstituents(jet->nConstituents());
134 //std::vector< edm::Ptr <Candidate> > constituents = jet->getJetConstituents();
135 localJet.setN90(jet->nCarrying(0.9));
136 localJet.setN60(jet->nCarrying(0.6));
137 localJet.setJetArea(jet->jetArea());
138 localJet.setPileupEnergy(jet->pileup());
139 localJet.setMaxDistance(jet->maxDistance());
140 float totalEnergy = jet->etInAnnulus(0.,999.);
141 if(totalEnergy!=0)
142 {
143 localJet.setDR01EnergyFraction( jet->etInAnnulus(0.,0.1) / totalEnergy );
144 localJet.setDR02EnergyFraction( jet->etInAnnulus(0.,0.2) / totalEnergy );
145 localJet.setDR03EnergyFraction( jet->etInAnnulus(0.,0.3) / totalEnergy );
146 localJet.setDR04EnergyFraction( jet->etInAnnulus(0.,0.4) / totalEnergy );
147 localJet.setDR05EnergyFraction( jet->etInAnnulus(0.,0.5) / totalEnergy );
148 }
149
150
151 if( dataType_=="RECO" )
152 {
153 // Some specific methods to reco::Jet
154 // Do association to genParticle ?
155
156 if( jetType=="CALO" )
157 {
158 // Variables from reco::CaloJet
159 const reco::CaloJet *caloJet = dynamic_cast<const reco::CaloJet*>(&*jet);
160 localJet.setJetType(1);
161 localJet.setEcalEnergyFraction(caloJet->emEnergyFraction());
162 localJet.setHcalEnergyFraction(caloJet->energyFractionHadronic());
163 //std::vector<CaloTowerPtr> getCaloConstituents () const;
164 }
165
166 if( jetType=="PF" )
167 {
168 // Variables from reco::PFJet
169 const reco::PFJet *pfJet = dynamic_cast<const reco::PFJet*>(&*jet);
170 localJet.setJetType(2);
171 localJet.setEcalEnergyFraction(pfJet->chargedEmEnergyFraction() + pfJet->neutralEmEnergyFraction());
172 localJet.setHcalEnergyFraction(pfJet->chargedHadronEnergyFraction() + pfJet->neutralHadronEnergyFraction());
173 if(pfJet->energy() != 0) localJet.setChargedEnergyFraction( (pfJet->chargedEmEnergy() + pfJet->chargedHadronEnergy() + pfJet->chargedMuEnergy() ) / pfJet->energy());
174 localJet.setChargedMultiplicity((int)pfJet->chargedMultiplicity()) ;
175 //std::vector <const reco::PFCandidate*> getPFConstituents () const;
176 }
177
178 }
179
180
181 if( dataType_=="PAT" )
182 {
183 // Some specific methods to pat::Jet
184 const pat::Jet *patJet = dynamic_cast<const pat::Jet*>(&*jet);
185
186 // Variables from pat::Jet (Basic)
187 localJet.setBtag_trackCountingHighEff(patJet->bDiscriminator("trackCountingHighEffBJetTags"));
188 localJet.setBtag_trackCountingHighPur(patJet->bDiscriminator("trackCountingHighPurBJetTags"));
189 localJet.setBtag_jetProbability(patJet->bDiscriminator("jetProbabilityBJetTags"));
190
191 // see DataFormats/PatCandidates/interface/JetCorrFactors.h
192 localJet.setBCorrection(patJet->corrFactor("part","b"));
193 localJet.setCCorrection(patJet->corrFactor("part","c"));
194 localJet.setUDSCorrection(patJet->corrFactor("part","uds"));
195 localJet.setGCorrection(patJet->corrFactor("part","glu"));
196
197 // Use associated tracks to calculate charged broadness of the jet
198 // FIXME - Check generalTracks collection is present
199 reco::TrackRefVector tracks = patJet->associatedTracks() ;
200 Float_t deltaR = 0.;
201 Float_t pTrackerTot = 0.;
202 Float_t pTrackerCone01 = 0.;
203 Float_t pTrackerCone02 = 0.;
204 Float_t pTrackerCone03 = 0.;
205 Float_t pTrackerCone04 = 0.;
206 Float_t pTrackerCone05 = 0.;
207 // TODO - Use std::map....
208 vector < pair < Float_t , Float_t > > tracksVPair ;
209 pair < Float_t , Float_t > tracksPair;
210
211 for(unsigned int iTracks = 0; iTracks< patJet->associatedTracks().size() ; iTracks++)
212 {
213 deltaR = localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0));
214 pTrackerTot += tracks[iTracks]->p();
215 tracksPair.first = tracks[iTracks]->p();
216 tracksPair.second = deltaR;
217 tracksVPair.push_back(tracksPair);
218 if(deltaR < 0.5) pTrackerCone05 += tracks[iTracks]->p();
219 if(deltaR < 0.4) pTrackerCone04 += tracks[iTracks]->p();
220 if(deltaR < 0.3) pTrackerCone03 += tracks[iTracks]->p();
221 if(deltaR < 0.2) pTrackerCone02 += tracks[iTracks]->p();
222 if(deltaR < 0.1) pTrackerCone01 += tracks[iTracks]->p();
223 }
224 sort(tracksVPair.begin(), tracksVPair.end(), Rsortrule);
225 Float_t Rmin = 0;
226 Float_t pDummy = 0;
227 for(std::vector<std::pair< Float_t,Float_t > >::iterator i = tracksVPair.begin(); i!=tracksVPair.end(); i++)
228 {
229 pDummy+=(*i).first;
230 if (pDummy>0.75*(pTrackerTot))
231 {
232 Rmin = (*i).second;
233 break;
234 }
235 }
236 if (Rmin<1e-5) {Rmin=0.;}
237 localJet.setChargedBroadness(Rmin);
238 if(pTrackerTot !=0)
239 {
240 localJet.setChargedBroadnessDR01(pTrackerCone01/pTrackerTot);
241 localJet.setChargedBroadnessDR02(pTrackerCone02/pTrackerTot);
242 localJet.setChargedBroadnessDR03(pTrackerCone03/pTrackerTot);
243 localJet.setChargedBroadnessDR04(pTrackerCone04/pTrackerTot);
244 localJet.setChargedBroadnessDR05(pTrackerCone05/pTrackerTot);
245 }
246
247
248 if ( patJet->isCaloJet() ) {
249 // Variables from pat::Jet (CaloSpecific)
250 localJet.setJetType(1);
251 localJet.setEcalEnergyFraction(patJet->emEnergyFraction());
252 localJet.setHcalEnergyFraction(patJet->energyFractionHadronic());
253 localJet.setChargedMultiplicity(patJet->associatedTracks().size()) ;
254 //std::vector<CaloTowerPtr> getCaloConstituents () const;
255 }
256
257 if(patJet->isPFJet()) {
258 // Variables from pat::Jet (PFSpecific)
259 localJet.setJetType(2);
260 localJet.setEcalEnergyFraction(patJet->chargedEmEnergyFraction() + patJet->neutralEmEnergyFraction());
261 localJet.setHcalEnergyFraction(patJet->chargedHadronEnergyFraction() + patJet->neutralHadronEnergyFraction());
262 if(patJet->energy() != 0) localJet.setChargedEnergyFraction( (patJet->chargedEmEnergy() + patJet->chargedHadronEnergy() + patJet->chargedMuEnergy() ) / patJet->energy());
263 localJet.setChargedMultiplicity((int)patJet->chargedMultiplicity()) ;
264 //std::vector <const reco::PFCandidate*> getPFConstituents () const;
265 }
266
267 // Matched genParticle
268 if (useMC_)
269 {
270 // MC truth associator index
271 if ((patJet->genParticleRef()).isNonnull()) {
272 localJet.setGenParticleIndex((patJet->genParticleRef()).index());
273 } else {
274 localJet.setGenParticleIndex(-1);
275 }
276
277 // check if jet comes from a top
278 bool IsTopJet = false;
279 if(patJet->genParton())
280 {
281 const reco::Candidate* gen = patJet->genParton();
282 while(gen->mother())
283 {
284 if(abs((gen->mother())->pdgId()) == 6)
285 {
286 IsTopJet = true;
287 break;
288 }
289 else
290 {
291 gen = (gen->mother() );
292 }
293 }
294 }
295 localJet.setIsTopJet(IsTopJet);
296
297 // Matched generated jet
298 if ( patJet->genJet() != NULL )
299 {
300 localJet.setGenJetEnergy( patJet->genJet()->energy() );
301 }
302
303 }
304 }
305
306 new( (*rootJets)[j] ) TRootJet(localJet);
307 if(verbosity_>2) cout << " ["<< setw(3) << j << "] " << localJet << endl;
308 }
309
310 return true;
311 }