Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4INCLPhaseSpaceGenerator.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // INCL++ intra-nuclear cascade model
27 // Alain Boudard, CEA-Saclay, France
28 // Joseph Cugnon, University of Liege, Belgium
29 // Jean-Christophe David, CEA-Saclay, France
30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31 // Sylvie Leray, CEA-Saclay, France
32 // Davide Mancusi, CEA-Saclay, France
33 //
34 #define INCLXX_IN_GEANT4_MODE 1
35 
36 #include "globals.hh"
37 
41 
42 namespace G4INCL {
43 
44  namespace {
45  G4ThreadLocal IPhaseSpaceGenerator *thePhaseSpaceGenerator;
46 
47  G4ThreadLocal Particle *biasMe;
48 
55  void bias(ParticleList &particles, const ThreeVector &pInVec, const G4double slope) {
56  const G4double pIn = pInVec.mag();
57  const ThreeVector collisionAxis = pInVec/pIn;
58  const ThreeVector pMomVec = biasMe->getMomentum();
59  const G4double pMom = pMomVec.mag();
60  const G4double pMomCosAng = pMomVec.dot(collisionAxis)/pMom;
61  const G4double pMomAng = Math::arcCos(pMomCosAng);
62 
63  // compute the target angle for the biasing
64  // it is drawn from a exp(Bt) distribution
65  const G4double cosAngSlope = 2e-6 * slope * pIn * pMom;
66  const G4double cosAng = 1. + std::log(1. - Random::shoot()*(1.-std::exp(-2.*cosAngSlope)))/cosAngSlope;
67  const G4double ang = Math::arcCos(cosAng);
68 
69  // compute the rotation angle
70  const G4double rotationAngle = ang - pMomAng;
71 
72  // generate the rotation axis; it is perpendicular to collisionAxis and
73  // pMomVec
74  ThreeVector rotationAxis;
75  if(pMomAng>1E-10) {
76  rotationAxis = collisionAxis.vector(pMomVec);
77  const G4double axisLength = rotationAxis.mag();
78  const G4double oneOverLength = 1./axisLength;
79  rotationAxis *= oneOverLength;
80  } else {
81  // need to jump through some hoops if collisionAxis is nearly aligned
82  // with pMomVec
83  rotationAxis = collisionAxis.anyOrthogonal();
84  }
85 
86  // apply the rotation
87  particles.rotateMomentum(rotationAngle, rotationAxis);
88  }
89 
90  }
91 
92  namespace PhaseSpaceGenerator {
93  void generate(const G4double sqrtS, ParticleList &particles) {
94  return thePhaseSpaceGenerator->generate(sqrtS, particles);
95  }
96 
97  void generateBiased(const G4double sqrtS, ParticleList &particles, const size_t index, const G4double slope) {
98 // assert(index<particles.size());
99  // store the incoming momentum of particle[index]; it will be used to
100  // compute t when biasing
101  biasMe = particles[index];
102  const ThreeVector pInVec = biasMe->getMomentum();
103  generate(sqrtS, particles);
104  bias(particles, pInVec, slope);
105  }
106 
108  thePhaseSpaceGenerator = g;
109  }
110 
112  return thePhaseSpaceGenerator;
113  }
114 
116  delete thePhaseSpaceGenerator;
117  thePhaseSpaceGenerator = NULL;
118  }
119 
120  void initialize(Config const * const theConfig) {
122  if(psg==RauboldLynchType)
124  else if(psg==KopylovType)
126  else
128  }
129  }
130 }
G4double arcCos(const G4double x)
Calculates arccos with some tolerance on illegal arguments.
Generate momenta using the RauboldLynch method.
static constexpr double g
Definition: G4SIunits.hh:183
#define G4ThreadLocal
Definition: tls.hh:89
Abstract interface for the phase-space generators.
void initialize(Config const *const theConfig)
void generateBiased(const G4double sqrtS, ParticleList &particles, const size_t index, const G4double slope)
Generate a biased event in the CM system.
PhaseSpaceGeneratorType getPhaseSpaceGeneratorType() const
Get the phase-space-generator type.
void generate(const G4double sqrtS, ParticleList &particles)
Generate an event in the CM system.
G4double shoot()
Definition: G4INCLRandom.cc:93
Generate momenta using the Kopylov method.
double G4double
Definition: G4Types.hh:76
void setPhaseSpaceGenerator(IPhaseSpaceGenerator *g)
IPhaseSpaceGenerator * getPhaseSpaceGenerator()