summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chroma/generator/g4gen.py53
1 files changed, 32 insertions, 21 deletions
diff --git a/chroma/generator/g4gen.py b/chroma/generator/g4gen.py
index 0b8169d..4b0a139 100644
--- a/chroma/generator/g4gen.py
+++ b/chroma/generator/g4gen.py
@@ -53,7 +53,7 @@ class G4Generator(object):
gRunManager.Initialize()
g4unmute()
# preinitialize the process by running a simple event
- self.generate_photons([Vertex('e-', (0,0,0), (1,0,0), 0, 1.0)])
+ self.generate_photons([Vertex('e-', (0,0,0), (1,0,0), 0, 1.0)], mute=True)
def create_g4material(self, material):
g4material = G4Material('world_material', material.density * g / cm3,
@@ -107,37 +107,48 @@ class G4Generator(object):
return Photons(pos, dir, pol, wavelengths, t0)
- def generate_photons(self, vertices):
+ def generate_photons(self, vertices, mute=False):
"""Use GEANT4 to generate photons produced by propagating `vertices`.
Args:
vertices: list of event.Vertex objects
List of initial particle vertices.
+ mute: bool
+ Disable GEANT4 output to console during generation. (GEANT4 can
+ be quite chatty.)
+
Returns:
photons: event.Photons
Photon vertices generated by the propagation of `vertices`.
"""
+ if mute:
+ g4mute()
+
photons = None
- for vertex in vertices:
- self.particle_gun.SetParticleByName(vertex.particle_name)
- mass = G4ParticleTable.GetParticleTable().FindParticle(vertex.particle_name).GetPDGMass()
- total_energy = vertex.ke*MeV + mass
- self.particle_gun.SetParticleEnergy(total_energy)
- self.particle_gun.SetParticlePosition(G4ThreeVector(*vertex.pos)*mm)
- self.particle_gun.SetParticleMomentumDirection(G4ThreeVector(*vertex.dir).unit())
- self.particle_gun.SetParticleTime(vertex.t0*ns)
-
- if vertex.pol is not None:
- self.particle_gun.SetParticlePolarization(G4ThreeVector(*vertex.pol).unit())
-
- self.tracking_action.Clear()
- gRunManager.BeamOn(1)
-
- if photons is None:
- photons = self._extract_photons_from_tracking_action()
- else:
- photons += self._extract_photons_from_tracking_action()
+ try:
+ for vertex in vertices:
+ self.particle_gun.SetParticleByName(vertex.particle_name)
+ mass = G4ParticleTable.GetParticleTable().FindParticle(vertex.particle_name).GetPDGMass()
+ total_energy = vertex.ke*MeV + mass
+ self.particle_gun.SetParticleEnergy(total_energy)
+ self.particle_gun.SetParticlePosition(G4ThreeVector(*vertex.pos)*mm)
+ self.particle_gun.SetParticleMomentumDirection(G4ThreeVector(*vertex.dir).unit())
+ self.particle_gun.SetParticleTime(vertex.t0*ns)
+
+ if vertex.pol is not None:
+ self.particle_gun.SetParticlePolarization(G4ThreeVector(*vertex.pol).unit())
+
+ self.tracking_action.Clear()
+ gRunManager.BeamOn(1)
+
+ if photons is None:
+ photons = self._extract_photons_from_tracking_action()
+ else:
+ photons += self._extract_photons_from_tracking_action()
+ finally:
+ if mute:
+ g4unmute()
return photons