Go to the documentation of this file.00001 #include <string>
00002 #include <iostream>
00003 #include <sstream>
00004 #include <memory>
00005 #include <assert.h>
00006
00007 #include <boost/shared_ptr.hpp>
00008
00009 #include <HepMC/GenEvent.h>
00010 #include <HepMC/GenParticle.h>
00011 #include <HepMC/PdfInfo.h>
00012
00013 #include <ThePEG/Repository/Repository.h>
00014 #include <ThePEG/EventRecord/Event.h>
00015 #include <ThePEG/Config/ThePEG.h>
00016 #include <ThePEG/LesHouches/LesHouchesReader.h>
00017
00018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00020 #include "FWCore/Framework/interface/Event.h"
00021
00022 #include "SimDataFormats/GeneratorProducts/interface/LesHouches.h"
00023 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
00024
00025 #include "GeneratorInterface/LHEInterface/interface/LHERunInfo.h"
00026 #include "GeneratorInterface/LHEInterface/interface/LHEEvent.h"
00027 #include "GeneratorInterface/LHEInterface/interface/LHEProxy.h"
00028 #include "GeneratorInterface/LHEInterface/interface/Hadronisation.h"
00029
00030 #include "GeneratorInterface/ThePEGInterface/interface/ThePEGInterface.h"
00031
00032 using namespace std;
00033 using namespace ThePEG;
00034 using namespace lhef;
00035
00036 namespace lhef {
00037
00038 class ThePEGHadronisation : public ThePEGInterface, public Hadronisation {
00039 public:
00040 ThePEGHadronisation(const edm::ParameterSet ¶ms);
00041 ~ThePEGHadronisation();
00042
00043 private:
00044 void doInit();
00045 std::auto_ptr<HepMC::GenEvent> doHadronisation();
00046 void newRunInfo(const boost::shared_ptr<LHERunInfo> &runInfo);
00047
00048 void initLHE();
00049
00050 boost::shared_ptr<LHEProxy> proxy_;
00051
00052 const std::string handlerDirectory_;
00053 };
00054
00055 void ThePEGHadronisation::initLHE()
00056 {
00057 ostringstream ss;
00058 ss << proxy_->getID();
00059
00060 ostringstream logstream;
00061 ThePEG::Repository::exec("set " + handlerDirectory_ +
00062 "/LHEReader:ProxyID " + ss.str(), logstream);
00063 edm::LogInfo("Generator|LHEInterface") << logstream.str();
00064 }
00065
00066 ThePEGHadronisation::ThePEGHadronisation(const edm::ParameterSet ¶ms) :
00067 ThePEGInterface(params),
00068 Hadronisation(params),
00069 handlerDirectory_(params.getParameter<string>("eventHandlers"))
00070 {
00071 initRepository(params);
00072 proxy_ = LHEProxy::create();
00073 initLHE();
00074 }
00075
00076 void ThePEGHadronisation::doInit()
00077 {
00078 }
00079
00080 ThePEGHadronisation::~ThePEGHadronisation()
00081 {
00082 }
00083
00084 std::auto_ptr<HepMC::GenEvent> ThePEGHadronisation::doHadronisation()
00085 {
00086 edm::LogInfo("Generator|LHEInterface") << "Start production";
00087
00088 proxy_->loadEvent(getRawEvent());
00089
00090 ThePEG::EventPtr thepegEvent;
00091 try {
00092 flushRandomNumberGenerator();
00093 thepegEvent = eg_->shoot();
00094 } catch(ThePEG::Stop) {
00095
00096 }
00097
00098 if (!thepegEvent) {
00099 edm::LogWarning("Generator|LHEInterface")
00100 << "thepegEvent not initialized";
00101 return std::auto_ptr<HepMC::GenEvent>();
00102 }
00103
00104 std::auto_ptr<HepMC::GenEvent> event = convert(thepegEvent);
00105 if (!event.get())
00106 return event;
00107
00108 HepMC::PdfInfo pdf;
00109 clearAuxiliary(event.get(), &pdf);
00110 getRawEvent()->fillPdfInfo(&pdf);
00111 fillAuxiliary(event.get(), &pdf, thepegEvent);
00112 event->set_pdf_info(pdf);
00113
00114 return event;
00115 }
00116
00117 void ThePEGHadronisation::newRunInfo(
00118 const boost::shared_ptr<LHERunInfo> &runInfo)
00119 {
00120 proxy_->loadRunInfo(runInfo);
00121 initGenerator();
00122 }
00123
00124 DEFINE_LHE_HADRONISATION_PLUGIN(ThePEGHadronisation);
00125
00126 }