ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/JetAnalyzer.cc
(Generate patch)

Comparing UserCode/Morgan/src/JetAnalyzer.cc (file contents):
Revision 1.2 by lethuill, Mon Dec 1 15:58:05 2008 UTC vs.
Revision 1.12 by lethuill, Sat Oct 10 20:44:47 2009 UTC

# Line 4 | Line 4 | using namespace std;
4   using namespace reco;
5   using namespace edm;
6  
7 JetAnalyzer::JetAnalyzer(const edm::ParameterSet& producersNames):verbosity_(0),useMC_(false)
8 {
9        dataType_ = producersNames.getUntrackedParameter<string>("dataType","unknown");
10        jetProducer_ = producersNames.getParameter<edm::InputTag>("jetProducer");
11 }
12
13 JetAnalyzer::JetAnalyzer(const edm::ParameterSet& producersNames, int verbosity):verbosity_(verbosity),useMC_(false)
14 {
15        dataType_ = producersNames.getUntrackedParameter<string>("dataType","unknown");
16        jetProducer_ = producersNames.getParameter<edm::InputTag>("jetProducer");
17 }
18
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.getParameter<bool>("doMC");
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 <    return p1.second<p2.second;
19 > bool Rsortrule (std::pair <double,double> p1, std::pair <double,double> p2 )
20 > {
21 >   return p1.second<p2.second;
22   }
23  
24 < void JetAnalyzer::Process(const edm::Event& iEvent, TClonesArray* rootJets)
24 > bool JetAnalyzer::process(const edm::Event& iEvent, TClonesArray* rootJets)
25   {
26 <
27 <  edm::Handle< vector< pat::Jet > > recoJets;
28 <  iEvent.getByLabel(jetProducer_, recoJets);
29 <  if(verbosity_>1) std::cout <<"  Number of jets = "<< recoJets->size()<< "  Label: "<<jetProducer_.label()<<"  Instance: "<<jetProducer_.instance()<<std::endl;
30 <  for (unsigned int j=0; j<recoJets->size(); j++)
31 <    {
32 <      TRootJet localJet(TLorentzVector( (*recoJets)[j].px(),(*recoJets)[j].py(),(*recoJets)[j].pz(),(*recoJets)[j].energy() ) ,
33 <                        TVector3( (*recoJets)[j].vx() ,(*recoJets)[j].vy() ,(*recoJets)[j].vz() ),
34 <                        abs((*recoJets)[j].pdgId()),
35 <                        (*recoJets)[j].charge()
36 <                        //      (*recoJets)[j].genJet()
37 <                        );
38 <      localJet.setBtag_trackCountingHighEff((*recoJets)[j].bDiscriminator("trackCountingHighEffBJetTags"));
39 <      localJet.setBtag_trackCountingHighPur((*recoJets)[j].bDiscriminator("trackCountingHighPurBJetTags"));
40 <      localJet.setBtag_jetProbability((*recoJets)[j].bDiscriminator("jetProbabilityBJetTags"));
41 <
42 <      reco::TrackRefVector tracks =  (*recoJets)[j].associatedTracks() ;
43 <      Float_t pTrackerTot = 0;
44 <      Float_t ptTrackerTot = 0;
45 <      //  Float_t eTrackerTot = 0;
46 <      Float_t pTrackerCone01 = 0;
47 <      Float_t pTrackerCone02 = 0;
48 <      Float_t pTrackerCone03 = 0;
49 <      Float_t pTrackerCone04 = 0;
50 <      Float_t pTrackerCone05 = 0;
51 <      vector < pair < Float_t , Float_t > > tracksVPair ;
62 <      pair < Float_t , Float_t > tracksPair;
63 <      for(unsigned int iTracks = 0; iTracks< (*recoJets)[j].associatedTracks().size() ; iTracks ++)
64 <        {
65 <          //      Float_t buzz = tracks[iTracks]->p();
66 <          pTrackerTot += tracks[iTracks]->p();
67 <          ptTrackerTot += tracks[iTracks]->pt();
68 <          tracksPair.first = tracks[iTracks]->p();
69 <          tracksPair.second = localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0)) ;
70 <          tracksVPair.push_back(tracksPair);
71 <          // eTrackerTot += tracks[iTracks]->energy();
72 <          if(localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0)) < 0.5)
73 <            {
74 <              pTrackerCone05 += tracks[iTracks]->p();
75 <              if(localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0)) < 0.4)
76 <                {
77 <                  pTrackerCone04 += tracks[iTracks]->p();
78 <                  if(localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0)) < 0.3)
79 <                    {
80 <                      pTrackerCone03 += tracks[iTracks]->p();
81 <                      if(localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0)) < 0.2)
82 <                        {
83 <                          pTrackerCone02 += tracks[iTracks]->p();
84 <                          if(localJet.DeltaR(TLorentzVector(tracks[iTracks]->px(),tracks[iTracks]->py(),tracks[iTracks]->pz(),0)) < 0.1)
85 <                            {
86 <                              pTrackerCone01 += tracks[iTracks]->p();
87 <                            }
88 <                        }
89 <                    }
90 <                }
91 <            }
92 <        }
93 <      sort(tracksVPair.begin(),tracksVPair.end(), Rsortrule);
94 <      Float_t Rmin = 0;
95 <      Float_t pDummy = 0;
96 <      for(std::vector<std::pair< Float_t,Float_t > >::iterator i = tracksVPair.begin(); i !=tracksVPair.end(); i++) {
97 <        pDummy+=(*i).first;
98 <        if (pDummy>0.75*(pTrackerTot)) {
99 <          Rmin = (*i).second;
100 <          break;
101 <        }
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 >      ) 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 <      if (Rmin<1e-5) {Rmin=0.;}
54 <
55 <      localJet.setBroadness(Rmin);
56 <      localJet.setBroadnessDeltaR01(pTrackerCone01/pTrackerTot);
57 <      localJet.setBroadnessDeltaR02(pTrackerCone02/pTrackerTot);
58 <      localJet.setBroadnessDeltaR03(pTrackerCone03/pTrackerTot);
59 <      localJet.setBroadnessDeltaR04(pTrackerCone04/pTrackerTot);
60 <      localJet.setBroadnessDeltaR05(pTrackerCone05/pTrackerTot);
61 <      localJet.setChargedPt(ptTrackerTot);
62 <      localJet.setPartonFlavour((*recoJets)[j].partonFlavour());
63 <      localJet.setCorrB((*recoJets)[j].correctionFactor(pat::Jet::bCorrection));
64 <      localJet.setCorrC((*recoJets)[j].correctionFactor(pat::Jet::cCorrection));
65 <      localJet.setCorrUDS((*recoJets)[j].correctionFactor(pat::Jet::udsCorrection));
66 <      localJet.setCorrGlu((*recoJets)[j].correctionFactor(pat::Jet::gCorrection));
67 <      localJet.setN90((*recoJets)[j].n90());
68 <
69 <      // we still need to implemente the matching or the referencing of the MC part of the Jet see the boolean "useMC_"
70 <
71 <      if((*recoJets)[j].isCaloJet()) {
72 <        // do anything related to a CaloJet
73 <        localJet.setJetType(1);
74 <        localJet.setEcalEnergy((*recoJets)[j].emEnergyFraction());
75 <        localJet.setHcalEnergy((*recoJets)[j].energyFractionHadronic());
76 <        localJet.setChargedEnergy(pTrackerTot);
77 <        localJet.setChargedMultiplicity((*recoJets)[j].associatedTracks().size()) ;
78 <        localJet.setNeutralMultiplicity((*recoJets)[j].getCaloConstituents().size()) ;
79 <      }
80 <      if((*recoJets)[j].isPFJet()) {
81 <        // do anything related to a PFJet
82 <        localJet.setJetType(2);
83 <        localJet.setEcalEnergy((*recoJets)[j].chargedEmEnergyFraction() + (*recoJets)[j].neutralEmEnergyFraction());
84 <        localJet.setHcalEnergy((*recoJets)[j].chargedHadronEnergyFraction() + (*recoJets)[j].neutralHadronEnergyFraction());
85 <        localJet.setChargedEnergy((*recoJets)[j].chargedEmEnergy() + (*recoJets)[j].chargedHadronEnergy() + (*recoJets)[j].chargedMuEnergy() );
86 <        localJet.setChargedMultiplicity((int)(*recoJets)[j].chargedMultiplicity()) ;
87 <        localJet.setNeutralMultiplicity((int)(*recoJets)[j].neutralMultiplicity()) ;
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 <      // if it is neither CaloJet nor PFJet we are bad
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->corrFactor("part","b"));
190 >         localJet.setCCorrection(patJet->corrFactor("part","c"));
191 >         localJet.setUDSCorrection(patJet->corrFactor("part","uds"));
192 >         localJet.setGCorrection(patJet->corrFactor("part","glu"));
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 <
305 >   }
306 >  
307 >   return true;
308   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines