herwigpp_2.4.0.cc

Go to the documentation of this file.
00001 //example of Herwig++, generate pp -> ttbar events
00002 //by Zhonghua Qin <zhonghua.qin@desy.de> 
00003 #include "ThePEG/Repository/EventGenerator.h"
00004 #include "ThePEG/Repository/Repository.h"
00005 #include "ThePEG/Persistency/PersistentIStream.h"
00006 #include "ThePEG/Utilities/DynamicLoader.h"
00007 #include "ThePEG/EventRecord/Event.h"
00008 #include "ThePEG/EventRecord/SubProcess.h"
00009 #include "ThePEG/Handlers/XComb.h"
00010 #include "ThePEG/Handlers/EventHandler.h"
00011 #include "ThePEG/PDF/PartonExtractor.h"
00012 #include "ThePEG/PDF/PDF.h"
00013 #include "ThePEG/Vectors/HepMCConverter.h"
00014 #include "ThePEGHepMC_1.5.0.h"
00015 
00016 #include "HepMC/GenEvent.h"
00017 #include "HepMC/IO_GenEvent.h"
00018 #include "HepMC/GenEvent.h"
00019 #include "HepMC/IO_AsciiParticles.h"
00020 #include "HepMC/SimpleVector.h"
00021 
00022 #include <iostream>
00023 #include <stdio.h>
00024 #include <string>
00025 
00026 #include "TH1.h"
00027 #include "TFile.h"
00028 #include "TMath.h"
00029 #include <TCanvas.h>
00030 
00031 #include "TF1.h"
00032 #include <TH2.h>
00033 #include <TStyle.h>
00034 #include "TLegend.h"
00035 #include <TTree.h>
00036 #include <TString.h>
00037 
00038 using namespace ThePEG;
00039 
00040 // include our own classes
00041 #include "../../include/TopAnalysis.h"
00042 #include "../../include/TauAnalysis.h"
00043 #include "../../include/DiJetAnalysis.h"
00044 #include "../../include/WplusJetAnalysis.h"
00045 #include "../../include/ZAnalysis.h"
00046 #include "../../include/UEAnalysis.h"
00047 #include "../../include/EtMissAnalysis.h"
00048 #include "../../include/ElasScatAnalysis.h"
00049 #include "../../include/UserAnalysis.h"
00050 #include "readHerwigConfigFile.h"
00051 #include "../../include/Configuration.h"
00052 #include "../../include/JetFinder.h"
00053 
00054 int main(int argc, const char* argv[]) {
00055 
00056   if(argc <= 1 ) {
00057       std::cout << "Usage: " << argv[0] << " <Configuration File>" << std::endl;
00058       return 0;
00059   }
00060   
00061   
00062   Configuration* currentconfig = new Configuration();
00063   if(currentconfig->read(argv[1]))
00064       {
00065           std::cout << " ... skip !" << std::endl;
00066           return 0;
00067       }
00068 
00069   JetFinder FindJet;
00070   FindJet.Init(currentconfig->max_eta,currentconfig->min_pt);
00071   FindJet.InitJetFinder(currentconfig->coneRadius,currentconfig->overlapThreshold,currentconfig->jet_ptmin,currentconfig->lepton_ptmin,currentconfig->DeltaR_lepton_track);
00072 
00073 
00074   std::vector<baseAnalysis*> analysis;
00075 
00076   // create analysis Objects and initialize them                                                                                          
00077   if (currentconfig->dijet) {
00078     std::cout << "Adding module DiJetAnalysis" << std::endl;
00079     analysis.push_back(new DiJetAnalysis);
00080   }
00081   if (currentconfig->wplusjet) {
00082     std::cout << "Adding module WplusJetAnalysis" << std::endl;
00083     analysis.push_back(new WplusJetAnalysis);
00084   }
00085   if(currentconfig->z){
00086     std::cout << "Adding module ZAnalysis" << std::endl;
00087     analysis.push_back(new ZAnalysis);
00088   }
00089   if(currentconfig->tau){ 
00090     std::cout << "Adding module TauAnalysis" << std::endl;
00091     analysis.push_back(new TauAnalysis);
00092   }
00093   if(currentconfig->top){
00094     std::cout << "Adding module TopAnalysis" << std::endl;
00095     analysis.push_back(new TopAnalysis);
00096   }
00097   if(currentconfig->ue){
00098     std::cout << "Adding module UEAnalysis" << std::endl;
00099     analysis.push_back(new UEAnalysis);
00100   }  
00101   if(currentconfig->etmiss){
00102     std::cout << "Adding module EtMissAnalysis" << std::endl;
00103     analysis.push_back(new EtMissAnalysis);
00104   }
00105   if(currentconfig->elasScat){
00106     std::cout << "Adding module ElasScatAnalysis" << std::endl;
00107     analysis.push_back(new ElasScatAnalysis);
00108   }
00109   if(currentconfig->user){
00110     std::cout << "Adding module UserAnalysis" << std::endl;
00111     analysis.push_back(new UserAnalysis);
00112   }
00113   
00114 
00115   // init requested analysis modules and jet finder
00116   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00117     (*i)->Init(currentconfig->max_eta,currentconfig->min_pt);
00118     (*i)->InitJetFinder(currentconfig->coneRadius,currentconfig->overlapThreshold,currentconfig->jet_ptmin,currentconfig->lepton_ptmin,currentconfig->DeltaR_lepton_track);
00119   }
00120 
00121   //Add a path to seach for dynamically linkable libraries
00122   std::cout<<"Add a path to seach for dynamically linkable libraries..."<<std::endl;
00123   ThePEG::DynamicLoader::appendPath(HWMODULEDIR);
00124   ThePEG::DynamicLoader::appendPath(THEPEGMODULEDIR);
00125   
00126   //Load a whole repository from the given file
00127   std::cout<<"Load repository from a given file..."<<std::endl;
00128   const string repopath = string(HWREPODIR) + "/HerwigDefaults.rpo";
00129   ThePEG::Repository::load(repopath);
00130 
00131   //Setup process,interpret the command in cmd and return possible messages
00132   std::cout<<"Setup process,interpret the command in cmd and return possible messages..."<<std::endl;
00133 
00134   // set random number seed (mandatory!) ... this may be overwritten by function readConfigFile
00135   char exec_command[100];
00136   sprintf(exec_command,"set LHCGenerator:RandomNumberGenerator:Seed %ld",currentconfig->rseed); 
00137   ThePEG::Repository::exec("cd /Herwig/Generators", cout);
00138   ThePEG::Repository::exec(exec_command, cout);
00139 
00140   // vector to store herwig commandlines from Configuration file
00141   std::vector< std::string > herwig_commands;
00142   // read in commandlines
00143   for (unsigned int files=0; files<(currentconfig->ConfigFileNames).size(); files++)
00144       readConfigFile(&herwig_commands,(currentconfig->ConfigFileNames)[files]);
00145 
00146   // loop over the commands
00147   for(unsigned int i=0; i<herwig_commands.size(); i++)
00148       ThePEG::Repository::exec( herwig_commands[i].c_str(), cout);
00149 
00150 //switches for FSR, ISR and MI
00151   ThePEG::Repository::exec("cd /Herwig/Shower", cout);
00152 
00153   sprintf(exec_command,"set SplittingGenerator:ISR %c",currentconfig->ISR);
00154   ThePEG::Repository::exec(exec_command, cout);
00155 
00156   sprintf(exec_command,"set SplittingGenerator:FSR %c",currentconfig->FSR);
00157   ThePEG::Repository::exec(exec_command, cout);
00158 
00159   sprintf(exec_command,"set ShowerHandler:MPI %c",currentconfig->MI);
00160   ThePEG::Repository::exec(exec_command, cout);
00161 
00162   //Check sanity of the object during the setup phase
00163   ThePEG::Repository::update();
00164 
00165  // ThePEG generator object.
00166   ThePEG::EGPtr m_hw;
00167 
00168   // ThePEG event object.
00169   ThePEG::EventPtr m_event;
00170 
00171  // Make a "run" object from the config repository.
00172   std::cout<<"make a run object ..."<<std::endl;
00173   ThePEG::EGPtr tmpEG = ThePEG::BaseRepository::GetObject<ThePEG::EGPtr>("/Herwig/Generators/LHCGenerator");
00174   m_hw = ThePEG::Repository::makeRun(tmpEG, "LHC");
00175 
00176  //Herwig++ initializing
00177   std::cout<<"Herwig++ initializing..."<<std::endl;
00178   m_hw->initialize();
00179 
00180  //Loop for events generating and fill histograms
00181   std::cout<<"Generating events and filling histograms..."<<std::endl;
00182   
00183  //Change the value of nEvent to the number of events you want to generate
00184   for (unsigned int iEvent = 0; iEvent < currentconfig->nevents; ++iEvent) {
00185 
00186  // Run the generator for one event.
00187   assert(m_hw);
00188   m_event = m_hw->shoot();
00189 
00190  // Fill HepMC event from Herwig's internally stored EventPtr.
00191  // Convert the Herwig event into the HepMC GenEvent
00192  // HepMC::GenEvent*  evt = new HepMC::GenEvent();
00193   //  ThePEG::HepMCConverter<HepMC::GenEvent>::convert(*m_event, *evt, false, ThePEG::GeV);
00194   HepMC::GenEvent*  evt= ThePEG::HepMCConverter<HepMC::GenEvent>::convert(*m_event, false, ThePEG::GeV);
00195 
00196   //call the Jetfinder
00197   vector<fastjet::PseudoJet> inclusive_jets = FindJet.GetJet(evt);
00198   
00199   //call analysis
00200   int ret_all = true;
00201   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00202     (*i)->SetJet(&inclusive_jets);
00203     int ret = (*i)->Process(evt);
00204     if (ret == false) ret_all = false;
00205   }
00206 
00207   if (ret_all==false) {
00208     std::cout << "Processing event number " << iEvent << std::endl;
00209     std::cout << "throw FAILURE"<<std::endl;
00210     //std::cout<<"HepMC Output"<<std::endl;
00211     //evt->print();
00212     std::cout<<std::endl;
00213   }
00214 
00215   //delete all the jet objects, missingEt etc. to be free for the next event
00216   FindJet.ClearEvent(evt);
00217   
00218   //delete event
00219   delete evt;
00220   }
00221 
00222   TFile* f = new TFile(currentconfig->OutputFileName.c_str(),"RECREATE");
00223   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00224     (*i)->Finalize(f);
00225   }
00226 
00227   // clean up analysis modules
00228   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00229     delete (*i);
00230   }
00231   analysis.resize(0);
00232 
00233   // clean up config object
00234   delete currentconfig;
00235 
00236   //Tidy up, Herwig++ finalizing
00237   std::cout<<"Herwig++ finalizing..."<<std::endl;
00238   assert(m_hw);
00239   m_hw->finalize();
00240   ThePEG::Repository::cleanup();
00241 
00242   std::cout<<"Run successfully!"<<std::endl;
00243   return 0;
00244 }

Generated on Mon Jan 4 15:22:34 2010 for HepMCAnalysis by  doxygen 1.4.7