Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:31:08

0001 // Framework headers
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 // SimpleConfigurable replacement
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 
0015 // HepMC headers
0016 #include "HepMC/GenEvent.h"
0017 
0018 // Hector headers
0019 #include "SimTransport/HectorProducer/interface/Hector.h"
0020 #include "SimTransport/HectorProducer/interface/HectorProducer.h"
0021 
0022 // SimDataFormats headers
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);