35 #include "HGCal/TBStandaloneSimulator/interface/HepMCG4Interface.hh"
37 #include "G4RunManager.hh"
38 #include "G4LorentzVector.hh"
40 #include "G4PrimaryParticle.hh"
41 #include "G4PrimaryVertex.hh"
42 #include "G4TransportationManager.hh"
43 #include "G4PhysicalConstants.hh"
44 #include "G4SystemOfUnits.hh"
47 HepMCG4Interface::HepMCG4Interface()
54 HepMCG4Interface::~HepMCG4Interface()
61 G4bool HepMCG4Interface::CheckVertexInsideWorld
62 (
const G4ThreeVector& pos)
const
65 G4Navigator* navigator = G4TransportationManager::GetTransportationManager()
66 -> GetNavigatorForTracking();
68 G4VPhysicalVolume* world = navigator-> GetWorldVolume();
69 G4VSolid* solid = world-> GetLogicalVolume()-> GetSolid();
70 EInside qinside = solid-> Inside(pos);
72 if( qinside != kInside)
return false;
77 void HepMCG4Interface::HepMC2G4(
const HepMC::GenEvent* hepmcevt,
81 for(HepMC::GenEvent::vertex_const_iterator vitr = hepmcevt->vertices_begin();
82 vitr != hepmcevt->vertices_end(); ++vitr ) {
86 for (HepMC::GenVertex::particle_iterator
87 pitr = (*vitr)->particles_begin(HepMC::children);
88 pitr != (*vitr)->particles_end(HepMC::children); ++pitr) {
90 if (!(*pitr)->end_vertex() && (*pitr)->status() == 1) {
98 HepMC::FourVector pos = (*vitr)-> position();
99 G4LorentzVector xvtx(pos.x(), pos.y(), pos.z(), pos.t());
100 if (! CheckVertexInsideWorld(xvtx.vect()*mm))
continue;
103 G4PrimaryVertex* g4vtx =
104 new G4PrimaryVertex(xvtx.x()*mm, xvtx.y()*mm, xvtx.z()*mm,
105 xvtx.t()*mm / c_light);
107 for (HepMC::GenVertex::particle_iterator
108 vpitr = (*vitr)->particles_begin(HepMC::children);
109 vpitr != (*vitr)->particles_end(HepMC::children); ++vpitr) {
111 if( (*vpitr)->status() != 1 )
continue;
113 G4int pdgcode = (*vpitr)-> pdg_id();
114 pos = (*vpitr)-> momentum();
115 G4LorentzVector p(pos.px(), pos.py(), pos.pz(), pos.e());
116 G4PrimaryParticle* g4prim =
117 new G4PrimaryParticle(pdgcode, p.x()*GeV, p.y()*GeV, p.z()*GeV);
119 g4vtx-> SetPrimary(g4prim);
121 g4event-> AddPrimaryVertex(g4vtx);
127 HepMC::GenEvent* HepMCG4Interface::GenerateHepMCEvent()
130 HepMC::GenEvent* aevent =
new HepMC::GenEvent();
135 void HepMCG4Interface::GeneratePrimaryVertex(G4Event* anEvent)
142 hepmcEvent = GenerateHepMCEvent();
144 G4cout <<
"HepMCInterface: no generated particles. run terminated..."
146 G4RunManager::GetRunManager()-> AbortRun();
149 HepMC2G4(hepmcEvent, anEvent);