Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/coherent_elastic/src/G4LEpp.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 /processes/hadronic/models/coherent_elastic/src/G4LEpp.cc (Version 11.3.0) and /processes/hadronic/models/coherent_elastic/src/G4LEpp.cc (Version 9.4.p3)


  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                                                    26 
 27  // G4 Low energy model: n-n or p-p scattering     27  // G4 Low energy model: n-n or p-p scattering
 28  // F.W. Jones, L.G. Greeniaus, H.P. Wellisch      28  // F.W. Jones, L.G. Greeniaus, H.P. Wellisch
 29                                                    29 
 30 // FWJ 27-AUG-2010: extended Coulomb-suppresse << 
 31                                                    30 
 32 #include "G4LEpp.hh"                               31 #include "G4LEpp.hh"
 33 #include "G4PhysicalConstants.hh"              << 
 34 #include "G4SystemOfUnits.hh"                  << 
 35 #include "Randomize.hh"                            32 #include "Randomize.hh"
 36 #include "G4ios.hh"                                33 #include "G4ios.hh"
 37                                                    34 
 38 // Initialization of static data arrays:           35 // Initialization of static data arrays:
 39 #include "G4LEppData.hh"                           36 #include "G4LEppData.hh"
 40                                                    37 
 41 #include "G4PhysicsModelCatalog.hh"            <<  38 G4LEpp::G4LEpp():G4HadronicInteraction("G4LEpp")
                                                   >>  39 {
                                                   >>  40   //    theParticleChange.SetNumberOfSecondaries(1);
                                                   >>  41   //    SetMinEnergy(10.*MeV);
                                                   >>  42   //    SetMaxEnergy(1200.*MeV);
 42                                                    43 
                                                   >>  44   SetCoulombEffects(0);
 43                                                    45 
 44 G4LEpp::G4LEpp():G4HadronElastic("G4LEpp")     << 
 45 {                                              << 
 46   secID = G4PhysicsModelCatalog::GetModelID( " << 
 47   SetMinEnergy(0.);                                46   SetMinEnergy(0.);
 48   SetMaxEnergy(5.*GeV);                        <<  47   SetMaxEnergy(1200.*GeV);
 49 }                                                  48 }
 50                                                    49 
 51 G4LEpp::~G4LEpp()                                  50 G4LEpp::~G4LEpp()
 52 {}                                             <<  51 {
                                                   >>  52   //    theParticleChange.Clear();
                                                   >>  53 }
                                                   >>  54 
                                                   >>  55 
                                                   >>  56 void
                                                   >>  57 G4LEpp::SetCoulombEffects(G4int State)
                                                   >>  58 {
                                                   >>  59   if (State) {
                                                   >>  60     for(G4int i=0; i<NANGLE; i++)
                                                   >>  61     {
                                                   >>  62       sig[i] = SigCoul[i];
                                                   >>  63     }
                                                   >>  64     elab = ElabCoul;
                                                   >>  65   }
                                                   >>  66   else {
                                                   >>  67     for(G4int i=0; i<NANGLE; i++)
                                                   >>  68     {
                                                   >>  69       sig[i] = Sig[i];
                                                   >>  70     }
                                                   >>  71     elab = Elab;
                                                   >>  72   }
                                                   >>  73 }
                                                   >>  74 
 53                                                    75 
 54 G4HadFinalState*                                   76 G4HadFinalState*
 55 G4LEpp::ApplyYourself(const G4HadProjectile& a     77 G4LEpp::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleus)
 56 {                                                  78 {
 57     theParticleChange.Clear();                     79     theParticleChange.Clear();
 58     const G4HadProjectile* aParticle = &aTrack     80     const G4HadProjectile* aParticle = &aTrack;
 59                                                    81 
 60     G4double P = aParticle->GetTotalMomentum()     82     G4double P = aParticle->GetTotalMomentum();
 61     G4double Px = aParticle->Get4Momentum().x(     83     G4double Px = aParticle->Get4Momentum().x();
 62     G4double Py = aParticle->Get4Momentum().y(     84     G4double Py = aParticle->Get4Momentum().y();
 63     G4double Pz = aParticle->Get4Momentum().z(     85     G4double Pz = aParticle->Get4Momentum().z();
 64     G4double E  = aParticle->GetTotalEnergy(); <<  86     G4double ek = aParticle->GetKineticEnergy();
 65     G4ThreeVector theInitial = aParticle->Get4 <<  87     G4ThreeVector theInitial = aParticle->Get4Momentum().vect();
 66                                                    88 
 67     if (verboseLevel > 1) {                    <<  89 //    if (verboseLevel > 1) 
 68       G4double ek = aParticle->GetKineticEnerg <<  90          {
                                                   >>  91       G4double E = aParticle->GetTotalEnergy();
 69       G4double E0 = aParticle->GetDefinition()     92       G4double E0 = aParticle->GetDefinition()->GetPDGMass();
 70       G4double Q = aParticle->GetDefinition()-     93       G4double Q = aParticle->GetDefinition()->GetPDGCharge();
 71       G4int A = targetNucleus.GetA_asInt();    <<  94       G4double N = targetNucleus.GetN();
 72       G4int Z = targetNucleus.GetZ_asInt();    <<  95       G4double Z = targetNucleus.GetZ();
 73       G4cout << "G4LEpp:ApplyYourself: inciden     96       G4cout << "G4LEpp:ApplyYourself: incident particle: "
 74              << aParticle->GetDefinition()->Ge     97              << aParticle->GetDefinition()->GetParticleName() << G4endl;
 75       G4cout << "P = " << P/GeV << " GeV/c"        98       G4cout << "P = " << P/GeV << " GeV/c"
 76              << ", Px = " << Px/GeV << " GeV/c     99              << ", Px = " << Px/GeV << " GeV/c"
 77              << ", Py = " << Py/GeV << " GeV/c    100              << ", Py = " << Py/GeV << " GeV/c"
 78              << ", Pz = " << Pz/GeV << " GeV/c    101              << ", Pz = " << Pz/GeV << " GeV/c" << G4endl;
 79       G4cout << "E = " << E/GeV << " GeV"         102       G4cout << "E = " << E/GeV << " GeV"
 80              << ", kinetic energy = " << ek/Ge    103              << ", kinetic energy = " << ek/GeV << " GeV"
 81              << ", mass = " << E0/GeV << " GeV    104              << ", mass = " << E0/GeV << " GeV"
 82              << ", charge = " << Q << G4endl;     105              << ", charge = " << Q << G4endl;
 83       G4cout << "G4LEpp:ApplyYourself: materia    106       G4cout << "G4LEpp:ApplyYourself: material:" << G4endl;
 84       G4cout << "A = " << A                    << 107       G4cout << "A = " << N
 85              << ", Z = " << Z                     108              << ", Z = " << Z
 86              << ", atomic mass "                  109              << ", atomic mass " 
 87              <<  G4Proton::Proton()->GetPDGMas    110              <<  G4Proton::Proton()->GetPDGMass()/GeV << "GeV" 
 88              << G4endl;                           111              << G4endl;
 89       //                                          112       //
 90       // GHEISHA ADD operation to get total en    113       // GHEISHA ADD operation to get total energy, mass, charge
 91       //                                          114       //
 92       E += proton_mass_c2;                     << 115       E += G4Proton::Proton()->GetPDGMass();
 93       G4double E02 = E*E - P*P;                   116       G4double E02 = E*E - P*P;
 94       E0 = std::sqrt(std::fabs(E02));          << 117       E0 = std::sqrt(std::abs(E02));
 95       if (E02 < 0)E0 *= -1;                       118       if (E02 < 0)E0 *= -1;
 96       Q += Z;                                     119       Q += Z;
 97       G4cout << "G4LEpp:ApplyYourself: total:"    120       G4cout << "G4LEpp:ApplyYourself: total:" << G4endl;
 98       G4cout << "E = " << E/GeV << " GeV"         121       G4cout << "E = " << E/GeV << " GeV"
 99              << ", mass = " << E0/GeV << " GeV    122              << ", mass = " << E0/GeV << " GeV"
100              << ", charge = " << Q << G4endl;     123              << ", charge = " << Q << G4endl;
101     }                                             124     }
102     G4double t = SampleInvariantT(aParticle->G << 125 
103     G4double cost = 1.0 - 2*t/(P*P);           << 126     // Find energy bin
104     if(cost > 1.0) { cost = 1.0; }             << 127 
105     if(cost <-1.0) { cost =-1.0; }             << 128     G4int je1 = 0;
106     G4double sint = std::sqrt((1.0 - cost)*(1. << 129     G4int je2 = NENERGY - 1;
107     G4double phi = twopi*G4UniformRand();      << 130     ek = ek/GeV;
                                                   >> 131     do {
                                                   >> 132       G4int midBin = (je1 + je2)/2;
                                                   >> 133       if (ek < elab[midBin])
                                                   >> 134         je2 = midBin;
                                                   >> 135       else
                                                   >> 136         je1 = midBin;
                                                   >> 137     } while (je2 - je1 > 1); 
                                                   >> 138     //    G4int j;
                                                   >> 139     //std::abs(ek-elab[je1]) < std::abs(ek-elab[je2]) ? j = je1 : j = je2;
                                                   >> 140     G4double delab = elab[je2] - elab[je1];
                                                   >> 141 
                                                   >> 142     // Sample the angle
                                                   >> 143 
                                                   >> 144     G4float sample = G4UniformRand();
                                                   >> 145     G4int ke1 = 0;
                                                   >> 146     G4int ke2 = NANGLE - 1;
                                                   >> 147     G4double dsig = sig[je2][0] - sig[je1][0];
                                                   >> 148     G4double rc = dsig/delab;
                                                   >> 149     G4double b = sig[je1][0] - rc*elab[je1];
                                                   >> 150     G4double sigint1 = rc*ek + b;
                                                   >> 151     G4double sigint2 = 0.;
                                                   >> 152 
                                                   >> 153     if (verboseLevel > 1) G4cout << "sample=" << sample << G4endl
                                                   >> 154                                  << ke1 << " " << ke2 << " " 
                                                   >> 155                                  << sigint1 << " " << sigint2 << G4endl;
                                                   >> 156 
                                                   >> 157     do {
                                                   >> 158       G4int midBin = (ke1 + ke2)/2;
                                                   >> 159       dsig = sig[je2][midBin] - sig[je1][midBin];
                                                   >> 160       rc = dsig/delab;
                                                   >> 161       b = sig[je1][midBin] - rc*elab[je1];
                                                   >> 162       G4double sigint = rc*ek + b;
                                                   >> 163       if (sample < sigint) {
                                                   >> 164         ke2 = midBin;
                                                   >> 165         sigint2 = sigint;
                                                   >> 166       }
                                                   >> 167       else {
                                                   >> 168         ke1 = midBin;
                                                   >> 169         sigint1 = sigint;
                                                   >> 170       }
                                                   >> 171       if (verboseLevel > 1)G4cout << ke1 << " " << ke2 << " " 
                                                   >> 172                                   << sigint1 << " " << sigint2 << G4endl;
                                                   >> 173     } while (ke2 - ke1 > 1); 
                                                   >> 174 
                                                   >> 175     // sigint1 and sigint2 should be recoverable from above loop
                                                   >> 176 
                                                   >> 177     //    G4double dsig = sig[je2][ke1] - sig[je1][ke1];
                                                   >> 178     //    G4double rc = dsig/delab;
                                                   >> 179     //    G4double b = sig[je1][ke1] - rc*elab[je1];
                                                   >> 180     //    G4double sigint1 = rc*ek + b;
                                                   >> 181 
                                                   >> 182     //    G4double dsig = sig[je2][ke2] - sig[je1][ke2];
                                                   >> 183     //    G4double rc = dsig/delab;
                                                   >> 184     //    G4double b = sig[je1][ke2] - rc*elab[je1];
                                                   >> 185     //    G4double sigint2 = rc*ek + b;
                                                   >> 186 
                                                   >> 187     dsig = sigint2 - sigint1;
                                                   >> 188     rc = 1./dsig;
                                                   >> 189     b = ke1 - rc*sigint1;
                                                   >> 190     G4double kint = rc*sample + b;
                                                   >> 191     G4double theta = (0.5 + kint)*pi/180.;
                                                   >> 192     if (theta < 0.) theta = 0.;
                                                   >> 193 
                                                   >> 194     //    G4int k;
                                                   >> 195     //std::abs(sample-sig[j][ke1]) < std::abs(sample-sig[j][ke2]) ? k = ke1 : k = ke2;
                                                   >> 196     //    G4double theta = (0.5 + k)*pi/180.;
                                                   >> 197 
                                                   >> 198     if (verboseLevel > 1) {
                                                   >> 199       G4cout << "   energy bin " << je1 << " energy=" << elab[je1] << G4endl;
                                                   >> 200       G4cout << "   angle bin " << kint << " angle=" << theta/degree << G4endl;
                                                   >> 201     }
                                                   >> 202 
                                                   >> 203 
108     // Get the target particle                    204     // Get the target particle
                                                   >> 205 
109     G4DynamicParticle* targetParticle = target    206     G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
110                                                   207 
111     G4double E1 = aParticle->GetTotalEnergy();    208     G4double E1 = aParticle->GetTotalEnergy();
112     G4double M1 = aParticle->GetDefinition()->    209     G4double M1 = aParticle->GetDefinition()->GetPDGMass();
113     G4double E2 = targetParticle->GetTotalEner    210     G4double E2 = targetParticle->GetTotalEnergy();
114     G4double M2 = targetParticle->GetDefinitio    211     G4double M2 = targetParticle->GetDefinition()->GetPDGMass();
115     G4double totalEnergy = E1 + E2;               212     G4double totalEnergy = E1 + E2;
116     G4double pseudoMass = std::sqrt(totalEnerg    213     G4double pseudoMass = std::sqrt(totalEnergy*totalEnergy - P*P);
                                                   >> 214     // pseudoMass also = std::sqrt(M1*M1 + M2*M2 + 2*M2*E1)
117                                                   215 
118     // Transform into centre of mass system       216     // Transform into centre of mass system
119                                                   217 
120     G4double px = (M2/pseudoMass)*Px;             218     G4double px = (M2/pseudoMass)*Px;
121     G4double py = (M2/pseudoMass)*Py;             219     G4double py = (M2/pseudoMass)*Py;
122     G4double pz = (M2/pseudoMass)*Pz;             220     G4double pz = (M2/pseudoMass)*Pz;
123     G4double p = std::sqrt(px*px + py*py + pz*    221     G4double p = std::sqrt(px*px + py*py + pz*pz);
124                                                   222 
125     if (verboseLevel > 1) {                       223     if (verboseLevel > 1) {
126       G4cout << "  E1, M1 (GeV) " << E1/GeV <<    224       G4cout << "  E1, M1 (GeV) " << E1/GeV << " " << M1/GeV << G4endl;
127       G4cout << "  E2, M2 (GeV) " << E2/GeV <<    225       G4cout << "  E2, M2 (GeV) " << E2/GeV << " " << M2/GeV << G4endl;
128       G4cout << "  particle  1 momentum in CM  << 226       G4cout << "  particle  1 momentum in CM " << px/GeV << " " << py/GeV << " "
129        << " " << py/GeV << " "                 << 227            << pz/GeV << " " << p/GeV << G4endl;
130        << pz/GeV << " " << p/GeV << G4endl;    << 
131     }                                             228     }
132                                                   229 
133     // First scatter w.r.t. Z axis                230     // First scatter w.r.t. Z axis
134     G4double pxnew = p*sint*std::cos(phi);     << 231     G4double phi = G4UniformRand()*twopi;
135     G4double pynew = p*sint*std::sin(phi);     << 232     G4double pxnew = p*std::sin(theta)*std::cos(phi);
136     G4double pznew = p*cost;                   << 233     G4double pynew = p*std::sin(theta)*std::sin(phi);
                                                   >> 234     G4double pznew = p*std::cos(theta);
137                                                   235 
138     // Rotate according to the direction of th    236     // Rotate according to the direction of the incident particle
139     if (px*px + py*py > 0) {                      237     if (px*px + py*py > 0) {
140       G4double ph, cosp, sinp;                 << 238       G4double cost, sint, ph, cosp, sinp;
141       cost = pz/p;                                239       cost = pz/p;
142       sint = (std::sqrt((1-cost)*(1+cost)) + s << 240       sint = (std::sqrt(std::abs((1-cost)*(1+cost))) + std::sqrt(px*px+py*py)/p)/2;
143       py < 0 ? ph = 3*halfpi : ph = halfpi;       241       py < 0 ? ph = 3*halfpi : ph = halfpi;
144       if (std::fabs(px) > 0.000001*GeV) ph = s << 242       if (std::abs(px) > 0.000001*GeV) ph = std::atan2(py,px);
145       cosp = std::cos(ph);                        243       cosp = std::cos(ph);
146       sinp = std::sin(ph);                        244       sinp = std::sin(ph);
147       px = (cost*cosp*pxnew - sinp*pynew + sin    245       px = (cost*cosp*pxnew - sinp*pynew + sint*cosp*pznew);
148       py = (cost*sinp*pxnew + cosp*pynew + sin    246       py = (cost*sinp*pxnew + cosp*pynew + sint*sinp*pznew);
149       pz = (-sint*pxnew                  + cos    247       pz = (-sint*pxnew                  + cost*pznew);
                                                   >> 248       //      G4ThreeVector it(a,b,c);
                                                   >> 249       //      p0->SetMomentum(it);
                                                   >> 250       //      G4ThreeVector aTargetMom = theInitial - it;
                                                   >> 251       //      targetParticle->SetMomentum(aTargetMom);
150     }                                             252     }
151     else {                                        253     else {
152       px = pxnew;                                 254       px = pxnew;
153       py = pynew;                                 255       py = pynew;
154       pz = pznew;                                 256       pz = pznew;
155     }                                             257     }
156                                                   258 
157     if (verboseLevel > 1) {                       259     if (verboseLevel > 1) {
158       G4cout << "  AFTER SCATTER..." << G4endl    260       G4cout << "  AFTER SCATTER..." << G4endl;
159       G4cout << "  particle 1 momentum in CM "    261       G4cout << "  particle 1 momentum in CM " << px/GeV << " " << py/GeV << " "
160            << pz/GeV << " " << p/GeV << G4endl    262            << pz/GeV << " " << p/GeV << G4endl;
161     }                                             263     }
162                                                   264 
163     // Transform to lab system                    265     // Transform to lab system
164                                                   266 
165     G4double E1pM2 = E1 + M2;                     267     G4double E1pM2 = E1 + M2;
166     G4double betaCM  = P/E1pM2;                   268     G4double betaCM  = P/E1pM2;
167     G4double betaCMx = Px/E1pM2;                  269     G4double betaCMx = Px/E1pM2;
168     G4double betaCMy = Py/E1pM2;                  270     G4double betaCMy = Py/E1pM2;
169     G4double betaCMz = Pz/E1pM2;                  271     G4double betaCMz = Pz/E1pM2;
170     G4double gammaCM = E1pM2/std::sqrt(E1pM2*E    272     G4double gammaCM = E1pM2/std::sqrt(E1pM2*E1pM2 - P*P);
171                                                   273 
172     if (verboseLevel > 1) {                       274     if (verboseLevel > 1) {
173       G4cout << "  betaCM " << betaCMx << " "     275       G4cout << "  betaCM " << betaCMx << " " << betaCMy << " "
174              << betaCMz << " " << betaCM << G4    276              << betaCMz << " " << betaCM << G4endl;
175       G4cout << "  gammaCM " << gammaCM << G4e    277       G4cout << "  gammaCM " << gammaCM << G4endl;
176     }                                             278     }
177                                                   279 
178     // Now following GLOREN...                    280     // Now following GLOREN...
179                                                   281 
180     G4double BETA[5], PA[5], PB[5];               282     G4double BETA[5], PA[5], PB[5];
181     BETA[1] = -betaCMx;                           283     BETA[1] = -betaCMx;
182     BETA[2] = -betaCMy;                           284     BETA[2] = -betaCMy;
183     BETA[3] = -betaCMz;                           285     BETA[3] = -betaCMz;
184     BETA[4] = gammaCM;                            286     BETA[4] = gammaCM;
185                                                   287 
186     //The incident particle...                    288     //The incident particle...
187                                                   289 
188     PA[1] = px;                                   290     PA[1] = px;
189     PA[2] = py;                                   291     PA[2] = py;
190     PA[3] = pz;                                   292     PA[3] = pz;
191     PA[4] = std::sqrt(M1*M1 + p*p);               293     PA[4] = std::sqrt(M1*M1 + p*p);
192                                                   294 
193     G4double BETPA  = BETA[1]*PA[1] + BETA[2]*    295     G4double BETPA  = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3];
194     G4double BPGAM  = (BETPA * BETA[4]/(BETA[4    296     G4double BPGAM  = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4];
195                                                   297 
196     PB[1] = PA[1] + BPGAM  * BETA[1];             298     PB[1] = PA[1] + BPGAM  * BETA[1];
197     PB[2] = PA[2] + BPGAM  * BETA[2];             299     PB[2] = PA[2] + BPGAM  * BETA[2];
198     PB[3] = PA[3] + BPGAM  * BETA[3];             300     PB[3] = PA[3] + BPGAM  * BETA[3];
199     PB[4] = (PA[4] - BETPA) * BETA[4];            301     PB[4] = (PA[4] - BETPA) * BETA[4];
200                                                   302 
201     G4DynamicParticle* newP = new G4DynamicPar    303     G4DynamicParticle* newP = new G4DynamicParticle;
202     newP->SetDefinition(aParticle->GetDefiniti << 304     newP->SetDefinition(const_cast<G4ParticleDefinition *>(aParticle->GetDefinition()) );
203     newP->SetMomentum(G4ThreeVector(PB[1], PB[    305     newP->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3]));
204                                                   306 
                                                   >> 307 
205     //The target particle...                      308     //The target particle...
206                                                   309 
207     PA[1] = -px;                                  310     PA[1] = -px;
208     PA[2] = -py;                                  311     PA[2] = -py;
209     PA[3] = -pz;                                  312     PA[3] = -pz;
210     PA[4] = std::sqrt(M2*M2 + p*p);               313     PA[4] = std::sqrt(M2*M2 + p*p);
211                                                   314 
212     BETPA  = BETA[1]*PA[1] + BETA[2]*PA[2] + B    315     BETPA  = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3];
213     BPGAM  = (BETPA * BETA[4]/(BETA[4] + 1.) -    316     BPGAM  = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4];
214                                                   317 
215     PB[1] = PA[1] + BPGAM  * BETA[1];             318     PB[1] = PA[1] + BPGAM  * BETA[1];
216     PB[2] = PA[2] + BPGAM  * BETA[2];             319     PB[2] = PA[2] + BPGAM  * BETA[2];
217     PB[3] = PA[3] + BPGAM  * BETA[3];             320     PB[3] = PA[3] + BPGAM  * BETA[3];
218     PB[4] = (PA[4] - BETPA) * BETA[4];            321     PB[4] = (PA[4] - BETPA) * BETA[4];
219                                                   322 
220     targetParticle->SetMomentum(G4ThreeVector(    323     targetParticle->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3]));
221                                                   324 
                                                   >> 325     // G4double ektotal = newP->GetKineticEnergy() + 
                                                   >> 326     //                    targetParticle->GetKineticEnergy();
                                                   >> 327 
222     if (verboseLevel > 1) {                       328     if (verboseLevel > 1) {
223       G4cout << "  particle 1 momentum in LAB     329       G4cout << "  particle 1 momentum in LAB " 
224            << newP->GetMomentum()/GeV          << 330            << newP->GetMomentum()*(1./GeV) 
225            << " " << newP->GetTotalMomentum()/    331            << " " << newP->GetTotalMomentum()/GeV << G4endl;
226       G4cout << "  particle 2 momentum in LAB     332       G4cout << "  particle 2 momentum in LAB " 
227            << targetParticle->GetMomentum()/Ge << 333            << targetParticle->GetMomentum()*(1./GeV) 
228            << " " << targetParticle->GetTotalM    334            << " " << targetParticle->GetTotalMomentum()/GeV << G4endl;
229       G4cout << "  TOTAL momentum in LAB "        335       G4cout << "  TOTAL momentum in LAB " 
230            << (newP->GetMomentum()+targetParti << 336            << (newP->GetMomentum()+targetParticle->GetMomentum())*(1./GeV) 
231            << " "                                 337            << " " 
232            << (newP->GetMomentum()+targetParti    338            << (newP->GetMomentum()+targetParticle->GetMomentum()).mag()/GeV
233            << G4endl;                             339            << G4endl;
234     }                                             340     }
235                                                   341 
236     theParticleChange.SetMomentumChange( newP- << 342     //    if (theta < pi/2.) {
237     theParticleChange.SetEnergyChange(newP->Ge << 343       //  G4double p = newP->GetMomentum().mag();
238     delete newP;                               << 344       //      G4ThreeVector m = newP->GetMomentum();
                                                   >> 345       //      if (p > DBL_MIN)
                                                   >> 346       //        theParticleChange.SetMomentumChange(m.x()/p, m.y()/p, m.z()/p);
                                                   >> 347       //      else
                                                   >> 348       //        theParticleChange.SetMomentumChange(0., 0., 0.);
                                                   >> 349 
                                                   >> 350       theParticleChange.SetMomentumChange( newP->GetMomentumDirection());
                                                   >> 351       theParticleChange.SetEnergyChange(newP->GetKineticEnergy());
                                                   >> 352       delete newP;
                                                   >> 353 
                                                   >> 354       //    }
                                                   >> 355       //    else {
                                                   >> 356       //      // charge exchange
                                                   >> 357       //      theParticleChange.SetNumberOfSecondaries(2);
                                                   >> 358       //      theParticleChange.AddSecondary(newP);
                                                   >> 359       //      theParticleChange.SetStatusChange(fStopAndKill);
                                                   >> 360       //      //      theParticleChange.SetEnergyChange(0.0);
                                                   >> 361       //    }
239                                                   362 
240     // Recoil particle                            363     // Recoil particle
241     theParticleChange.AddSecondary(targetParti << 364     G4DynamicParticle* p1 = new G4DynamicParticle;
                                                   >> 365     p1->SetDefinition(targetParticle->GetDefinition());
                                                   >> 366     p1->SetMomentum(targetParticle->GetMomentum());
                                                   >> 367     theParticleChange.AddSecondary(p1);    
                                                   >> 368     
                                                   >> 369 
242     return &theParticleChange;                    370     return &theParticleChange;
243 }                                                 371 }
244                                                   372 
245 ////////////////////////////////////////////// << 373  // end of file
246 //                                             << 
247 // sample momentum transfer using Lab. momentu << 
248                                                << 
249 G4double G4LEpp::SampleInvariantT(const G4Part << 
250           G4double plab, G4int , G4int )       << 
251 {                                              << 
252   G4double nMass = p->GetPDGMass(); // 939.565 << 
253   G4double ek = std::sqrt(plab*plab+nMass*nMas << 
254                                                << 
255     // Find energy bin                         << 
256                                                << 
257   G4int je1 = 0;                               << 
258   G4int je2 = NENERGY - 1;                     << 
259   ek /= GeV;                                   << 
260                                                << 
261   do                                           << 
262   {                                            << 
263     G4int midBin = (je1 + je2)/2;              << 
264                                                << 
265     if (ek < elab[midBin]) je2 = midBin;       << 
266     else                   je1 = midBin;       << 
267   }                                            << 
268   while (je2 - je1 > 1);  /* Loop checking, 10 << 
269                                                << 
270   G4double delab = elab[je2] - elab[je1];      << 
271                                                << 
272     // Sample the angle                        << 
273                                                << 
274   G4double sample = G4UniformRand();           << 
275   G4int ke1 = 0;                               << 
276   G4int ke2 = NANGLE - 1;                      << 
277   G4double dsig, b, rc;                        << 
278                                                << 
279   dsig = Sig[je2][0] - Sig[je1][0];            << 
280   rc = dsig/delab;                             << 
281   b = Sig[je1][0] - rc*elab[je1];              << 
282                                                << 
283   G4double sigint1 = rc*ek + b;                << 
284   G4double sigint2 = 0.;                       << 
285                                                << 
286   do                                           << 
287   {                                            << 
288       G4int midBin = (ke1 + ke2)/2;            << 
289       dsig = Sig[je2][midBin] - Sig[je1][midBi << 
290       rc = dsig/delab;                         << 
291       b = Sig[je1][midBin] - rc*elab[je1];     << 
292       G4double sigint = rc*ek + b;             << 
293                                                << 
294       if (sample < sigint)                     << 
295       {                                        << 
296         ke2 = midBin;                          << 
297         sigint2 = sigint;                      << 
298       }                                        << 
299       else                                     << 
300       {                                        << 
301         ke1 = midBin;                          << 
302         sigint1 = sigint;                      << 
303       }                                        << 
304   }                                            << 
305   while (ke2 - ke1 > 1);  /* Loop checking, 10 << 
306                                                << 
307   dsig = sigint2 - sigint1;                    << 
308   rc = 1./dsig;                                << 
309   b = ke1 - rc*sigint1;                        << 
310                                                << 
311   G4double kint = rc*sample + b;               << 
312   G4double theta = (0.5 + kint)*pi/180.;       << 
313   G4double t = 0.5*plab*plab*(1 - std::cos(the << 
314                                                << 
315   return t;                                    << 
316 }                                              << 
317 // end of file                                 << 
318                                                   374