CMS 3D CMS Logo

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 // system include files
44 #include <memory>
45 
46 // user include files
49 
52 
54 
68 
69 //
70 // constants, enums and typedefs
71 //
72 typedef std::shared_ptr<BasePartonSelector> PartonSelectorPtr;
73 
74 //
75 // class declaration
76 //
77 
79 public:
81  ~HadronAndPartonSelector() override;
82 
83  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
84 
85 private:
86  void produce(edm::Event&, const edm::EventSetup&) override;
87 
88  // ----------member data ---------------------------
89  const edm::EDGetTokenT<GenEventInfoProduct> srcToken_; // To get handronizer module type
90  const edm::EDGetTokenT<reco::GenParticleCollection> particlesToken_; // Input GenParticle collection
91 
92  std::string partonMode_; // Parton selection mode
96 };
97 
98 //
99 // static data member definitions
100 //
101 
102 //
103 // constructors and destructor
104 //
106  :
107 
108  srcToken_(mayConsume<GenEventInfoProduct>(iConfig.getParameter<edm::InputTag>("src"))),
109  particlesToken_(consumes<reco::GenParticleCollection>(iConfig.getParameter<edm::InputTag>("particles"))),
110  partonMode_(iConfig.getParameter<std::string>("partonMode")),
111  fullChainPhysPartons_(iConfig.getParameter<bool>("fullChainPhysPartons"))
112 
113 {
114  //register your products
115  produces<reco::GenParticleRefVector>("bHadrons");
116  produces<reco::GenParticleRefVector>("cHadrons");
117  produces<reco::GenParticleRefVector>("algorithmicPartons");
118  produces<reco::GenParticleRefVector>("physicsPartons");
119  produces<reco::GenParticleRefVector>("leptons");
120 
121  partonSelectorSet_ = false;
122  partonSelector_ = nullptr;
123 }
124 
126  // do anything here that needs to be done at desctruction time
127  // (e.g. close files, deallocate resources etc.)
128 }
129 
130 //
131 // member functions
132 //
133 
134 // ------------ method called to produce the data ------------
136  // determine hadronizer type (done only once per job)
137  if (partonMode_ == "Auto") {
138  edm::Handle<GenEventInfoProduct> genEvtInfoProduct;
139  iEvent.getByToken(srcToken_, genEvtInfoProduct);
140 
141  std::string moduleName = "";
142  if (genEvtInfoProduct.isValid()) {
143  const edm::StableProvenance& prov = iEvent.getStableProvenance(genEvtInfoProduct.id());
144  moduleName = edm::moduleName(prov, iEvent.processHistory());
145  if (moduleName == "ExternalGeneratorFilter") {
146  moduleName = edm::parameterSet(prov, iEvent.processHistory()).getParameter<std::string>("@external_type");
147  edm::LogInfo("SpecialModule") << "GEN events are produced by ExternalGeneratorFilter, "
148  << "which is a wrapper of the original module: " << moduleName;
149  }
150  }
151 
152  if (moduleName.find("Pythia6") != std::string::npos)
153  partonMode_ = "Pythia6";
154  else if (moduleName.find("Pythia8") != std::string::npos)
155  partonMode_ = "Pythia8";
156  else if (moduleName.find("Herwig6") != std::string::npos)
157  partonMode_ = "Herwig6";
158  else if (moduleName.find("ThePEG") != std::string::npos)
159  partonMode_ = "Herwig++";
160  else if (moduleName.find("Herwig7") != std::string::npos)
161  partonMode_ = "Herwig++";
162  else if (moduleName.find("Sherpa") != std::string::npos)
163  partonMode_ = "Sherpa";
164  else
165  partonMode_ = "Undefined";
166  }
167 
168  // set the parton selection mode (done only once per job)
169  if (!partonSelectorSet_) {
170  if (partonMode_ == "Undefined")
171  edm::LogWarning("UndefinedPartonMode")
172  << "Could not automatically determine the hadronizer type and set the correct parton selection mode. "
173  "Parton-based jet flavour will not be defined.";
174  else if (partonMode_ == "Pythia6") {
176  edm::LogInfo("PartonModeDefined") << "Using Pythia6 parton selection mode.";
177  } else if (partonMode_ == "Pythia8") {
179  edm::LogInfo("PartonModeDefined") << "Using Pythia8 parton selection mode.";
180  } else if (partonMode_ == "Herwig6") {
182  edm::LogInfo("PartonModeDefined") << "Using Herwig6 parton selection mode.";
183  } else if (partonMode_ == "Herwig++") {
185  edm::LogInfo("PartonModeDefined") << "Using Herwig++ parton selection mode.";
186  } else if (partonMode_ == "Sherpa") {
188  edm::LogInfo("PartonModeDefined") << "Using Sherpa parton selection mode.";
189  } else
190  throw cms::Exception("InvalidPartonMode")
191  << "Parton selection mode is invalid: " << partonMode_
192  << ", use Auto | Pythia6 | Pythia8 | Herwig6 | Herwig++ | Sherpa" << std::endl;
193 
194  partonSelectorSet_ = true;
195  }
196 
198  iEvent.getByToken(particlesToken_, particles);
199 
200  auto bHadrons = std::make_unique<reco::GenParticleRefVector>();
201  auto cHadrons = std::make_unique<reco::GenParticleRefVector>();
202  auto partons = std::make_unique<reco::GenParticleRefVector>();
203  auto physicsPartons = std::make_unique<reco::GenParticleRefVector>();
204  auto leptons = std::make_unique<reco::GenParticleRefVector>();
205 
206  // loop over particles and select b and c hadrons and leptons
207  for (reco::GenParticleCollection::const_iterator it = particles->begin(); it != particles->end(); ++it) {
208  // if b hadron
209  if (CandMCTagUtils::hasBottom(*it)) {
210  // check if any of the daughters is also a b hadron
211  bool hasbHadronDaughter = false;
212  for (size_t i = 0; i < it->numberOfDaughters(); ++i) {
213  if (CandMCTagUtils::hasBottom(*(it->daughter(i)))) {
214  hasbHadronDaughter = true;
215  break;
216  }
217  }
218  if (hasbHadronDaughter)
219  continue; // skip excited b hadrons that have other b hadrons as daughters
220 
221  bHadrons->push_back(reco::GenParticleRef(particles, it - particles->begin()));
222  }
223 
224  // if c hadron
225  if (CandMCTagUtils::hasCharm(*it)) {
226  // check if any of the daughters is also a c hadron
227  bool hascHadronDaughter = false;
228  for (size_t i = 0; i < it->numberOfDaughters(); ++i) {
229  if (CandMCTagUtils::hasCharm(*(it->daughter(i)))) {
230  hascHadronDaughter = true;
231  break;
232  }
233  }
234  if (hascHadronDaughter)
235  continue; // skip excited c hadrons that have other c hadrons as daughters
236 
237  cHadrons->push_back(reco::GenParticleRef(particles, it - particles->begin()));
238  }
239 
240  // status==1 electrons and muons
241  if ((reco::isElectron(*it) || reco::isMuon(*it)) && it->status() == 1)
242  leptons->push_back(reco::GenParticleRef(particles, it - particles->begin()));
243 
244  // status==2 taus
245  if (reco::isTau(*it) && it->status() == 2)
246  leptons->push_back(reco::GenParticleRef(particles, it - particles->begin()));
247  }
248 
249  // select algorithmic partons
250  if (partonMode_ != "Undefined") {
252  }
253 
254  // select physics partons
255  for (reco::GenParticleCollection::const_iterator it = particles->begin(); it != particles->end(); ++it) {
256  if (!fullChainPhysPartons_) {
257  if (!(it->status() == 3 || ((partonMode_ == "Pythia8") && (it->status() == 23))))
258  continue;
259  }
260  if (!CandMCTagUtils::isParton(*it))
261  continue; // skip particle if not a parton
262  physicsPartons->push_back(reco::GenParticleRef(particles, it - particles->begin()));
263  }
264 
265  iEvent.put(std::move(bHadrons), "bHadrons");
266  iEvent.put(std::move(cHadrons), "cHadrons");
267  iEvent.put(std::move(partons), "algorithmicPartons");
268  iEvent.put(std::move(physicsPartons), "physicsPartons");
269  iEvent.put(std::move(leptons), "leptons");
270 }
271 
272 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
274  //The following says we do not know what parameters are allowed so do no validation
275  // Please change this to state exactly what you do use, even if it is no parameters
277  desc.setUnknown();
278  descriptions.addDefault(desc);
279 }
280 
281 //define this as a plug-in
GenEventInfoProduct
Definition: GenEventInfoProduct.h:17
electrons_cff.bool
bool
Definition: electrons_cff.py:366
mps_fire.i
i
Definition: mps_fire.py:428
Pythia8PartonSelector.h
HerwigppPartonSelector
Herwig++ parton selector derived from the base parton selector.
Definition: HerwigppPartonSelector.h:10
reco::isElectron
bool isElectron(const Candidate &part)
Definition: pdgIdUtils.h:7
HLT_FULL_cff.leptons
leptons
Definition: HLT_FULL_cff.py:26294
CandMCTag.h
HadronAndPartonSelector::partonSelector_
PartonSelectorPtr partonSelector_
Definition: HadronAndPartonSelector.cc:95
edm::EDGetTokenT< GenEventInfoProduct >
CandMCTagUtils::hasBottom
bool hasBottom(const reco::Candidate &c)
Definition: CandMCTag.cc:24
edm
HLT enums.
Definition: AlignableModifier.h:19
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
reco::GenParticleCollection
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
Definition: GenParticleFwd.h:13
edm::moduleName
std::string moduleName(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:27
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
EDProducer.h
HadronAndPartonSelector::partonSelectorSet_
bool partonSelectorSet_
Definition: HadronAndPartonSelector.cc:94
CandMCTagUtils::isParton
bool isParton(const reco::Candidate &c)
Definition: CandMCTag.cc:46
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:46
edm::LogInfo
Log< level::Info, false > LogInfo
Definition: MessageLogger.h:125
HadronAndPartonSelector::fullChainPhysPartons_
bool fullChainPhysPartons_
Definition: HadronAndPartonSelector.cc:93
edm::Handle
Definition: AssociativeIterator.h:50
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
ecalTrigSettings_cff.particles
particles
Definition: ecalTrigSettings_cff.py:11
edm::Ref< GenParticleCollection >
GenParticle.h
edm::parameterSet
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:11
HadronAndPartonSelector::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: HadronAndPartonSelector.cc:135
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Pythia6PartonSelector.h
GenParticleFwd.h
dqmAnalyzer_cff.partons
partons
Definition: dqmAnalyzer_cff.py:28
Herwig6PartonSelector.h
HadronAndPartonSelector::particlesToken_
const edm::EDGetTokenT< reco::GenParticleCollection > particlesToken_
Definition: HadronAndPartonSelector.cc:90
HadronAndPartonSelector
Selects hadrons and partons from a collection of GenParticles.
Definition: HadronAndPartonSelector.cc:78
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
SherpaPartonSelector.h
edm::ParameterSet
Definition: ParameterSet.h:47
Herwig6PartonSelector
Herwig6 parton selector derived from the base parton selector.
Definition: Herwig6PartonSelector.h:10
HadronAndPartonSelector::~HadronAndPartonSelector
~HadronAndPartonSelector() override
Definition: HadronAndPartonSelector.cc:125
GenEventInfoProduct.h
Event.h
edm::StableProvenance
Definition: StableProvenance.h:30
iEvent
int iEvent
Definition: GenABIO.cc:224
EcalCalibMonitorClient_cfi.moduleName
moduleName
Definition: EcalCalibMonitorClient_cfi.py:17
edm::stream::EDProducer
Definition: EDProducer.h:36
edm::EventSetup
Definition: EventSetup.h:58
pdgIdUtils.h
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
HadronAndPartonSelector::partonMode_
std::string partonMode_
Definition: HadronAndPartonSelector.cc:92
PartonSelectorPtr
std::shared_ptr< BasePartonSelector > PartonSelectorPtr
Definition: HadronAndPartonSelector.cc:72
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
AK4GenJetFlavourInfos_cfi.cHadrons
cHadrons
Definition: AK4GenJetFlavourInfos_cfi.py:7
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
HadronAndPartonSelector::HadronAndPartonSelector
HadronAndPartonSelector(const edm::ParameterSet &)
Definition: HadronAndPartonSelector.cc:105
CandMCTagUtils::hasCharm
bool hasCharm(const reco::Candidate &c)
Definition: CandMCTag.cc:35
Pythia8PartonSelector
Pythia8 parton selector derived from the base parton selector.
Definition: Pythia8PartonSelector.h:10
Pythia6PartonSelector
Pythia6 parton selector derived from the base parton selector.
Definition: Pythia6PartonSelector.h:10
BasePartonSelector.h
Frameworkfwd.h
Exception
Definition: hltDiff.cc:245
Provenance.h
AK4GenJetFlavourInfos_cfi.bHadrons
bHadrons
Definition: AK4GenJetFlavourInfos_cfi.py:6
HadronAndPartonSelector::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HadronAndPartonSelector.cc:273
reco::isTau
bool isTau(const Candidate &part)
Definition: pdgIdUtils.h:11
Candidate.h
ParameterSet.h
HerwigppPartonSelector.h
HadronAndPartonSelector::srcToken_
const edm::EDGetTokenT< GenEventInfoProduct > srcToken_
Definition: HadronAndPartonSelector.cc:89
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
edm::Event
Definition: Event.h:73
edm::ConfigurationDescriptions::addDefault
void addDefault(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:99
edm::HandleBase::id
ProductID id() const
Definition: HandleBase.cc:29
SherpaPartonSelector
Sherpa parton selector derived from the base parton selector.
Definition: SherpaPartonSelector.h:10
reco::isMuon
bool isMuon(const Candidate &part)
Definition: pdgIdUtils.h:9