CMS 3D CMS Logo

HectorProducer.cc
Go to the documentation of this file.
1 // Framework headers
10 
11 // SimpleConfigurable replacement
13 
14 // HepMC headers
15 #include "HepMC/GenEvent.h"
16 
17 // Hector headers
20 
21 // SimDataFormats headers
24 
25 #include <CLHEP/Random/RandomEngine.h>
26 
27 #include <iostream>
28 #include <memory>
29 #include <string>
30 
31 class TRandom3;
32 
34  : m_HepMC(consumes<edm::HepMCProduct>(p.getParameter<edm::InputTag>("HepMCProductLabel"))) {
35  m_verbosity = p.getParameter<bool>("Verbosity");
36  m_FP420Transport = p.getParameter<bool>("FP420Transport");
37  m_ZDCTransport = p.getParameter<bool>("ZDCTransport");
38  m_evtAnalysed = 0;
39 
40  produces<edm::HepMCProduct>();
41  produces<edm::LHCTransportLinkContainer>();
42 
43  m_Hector = new Hector(p, m_verbosity, m_FP420Transport, m_ZDCTransport);
44 
46  if (!rng.isAvailable()) {
47  throw cms::Exception("Configuration") << "LHCTransport (HectorProducer) requires the "
48  "RandomNumberGeneratorService\n"
49  "which is not present in the configuration file. You must add the "
50  "service\n"
51  "in the configuration file or remove the modules that require it.";
52  }
53  edm::LogInfo("SimTransportHectorProducer") << "Hector is created";
54 }
55 
57 
59 
61 
64  CLHEP::HepRandomEngine *engine = &rng->getEngine(iEvent.streamID());
65  if (engine->name() != "TRandom3") {
66  throw cms::Exception("Configuration") << "The TRandom3 engine type must be used with HectorProducer, "
67  << "Random Number Generator Service not correctly configured!";
68  }
69  TRandom3 *rootEngine = ((edm::TRandomAdaptor *)engine)->getRootEngine();
70 
71  ++m_evtAnalysed;
72 
73  edm::LogInfo("SimTransportHectorProducer") << "produce evt " << m_evtAnalysed;
74 
76  iEvent.getByToken(m_HepMC, HepMCEvt);
77 
78  if (!HepMCEvt.isValid()) {
79  throw cms::Exception("InvalidReference") << "Invalid reference to HepMCProduct\n";
80  }
81 
82  if (HepMCEvt.provenance()->moduleLabel() == "LHCTransport") {
83  throw cms::Exception("LogicError") << "HectorTrasported HepMCProduce already exists\n";
84  }
85 
86  evt_ = new HepMC::GenEvent(*HepMCEvt->GetEvent());
88  if (m_FP420Transport) {
89  m_Hector->clear();
90  m_Hector->add(evt_, es);
91  m_Hector->filterFP420(rootEngine);
92  }
93  if (m_ZDCTransport) {
94  m_Hector->clear();
95  m_Hector->add(evt_, es);
96  m_Hector->filterZDC(rootEngine);
97 
98  m_Hector->clear();
99  m_Hector->add(evt_, es);
100  m_Hector->filterD1(rootEngine);
101  }
103  if (m_verbosity) {
104  evt_->print();
105  }
106 
107  edm::LogInfo("SimTransportHectorProducer") << "new HepMC product ";
108 
109  unique_ptr<edm::HepMCProduct> NewProduct(new edm::HepMCProduct());
110  NewProduct->addHepMCData(evt_);
111 
112  iEvent.put(std::move(NewProduct));
113 
114  edm::LogInfo("SimTransportHectorProducer") << "new LHCTransportLinkContainer ";
115  unique_ptr<edm::LHCTransportLinkContainer> NewCorrespondenceMap(new edm::LHCTransportLinkContainer());
117  (*NewCorrespondenceMap).swap(thisLink);
118 
119  if (m_verbosity) {
120  for (unsigned int i = 0; i < (*NewCorrespondenceMap).size(); i++)
121  LogDebug("HectorEventProcessing") << "Hector correspondence table: " << (*NewCorrespondenceMap)[i];
122  }
123 
124  iEvent.put(std::move(NewCorrespondenceMap));
125  edm::LogInfo("SimTransportHectorProducer") << "produce end ";
126 }
127 
#define LogDebug(id)
T getParameter(std::string const &) const
int m_evtAnalysed
just to count events that have been analysed
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
void beginRun(const edm::Run &r, const edm::EventSetup &c) override
edm::EDGetTokenT< edm::HepMCProduct > m_HepMC
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
HectorProducer(edm::ParameterSet const &p)
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
void clear()
Definition: Hector.cc:152
void endRun(const edm::Run &r, const edm::EventSetup &c) override
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void filterD1(TRandom3 *)
Definition: Hector.cc:414
bool isAvailable() const
Definition: Service.h:40
void filterFP420(TRandom3 *)
Definition: Hector.cc:237
bool isValid() const
Definition: HandleBase.h:74
void filterZDC(TRandom3 *)
Definition: Hector.cc:329
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
~HectorProducer() override
Hector * m_Hector
std::string const & moduleLabel() const
Definition: Provenance.h:53
void add(const HepMC::GenEvent *ev, const edm::EventSetup &es)
Definition: Hector.cc:175
HLT enums.
std::vector< LHCTransportLink > & getCorrespondenceMap()
Definition: Hector.h:73
HepMC::GenEvent * addPartToHepMC(HepMC::GenEvent *event)
Definition: Hector.cc:515
StreamID streamID() const
Definition: Event.h:95
std::vector< LHCTransportLink > LHCTransportLinkContainer
HepMC::GenEvent * evt_
def move(src, dest)
Definition: eostools.py:511
Definition: Run.h:45
Provenance const * provenance() const
Definition: HandleBase.h:83
void clearApertureFlags()
Definition: Hector.cc:146
void produce(edm::Event &e, const edm::EventSetup &c) override