00001 #include "GeneratorInterface/ExhumeInterface/interface/ExhumeSource.h"
00002 #include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h"
00003 #include "SimDataFormats/HepMCProduct/interface/GenInfoProduct.h"
00004 #include "FWCore/Framework/interface/Event.h"
00005 #include "FWCore/Framework/interface/Run.h"
00006 #include "FWCore/ServiceRegistry/interface/Service.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00009 #include "Utilities/General/interface/FileInPath.h"
00010
00011
00012
00013
00014 #include <iostream>
00015 #include "time.h"
00016
00017 using namespace edm;
00018 using namespace std;
00019
00020
00021
00022
00023
00024
00025
00026 #include "HepMC/IO_HEPEVT.h"
00027
00028 #define pylist pylist_
00029 extern "C" {
00030 void pylist(int*);
00031 }
00032 void call_pylist( int mode ){ pylist( &mode ); }
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 extern struct {
00045 int mstp[200];
00046 double parp[200];
00047 int msti[200];
00048 double pari[200];
00049 } pypars_;
00050 #define pypars pypars_
00051
00052
00053
00054
00055
00056
00057
00058
00059 static const unsigned long kNanoSecPerSec = 1000000000;
00060 static const unsigned long kAveEventPerSec = 200;
00061
00062 ExhumeSource::ExhumeSource( const ParameterSet & pset,
00063 InputSourceDescription const& desc ) :
00064 GeneratedInputSource(pset, desc), evt(0),
00065 pythiaPylistVerbosity_ (pset.getUntrackedParameter<int>("pythiaPylistVerbosity",0)),
00066 pythiaHepMCVerbosity_ (pset.getUntrackedParameter<bool>("pythiaHepMCVerbosity",false)),
00067 maxEventsToPrint_ (pset.getUntrackedParameter<int>("maxEventsToPrint",1)),
00068 comenergy(pset.getUntrackedParameter<double>("comEnergy",14000.)),
00069 extCrossSect(pset.getUntrackedParameter<double>("crossSection", -1.)),
00070 extFilterEff(pset.getUntrackedParameter<double>("filterEfficiency", -1.))
00071 {
00072 std::ostringstream header_str;
00073
00074 header_str << "ExhumeSource: initializing Exhume/Pythia.\n";
00075
00076
00077
00078 pythiaPylistVerbosity_ = pset.getUntrackedParameter<int>("pythiaPylistVerbosity",0);
00079 header_str << "Pythia PYLIST verbosity level = " << pythiaPylistVerbosity_ << "\n";
00080
00081
00082 pythiaHepMCVerbosity_ = pset.getUntrackedParameter<bool>("pythiaHepMCVerbosity",false);
00083 header_str << "Pythia HepMC verbosity = " << pythiaHepMCVerbosity_ << "\n";
00084
00085
00086 maxEventsToPrint_ = pset.getUntrackedParameter<int>("maxEventsToPrint",0);
00087 header_str << "Number of events to be printed = " << maxEventsToPrint_ << "\n";
00088
00089
00090 ParameterSet process_pset = pset.getParameter<ParameterSet>("ExhumeProcess") ;
00091 ProcessType = process_pset.getParameter<string>("ProcessType");
00092 if(ProcessType == "Higgs"){
00093 ExhumeProcess = new Exhume::Higgs(pset);
00094 HiggsDecay = process_pset.getParameter<int>("HiggsDecay");
00095 double m_higgs = pset.getUntrackedParameter<double>("HiggsMass",120.);
00096 MassRangeLow = process_pset.getUntrackedParameter<double>("MassRangeLow",(m_higgs - 5.));
00097 MassRangeHigh = process_pset.getUntrackedParameter<double>("MassRangeHigh",(m_higgs + 5.));
00098 ((Exhume::Higgs*)ExhumeProcess)->SetHiggsDecay(HiggsDecay);
00099 sigID = 100 + HiggsDecay;
00100 } else if(ProcessType == "QQ"){
00101 ExhumeProcess = new Exhume::QQ(pset);
00102 QuarkType = process_pset.getParameter<int>("QuarkType");
00103 ThetaMin = process_pset.getUntrackedParameter<double>("ThetaMin");
00104 MassRangeLow = process_pset.getUntrackedParameter<double>("MassRangeLow",10.);
00105 MassRangeHigh = process_pset.getUntrackedParameter<double>("MassRangeHigh",200.);
00106 ((Exhume::QQ*)ExhumeProcess)->SetQuarkType(QuarkType);
00107 ((Exhume::QQ*)ExhumeProcess)->SetThetaMin(ThetaMin);
00108 sigID = 200 + QuarkType;
00109 } else if(ProcessType == "GG"){
00110 ExhumeProcess = new Exhume::GG(pset);
00111 ThetaMin = process_pset.getUntrackedParameter<double>("ThetaMin");
00112 MassRangeLow = process_pset.getUntrackedParameter<double>("MassRangeLow",10.);
00113 MassRangeHigh = process_pset.getUntrackedParameter<double>("MassRangeHigh",200.);
00114 ((Exhume::GG*)ExhumeProcess)->SetThetaMin(ThetaMin);
00115 sigID = 300;
00116 } else{
00117 sigID = -1;
00118 throw edm::Exception(edm::errors::Configuration,"ExhumeError") <<" No valid Exhume Process";
00119 }
00120
00121 edm::Service<RandomNumberGenerator> rng;
00122 uint32_t seed = rng->mySeed();
00123 ExhumeEvent = new Exhume::Event(*ExhumeProcess,seed);
00124
00125 ExhumeEvent->SetMassRange(MassRangeLow,MassRangeHigh);
00126 ExhumeEvent->SetParameterSpace();
00127
00128
00129
00130
00131 header_str << "\n";
00132
00133
00134 produces<HepMCProduct>();
00135 produces<GenInfoProduct, edm::InRun>();
00136
00137 header_str << "ExhumeSource: starting event generation ...\n";
00138
00139 edm::LogInfo("")<<header_str.str();
00140 }
00141
00142
00143 ExhumeSource::~ExhumeSource(){
00144 std::ostringstream footer_str;
00145 footer_str << "ExhumeSource: event generation done.\n";
00146
00147 edm::LogInfo("") << footer_str.str();
00148
00149 clear();
00150 }
00151
00152 void ExhumeSource::clear() {
00153 delete ExhumeEvent;
00154 delete ExhumeProcess;
00155 }
00156
00157 void ExhumeSource::endRun(Run & r) {
00158 std::ostringstream footer_str;
00159
00160 double cs = ExhumeEvent->CrossSectionCalculation();
00161 double eff = ExhumeEvent->GetEfficiency();
00162 string name = ExhumeProcess->GetName();
00163
00164 footer_str << "\n" <<" You have just been ExHuMEd." << "\n" << "\n";
00165 footer_str << " The cross section for process " << name
00166 << " is " << cs << " fb" << "\n" << "\n";
00167 footer_str << " The efficiency of event generation was " << eff << "%" << "\n" << "\n";
00168
00169 edm::LogInfo("") << footer_str.str();
00170
00171 auto_ptr<GenInfoProduct> giprod (new GenInfoProduct());
00172 giprod->set_cross_section(cs);
00173 giprod->set_external_cross_section(extCrossSect);
00174 giprod->set_filter_efficiency(extFilterEff);
00175 r.put(giprod);
00176 }
00177
00178 bool ExhumeSource::produce(Event & e) {
00179
00180 auto_ptr<HepMCProduct> bare_product(new HepMCProduct());
00181 edm::LogInfo("") << "ExhumeSource: Generating event ...\n";
00182
00183
00184
00185 ExhumeEvent->Generate();
00186 ExhumeProcess->Hadronise();
00187
00188 HepMC::IO_HEPEVT conv;
00189
00190 HepMC::GenEvent* evt = conv.read_next_event();
00191
00192 evt->set_signal_process_id(sigID);
00193 evt->set_event_scale(pypars.pari[16]);
00194 evt->set_event_number(numberEventsInRun() - remainingEvents() - 1);
00195
00196
00197
00198
00199 if(event() <= maxEventsToPrint_ &&
00200 (pythiaPylistVerbosity_ || pythiaHepMCVerbosity_)) {
00201
00202
00203 if(pythiaPylistVerbosity_) {
00204 call_pylist(pythiaPylistVerbosity_);
00205 }
00206
00207
00208 if(pythiaHepMCVerbosity_) {
00209 edm::LogInfo("") << "Event process = " << ExhumeProcess->GetName() << "\n"
00210 << "----------------------" << "\n";
00211 evt->print();
00212 }
00213 }
00214
00215
00216
00217
00218
00219 if(evt) bare_product->addHepMCData(evt );
00220
00221 e.put(bare_product);
00222
00223 return true;
00224 }
00225