CMS 3D CMS Logo

ExhumeSource.cc

Go to the documentation of this file.
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 //#include "CLHEP/Random/JamesRandom.h"
00012 //#include "CLHEP/Random/RandFlat.h"
00013 
00014 #include <iostream>
00015 #include "time.h"
00016 
00017 using namespace edm;
00018 using namespace std;
00019 
00020 
00021 // Generator modifications
00022 // ***********************
00023 //#include "HepMC/include/PythiaWrapper6_2.h"
00024 //#include "HepMC/ConvertHEPEVT.h"
00025 //#include "HepMC/CBhepevt.h"
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 #define my_pythia_init my_pythia_init_
00036 extern "C" {
00037         void my_pythia_init();
00038 }
00039 #define pydata pydata_
00040 extern "C" {
00041     void pydata(void);
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 //HepMC::ConvertHEPEVT conv;
00053 //HepMC::IO_HEPEVT conv;
00054 
00055 // ***********************
00056 
00057 
00058 //used for defaults
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   // PYLIST Verbosity Level
00077   // Valid PYLIST arguments are: 1, 2, 3, 5, 7, 11, 12, 13
00078   pythiaPylistVerbosity_ = pset.getUntrackedParameter<int>("pythiaPylistVerbosity",0);
00079   header_str << "Pythia PYLIST verbosity level = " << pythiaPylistVerbosity_ << "\n";
00080   
00081   // HepMC event verbosity Level
00082   pythiaHepMCVerbosity_ = pset.getUntrackedParameter<bool>("pythiaHepMCVerbosity",false);
00083   header_str << "Pythia HepMC verbosity = " << pythiaHepMCVerbosity_ << "\n"; 
00084 
00085   //Max number of events printed on verbosity level 
00086   maxEventsToPrint_ = pset.getUntrackedParameter<int>("maxEventsToPrint",0);
00087   header_str << "Number of events to be printed = " << maxEventsToPrint_ << "\n";
00088 
00089   //Exhume Initialization
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   //my_pythia_init();
00129   //pydata();
00130 
00131   header_str << "\n"; // Stetically add for the output
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     //HepMC::GenEvent* evt = conv.getGenEventfromHEPEVT();
00190     HepMC::GenEvent* evt = conv.read_next_event();
00191     //evt->set_signal_process_id(pypars.msti[0]);
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     //******** Verbosity ********
00198     
00199     if(event() <= maxEventsToPrint_ &&
00200        (pythiaPylistVerbosity_ || pythiaHepMCVerbosity_)) {
00201 
00202       // Prints PYLIST info
00203       if(pythiaPylistVerbosity_) {
00204         call_pylist(pythiaPylistVerbosity_);
00205       }
00206       
00207       // Prints HepMC event
00208       if(pythiaHepMCVerbosity_) {
00209         edm::LogInfo("") << "Event process = " << ExhumeProcess->GetName() << "\n" 
00210         << "----------------------" << "\n";
00211         evt->print();
00212       }
00213     }
00214     
00215     
00216     //evt = reader_->fillCurrentEventData(); 
00217     //********                                      
00218 
00219     if(evt)  bare_product->addHepMCData(evt );
00220 
00221     e.put(bare_product);
00222 
00223     return true;
00224 }
00225 

Generated on Tue Jun 9 17:36:54 2009 for CMSSW by  doxygen 1.5.4