00001 #ifndef gen_FortranCallback_h 00002 #define gen_FortranCallback_h 00003 00004 #include <boost/shared_ptr.hpp> 00005 00006 #include "SimDataFormats/GeneratorProducts/interface/LHECommonBlocks.h" 00007 00008 #include "GeneratorInterface/LHEInterface/interface/LHERunInfo.h" 00009 #include "GeneratorInterface/LHEInterface/interface/LHEEvent.h" 00010 00011 namespace HepMC 00012 { 00013 class GenEvent; 00014 } 00015 00016 namespace gen { 00017 00018 class FortranCallback 00019 { 00020 00021 public: 00022 00023 static FortranCallback* getInstance() ; 00024 00025 //void setLHEEvent(lhef::LHEEvent* lhev) { fPartonLevel = lhev; } 00026 void setLHERunInfo( lhef::LHERunInfo* lheri ) { fRunBlock=lheri; } 00027 void setLHEEvent( lhef::LHEEvent* lhee ) { fEventBlock=lhee; } 00028 00029 void resetIterationsPerEvent() { fIterationsPerEvent = 0; } 00030 00031 void fillHeader(); 00032 void fillEvent(); 00033 00034 int getIterationsPerEvent() const { return fIterationsPerEvent; } 00035 00036 private: 00037 00038 // ctor 00039 00040 FortranCallback(); 00041 00042 // data member(s) 00043 00044 lhef::LHERunInfo* fRunBlock; 00045 lhef::LHEEvent* fEventBlock; 00046 int fIterationsPerEvent; 00047 00048 static FortranCallback* fInstance; 00049 00050 00051 }; 00052 00053 // --** Implementation **--- 00054 00055 FortranCallback* FortranCallback::fInstance = 0; 00056 00057 FortranCallback::FortranCallback() 00058 // : fPartonLevel(0) 00059 : fRunBlock(0), fEventBlock(0), fIterationsPerEvent(0) 00060 { 00061 } 00062 00063 FortranCallback* FortranCallback::getInstance() 00064 { 00065 if ( fInstance == 0 ) fInstance = new FortranCallback; 00066 return fInstance; 00067 } 00068 00069 void FortranCallback::fillHeader() 00070 { 00071 00072 if ( fRunBlock == 0 ) return; 00073 00074 //const lhef::HEPRUP* heprup = &(fRunBlock->heprup()); 00075 const lhef::HEPRUP* heprup = fRunBlock->getHEPRUP(); 00076 00077 lhef::CommonBlocks::fillHEPRUP(heprup); 00078 00079 return; 00080 00081 } 00082 00083 void FortranCallback::fillEvent() 00084 { 00085 00086 //if ( fPartonLevel == 0 ) return; 00087 //const lhef::HEPEUP* hepeup = fPartonLevel->getHEPEUP(); 00088 00089 if ( fEventBlock == 0 ) return; 00090 00091 const lhef::HEPEUP* hepeup = fEventBlock->getHEPEUP(); 00092 00093 if (fIterationsPerEvent++) 00094 { 00095 hepeup_.nup = 0; 00096 return; 00097 } 00098 00099 lhef::CommonBlocks::fillHEPEUP(hepeup); 00100 00101 return; 00102 00103 } 00104 00105 00106 } // end namespace 00107 00108 #endif 00109 00110 00111