Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/eventgenerator/particleGun/src/PrimaryGeneratorAction2.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /examples/extended/eventgenerator/particleGun/src/PrimaryGeneratorAction2.cc (Version 11.3.0) and /examples/extended/eventgenerator/particleGun/src/PrimaryGeneratorAction2.cc (Version 9.5)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 /// \file eventgenerator/particleGun/src/Prima << 
 27 /// \brief Implementation of the PrimaryGenera << 
 28 //                                                 26 //
 29 //                                             <<  27 // $Id: PrimaryGeneratorAction2.cc,v 1.3 2010-07-16 07:37:48 maire Exp $
 30 //                                             <<  28 // GEANT4 tag $Name: not supported by cvs2svn $
 31 //....oooOO0OOooo........oooOO0OOooo........oo <<  29 // 
 32 //....oooOO0OOooo........oooOO0OOooo........oo     30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >>  31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
 33                                                    32 
 34 #include "PrimaryGeneratorAction2.hh"              33 #include "PrimaryGeneratorAction2.hh"
 35                                                << 
 36 #include "PrimaryGeneratorAction.hh"               34 #include "PrimaryGeneratorAction.hh"
 37                                                    35 
 38 #include "G4Event.hh"                              36 #include "G4Event.hh"
 39 #include "G4ParticleDefinition.hh"             << 
 40 #include "G4ParticleGun.hh"                        37 #include "G4ParticleGun.hh"
 41 #include "G4ParticleTable.hh"                      38 #include "G4ParticleTable.hh"
 42 #include "G4PhysicalConstants.hh"              <<  39 #include "G4ParticleDefinition.hh"
 43 #include "G4SystemOfUnits.hh"                  << 
 44 #include "Randomize.hh"                            40 #include "Randomize.hh"
 45                                                    41 
 46 //....oooOO0OOooo........oooOO0OOooo........oo     42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 47                                                    43 
 48 PrimaryGeneratorAction2::PrimaryGeneratorActio <<  44 PrimaryGeneratorAction2::PrimaryGeneratorAction2(G4ParticleGun* gun)
 49 {                                              <<  45 : particleGun(gun)
                                                   >>  46 {    
 50   // energy distribution                           47   // energy distribution
 51   //                                               48   //
 52   InitFunction();                                  49   InitFunction();
 53 }                                                  50 }
 54                                                    51 
 55 //....oooOO0OOooo........oooOO0OOooo........oo     52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 56                                                    53 
 57 void PrimaryGeneratorAction2::GeneratePrimarie <<  54 PrimaryGeneratorAction2::~PrimaryGeneratorAction2()
 58 {                                              <<  55 { }
 59   // uniform solid angle                       << 
 60   G4double cosAlpha = 1. - 2 * G4UniformRand() << 
 61   G4double sinAlpha = std::sqrt(1. - cosAlpha  << 
 62   G4double psi = twopi * G4UniformRand();  //  << 
 63   G4ThreeVector dir(sinAlpha * std::cos(psi),  << 
 64                                                << 
 65   fParticleGun->SetParticleMomentumDirection(d << 
 66                                                    56 
 67   // set energy from a tabulated distribution  <<  57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 68   //                                           << 
 69   // G4double energy = RejectAccept();         << 
 70   G4double energy = InverseCumul();            << 
 71   fParticleGun->SetParticleEnergy(energy);     << 
 72                                                    58 
 73   // create vertex                             <<  59 void PrimaryGeneratorAction2::GeneratePrimaries(G4Event* anEvent)
 74   //                                           <<  60 {
 75   fParticleGun->GeneratePrimaryVertex(anEvent) <<  61   //cosAlpha uniform in [cos(0), cos(pi)]
                                                   >>  62   G4double cosAlpha = 1. - 2*G4UniformRand();
                                                   >>  63   G4double sinAlpha = std::sqrt(1. - cosAlpha*cosAlpha);
                                                   >>  64   G4double psi      = twopi*G4UniformRand();  //psi uniform in [0, 2*pi]  
                                                   >>  65   G4ThreeVector dir(sinAlpha*std::cos(psi),sinAlpha*std::sin(psi),cosAlpha);
                                                   >>  66 
                                                   >>  67   particleGun->SetParticleMomentumDirection(dir);
                                                   >>  68   
                                                   >>  69   //set energy from a tabulated distribution
                                                   >>  70   //
                                                   >>  71   //G4double energy = RejectAccept();
                                                   >>  72   G4double energy = InverseCumul();  
                                                   >>  73   particleGun->SetParticleEnergy(energy);    
                                                   >>  74 
                                                   >>  75   //create vertex
                                                   >>  76   //   
                                                   >>  77   particleGun->GeneratePrimaryVertex(anEvent);
 76 }                                                  78 }
 77 //....oooOO0OOooo........oooOO0OOooo........oo     79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 78                                                    80 
 79 void PrimaryGeneratorAction2::InitFunction()       81 void PrimaryGeneratorAction2::InitFunction()
 80 {                                                  82 {
 81   // tabulated function                        <<  83   // tabulated function 
 82   // Y is assumed positive, linear per segment <<  84   // f is assumed positive, linear per segment, continuous
 83   //                                               85   //
 84   fNPoints = 16;                               <<  86   nPoints = 16;
 85   const G4double xx[] = {37 * keV,  39 * keV,  <<  87   const G4double xx[] = 
 86                          71 * keV,  75 * keV,  <<  88     { 37*keV, 39*keV, 45*keV,  51*keV,  57*keV,  69*keV,  71*keV,  75*keV, 
 87                          125 * keV, 145 * keV, <<  89       83*keV, 91*keV, 97*keV, 107*keV, 125*keV, 145*keV, 159*keV, 160*keV }; 
 88                                                <<  90       
 89   const G4double yy[] = {0.000,  0.077,  0.380 <<  91   const G4double ff[] =
 90                          17.644, 18.518, 17.77 <<  92     { 0.000,  0.077,  0.380,  2.044, 5.535, 15.077, 12.443, 14.766,
 91                                                <<  93      17.644, 18.518, 17.772, 14.776, 8.372,  3.217,  0.194,  0.000 };
 92   // copy arrays in std::vector and compute fM <<  94   
 93   //                                           <<  95   //copy arrays in std::vector and compute fMax
 94   fX.resize(fNPoints);                         <<  96   //
 95   fY.resize(fNPoints);                         <<  97   x.resize(nPoints); f.resize(nPoints);
 96   fYmax = 0.;                                  <<  98   fMax = 0.;
 97   for (G4int j = 0; j < fNPoints; j++) {       <<  99   for (G4int j=0; j<nPoints; j++) {
 98     fX[j] = xx[j];                             << 100     x[j] = xx[j]; f[j] = ff[j];
 99     fY[j] = yy[j];                             << 101     if (fMax < f[j]) fMax = f[j];
100     if (fYmax < fY[j]) fYmax = fY[j];          << 
101   };                                              102   };
102                                                << 103      
103   // compute slopes                            << 104   //compute slopes
104   //                                              105   //
105   fSlp.resize(fNPoints);                       << 106   a.resize(nPoints);
106   for (G4int j = 0; j < fNPoints - 1; j++) {   << 107   for (G4int j=0; j<nPoints-1; j++) { 
107     fSlp[j] = (fY[j + 1] - fY[j]) / (fX[j + 1] << 108     a[j] = (f[j+1] - f[j])/(x[j+1] - x[j]);
108   };                                              109   };
109                                                << 110   
110   // compute cumulative function               << 111   //compute cumulative function
111   //                                              112   //
112   fYC.resize(fNPoints);                        << 113   Fc.resize(nPoints);  
113   fYC[0] = 0.;                                 << 114   Fc[0] = 0.;
114   for (G4int j = 1; j < fNPoints; j++) {       << 115   for (G4int j=1; j<nPoints; j++) {
115     fYC[j] = fYC[j - 1] + 0.5 * (fY[j] + fY[j  << 116     Fc[j] = Fc[j-1] + 0.5*(f[j] + f[j-1])*(x[j] - x[j-1]);
116   };                                           << 117   };     
117 }                                                 118 }
118                                                   119 
119 //....oooOO0OOooo........oooOO0OOooo........oo    120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
120                                                   121 
121 G4double PrimaryGeneratorAction2::RejectAccept    122 G4double PrimaryGeneratorAction2::RejectAccept()
122 {                                                 123 {
123   // tabulated function                        << 124   // tabulated function 
124   // Y is assumed positive, linear per segment << 125   // f is assumed positive, linear per segment, continuous
125   // (see Particle Data Group: pdg.lbl.gov --> << 126   //  
126   //                                           << 127   G4double x_rndm = 0., y_rndm = 0., f_inter = -1.;
127   G4double Xrndm = 0., Yrndm = 0., Yinter = -1 << 128   
128                                                << 129   while (y_rndm > f_inter) {
129   while (Yrndm > Yinter) {                     << 130     //choose a point randomly
130     // choose a point randomly                 << 131     x_rndm = x[0] + G4UniformRand()*(x[nPoints-1] - x[0]);
131     Xrndm = fX[0] + G4UniformRand() * (fX[fNPo << 132     y_rndm = G4UniformRand()*fMax;
132     Yrndm = G4UniformRand() * fYmax;           << 133     //find bin
133     // find bin                                << 134     G4int j = nPoints-2;
134     G4int j = fNPoints - 2;                    << 135     while ((x[j] > x_rndm) && (j > 0)) j--;
135     while ((fX[j] > Xrndm) && (j > 0))         << 136     //compute f(x_rndm) by linear interpolation
136       j--;                                     << 137     f_inter = f[j] + a[j]*(x_rndm - x[j]);
137     // compute Y(x_rndm) by linear interpolati << 
138     Yinter = fY[j] + fSlp[j] * (Xrndm - fX[j]) << 
139   };                                              138   };
140   return Xrndm;                                << 139   return x_rndm;
141 }                                                 140 }
142                                                   141 
143 //....oooOO0OOooo........oooOO0OOooo........oo    142 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
144                                                   143 
145 G4double PrimaryGeneratorAction2::InverseCumul    144 G4double PrimaryGeneratorAction2::InverseCumul()
146 {                                                 145 {
147   // tabulated function                           146   // tabulated function
148   // Y is assumed positive, linear per segment << 147   // f is assumed positive, linear per segment, continuous 
149   // --> cumulative function is second order p    148   // --> cumulative function is second order polynomial
150   // (see Particle Data Group: pdg.lbl.gov --> << 149   
151                                                << 150   //choose y randomly
152   // choose y randomly                         << 151   G4double y_rndm = G4UniformRand()*Fc[nPoints-1];
153   G4double Yrndm = G4UniformRand() * fYC[fNPoi << 152   //find bin
154   // find bin                                  << 153   G4int j = nPoints-2;
155   G4int j = fNPoints - 2;                      << 154   while ((Fc[j] > y_rndm) && (j > 0)) j--;
156   while ((fYC[j] > Yrndm) && (j > 0))          << 155   //y_rndm --> x_rndm :  Fc(x) is second order polynomial
157     j--;                                       << 156   G4double x_rndm = x[j];
158   // y_rndm --> x_rndm :  fYC(x) is second ord << 157   G4double aa = a[j];
159   G4double Xrndm = fX[j];                      << 158   if (aa != 0.) {
160   G4double a = fSlp[j];                        << 159     G4double b = f[j]/aa, c = 2*(y_rndm - Fc[j])/aa;
161   if (a != 0.) {                               << 160     G4double delta = b*b + c;
162     G4double b = fY[j] / a, c = 2 * (Yrndm - f << 161     G4int sign = 1; if (aa < 0.) sign = -1;
163     G4double delta = b * b + c;                << 162     x_rndm += sign*std::sqrt(delta) - b;    
164     G4int sign = 1;                            << 163   } else if (f[j] > 0.) {
165     if (a < 0.) sign = -1;                     << 164     x_rndm += (y_rndm - Fc[j])/f[j];
166     Xrndm += sign * std::sqrt(delta) - b;      << 
167   }                                            << 
168   else if (fY[j] > 0.) {                       << 
169     Xrndm += (Yrndm - fYC[j]) / fY[j];         << 
170   };                                              165   };
171   return Xrndm;                                << 166   return x_rndm;
172 }                                                 167 }
173                                                   168 
174 //....oooOO0OOooo........oooOO0OOooo........oo    169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
175                                                   170