File indexing completed on 2023-03-17 11:25:55
0001
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003 #include "FWCore/PluginManager/interface/ModuleDef.h"
0004 #include "FWCore/ServiceRegistry/interface/Service.h"
0005 #include "FWCore/Utilities/interface/Exception.h"
0006 #include "FWCore/Utilities/interface/InputTag.h"
0007 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009
0010 #include "IOMC/RandomEngine/interface/TRandomAdaptor.h"
0011
0012
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014
0015
0016 #include "HepMC/GenEvent.h"
0017
0018
0019 #include "SimTransport/HectorProducer/interface/Hector.h"
0020 #include "SimTransport/HectorProducer/interface/HectorProducer.h"
0021
0022
0023 #include "SimDataFormats/Forward/interface/LHCTransportLinkContainer.h"
0024 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
0025
0026 #include <CLHEP/Random/RandomEngine.h>
0027
0028 #include <iostream>
0029 #include <memory>
0030 #include <string>
0031
0032 class TRandom3;
0033
0034 HectorProducer::HectorProducer(edm::ParameterSet const &p)
0035 : m_HepMC(consumes<edm::HepMCProduct>(p.getParameter<edm::InputTag>("HepMCProductLabel"))) {
0036 tok_pdt_ = esConsumes<HepPDT::ParticleDataTable, PDTRecord>();
0037 m_verbosity = p.getParameter<bool>("Verbosity");
0038 m_FP420Transport = p.getParameter<bool>("FP420Transport");
0039 m_ZDCTransport = p.getParameter<bool>("ZDCTransport");
0040 m_evtAnalysed = 0;
0041
0042 produces<edm::HepMCProduct>();
0043 produces<edm::LHCTransportLinkContainer>();
0044
0045 usesResource("Hector");
0046 m_Hector = std::make_unique<Hector>(p, tok_pdt_, m_verbosity, m_FP420Transport, m_ZDCTransport);
0047
0048 edm::Service<edm::RandomNumberGenerator> rng;
0049 if (!rng.isAvailable()) {
0050 throw cms::Exception("Configuration") << "LHCTransport (HectorProducer) requires the "
0051 "RandomNumberGeneratorService\n"
0052 "which is not present in the configuration file. You must add the "
0053 "service\n"
0054 "in the configuration file or remove the modules that require it.";
0055 }
0056 edm::LogVerbatim("SimTransportHectorProducer") << "Hector is created";
0057 }
0058
0059 HectorProducer::~HectorProducer() {}
0060
0061 void HectorProducer::produce(edm::Event &iEvent, const edm::EventSetup &es) {
0062 edm::Service<edm::RandomNumberGenerator> rng;
0063 CLHEP::HepRandomEngine *engine = &rng->getEngine(iEvent.streamID());
0064 if (engine->name() != "TRandom3") {
0065 throw cms::Exception("Configuration") << "The TRandom3 engine type must be used with HectorProducer, "
0066 << "Random Number Generator Service not correctly configured!";
0067 }
0068 TRandom3 *rootEngine = ((edm::TRandomAdaptor *)engine)->getRootEngine();
0069
0070 ++m_evtAnalysed;
0071
0072 edm::LogVerbatim("SimTransportHectorProducer") << "produce evt " << m_evtAnalysed;
0073
0074 edm::Handle<edm::HepMCProduct> HepMCEvt;
0075 iEvent.getByToken(m_HepMC, HepMCEvt);
0076
0077 if (!HepMCEvt.isValid()) {
0078 throw cms::Exception("InvalidReference") << "Invalid reference to HepMCProduct\n";
0079 }
0080
0081 if (HepMCEvt.provenance()->moduleLabel() == "LHCTransport") {
0082 throw cms::Exception("LogicError") << "HectorTrasported HepMCProduce already exists\n";
0083 }
0084
0085 auto evt = new HepMC::GenEvent(*HepMCEvt->GetEvent());
0086 m_Hector->clearApertureFlags();
0087 if (m_FP420Transport) {
0088 m_Hector->clear();
0089 m_Hector->add(evt, es);
0090 m_Hector->filterFP420(rootEngine);
0091 }
0092 if (m_ZDCTransport) {
0093 m_Hector->clear();
0094 m_Hector->add(evt, es);
0095 m_Hector->filterZDC(rootEngine);
0096
0097 m_Hector->clear();
0098 m_Hector->add(evt, es);
0099 m_Hector->filterD1(rootEngine);
0100 }
0101 evt = m_Hector->addPartToHepMC(evt);
0102 if (m_verbosity)
0103 evt->print();
0104
0105 edm::LogVerbatim("SimTransportHectorProducer") << "new HepMC product ";
0106
0107 unique_ptr<edm::HepMCProduct> NewProduct(new edm::HepMCProduct());
0108 NewProduct->addHepMCData(evt);
0109
0110 iEvent.put(std::move(NewProduct));
0111
0112 edm::LogVerbatim("SimTransportHectorProducer") << "new LHCTransportLinkContainer ";
0113 unique_ptr<edm::LHCTransportLinkContainer> NewCorrespondenceMap(new edm::LHCTransportLinkContainer());
0114 edm::LHCTransportLinkContainer thisLink(m_Hector->getCorrespondenceMap());
0115 (*NewCorrespondenceMap).swap(thisLink);
0116
0117 if (m_verbosity) {
0118 for (unsigned int i = 0; i < (*NewCorrespondenceMap).size(); ++i)
0119 edm::LogVerbatim("HectorEventProcessing") << "Hector correspondence table: " << (*NewCorrespondenceMap)[i];
0120 }
0121
0122 iEvent.put(std::move(NewCorrespondenceMap));
0123 edm::LogVerbatim("SimTransportHectorProducer") << "produce end ";
0124 }
0125
0126 DEFINE_FWK_MODULE(HectorProducer);