CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HadronAndPartonSelector.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: HadronAndPartonSelector
4 // Class: HadronAndPartonSelector
5 //
37 //
38 // Original Author: Dinko Ferencek
39 // Created: Tue Nov 5 22:43:43 CET 2013
40 //
41 //
42 
43 
44 // system include files
45 #include <memory>
46 
47 // user include files
50 
53 
55 
69 
70 //
71 // constants, enums and typedefs
72 //
73 typedef boost::shared_ptr<BasePartonSelector> PartonSelectorPtr;
74 
75 //
76 // class declaration
77 //
78 
80  public:
83 
84  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
85 
86  private:
87  virtual void beginJob() ;
88  virtual void produce(edm::Event&, const edm::EventSetup&);
89  virtual void endJob() ;
90 
91  virtual void beginRun(edm::Run&, edm::EventSetup const&);
92  virtual void endRun(edm::Run&, edm::EventSetup const&);
95 
96  // ----------member data ---------------------------
97  const edm::EDGetTokenT<GenEventInfoProduct> srcToken_; // To get handronizer module type
98  const edm::EDGetTokenT<reco::GenParticleCollection> particlesToken_; // Input GenParticle collection
99 
100  std::string partonMode_; // Parton selection mode
102 };
103 
104 //
105 // static data member definitions
106 //
107 
108 //
109 // constructors and destructor
110 //
112 
113  srcToken_(mayConsume<GenEventInfoProduct>( iConfig.getParameter<edm::InputTag>("src") )),
114  particlesToken_(consumes<reco::GenParticleCollection>( iConfig.getParameter<edm::InputTag>("particles") )),
115  partonMode_(iConfig.getParameter<std::string>("partonMode"))
116 
117 {
118  //register your products
119  produces<reco::GenParticleRefVector>( "bHadrons" );
120  produces<reco::GenParticleRefVector>( "cHadrons" );
121  produces<reco::GenParticleRefVector>( "algorithmicPartons" );
122  produces<reco::GenParticleRefVector>( "physicsPartons" );
123  produces<reco::GenParticleRefVector>( "leptons" );
124 }
125 
126 
128 {
129 
130  // do anything here that needs to be done at desctruction time
131  // (e.g. close files, deallocate resources etc.)
132 
133 }
134 
135 
136 //
137 // member functions
138 //
139 
140 // ------------ method called to produce the data ------------
141 void
143 {
144  // determine hadronizer type (done only once per job)
145  if( partonMode_=="Auto" )
146  {
147  edm::Handle<GenEventInfoProduct> genEvtInfoProduct;
148  iEvent.getByToken(srcToken_, genEvtInfoProduct);
149 
150  std::string moduleName = "";
151  if( genEvtInfoProduct.isValid() ) {
152  const edm::Provenance& prov = iEvent.getProvenance(genEvtInfoProduct.id());
153  moduleName = edm::moduleName(prov);
154  }
155 
156  if( moduleName.find("Pythia6")!=std::string::npos )
157  partonMode_="Pythia6";
158  else if( moduleName.find("Pythia8")!=std::string::npos )
159  partonMode_="Pythia8";
160  else if( moduleName.find("Herwig6")!=std::string::npos )
161  partonMode_="Herwig6";
162  else if( moduleName.find("ThePEG")!=std::string::npos )
163  partonMode_="Herwig++";
164  else if( moduleName.find("Sherpa")!=std::string::npos )
165  partonMode_="Sherpa";
166  else
167  partonMode_="Undefined";
168  }
169 
170  // set the parton selection mode (done only once per job)
171  if( !partonSelector_ )
172  {
173  if ( partonMode_=="Undefined" )
174  edm::LogWarning("UndefinedPartonMode") << "Could not automatically determine the hadronizer type and set the correct parton selection mode. Parton-based jet flavour will not be defined.";
175  else if ( partonMode_=="Pythia6" )
176  {
178  edm::LogInfo("PartonModeDefined") << "Using Pythia6 parton selection mode.";
179  }
180  else if ( partonMode_=="Pythia8" )
181  {
183  edm::LogInfo("PartonModeDefined") << "Using Pythia8 parton selection mode.";
184  }
185  else if ( partonMode_=="Herwig6" )
186  {
188  edm::LogInfo("PartonModeDefined") << "Using Herwig6 parton selection mode.";
189  }
190  else if ( partonMode_=="Herwig++" )
191  {
193  edm::LogInfo("PartonModeDefined") << "Using Herwig++ parton selection mode.";
194  }
195  else if ( partonMode_=="Sherpa" )
196  {
198  edm::LogInfo("PartonModeDefined") << "Using Sherpa parton selection mode.";
199  }
200  else
201  throw cms::Exception("InvalidPartonMode") <<"Parton selection mode is invalid: " << partonMode_ << ", use Auto | Pythia6 | Pythia8 | Herwig6 | Herwig++ | Sherpa" << std::endl;
202  }
203 
205  iEvent.getByToken(particlesToken_, particles);
206 
207  std::auto_ptr<reco::GenParticleRefVector> bHadrons ( new reco::GenParticleRefVector );
208  std::auto_ptr<reco::GenParticleRefVector> cHadrons ( new reco::GenParticleRefVector );
209  std::auto_ptr<reco::GenParticleRefVector> partons ( new reco::GenParticleRefVector );
210  std::auto_ptr<reco::GenParticleRefVector> physicsPartons ( new reco::GenParticleRefVector );
211  std::auto_ptr<reco::GenParticleRefVector> leptons ( new reco::GenParticleRefVector );
212 
213  // loop over particles and select b and c hadrons and leptons
214  for(reco::GenParticleCollection::const_iterator it = particles->begin(); it != particles->end(); ++it)
215  {
216  // if b hadron
217  if( CandMCTagUtils::hasBottom( *it ) )
218  {
219  // check if any of the daughters is also a b hadron
220  bool hasbHadronDaughter = false;
221  for(size_t i=0; i < it->numberOfDaughters(); ++i)
222  {
223  if( CandMCTagUtils::hasBottom( *(it->daughter(i)) ) ) { hasbHadronDaughter = true; break; }
224  }
225  if( hasbHadronDaughter ) continue; // skip excited b hadrons that have other b hadrons as daughters
226 
227  bHadrons->push_back( reco::GenParticleRef( particles, it - particles->begin() ) );
228  }
229 
230  // if c hadron
231  if( CandMCTagUtils::hasCharm( *it ) )
232  {
233  // check if any of the daughters is also a c hadron
234  bool hascHadronDaughter = false;
235  for(size_t i=0; i < it->numberOfDaughters(); ++i)
236  {
237  if( CandMCTagUtils::hasCharm( *(it->daughter(i)) ) ) { hascHadronDaughter = true; break; }
238  }
239  if( hascHadronDaughter ) continue; // skip excited c hadrons that have other c hadrons as daughters
240 
241  cHadrons->push_back( reco::GenParticleRef( particles, it - particles->begin() ) );
242  }
243 
244  // status==1 electrons and muons
245  if( ( reco::isElectron( *it ) || reco::isMuon( *it ) ) && it->status()==1 )
246  leptons->push_back( reco::GenParticleRef( particles, it - particles->begin() ) );
247 
248  // status==2 taus
249  if( reco::isTau( *it ) && it->status()==2 )
250  leptons->push_back( reco::GenParticleRef( particles, it - particles->begin() ) );
251  }
252 
253  // select partons
254  if ( partonMode_!="Undefined" ) {
255  partonSelector_->run(particles,partons);
256  for(reco::GenParticleCollection::const_iterator it = particles->begin(); it != particles->end(); ++it)
257  {
258  if( !(it->status()==3 || (( partonMode_=="Pythia8" ) && (it->status()==23)))) continue;
259  if( !CandMCTagUtils::isParton( *it ) ) continue; // skip particle if not a parton
260  physicsPartons->push_back( reco::GenParticleRef( particles, it - particles->begin() ) );
261  }
262  }
263 
264  iEvent.put( bHadrons, "bHadrons" );
265  iEvent.put( cHadrons, "cHadrons" );
266  iEvent.put( partons, "algorithmicPartons" );
267  iEvent.put( physicsPartons, "physicsPartons" );
268  iEvent.put( leptons, "leptons" );
269 }
270 
271 // ------------ method called once each job just before starting event loop ------------
272 void
274 {
275 }
276 
277 // ------------ method called once each job just after ending the event loop ------------
278 void
280 }
281 
282 // ------------ method called when starting to processes a run ------------
283 void
285 {
286 }
287 
288 // ------------ method called when ending the processing of a run ------------
289 void
291 {
292 }
293 
294 // ------------ method called when starting to processes a luminosity block ------------
295 void
297 {
298 }
299 
300 // ------------ method called when ending the processing of a luminosity block ------------
301 void
303 {
304 }
305 
306 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
307 void
309  //The following says we do not know what parameters are allowed so do no validation
310  // Please change this to state exactly what you do use, even if it is no parameters
312  desc.setUnknown();
313  descriptions.addDefault(desc);
314 }
315 
316 //define this as a plug-in
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
int i
Definition: DBlmapReader.cc:9
Selects hadrons and partons from a collection of GenParticles.
bool isMuon(const Candidate &part)
Definition: pdgIdUtils.h:11
ProductID id() const
Definition: HandleBase.cc:15
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool hasCharm(const reco::Candidate &c)
Definition: CandMCTag.cc:37
Herwig++ parton selector derived from the base parton selector.
const edm::EDGetTokenT< reco::GenParticleCollection > particlesToken_
Herwig6 parton selector derived from the base parton selector.
int iEvent
Definition: GenABIO.cc:230
std::string moduleName(Provenance const &provenance)
Definition: Provenance.cc:27
Sherpa parton selector derived from the base parton selector.
virtual void produce(edm::Event &, const edm::EventSetup &)
virtual void beginLuminosityBlock(edm::LuminosityBlock &, edm::EventSetup const &)
void addDefault(ParameterSetDescription const &psetDescription)
bool isElectron(const Candidate &part)
Definition: pdgIdUtils.h:7
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:115
bool isValid() const
Definition: HandleBase.h:75
boost::shared_ptr< BasePartonSelector > PartonSelectorPtr
Pythia6 parton selector derived from the base parton selector.
Pythia8 parton selector derived from the base parton selector.
virtual void endLuminosityBlock(edm::LuminosityBlock &, edm::EventSetup const &)
bool isParton(const reco::Candidate &c)
Definition: CandMCTag.cc:48
virtual void beginRun(edm::Run &, edm::EventSetup const &)
HadronAndPartonSelector(const edm::ParameterSet &)
virtual void endRun(edm::Run &, edm::EventSetup const &)
Provenance getProvenance(BranchID const &theID) const
Definition: Event.cc:78
bool hasBottom(const reco::Candidate &c)
Definition: CandMCTag.cc:26
Definition: Run.h:41
const edm::EDGetTokenT< GenEventInfoProduct > srcToken_
bool isTau(const Candidate &part)
Definition: pdgIdUtils.h:15