ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/JetAnalyzer.cc
Revision: 1.10
Committed: Wed Jun 10 11:17:06 2009 UTC (15 years, 10 months ago) by lethuill
Content type: text/plain
Branch: MAIN
CVS Tags: all_2_2_9_03, all_2_2_9_02, all_2_2_9_01
Branch point for: CMSSW_2_2_X_br
Changes since 1.9: +288 -258 lines
Log Message:
Better protection against missing collection / Cleaning data format selection / Last iteration for migration to PAT of Photons

File Contents

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