CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_6/src/GeneratorInterface/ThePEGInterface/plugins/ThePEGHadronisation.cc

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 &params);
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 &params) :
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                 // no event
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 } // namespace lhef