Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions
G4eeTo3PiModel Class Reference

#include <G4eeTo3PiModel.hh>

Inheritance diagram for G4eeTo3PiModel:
G4Vee2hadrons

Public Member Functions

 G4eeTo3PiModel (G4eeCrossSections *)
 
virtual ~G4eeTo3PiModel ()
 
virtual G4double ThresholdEnergy () const
 
virtual G4double PeakEnergy () const
 
virtual G4double ComputeCrossSection (G4double) const
 
virtual G4PhysicsVectorPhysicsVector (G4double, G4double) const
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, G4double, const G4ThreeVector &)
 
- Public Member Functions inherited from G4Vee2hadrons
 G4Vee2hadrons ()
 
virtual ~G4Vee2hadrons ()
 
void SetLowEnergy (G4double val)
 
G4double LowEnergy () const
 
void SetHighEnergy (G4double val)
 
G4double HighEnergy () const
 

Detailed Description

Definition at line 59 of file G4eeTo3PiModel.hh.

Constructor & Destructor Documentation

G4eeTo3PiModel::G4eeTo3PiModel ( G4eeCrossSections cr)

Definition at line 66 of file G4eeTo3PiModel.cc.

References G4ParticleDefinition::GetPDGMass(), python.hepunit::MeV, G4PionPlus::PionPlus(), and G4PionZero::PionZero().

66  :
67  cross(cr)
68 {
69  massPi = G4PionPlus::PionPlus()->GetPDGMass();
70  massPi0 = G4PionZero::PionZero()->GetPDGMass();
71  massOm = 782.62*MeV;
72  massPhi = 1019.46*MeV;
73  gcash = 0.0;
74  gmax = 1.0;
75 }
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98
static G4PionZero * PionZero()
Definition: G4PionZero.cc:104
G4double GetPDGMass() const
G4eeTo3PiModel::~G4eeTo3PiModel ( )
virtual

Definition at line 79 of file G4eeTo3PiModel.cc.

80 {}

Member Function Documentation

G4double G4eeTo3PiModel::ComputeCrossSection ( G4double  e) const
virtual

Implements G4Vee2hadrons.

Definition at line 100 of file G4eeTo3PiModel.cc.

References G4eeCrossSections::CrossSection3pi(), G4Vee2hadrons::HighEnergy(), and G4INCL::Math::min().

101 {
102  G4double ee = std::min(HighEnergy(),e);
103  return cross->CrossSection3pi(ee);
104 }
G4double CrossSection3pi(G4double)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double HighEnergy() const
double G4double
Definition: G4Types.hh:76
G4double G4eeTo3PiModel::PeakEnergy ( ) const
virtual

Implements G4Vee2hadrons.

Definition at line 91 of file G4eeTo3PiModel.cc.

References G4Vee2hadrons::HighEnergy().

92 {
93  G4double e = massOm;
94  if(HighEnergy() > massPhi) e = massPhi;
95  return e;
96 }
G4double HighEnergy() const
double G4double
Definition: G4Types.hh:76
G4PhysicsVector * G4eeTo3PiModel::PhysicsVector ( G4double  emin,
G4double  emax 
) const
virtual

Implements G4Vee2hadrons.

Definition at line 108 of file G4eeTo3PiModel.cc.

References G4INCL::Math::max(), python.hepunit::MeV, G4PhysicsVector::SetSpline(), ThresholdEnergy(), and test::v.

110 {
111  G4double tmin = std::max(emin, ThresholdEnergy());
112  G4double tmax = std::max(tmin, emax);
113  G4int nbins = (G4int)((tmax - tmin)/(1.*MeV));
114  G4PhysicsVector* v = new G4PhysicsLinearVector(emin,emax,nbins);
115  v->SetSpline(true);
116  return v;
117 }
int G4int
Definition: G4Types.hh:78
void SetSpline(G4bool)
virtual G4double ThresholdEnergy() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
double G4double
Definition: G4Types.hh:76
void G4eeTo3PiModel::SampleSecondaries ( std::vector< G4DynamicParticle * > *  newp,
G4double  e,
const G4ThreeVector direction 
)
virtual

Implements G4Vee2hadrons.

Definition at line 121 of file G4eeTo3PiModel.cc.

