00001 /* 00002 * $Date: 2013/05/17 20:09:07 $ 00003 * $Revision: 1.9 $ 00004 * \author Julia Yarba 00005 */ 00006 00007 #include <ostream> 00008 #include <memory> 00009 00010 #include "FWCore/Framework/interface/EDProducer.h" 00011 #include "FWCore/Framework/interface/EventSetup.h" 00012 #include "FWCore/Framework/interface/Run.h" 00013 #include "FWCore/ServiceRegistry/interface/Service.h" 00014 #include "FWCore/Utilities/interface/Exception.h" 00015 #include "FWCore/Utilities/interface/RandomNumberGenerator.h" 00016 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00017 00018 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" 00019 #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h" 00020 00021 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h" 00022 00023 #include "IOMC/ParticleGuns/interface/BaseFlatGunProducer.h" 00024 00025 00026 #include <iostream> 00027 00028 using namespace edm; 00029 using namespace std; 00030 using namespace CLHEP; 00031 00032 namespace { 00033 CLHEP::HepRandomEngine& getEngineReference() 00034 { 00035 00036 Service<RandomNumberGenerator> rng; 00037 if(!rng.isAvailable()) { 00038 throw cms::Exception("Configuration") 00039 << "The RandomNumberProducer module requires the RandomNumberGeneratorService\n" 00040 "which appears to be absent. Please add that service to your configuration\n" 00041 "or remove the modules that require it."; 00042 } 00043 00044 // The Service has already instantiated an engine. Make contact with it. 00045 return (rng->getEngine()); 00046 } 00047 } 00048 00049 BaseFlatGunProducer::BaseFlatGunProducer( const ParameterSet& pset ) : 00050 fEvt(0), 00051 fRandomEngine(getEngineReference()), 00052 fRandomGenerator(0) 00053 // fPDGTable( new DefaultConfig::ParticleDataTable("PDG Table") ) 00054 { 00055 00056 ParameterSet pgun_params = pset.getParameter<ParameterSet>("PGunParameters") ; 00057 00058 // although there's the method ParameterSet::empty(), 00059 // it looks like it's NOT even necessary to check if it is, 00060 // before trying to extract parameters - if it is empty, 00061 // the default values seem to be taken 00062 fPartIDs = pgun_params.getParameter< vector<int> >("PartID"); 00063 fMinEta = pgun_params.getParameter<double>("MinEta"); 00064 fMaxEta = pgun_params.getParameter<double>("MaxEta"); 00065 fMinPhi = pgun_params.getParameter<double>("MinPhi"); 00066 fMaxPhi = pgun_params.getParameter<double>("MaxPhi"); 00067 00068 // 00069 //fPDGTablePath = "/afs/cern.ch/sw/lcg/external/clhep/1.9.2.1/slc3_ia32_gcc323/data/HepPDT/" ; 00070 /* 00071 string HepPDTBase( getenv("HEPPDT_PARAM_PATH") ) ; 00072 fPDGTablePath = HepPDTBase + "/data/" ; 00073 fPDGTableName = "PDG_mass_width_2004.mc"; // should it be 2004 table ? 00074 00075 string TableFullName = fPDGTablePath + fPDGTableName ; 00076 ifstream PDFile( TableFullName.c_str() ) ; 00077 if( !PDFile ) 00078 { 00079 throw cms::Exception("FileNotFound", "BaseFlatGunProducer::BaseFlatGunProducer()") 00080 << "File " << TableFullName << " cannot be opened.\n"; 00081 } 00082 00083 HepPDT::TableBuilder tb(*fPDGTable) ; 00084 if ( !addPDGParticles( PDFile, tb ) ) { cout << " Error reading PDG !" << endl; } 00085 // the tb dtor fills fPDGTable 00086 */ 00087 00088 fVerbosity = pset.getUntrackedParameter<int>( "Verbosity",0 ) ; 00089 00090 // The Service has already instantiated an engine. Use it. 00091 fRandomGenerator = new CLHEP::RandFlat(fRandomEngine) ; 00092 fAddAntiParticle = pset.getParameter<bool>("AddAntiParticle") ; 00093 00094 produces<GenRunInfoProduct, InRun>(); 00095 } 00096 00097 BaseFlatGunProducer::~BaseFlatGunProducer() 00098 { 00099 00100 //if ( fRandomGenerator != NULL ) delete fRandomGenerator; 00101 // do I need to delete the Engine, too ? 00102 00103 // no need to cleanup GenEvent memory - done in HepMCProduct 00104 // if (fEvt != NULL) delete fEvt ; // double check 00105 // delete fPDGTable; 00106 00107 } 00108 00109 00110 void BaseFlatGunProducer::beginRun(const edm::Run & r, const EventSetup& es ) 00111 { 00112 es.getData( fPDGTable ) ; 00113 return ; 00114 00115 } 00116 void BaseFlatGunProducer::endRun(const Run &run, const EventSetup& es ) { 00117 } 00118 00119 00120 void BaseFlatGunProducer::endRunProduce(Run &run, const EventSetup& es ) 00121 { 00122 // just create an empty product 00123 // to keep the EventContent definitions happy 00124 // later on we might put the info into the run info that this is a PGun 00125 auto_ptr<GenRunInfoProduct> genRunInfo( new GenRunInfoProduct() ); 00126 run.put( genRunInfo ); 00127 }