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
Log Message:
Add antikt5 algo

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.13 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.13 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.13
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 lethuill 1.1 }