DD4hep  1.36.0
Detector Description Toolkit for High Energy Physics
Geant4ParticleGenerator.cpp
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation
3 //--------------------------------------------------------------------------
4 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
5 // All rights reserved.
6 //
7 // For the licensing terms see $DD4hepINSTALL/LICENSE.
8 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
9 //
10 // Author : M.Frank
11 //
12 //==========================================================================
13 
14 // Framework include files
15 #include <DD4hep/Printout.h>
16 #include <DD4hep/InstanceCount.h>
17 #include <DDG4/Geant4Context.h>
18 #include <DDG4/Geant4Primary.h>
20 #include <DDG4/Geant4Random.h>
21 #include <CLHEP/Units/PhysicalConstants.h>
22 #include <CLHEP/Units/SystemOfUnits.h>
23 
24 // Geant4 include files
25 #include <G4ParticleTable.hh>
26 #include <G4ParticleDefinition.hh>
27 
28 // C/C++ include files
29 #include <stdexcept>
30 #include <cmath>
31 
32 using namespace dd4hep::sim;
33 
36  : Geant4GeneratorAction(ctxt, nam), m_direction(0,1,0), m_position(0,0,0), m_particle(0)
37 {
39  m_needsControl = true;
40  declareProperty("Particle", m_particleName = "e-");
41  declareProperty("Energy", m_energy = -1);
42  declareProperty("energy", m_energy = -1);
43  declareProperty("MomentumMin", m_momentumMin = 0.0);
44  declareProperty("MomentumMax", m_momentumMax = 50 * CLHEP::MeV);
45  declareProperty("Multiplicity", m_multiplicity = 1);
46  declareProperty("Mask", m_mask = 0);
47  declareProperty("Position", m_position = ROOT::Math::XYZVector(0.,0.,0.));
48  declareProperty("Direction", m_direction = ROOT::Math::XYZVector(1.,1.,1.));
49 }
50 
54 }
55 
57 void Geant4ParticleGenerator::getParticleDirection(int , ROOT::Math::XYZVector& , double& momentum) const {
59 }
60 
63  if (m_energy != -1) {
64  momentum = m_energy;
65  return;
66  }
67  Geant4Event& evt = context()->event();
68  Geant4Random& rnd = evt.random();
70  // We no longer set m_momentumMax to -1 so, not entirely sure a) this will still happen, b) actually work
71  momentum = m_momentumMin+(momentum-m_momentumMin)*rnd.rndm();
72  else
73  momentum = m_momentumMin+(m_momentumMax-m_momentumMin)*rnd.rndm();
74 }
75 
78 }
79 
81 void Geant4ParticleGenerator::getVertexPosition(ROOT::Math::XYZVector& ) const {
82 }
83 
87  if ( !prim ) {
88  warning("printInteraction: Bad primary event [NULL-Pointer].");
89  return;
90  }
91  Geant4PrimaryInteraction* inter = prim->get(mask);
92  if ( !inter ) {
93  warning("printInteraction: Bad interaction identifier 0x%08X [Unknown Mask].",mask);
94  return;
95  }
96  printInteraction(inter);
97 }
98 
101  int count = 0;
102  if ( !inter ) {
103  warning("printInteraction: Invalid interaction pointer [NULL-Pointer].");
104  return;
105  }
106  for(const auto& iv : inter->vertices ) {
107  for( Geant4Vertex* v : iv.second ){
108  print("+-> Interaction [%d] [%.3f , %.3f] GeV %s pos:(%.3f %.3f %.3f)[mm]",
109  count, m_momentumMin/CLHEP::GeV, m_momentumMax/CLHEP::GeV, m_particleName.c_str(),
110  v->x/CLHEP::mm, v->y/CLHEP::mm, v->z/CLHEP::mm);
111  ++count;
112  for ( int i : v->out ) {
113  Geant4ParticleHandle p = inter->particles[i];
114  p.dumpWithVertex(outputLevel(),name()," +->");
115  }
116  }
117  }
118 }
119 
122  typedef Geant4Particle Particle;
123 
124  if (0 == m_particle || m_particle->GetParticleName() != m_particleName.c_str()) {
125  G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
126  m_particle = particleTable->FindParticle(m_particleName);
127  if (0 == m_particle) {
128  except("Geant4ParticleGenerator: Bad particle type: %s!", m_particleName.c_str());
129  }
130  }
131  Geant4Event& evt = context()->event();
134  prim->add(m_mask, inter);
135 
136  Geant4Vertex* vtx = new Geant4Vertex();
137  int multiplicity = m_multiplicity;
138  ROOT::Math::XYZVector unit_direction, position = m_position;
139  getVertexPosition(position);
140  getParticleMultiplicity(multiplicity);
141  vtx->mask = m_mask;
142  vtx->x = position.X();
143  vtx->y = position.Y();
144  vtx->z = position.Z();
145  inter->vertices[m_mask].emplace_back( vtx );
146  for(int i=0; i<m_multiplicity; ++i) {
147  double momentum = 0.0;
148  ROOT::Math::XYZVector direction = m_direction;
149  Particle* p = new Particle();
150  getParticleDirection(i, direction, momentum);
151  unit_direction = direction.unit();
152  p->id = inter->nextPID();
153  p->status |= G4PARTICLE_GEN_STABLE;
154  p->mask = m_mask;
155  p->pdgID = m_particle->GetPDGEncoding();
156 
157  p->psx = unit_direction.X()*momentum;
158  p->psy = unit_direction.Y()*momentum;
159  p->psz = unit_direction.Z()*momentum;
160  p->mass = m_particle->GetPDGMass();
161  p->charge = 3 * m_particle->GetPDGCharge();
162  // Optical photons must have a defined polarization; assign a random one
163  // perpendicular to the momentum direction (physical requirement for Geant4 optics).
164  if ( m_particle->GetParticleName() == "opticalphoton" ) {
165  if ( momentum == 0.0 ) {
166  except("Geant4ParticleGenerator: Cannot assign polarization to optical photon with zero momentum!");
167  }
168  // Build two unit vectors orthogonal to the photon direction using Gram-Schmidt.
169  ROOT::Math::XYZVector e1, e2;
170  if ( std::fabs(unit_direction.X()) < 0.9 )
171  e1 = ROOT::Math::XYZVector(1, 0, 0);
172  else
173  e1 = ROOT::Math::XYZVector(0, 1, 0);
174  e2 = unit_direction.Cross(e1).unit();
175  e1 = e2.Cross(unit_direction).unit(); // normalize defensively
176  Geant4Random& rnd = evt.random();
177  double angle = CLHEP::twopi * rnd.rndm();
178  ROOT::Math::XYZVector pol = (std::cos(angle)*e1 + std::sin(angle)*e2).unit();
179  p->spin[0] = pol.X();
180  p->spin[1] = pol.Y();
181  p->spin[2] = pol.Z();
182  }
183  else {
184  p->spin[0] = 0;
185  p->spin[1] = 0;
186  p->spin[2] = 0;
187  }
188  p->colorFlow[0] = 0;
189  p->colorFlow[1] = 0;
190  p->vsx = vtx->x;
191  p->vsy = vtx->y;
192  p->vsz = vtx->z;
193  //fg: do not set the endpoint to the start point of the particle
194  // p->vex = vtx->x;
195  // p->vey = vtx->y;
196  // p->vez = vtx->z;
197  inter->particles.emplace(p->id,p);
198  vtx->out.insert(p->id);
199  printout(INFO,name(),"Particle [%d] %-12s Mom:%.3f GeV vertex:(%6.3f %6.3f %6.3f)[mm] direction:(%6.3f %6.3f %6.3f)",
200  p->id, m_particleName.c_str(), momentum/CLHEP::GeV,
201  vtx->x/CLHEP::mm, vtx->y/CLHEP::mm, vtx->z/CLHEP::mm,
202  direction.X(), direction.Y(), direction.Z());
203  }
204 }
dd4hep::sim::Geant4ParticleGenerator::m_multiplicity
int m_multiplicity
Property: Desired multiplicity of the particles to be shot.
Definition: Geant4ParticleGenerator.h:56
dd4hep::sim::Geant4ParticleGenerator::~Geant4ParticleGenerator
virtual ~Geant4ParticleGenerator()
Default destructor.
Definition: Geant4ParticleGenerator.cpp:52
dd4hep::sim::Geant4PrimaryEvent
Class modelling a complete primary event with multiple interactions.
Definition: Geant4Primary.h:143
dd4hep::sim::Geant4Action::m_needsControl
bool m_needsControl
Default property: Flag to create control instance.
Definition: Geant4Action.h:123
dd4hep::sim::Geant4Random::rndm
double rndm(int i=0)
Create flat distributed random numbers in the interval ]0,1].
Definition: Geant4Random.cpp:268
dd4hep::sim::G4PARTICLE_GEN_STABLE
@ G4PARTICLE_GEN_STABLE
Definition: Geant4Particle.h:72
dd4hep::sim::Geant4Vertex::y
double y
Definition: Geant4Vertex.h:53
v
View * v
Definition: MultiView.cpp:28
dd4hep::sim::Geant4ParticleGenerator::m_mask
int m_mask
Property: User mask passed to all particles in the generated interaction.
Definition: Geant4ParticleGenerator.h:58
dd4hep::sim::Geant4ParticleHandle::dumpWithVertex
void dumpWithVertex(int level, const std::string &src, const char *tag) const
Output type 3:+++ "tag" ID: 0 e- status:00000014 type: 11 Vertex:(+0.00e+00,+0.00e+00,...
Definition: Geant4Particle.cpp:304
Geant4ParticleGenerator.h
dd4hep::sim::Geant4ParticleGenerator::Geant4ParticleGenerator
Geant4ParticleGenerator(Geant4Context *context, const std::string &name)
Standard constructor.
Definition: Geant4ParticleGenerator.cpp:35
dd4hep::sim::Geant4PrimaryInteraction
Class modelling a single interaction with multiple primary vertices and particles.
Definition: Geant4Primary.h:95
dd4hep::sim::Geant4Vertex::mask
int mask
Vertex mask to associate particles from collision.
Definition: Geant4Vertex.h:51
dd4hep::sim::Geant4PrimaryInteraction::vertices
VertexMap vertices
The map of primary vertices for the particles.
Definition: Geant4Primary.h:110
dd4hep::sim::Geant4ParticleGenerator::m_momentumMin
double m_momentumMin
Property: Minimal momentum value.
Definition: Geant4ParticleGenerator.h:52
dd4hep::InstanceCount::increment
static void increment(T *)
Increment count according to type information.
Definition: InstanceCount.h:98
dd4hep::sim::Geant4ParticleGenerator::getParticleMultiplicity
virtual void getParticleMultiplicity(int &multiplicity) const
Particle modification. Caller presets defaults to: (multiplicity=m_multiplicity)
Definition: Geant4ParticleGenerator.cpp:77
dd4hep::sim::Geant4PrimaryInteraction::particles
ParticleMap particles
The map of particles participating in this primary interaction.
Definition: Geant4Primary.h:112
dd4hep::sim::Geant4Context::event
Geant4Event & event() const
Access the geant4 event – valid only between BeginEvent() and EndEvent()!
Definition: Geant4Context.cpp:84
dd4hep::sim::Geant4Event::random
Geant4Random & random() const
Access the random number generator.
Definition: Geant4Context.h:137
dd4hep::sim::Geant4Action::warning
void warning(const char *fmt,...) const
Support of warning messages.
Definition: Geant4Action.cpp:223
dd4hep::sim::Geant4ParticleGenerator::m_energy
double m_energy
Property: Fixed momentum value, overwrites momentumMin and momentumMax if set.
Definition: Geant4ParticleGenerator.h:50
dd4hep::sim::Geant4Event::extension
T * extension(bool alert=true)
Access to type safe extension object. Exception is thrown if the object is invalid.
Definition: Geant4Context.h:151
dd4hep::sim::Geant4Action::except
void except(const char *fmt,...) const
Support of exceptions: Print fatal message and throw runtime_error.
Definition: Geant4Action.cpp:256
dd4hep::sim::Geant4ParticleGenerator::m_particle
G4ParticleDefinition * m_particle
Pointer to geant4 particle definition.
Definition: Geant4ParticleGenerator.h:48
Geant4Random.h
dd4hep::sim::Geant4ParticleGenerator::m_direction
ROOT::Math::XYZVector m_direction
Property: Shooting direction of the gun.
Definition: Geant4ParticleGenerator.h:42
dd4hep::sim::Geant4ParticleGenerator::getVertexPosition
virtual void getVertexPosition(ROOT::Math::XYZVector &position) const
Particle's vertex modification. Caller presets defaults to: (multiplicity=m_multiplicity)
Definition: Geant4ParticleGenerator.cpp:81
dd4hep::sim::Geant4ParticleGenerator::getParticleMomentumUniform
void getParticleMomentumUniform(double &momentum) const
Uniform particle momentum.
Definition: Geant4ParticleGenerator.cpp:62
dd4hep::sim::Geant4Vertex::x
double x
Vertex data.
Definition: Geant4Vertex.h:53
dd4hep::sim::Geant4ParticleGenerator::operator()
virtual void operator()(G4Event *event) override
Callback to generate primary particles.
Definition: Geant4ParticleGenerator.cpp:121
dd4hep::sim::Geant4ParticleGenerator::m_position
ROOT::Math::XYZVector m_position
Property: Position of the gun in space.
Definition: Geant4ParticleGenerator.h:44
dd4hep::sim::Geant4ParticleGenerator::m_momentumMax
double m_momentumMax
Property: Maximal momentum value.
Definition: Geant4ParticleGenerator.h:54
dd4hep::sim::Geant4Action::declareProperty
Geant4Action & declareProperty(const std::string &nam, T &val)
Declare property.
Definition: Geant4Action.h:366
dd4hep::InstanceCount::decrement
static void decrement(T *)
Decrement count according to type information.
Definition: InstanceCount.h:102
dd4hep::sim::Geant4GeneratorAction
Concrete implementation of the Geant4 generator action base class.
Definition: Geant4GeneratorAction.h:47
dd4hep::sim::Geant4Random
Mini interface to THE random generator of the application.
Definition: Geant4Random.h:59
dd4hep::sim::Geant4Action::name
const std::string & name() const
Access name of the action.
Definition: Geant4Action.h:280
dd4hep::sim::Geant4Action::outputLevel
PrintLevel outputLevel() const
Access the output level.
Definition: Geant4Action.h:296
dd4hep::sim::Geant4Vertex::out
Particles out
The list of outgoing particles.
Definition: Geant4Vertex.h:55
dd4hep::sim::Geant4Action::print
void print(const char *fmt,...) const
Support for messages with variable output level using output level.
Definition: Geant4Action.cpp:144
dd4hep::sim
Namespace for the Geant4 based simulation part of the AIDA detector description toolkit.
Definition: EDM4hepFileReader.cpp:46
dd4hep::sim::Geant4ParticleGenerator::m_particleName
std::string m_particleName
Property: Particle name.
Definition: Geant4ParticleGenerator.h:46
Geant4Primary.h
dd4hep::sim::Geant4ParticleHandle
Data structure to access derived MC particle information.
Definition: Geant4Particle.h:182
dd4hep::sim::Geant4Vertex::z
double z
Definition: Geant4Vertex.h:53
dd4hep::sim::Geant4Particle
Data structure to store the MC particle information.
Definition: Geant4Particle.h:104
dd4hep::sim::Geant4Vertex
Data structure to store the MC vertex information.
Definition: Geant4Vertex.h:45
InstanceCount.h
dd4hep::sim::Geant4ParticleGenerator::getParticleDirection
virtual void getParticleDirection(int num, ROOT::Math::XYZVector &direction, double &momentum) const
Particle modification. Caller presets defaults to: ( direction = m_direction, momentum = m_energy)
Definition: Geant4ParticleGenerator.cpp:57
dd4hep::sim::Geant4ParticleGenerator::printInteraction
virtual void printInteraction(int mask) const
Print single particle interaction identified by its mask.
Definition: Geant4ParticleGenerator.cpp:85
dd4hep::sim::Geant4Event
User event context for DDG4.
Definition: Geant4Context.h:121
Printout.h
Geant4Context.h
dd4hep::sim::Geant4PrimaryEvent::add
void add(int id, Geant4PrimaryInteraction *interaction)
Add a new interaction object to the event.
Definition: Geant4Primary.cpp:92
dd4hep::sim::Geant4Context
Generic context to extend user, run and event information.
Definition: Geant4Context.h:201
dd4hep::sim::Geant4Action::context
Geant4Context * context() const
Access the context.
Definition: Geant4Action.h:270
dd4hep::sim::Geant4PrimaryEvent::get
Geant4PrimaryInteraction * get(int id) const
Retrieve an interaction by its ID.
Definition: Geant4Primary.cpp:107