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 10.4)


  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     26 /// \file eventgenerator/particleGun/src/PrimaryGeneratorAction2.cc
 27 /// \brief Implementation of the PrimaryGenera     27 /// \brief Implementation of the PrimaryGeneratorAction2 class
 28 //                                                 28 //
 29 //                                                 29 //
 30 //                                             <<  30 // $Id: PrimaryGeneratorAction2.cc 99721 2016-10-03 08:11:44Z gcosmo $
                                                   >>  31 // 
 31 //....oooOO0OOooo........oooOO0OOooo........oo     32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 32 //....oooOO0OOooo........oooOO0OOooo........oo     33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 33                                                    34 
 34 #include "PrimaryGeneratorAction2.hh"              35 #include "PrimaryGeneratorAction2.hh"
 35                                                << 
 36 #include "PrimaryGeneratorAction.hh"               36 #include "PrimaryGeneratorAction.hh"
 37                                                    37 
 38 #include "G4Event.hh"                              38 #include "G4Event.hh"
 39 #include "G4ParticleDefinition.hh"             << 
 40 #include "G4ParticleGun.hh"                        39 #include "G4ParticleGun.hh"
 41 #include "G4ParticleTable.hh"                      40 #include "G4ParticleTable.hh"
                                                   >>  41 #include "G4ParticleDefinition.hh"
 42 #include "G4PhysicalConstants.hh"                  42 #include "G4PhysicalConstants.hh"
 43 #include "G4SystemOfUnits.hh"                      43 #include "G4SystemOfUnits.hh"
 44 #include "Randomize.hh"                            44 #include "Randomize.hh"
 45                                                    45 
 46 //....oooOO0OOooo........oooOO0OOooo........oo     46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 47                                                    47 
 48 PrimaryGeneratorAction2::PrimaryGeneratorActio <<  48 PrimaryGeneratorAction2::PrimaryGeneratorAction2(G4ParticleGun* gun)
 49 {                                              <<  49 : fParticleGun(gun)
                                                   >>  50 {    
 50   // energy distribution                           51   // energy distribution
 51   //                                               52   //
 52   InitFunction();                                  53   InitFunction();
 53 }                                                  54 }
 54                                                    55 
 55 //....oooOO0OOooo........oooOO0OOooo........oo     56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 56                                                    57 
                                                   >>  58 PrimaryGeneratorAction2::~PrimaryGeneratorAction2()
                                                   >>  59 { }
                                                   >>  60 
                                                   >>  61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >>  62 
 57 void PrimaryGeneratorAction2::GeneratePrimarie     63 void PrimaryGeneratorAction2::GeneratePrimaries(G4Event* anEvent)
 58 {                                                  64 {
 59   // uniform solid angle                       <<  65   //cosAlpha uniform in [cos(0), cos(pi)]
 60   G4double cosAlpha = 1. - 2 * G4UniformRand() <<  66   G4double cosAlpha = 1. - 2*G4UniformRand();
 61   G4double sinAlpha = std::sqrt(1. - cosAlpha  <<  67   G4double sinAlpha = std::sqrt(1. - cosAlpha*cosAlpha);
 62   G4double psi = twopi * G4UniformRand();  //  <<  68   G4double psi      = twopi*G4UniformRand();  //psi uniform in [0, 2*pi]  
 63   G4ThreeVector dir(sinAlpha * std::cos(psi),  <<  69   G4ThreeVector dir(sinAlpha*std::cos(psi),sinAlpha*std::sin(psi),cosAlpha);
 64                                                    70 
 65   fParticleGun->SetParticleMomentumDirection(d     71   fParticleGun->SetParticleMomentumDirection(dir);
 66                                                <<  72   
 67   // set energy from a tabulated distribution  <<  73   //set energy from a tabulated distribution
 68   //                                               74   //
 69   // G4double energy = RejectAccept();         <<  75   //G4double energy = RejectAccept();
 70   G4double energy = InverseCumul();            <<  76   G4double energy = InverseCumul();  
 71   fParticleGun->SetParticleEnergy(energy);     <<  77   fParticleGun->SetParticleEnergy(energy);    
 72                                                    78 
 73   // create vertex                             <<  79   //create vertex
 74   //                                           <<  80   //   
 75   fParticleGun->GeneratePrimaryVertex(anEvent)     81   fParticleGun->GeneratePrimaryVertex(anEvent);
 76 }                                                  82 }
 77 //....oooOO0OOooo........oooOO0OOooo........oo     83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 78                                                    84 
 79 void PrimaryGeneratorAction2::InitFunction()       85 void PrimaryGeneratorAction2::InitFunction()
 80 {                                                  86 {
 81   // tabulated function                        <<  87   // tabulated function 
 82   // Y is assumed positive, linear per segment     88   // Y is assumed positive, linear per segment, continuous
 83   //                                               89   //
 84   fNPoints = 16;                                   90   fNPoints = 16;
 85   const G4double xx[] = {37 * keV,  39 * keV,  <<  91   const G4double xx[] = 
 86                          71 * keV,  75 * keV,  <<  92     { 37*keV, 39*keV, 45*keV,  51*keV,  57*keV,  69*keV,  71*keV,  75*keV, 
 87                          125 * keV, 145 * keV, <<  93       83*keV, 91*keV, 97*keV, 107*keV, 125*keV, 145*keV, 159*keV, 160*keV }; 
 88                                                <<  94       
 89   const G4double yy[] = {0.000,  0.077,  0.380 <<  95   const G4double yy[] =
 90                          17.644, 18.518, 17.77 <<  96     { 0.000,  0.077,  0.380,  2.044, 5.535, 15.077, 12.443, 14.766,
 91                                                <<  97      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 <<  98   
                                                   >>  99   //copy arrays in std::vector and compute fMax
 93   //                                              100   //
 94   fX.resize(fNPoints);                         << 101   fX.resize(fNPoints); fY.resize(fNPoints);
 95   fY.resize(fNPoints);                         << 
 96   fYmax = 0.;                                     102   fYmax = 0.;
 97   for (G4int j = 0; j < fNPoints; j++) {       << 103   for (G4int j=0; j<fNPoints; j++) {
 98     fX[j] = xx[j];                             << 104     fX[j] = xx[j]; fY[j] = yy[j];
 99     fY[j] = yy[j];                             << 
100     if (fYmax < fY[j]) fYmax = fY[j];             105     if (fYmax < fY[j]) fYmax = fY[j];
101   };                                              106   };
102                                                << 107      
103   // compute slopes                            << 108   //compute slopes
104   //                                              109   //
105   fSlp.resize(fNPoints);                          110   fSlp.resize(fNPoints);
106   for (G4int j = 0; j < fNPoints - 1; j++) {   << 111   for (G4int j=0; j<fNPoints-1; j++) { 
107     fSlp[j] = (fY[j + 1] - fY[j]) / (fX[j + 1] << 112     fSlp[j] = (fY[j+1] - fY[j])/(fX[j+1] - fX[j]);
108   };                                              113   };
109                                                << 114   
110   // compute cumulative function               << 115   //compute cumulative function
111   //                                              116   //
112   fYC.resize(fNPoints);                        << 117   fYC.resize(fNPoints);  
113   fYC[0] = 0.;                                    118   fYC[0] = 0.;
114   for (G4int j = 1; j < fNPoints; j++) {       << 119   for (G4int j=1; j<fNPoints; j++) {
115     fYC[j] = fYC[j - 1] + 0.5 * (fY[j] + fY[j  << 120     fYC[j] = fYC[j-1] + 0.5*(fY[j] + fY[j-1])*(fX[j] - fX[j-1]);
116   };                                           << 121   };     
117 }                                                 122 }
118                                                   123 
119 //....oooOO0OOooo........oooOO0OOooo........oo    124 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
120                                                   125 
121 G4double PrimaryGeneratorAction2::RejectAccept    126 G4double PrimaryGeneratorAction2::RejectAccept()
122 {                                                 127 {
123   // tabulated function                        << 128   // tabulated function 
124   // Y is assumed positive, linear per segment    129   // Y is assumed positive, linear per segment, continuous
125   // (see Particle Data Group: pdg.lbl.gov --> << 130   //  
126   //                                           << 
127   G4double Xrndm = 0., Yrndm = 0., Yinter = -1    131   G4double Xrndm = 0., Yrndm = 0., Yinter = -1.;
128                                                << 132   
129   while (Yrndm > Yinter) {                        133   while (Yrndm > Yinter) {
130     // choose a point randomly                 << 134     //choose a point randomly
131     Xrndm = fX[0] + G4UniformRand() * (fX[fNPo << 135     Xrndm = fX[0] + G4UniformRand()*(fX[fNPoints-1] - fX[0]);
132     Yrndm = G4UniformRand() * fYmax;           << 136     Yrndm = G4UniformRand()*fYmax;
133     // find bin                                << 137     //find bin
134     G4int j = fNPoints - 2;                    << 138     G4int j = fNPoints-2;
135     while ((fX[j] > Xrndm) && (j > 0))         << 139     while ((fX[j] > Xrndm) && (j > 0)) j--;
136       j--;                                     << 140     //compute Y(x_rndm) by linear interpolation
137     // compute Y(x_rndm) by linear interpolati << 141     Yinter = fY[j] + fSlp[j]*(Xrndm - fX[j]);
138     Yinter = fY[j] + fSlp[j] * (Xrndm - fX[j]) << 
139   };                                              142   };
140   return Xrndm;                                   143   return Xrndm;
141 }                                                 144 }
142                                                   145 
143 //....oooOO0OOooo........oooOO0OOooo........oo    146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
144                                                   147 
145 G4double PrimaryGeneratorAction2::InverseCumul    148 G4double PrimaryGeneratorAction2::InverseCumul()
146 {                                                 149 {
147   // tabulated function                           150   // tabulated function
148   // Y is assumed positive, linear per segment << 151   // Y is assumed positive, linear per segment, continuous 
149   // --> cumulative function is second order p    152   // --> cumulative function is second order polynomial
150   // (see Particle Data Group: pdg.lbl.gov --> << 153   
151                                                << 154   //choose y randomly
152   // choose y randomly                         << 155   G4double Yrndm = G4UniformRand()*fYC[fNPoints-1];
153   G4double Yrndm = G4UniformRand() * fYC[fNPoi << 156   //find bin
154   // find bin                                  << 157   G4int j = fNPoints-2;
155   G4int j = fNPoints - 2;                      << 158   while ((fYC[j] > Yrndm) && (j > 0)) j--;
156   while ((fYC[j] > Yrndm) && (j > 0))          << 159   //y_rndm --> x_rndm :  fYC(x) is second order polynomial
157     j--;                                       << 
158   // y_rndm --> x_rndm :  fYC(x) is second ord << 
159   G4double Xrndm = fX[j];                         160   G4double Xrndm = fX[j];
160   G4double a = fSlp[j];                           161   G4double a = fSlp[j];
161   if (a != 0.) {                                  162   if (a != 0.) {
162     G4double b = fY[j] / a, c = 2 * (Yrndm - f << 163     G4double b = fY[j]/a, c = 2*(Yrndm - fYC[j])/a;
163     G4double delta = b * b + c;                << 164     G4double delta = b*b + c;
164     G4int sign = 1;                            << 165     G4int sign = 1; if (a < 0.) sign = -1;
165     if (a < 0.) sign = -1;                     << 166     Xrndm += sign*std::sqrt(delta) - b;    
166     Xrndm += sign * std::sqrt(delta) - b;      << 167   } else if (fY[j] > 0.) {
167   }                                            << 168     Xrndm += (Yrndm - fYC[j])/fY[j];
168   else if (fY[j] > 0.) {                       << 
169     Xrndm += (Yrndm - fYC[j]) / fY[j];         << 
170   };                                              169   };
171   return Xrndm;                                   170   return Xrndm;
172 }                                                 171 }
173                                                   172 
174 //....oooOO0OOooo........oooOO0OOooo........oo    173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
175                                                   174