References CLHEP::HepLorentzVector::boost(), CLHEP::HepLorentzVector::boostVector(), G4eeCrossSections::DpRho(), G4cout, G4endl, G4RandomDirection(), G4UniformRand, CLHEP::HepLorentzVector::m2(), G4PionMinus::PionMinus(), G4PionPlus::PionPlus(), G4PionZero::PionZero(), CLHEP::HepLorentzVector::rotateUz(), ThresholdEnergy(), CLHEP::Hep3Vector::x(), CLHEP::HepLorentzVector::x(), CLHEP::Hep3Vector::y(), CLHEP::HepLorentzVector::y(), CLHEP::Hep3Vector::z(), and CLHEP::HepLorentzVector::z().

123 {
124  if(e < ThresholdEnergy()) return;
125 
126  G4double x0 = massPi0/e;
127  G4double x1 = massPi/e;
128 
129  G4LorentzVector w0, w1, w2;
130  G4ThreeVector dir0, dir1;
131  G4double e0, p0, e2, p, gg, m01, m02, m12;
132 
133  // max pi0 energy
134  G4double edel = 0.5*e*(1.0 + x0*x0 - 4.0*x1*x1) - massPi0;
135 
136  do {
137  // pi0 sample
138  e0 = edel*G4UniformRand() + massPi0;
139  p0 = sqrt(e0 - massPi0*massPi0);
140  dir0 = G4RandomDirection();
141  w0 = G4LorentzVector(p0*dir0.x(),p0*dir0.y(),p0*dir0.z(),e0);
142 
143  // pi+pi- pair
144  w1 = G4LorentzVector(-p0*dir0.x(),-p0*dir0.y(),-p0*dir0.z(),e-e0);
145  G4ThreeVector bst = w1.boostVector();
146  e2 = 0.25*w1.m2();
147 
148  // pi+
149  p = sqrt(e2 - massPi*massPi);
150  dir1 = G4RandomDirection();
151  w2 = G4LorentzVector(p*dir1.x(),p*dir1.y(),p*dir1.z(),sqrt(e2));
152  w2.boost(bst);
153  G4double px2 = w2.x();
154  G4double py2 = w2.y();
155  G4double pz2 = w2.z();
156 
157  // pi-
158  w1 -= w2;
159  G4double px1 = w1.x();
160  G4double py1 = w1.y();
161  G4double pz1 = w1.z();
162 
163  m01 = w0*w1;
164  m02 = w0*w2;
165  m12 = w1*w2;
166 
167  G4double px = py1*pz2 - py2*pz1;
168  G4double py = pz1*px2 - pz2*px1;
169  G4double pz = px1*py2 - px2*py1;
170 
171  gg = (px*px + py*py + pz*pz)*
172  norm( 1.0/cross->DpRho(m01) + 1.0/cross->DpRho(m02)
173  + 1.0/cross->DpRho(m12) );
174  if(gg > gmax) {
175  G4cout << "G4eeTo3PiModel::SampleSecondaries WARNING matrix element g= "
176  << gg << " > " << gmax << " (majoranta)" << G4endl;
177  }
178  if(gg > gcash) gcash = gg;
179 
180  } while( gmax*G4UniformRand() > gg );
181 
182  w0.rotateUz(direction);
183  w1.rotateUz(direction);
184  w2.rotateUz(direction);
185 
186  // create G4DynamicParticle objects
187  G4DynamicParticle* dp0 =
189  G4DynamicParticle* dp1 =
191  G4DynamicParticle* dp2 =
193  newp->push_back(dp0);
194  newp->push_back(dp1);
195  newp->push_back(dp2);
196 }
Hep3Vector boostVector() const
double x() const
const char * p
Definition: xmltok.h:285
G4ThreeVector G4RandomDirection()
double z() const
std::complex< G4double > DpRho(G4double e)
#define G4UniformRand()
Definition: Randomize.hh:87
G4GLOB_DLL std::ostream G4cout
HepLorentzVector & boost(double, double, double)
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98
virtual G4double ThresholdEnergy() const
HepLorentzVector & rotateUz(const Hep3Vector &)
static G4PionZero * PionZero()
Definition: G4PionZero.cc:104
double m2() const
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:98
double y() const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
CLHEP::HepLorentzVector G4LorentzVector
G4double G4eeTo3PiModel::ThresholdEnergy ( ) const
virtual

Implements G4Vee2hadrons.

Definition at line 84 of file G4eeTo3PiModel.cc.

References G4Vee2hadrons::LowEnergy(), and G4INCL::Math::max().

Referenced by PhysicsVector(), and SampleSecondaries().

85 {
86  return std::max(LowEnergy(),2.0*massPi + massPi0);
87 }
G4double LowEnergy() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments

The documentation for this class was generated from the following files: