herwigpp_2.2.1.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.3.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/Configuration.h"
00042 #include "../../include/JetFinder.h"
00043 #include "../../include/ttbarAnalysis.h"
00044 #include "../../include/ZtautauAnalysis.h"
00045 #include "../../include/WtaunuAnalysis.h"
00046 #include "../../include/bbbarAnalysis.h"
00047 #include "../../include/JetAnalysis.h"
00048 #include "../../include/WplusJetAnalysis.h"
00049 #include "../../include/ZAnalysis.h"
00050 #include "../../include/UEAnalysis.h"
00051 #include "../../include/EtMissAnalysis.h"
00052 #include "../../include/ElasScatAnalysis.h"
00053 #include "../../include/UserAnalysis.h"
00054 #include "readHerwigConfigFile.h"
00055 
00056 int main(int argc, const char* argv[]) {
00057 
00058   if(argc <= 1 ) {
00059     std::cout << "Usage: " << argv[0] << " <Configuration File>" << std::endl;
00060     return 0;
00061   }
00062   
00063   
00064   Configuration* currentconfig = new Configuration();
00065   if(currentconfig->read(argv[1]))
00066     {
00067       std::cout << " ... skip !" << std::endl;
00068       return 0;
00069     }
00070 
00071   JetFinder FindJet;
00072   FindJet.Init(currentconfig->max_eta,currentconfig->min_pt);
00073   FindJet.InitJetFinder( currentconfig->coneRadius, currentconfig->overlapThreshold, currentconfig->jet_ptmin,
00074       currentconfig->lepton_ptmin, currentconfig->DeltaR_lepton_track, currentconfig->jetalgorithm );
00075 
00076 
00077   std::vector<baseAnalysis*> analysis;
00078 
00079   // create analysis Objects and initialize them                                                                                          
00080   if (currentconfig->jet) {
00081     std::cout << "Adding module JetAnalysis" << std::endl;
00082     analysis.push_back(new JetAnalysis);
00083   }
00084   if (currentconfig->wplusjet) {
00085     std::cout << "Adding module WplusJetAnalysis" << std::endl;
00086     analysis.push_back(new WplusJetAnalysis);
00087   }
00088   if(currentconfig->z){
00089     std::cout << "Adding module ZAnalysis" << std::endl;
00090     analysis.push_back(new ZAnalysis);
00091   }
00092   if(currentconfig->ztautau){ 
00093     std::cout << "Adding module ZtautauAnalysis" << std::endl;
00094     analysis.push_back(new ZtautauAnalysis);
00095   }
00096   if(currentconfig->wtaunu){ 
00097     std::cout << "Adding module WtaunuAnalysis" << std::endl;
00098     analysis.push_back(new WtaunuAnalysis);
00099   }
00100   if(currentconfig->bbbar){ 
00101     std::cout << "Adding module bbbarAnalysis" << std::endl;
00102     analysis.push_back(new bbbarAnalysis);
00103   }
00104   if(currentconfig->ttbar){
00105     std::cout << "Adding module ttbarAnalysis" << std::endl;
00106     analysis.push_back(new ttbarAnalysis);
00107   }
00108   if(currentconfig->ue){
00109     std::cout << "Adding module UEAnalysis" << std::endl;
00110     analysis.push_back(new UEAnalysis);
00111   }  
00112   if(currentconfig->etmiss){
00113     std::cout << "Adding module EtMissAnalysis" << std::endl;
00114     analysis.push_back(new EtMissAnalysis);
00115   }
00116   if(currentconfig->elasScat){
00117     std::cout << "Adding module ElasScatAnalysis" << std::endl;
00118     analysis.push_back(new ElasScatAnalysis);
00119   }
00120   if(currentconfig->user){
00121     std::cout << "Adding module UserAnalysis" << std::endl;
00122     analysis.push_back(new UserAnalysis);
00123   }
00124   
00125 
00126   // init requested analysis modules and jet finder
00127   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00128     (*i)->Init(currentconfig->max_eta,currentconfig->min_pt);
00129     (*i)->InitJetFinder( currentconfig->coneRadius, currentconfig->overlapThreshold, currentconfig->jet_ptmin,
00130         currentconfig->lepton_ptmin, currentconfig->DeltaR_lepton_track, currentconfig->jetalgorithm );
00131   }
00132 
00133 
00134   // Add a path to seach for dynamically linkable libraries
00135   std::cout<<"Add a path to seach for dynamically linkable libraries..."<<std::endl;
00136   ThePEG::DynamicLoader::appendPath(HWMODULEDIR);
00137   ThePEG::DynamicLoader::appendPath(THEPEGMODULEDIR);
00138   
00139   //Load a whole repository from the given file
00140   std::cout<<"Load repository from a given file..."<<std::endl;
00141   const string repopath = string(HWREPODIR) + "/HerwigDefaults.rpo";
00142   ThePEG::Repository::load(repopath);
00143 
00144   //Setup process,interpret the command in cmd and return possible messages
00145   std::cout<<"Setup process,interpret the command in cmd and return possible messages..."<<std::endl;
00146 
00147   // set random number seed (mandatory!) ... this may be overwritten by function readConfigFile
00148   char exec_command[100];
00149   sprintf(exec_command,"set LHCGenerator:RandomNumberGenerator:Seed %ld",currentconfig->rseed); 
00150   ThePEG::Repository::exec("cd /Herwig/Generators", cout);
00151   ThePEG::Repository::exec(exec_command, cout);
00152 
00153   // vector to store herwig commandlines from Configuration file
00154   std::vector< std::string > herwig_commands;
00155   // read in commandlines
00156   for (unsigned int files=0; files<(currentconfig->ConfigFileNames).size(); files++)
00157     readConfigFile(&herwig_commands,(currentconfig->ConfigFileNames)[files]);
00158 
00159   // loop over the commands
00160   for(unsigned int i=0; i<herwig_commands.size(); i++)
00161     ThePEG::Repository::exec( herwig_commands[i].c_str(), cout);
00162 
00163   //switches for FSR, ISR and MI
00164   ThePEG::Repository::exec("cd /Herwig/Shower", cout);
00165   
00166   sprintf(exec_command,"set SplittingGenerator:ISR %c",currentconfig->ISR);
00167   ThePEG::Repository::exec(exec_command, cout);
00168   
00169   sprintf(exec_command,"set SplittingGenerator:FSR %c",currentconfig->FSR);
00170   ThePEG::Repository::exec(exec_command, cout);
00171   
00172   sprintf(exec_command,"set ShowerHandler:MPI %c",currentconfig->MI);
00173   ThePEG::Repository::exec(exec_command, cout);
00174 
00175 
00176   //Check sanity of the object during the setup phase
00177   ThePEG::Repository::update();
00178 
00179   // ThePEG generator object.
00180   ThePEG::EGPtr m_hw;
00181 
00182   // ThePEG event object.
00183   ThePEG::EventPtr m_event;
00184 
00185   // Make a "run" object from the config repository.
00186   std::cout<<"make a run object ..."<<std::endl;
00187   ThePEG::EGPtr tmpEG = ThePEG::BaseRepository::GetObject<ThePEG::EGPtr>("/Herwig/Generators/LHCGenerator");
00188   m_hw = ThePEG::Repository::makeRun(tmpEG, "LHC");
00189 
00190   // Herwig++ initializing
00191   std::cout<<"Herwig++ initializing..."<<std::endl;
00192   m_hw->initialize();
00193 
00194   // Loop for events generating and fill histograms
00195   std::cout<<"Generating events and filling histograms..."<<std::endl;
00196   
00197   //Change the value of nEvent to the number of events you want to generate
00198   for (unsigned int iEvent = 0; iEvent < currentconfig->nevents; ++iEvent) {
00199 
00200     // Run the generator for one event.
00201     assert(m_hw);
00202     m_event = m_hw->shoot();
00203     
00204     // Fill HepMC event from Herwig's internally stored EventPtr.
00205     // Convert the Herwig event into the HepMC GenEvent
00206     HepMC::GenEvent*  evt = new HepMC::GenEvent();
00207     ThePEG::HepMCConverter<HepMC::GenEvent>::convert(*m_event, *evt, false, ThePEG::GeV);
00208 
00209     // debug print out
00210     std::cout << "Processing event number " << iEvent << std::endl;
00211     if (iEvent < 0) evt->print();
00212 
00213     //call the Jetfinder
00214     vector<fastjet::PseudoJet> inclusive_jets = FindJet.GetJet(evt);
00215 
00216     //call analysis
00217     int ret_all = true;
00218     for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00219       (*i)->SetJet(&inclusive_jets);
00220       int ret = (*i)->Process(evt);
00221       if (ret == false) ret_all = false;
00222     }
00223     
00224     if (ret_all==false) {
00225       std::cout << "Processing event number " << iEvent << std::endl;
00226       std::cout << "throw FAILURE"<<std::endl;
00227       //std::cout<<"HepMC Output"<<std::endl;
00228       //evt->print();
00229       std::cout<<std::endl;
00230     }
00231     
00232     // delete all the jet objects, missingEt etc. to be free for the next event
00233     FindJet.ClearEvent(evt);
00234         
00235     // delete event
00236     delete evt;
00237   }
00238   
00239   TFile* f = new TFile(currentconfig->OutputFileName.c_str(),"RECREATE");
00240   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00241     (*i)->Finalize(f);
00242   }
00243 
00244   // clean up analysis modules
00245   for (std::vector<baseAnalysis*>::const_iterator i(analysis.begin()); i != analysis.end(); ++i) {
00246     delete (*i);
00247   }
00248   analysis.resize(0);
00249 
00250   // clean up config object
00251   delete currentconfig;
00252 
00253   //Tidy up, Herwig++ finalizing
00254   std::cout<<"Herwig++ finalizing..."<<std::endl;
00255   assert(m_hw);
00256   m_hw->finalize();
00257   ThePEG::Repository::cleanup();
00258 
00259   std::cout<<"Run successfully!"<<std::endl;
00260   return 0;
00261 }

Generated on Wed Aug 31 09:44:48 2011 for HepMCAnalysis by  doxygen 1.4.7