00001 #include "GtGenerator.h"
00002 #include "GenTools/IHepMCEventMutator.h"
00003
00004 #include "Event/GenHeader.h"
00005
00006 #include "Context/TimeStamp.h"
00007
00008 #include "GaudiKernel/ISvcLocator.h"
00009 #include "GaudiKernel/IDataProviderSvc.h"
00010 #include "GaudiKernel/IDataManagerSvc.h"
00011 #include "GaudiKernel/IRndmEngine.h"
00012
00013 #include "GaudiKernel/IssueSeverity.h"
00014
00015 #include "CLHEP/Units/SystemOfUnits.h"
00016 #include "HepMC/GenEvent.h"
00017
00018 #include <vector>
00019 #include <limits>
00020
00021 GtGenerator::GtGenerator(const std::string& name, ISvcLocator* pSvcLocator)
00022 : DybAlgorithm<DayaBay::GenHeader>(name,pSvcLocator)
00023 {
00024 declareProperty("TimeStamp",m_tsseconds = 0,
00025 "Absolute start time in seconds from the unix epoch. "
00026 "Caution: this is a bare integer, do not multiply by CLHEP seconds.");
00027 declareProperty("GenTools",m_genToolNames,
00028 "Tools to generate HepMC::GenEvents");
00029 declareProperty("GenName", m_genName = "GtGenerator",
00030 "Name of this generator for book keeping purposes.");
00031 }
00032
00033 GtGenerator::~GtGenerator()
00034 {
00035 }
00036
00037 StatusCode GtGenerator::initialize()
00038 {
00039 for (size_t ind=0; ind < m_genToolNames.size(); ++ind) {
00040 std::string gtn = m_genToolNames[ind];
00041 try {
00042 m_genTools.push_back(tool<IHepMCEventMutator>(gtn));
00043 }
00044 catch(const GaudiException& exg) {
00045 fatal() << "Failed to get generator: \"" << gtn << "\"" << endreq;
00046 return StatusCode::FAILURE;
00047 }
00048 info () << "Added gen tool " << gtn << endreq;
00049 }
00050
00051
00052 m_now = TimeStamp(m_tsseconds);
00053
00054 return StatusCode::SUCCESS;
00055 }
00056
00057 StatusCode GtGenerator::execute()
00058 {
00059
00060 DayaBay::GenHeader* gen_header = MakeHeaderObject();
00061
00062
00063 HepMC::GenEvent* event = new HepMC::GenEvent;
00064 event->set_event_number(this->getExecNum());
00065
00066
00067 for (size_t ind = 0; ind< m_genTools.size(); ++ind) {
00068 debug () << "Running gen tool #" << ind << " " << m_genToolNames[ind] << endreq;
00069 if (m_genTools[ind]->mutate(*event).isFailure()) {
00070 fatal() << "Generator Tool " << m_genToolNames[ind]
00071 << " failed" << endreq;
00072 return StatusCode::FAILURE;
00073 }
00074 }
00075
00076
00077 double dt = std::numeric_limits<double>::max();
00078 {
00079 HepMC::GenEvent::vertex_const_iterator it, done = event->vertices_end();
00080 for (it = event->vertices_begin(); it != done; ++it) {
00081 double t = (*it)->position().t();
00082 if (t < dt) dt = t;
00083 }
00084 }
00085 debug () << "Smallest time of "
00086 << event->vertices_size() << " vertices = " << dt << endreq;
00087
00088
00089 dt = dt/CLHEP::second;
00090 time_t seconds = (time_t)dt;
00091 double fractional = dt - seconds;
00092 int ns = (int)(1e9*fractional);
00093 double rest = fractional - (1e-9*ns);
00094
00095
00096 double toffset = (dt - rest)*CLHEP::second;
00097
00098
00099 m_now.Add(TimeStamp(seconds,ns));
00100 gen_header->setTimeStamp(m_now);
00101
00102 debug() << "Offset time is " << toffset
00103 << ", now is " << m_now << endreq;
00104
00105
00106 {
00107 double earliest = -1, latest = -1;
00108 HepMC::GenEvent::vertex_iterator it, done = event->vertices_end();
00109 for (it = event->vertices_begin(); it != done; ++it) {
00110 HepMC::FourVector vtx = (*it)->position();
00111 double t = vtx.t() - toffset;
00112 vtx.setT(t);
00113 (*it)->set_position(vtx);
00114
00115 if (earliest < 0 || earliest > t) earliest = t;
00116 if (latest < 0 || latest < t) latest = t;
00117 }
00118
00119 TimeStamp ts_earliest(m_now);
00120 if (earliest > 0)
00121 ts_earliest.Add(earliest/CLHEP::second);
00122 gen_header->setEarliest(ts_earliest);
00123
00124 TimeStamp ts_latest(m_now);
00125 if (latest > 0)
00126 ts_latest.Add(latest/CLHEP::second);
00127 gen_header->setLatest(ts_latest);
00128 }
00129
00130
00131 gen_header->setEvent(event);
00132 gen_header->setGeneratorName(m_genName);
00133
00134 return StatusCode::SUCCESS;
00135 }
00136
00137 StatusCode GtGenerator::finalize()
00138 {
00139
00140 m_genTools.clear();
00141
00142 return this->GaudiAlgorithm::finalize();
00143 }
00144
00145