Geant4 Cross Reference

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


  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 // $Id: G4HadronElastic.cc,v 1.61 2008/08/05 07:37:39 vnivanch Exp $
                                                   >>  27 // GEANT4 tag $Name: geant4-09-02 $
 26 //                                                 28 //
 27 // Geant4 Header : G4HadronElastic             << 
 28 //                                                 29 //
 29 // Author : V.Ivanchenko 29 June 2009 (redesig <<  30 // Physics model class G4HadronElastic (derived from G4LElastic)
 30 //                                             <<  31 //
                                                   >>  32 //
                                                   >>  33 // G4 Model: Low-energy Elastic scattering with 4-momentum balance
                                                   >>  34 // F.W. Jones, TRIUMF, 04-JUN-96
                                                   >>  35 // Uses  G4ElasticHadrNucleusHE and G4VQCrossSection
                                                   >>  36 //
                                                   >>  37 //
                                                   >>  38 // 25-JUN-98 FWJ: replaced missing Initialize for ParticleChange.
                                                   >>  39 // 09-Set-05 V.Ivanchenko HARP version of the model: fix scattering
                                                   >>  40 //           on hydrogen, use relativistic Lorentz transformation
                                                   >>  41 // 24-Nov-05 V.Ivanchenko sample cost in center of mass reference system
                                                   >>  42 // 03-Dec-05 V.Ivanchenko add protection to initial momentum 20 MeV/c in
                                                   >>  43 //           center of mass system (before it was in lab system)
                                                   >>  44 //           below model is not valid
                                                   >>  45 // 14-Dec-05 V.Ivanchenko change protection to cos(theta) < -1 and
                                                   >>  46 //           rename the class
                                                   >>  47 // 13-Apr-06 V.Ivanchenko move to coherent_elastic subdirectory; remove
                                                   >>  48 //           charge exchange; remove limitation on incident momentum;
                                                   >>  49 //           add s-wave regim below some momentum        
                                                   >>  50 // 24-Apr-06 V.Ivanchenko add neutron scattering on hydrogen from CHIPS
                                                   >>  51 // 07-Jun-06 V.Ivanchenko fix problem of rotation
                                                   >>  52 // 25-Jul-06 V.Ivanchenko add 19 MeV low energy, below which S-wave is sampled
                                                   >>  53 // 02-Aug-06 V.Ivanchenko introduce energy cut on the aria of S-wave for pions
                                                   >>  54 // 24-Aug-06 V.Ivanchenko switch on G4ElasticHadrNucleusHE
                                                   >>  55 // 31-Aug-06 V.Ivanchenko do not sample sacttering for particles with kinetic 
                                                   >>  56 //                        energy below 10 keV
                                                   >>  57 // 16-Nov-06 V.Ivanchenko Simplify logic of choosing of the model for sampling
                                                   >>  58 // 30-Mar-07 V.Ivanchenko lowEnergyLimitQ=0, lowEnergyLimitHE = 1.0*GeV,
                                                   >>  59 //                        lowestEnergyLimit= 0
                                                   >>  60 // 04-May-07 V.Ivanchenko do not use HE model for hydrogen target to avoid NaN;
                                                   >>  61 //                        use QElastic for p, n incident for any energy for 
                                                   >>  62 //                        p and He targets only  
                                                   >>  63 // 11-May-07 V.Ivanchenko remove unused method Defs1
                                                   >>  64 //
 31                                                    65 
 32 #include "G4HadronElastic.hh"                      66 #include "G4HadronElastic.hh"
 33 #include "G4SystemOfUnits.hh"                  << 
 34 #include "G4ParticleTable.hh"                      67 #include "G4ParticleTable.hh"
 35 #include "G4ParticleDefinition.hh"                 68 #include "G4ParticleDefinition.hh"
 36 #include "G4IonTable.hh"                           69 #include "G4IonTable.hh"
                                                   >>  70 #include "G4QElasticCrossSection.hh"
                                                   >>  71 #include "G4VQCrossSection.hh"
                                                   >>  72 #include "G4ElasticHadrNucleusHE.hh"
 37 #include "Randomize.hh"                            73 #include "Randomize.hh"
 38 #include "G4Proton.hh"                             74 #include "G4Proton.hh"
 39 #include "G4Neutron.hh"                            75 #include "G4Neutron.hh"
 40 #include "G4Deuteron.hh"                           76 #include "G4Deuteron.hh"
 41 #include "G4Alpha.hh"                              77 #include "G4Alpha.hh"
 42 #include "G4Pow.hh"                            <<  78 #include "G4PionPlus.hh"
 43 #include "G4Exp.hh"                            <<  79 #include "G4PionMinus.hh"
 44 #include "G4Log.hh"                            << 
 45 #include "G4HadronicParameters.hh"             << 
 46 #include "G4PhysicsModelCatalog.hh"            << 
 47                                                << 
 48                                                    80 
 49 G4HadronElastic::G4HadronElastic(const G4Strin <<  81 G4HadronElastic::G4HadronElastic(G4ElasticHadrNucleusHE* HModel) 
 50   : G4HadronicInteraction(name), secID(-1)     <<  82   : G4HadronicInteraction("G4HadronElastic"), hElastic(HModel)
 51 {                                                  83 {
 52   SetMinEnergy( 0.0*GeV );                         84   SetMinEnergy( 0.0*GeV );
 53   SetMaxEnergy( G4HadronicParameters::Instance <<  85   SetMaxEnergy( 100.*TeV );
 54   lowestEnergyLimit= 1.e-6*eV;                 <<  86   verboseLevel= 0;
 55   pLocalTmax  = 0.0;                           <<  87   lowEnergyRecoilLimit = 100.*keV;  
 56   nwarn = 0;                                   <<  88   lowEnergyLimitQ  = 0.0*GeV;  
                                                   >>  89   lowEnergyLimitHE = 1.0*GeV; 
                                                   >>  90   lowestEnergyLimit= 1.e-6*eV;  
                                                   >>  91   plabLowLimit     = 20.0*MeV;
                                                   >>  92 
                                                   >>  93   qCManager   = G4QElasticCrossSection::GetPointer();
                                                   >>  94   if(!hElastic) hElastic = new G4ElasticHadrNucleusHE();
 57                                                    95 
 58   theProton   = G4Proton::Proton();                96   theProton   = G4Proton::Proton();
 59   theNeutron  = G4Neutron::Neutron();              97   theNeutron  = G4Neutron::Neutron();
 60   theDeuteron = G4Deuteron::Deuteron();            98   theDeuteron = G4Deuteron::Deuteron();
 61   theAlpha    = G4Alpha::Alpha();                  99   theAlpha    = G4Alpha::Alpha();
                                                   >> 100   thePionPlus = G4PionPlus::PionPlus();
                                                   >> 101   thePionMinus= G4PionMinus::PionMinus();
 62                                                   102 
 63   secID = G4PhysicsModelCatalog::GetModelID( " << 103   nnans = 0;
                                                   >> 104   npos  = 0;
                                                   >> 105   nneg  = 0;
                                                   >> 106   neneg = 0;
 64 }                                                 107 }
 65                                                   108 
 66 G4HadronElastic::~G4HadronElastic()               109 G4HadronElastic::~G4HadronElastic()
 67 {}                                             << 110 {
                                                   >> 111   delete hElastic;
                                                   >> 112   if( (nnans + npos + nneg + neneg) > 0 ) {
                                                   >> 113     G4cout << "### G4HadronElastic destructor Warnings: ";
                                                   >> 114     if(nnans > 0) G4cout << "###          N(nans)    = " << nnans;
                                                   >> 115     if(npos > 0)  G4cout << "###          N(cost > 1)= " << npos;
                                                   >> 116     if(nneg > 0)  G4cout << "###          N(cost <-1)= " << nneg;
                                                   >> 117     if(neneg > 0) G4cout << "###          N(E < 0)=    " << neneg;
                                                   >> 118     G4cout << "###" << G4endl;
                                                   >> 119   }
                                                   >> 120 }
 68                                                   121 
                                                   >> 122 G4VQCrossSection* G4HadronElastic::GetCS()
                                                   >> 123 {
                                                   >> 124   return qCManager;
                                                   >> 125 }
 69                                                   126 
 70 void G4HadronElastic::ModelDescription(std::os << 127 G4ElasticHadrNucleusHE* G4HadronElastic::GetHElastic()
 71 {                                                 128 {
 72   outFile << "G4HadronElastic is the base clas << 129   return hElastic;
 73           << "elastic scattering models except << 
 74           << "By default it uses the Gheisha t << 
 75     << "transfer parameterization.  The model  << 
 76     << "as opposed to the original Gheisha mod << 
 77     << "This model may be used for all long-li << 
 78     << "incident energies but fit the data onl << 
 79 }                                                 130 }
 80                                                   131 
 81 G4HadFinalState* G4HadronElastic::ApplyYoursel    132 G4HadFinalState* G4HadronElastic::ApplyYourself(
 82      const G4HadProjectile& aTrack, G4Nucleus&    133      const G4HadProjectile& aTrack, G4Nucleus& targetNucleus)
 83 {                                                 134 {
 84   theParticleChange.Clear();                      135   theParticleChange.Clear();
 85                                                   136 
 86   const G4HadProjectile* aParticle = &aTrack;     137   const G4HadProjectile* aParticle = &aTrack;
 87   G4double ekin = aParticle->GetKineticEnergy(    138   G4double ekin = aParticle->GetKineticEnergy();
 88                                                << 
 89   // no scattering below the limit             << 
 90   if(ekin <= lowestEnergyLimit) {                 139   if(ekin <= lowestEnergyLimit) {
 91     theParticleChange.SetEnergyChange(ekin);      140     theParticleChange.SetEnergyChange(ekin);
 92     theParticleChange.SetMomentumChange(0.,0., << 141     theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit());
 93     return &theParticleChange;                    142     return &theParticleChange;
 94   }                                               143   }
 95                                                   144 
 96   G4int A = targetNucleus.GetA_asInt();        << 145   G4double aTarget = targetNucleus.GetN();
 97   G4int Z = targetNucleus.GetZ_asInt();        << 146   G4double zTarget = targetNucleus.GetZ();
 98                                                   147 
                                                   >> 148   G4double plab = aParticle->GetTotalMomentum();
                                                   >> 149   if (verboseLevel >1) {
                                                   >> 150     G4cout << "G4HadronElastic::DoIt: Incident particle plab=" 
                                                   >> 151      << plab/GeV << " GeV/c " 
                                                   >> 152      << " ekin(MeV) = " << ekin/MeV << "  " 
                                                   >> 153      << aParticle->GetDefinition()->GetParticleName() << G4endl;
                                                   >> 154   }
 99   // Scattered particle referred to axis of in    155   // Scattered particle referred to axis of incident particle
100   const G4ParticleDefinition* theParticle = aP    156   const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
101   G4double m1 = theParticle->GetPDGMass();        157   G4double m1 = theParticle->GetPDGMass();
102   G4double plab = std::sqrt(ekin*(ekin + 2.0*m << 
103                                                   158 
                                                   >> 159   G4int Z = static_cast<G4int>(zTarget+0.5);
                                                   >> 160   G4int A = static_cast<G4int>(aTarget+0.5);
                                                   >> 161   G4int N = A - Z;
                                                   >> 162   G4int projPDG = theParticle->GetPDGEncoding();
104   if (verboseLevel>1) {                           163   if (verboseLevel>1) {
105     G4cout << "G4HadronElastic: "              << 164     G4cout << "G4HadronElastic for " << theParticle->GetParticleName()
106      << aParticle->GetDefinition()->GetParticl << 165      << " PDGcode= " << projPDG << " on nucleus Z= " << Z 
107      << " Plab(GeV/c)= " << plab/GeV           << 166      << " A= " << A << " N= " << N 
108      << " Ekin(MeV) = " << ekin/MeV            << 
109      << " scattered off Z= " << Z              << 
110      << " A= " << A                            << 
111      << G4endl;                                   167      << G4endl;
112   }                                               168   }
                                                   >> 169   G4ParticleDefinition * theDef = 0;
                                                   >> 170 
                                                   >> 171   if(Z == 1 && A == 1)       theDef = theProton;
                                                   >> 172   else if (Z == 1 && A == 2) theDef = theDeuteron;
                                                   >> 173   else if (Z == 1 && A == 3) theDef = G4Triton::Triton();
                                                   >> 174   else if (Z == 2 && A == 3) theDef = G4He3::He3();
                                                   >> 175   else if (Z == 2 && A == 4) theDef = theAlpha;
                                                   >> 176   else theDef = G4ParticleTable::GetParticleTable()->FindIon(Z,A,0,Z);
                                                   >> 177  
                                                   >> 178   G4double m2 = theDef->GetPDGMass();
                                                   >> 179   G4LorentzVector lv1 = aParticle->Get4Momentum();
                                                   >> 180   G4LorentzVector lv(0.0,0.0,0.0,m2);   
                                                   >> 181   lv += lv1;
113                                                   182 
114   G4double mass2 = G4NucleiProperties::GetNucl << 
115   G4double e1 = m1 + ekin;                     << 
116   G4LorentzVector lv(0.0,0.0,plab,e1+mass2);   << 
117   G4ThreeVector bst = lv.boostVector();           183   G4ThreeVector bst = lv.boostVector();
118   G4double momentumCMS = plab*mass2/std::sqrt( << 184   lv1.boost(-bst);
119                                                   185 
120   pLocalTmax = 4.0*momentumCMS*momentumCMS;    << 186   G4ThreeVector p1 = lv1.vect();
                                                   >> 187   G4double ptot = p1.mag();
                                                   >> 188   G4double tmax = 4.0*ptot*ptot;
                                                   >> 189   G4double t = 0.0;
                                                   >> 190 
                                                   >> 191   // Choose generator
                                                   >> 192   G4ElasticGenerator gtype = fLElastic;
                                                   >> 193 
                                                   >> 194   // Q-elastic for p,n scattering on H and He
                                                   >> 195   if (theParticle == theProton || theParticle == theNeutron) {
                                                   >> 196     //     && Z <= 2 && ekin >= lowEnergyLimitQ)  
                                                   >> 197     gtype = fQElastic;
121                                                   198 
122   // Sampling in CM system                     << 199   } else {
123   G4double t = SampleInvariantT(theParticle, p << 200     // S-wave for very low energy
                                                   >> 201     if(plab < plabLowLimit) gtype = fSWave;
                                                   >> 202     // HE-elastic for energetic projectile mesons
                                                   >> 203     else if(ekin >= lowEnergyLimitHE && theParticle->GetBaryonNumber() == 0) 
                                                   >> 204       { gtype = fHElastic; }
                                                   >> 205   }
124                                                   206 
125   if(t < 0.0 || t > pLocalTmax) {              << 207   //
126     // For the very rare cases where cos(theta << 208   // Sample t
127     // print some debugging information via a  << 209   //
128     // using the default algorithm             << 210   if(gtype == fQElastic) {
129 #ifdef G4VERBOSE                               << 211     if (verboseLevel >1) {
130     if(nwarn < 2) {                            << 212       G4cout << "G4HadronElastic: Z= " << Z << " N= " 
131       G4ExceptionDescription ed;               << 213        << N << " pdg= " <<  projPDG
132       ed << GetModelName() << " wrong sampling << 214        << " mom(GeV)= " << plab/GeV << "  " << qCManager << G4endl; 
133    << " for " << aParticle->GetDefinition()->G << 215     }
134    << " ekin=" << ekin << " MeV"               << 216     if(Z == 1 && N == 2) N = 1;
135    << " off (Z,A)=(" << Z << "," << A << ") -  << 217     else if(Z == 2 && N == 1) N = 2;
136       G4Exception( "G4HadronElastic::ApplyYour << 218     G4double cs = qCManager->GetCrossSection(false,plab,Z,N,projPDG);
137       ++nwarn;                                 << 219 
                                                   >> 220     // check if cross section is reasonable
                                                   >> 221     if(cs > 0.0) t = qCManager->GetExchangeT(Z,N,projPDG);
                                                   >> 222     else if(plab > plabLowLimit) gtype = fLElastic;
                                                   >> 223     else gtype = fSWave;
                                                   >> 224   }
                                                   >> 225 
                                                   >> 226   if(gtype == fLElastic) {
                                                   >> 227     G4double g2 = GeV*GeV; 
                                                   >> 228     t = g2*SampleT(tmax/g2,m1,m2,aTarget);
                                                   >> 229   }
                                                   >> 230 
                                                   >> 231   // use mean atomic number
                                                   >> 232   if(gtype == fHElastic) {
                                                   >> 233     t = hElastic->SampleT(theParticle,plab,Z,A);
                                                   >> 234   }
                                                   >> 235 
                                                   >> 236   // NaN finder
                                                   >> 237   if(!(t < 0.0 || t >= 0.0)) {
                                                   >> 238     if (verboseLevel > 0) {
                                                   >> 239       G4cout << "G4HadronElastic:WARNING: Z= " << Z << " N= " 
                                                   >> 240        << N << " pdg= " <<  projPDG
                                                   >> 241        << " mom(GeV)= " << plab/GeV 
                                                   >> 242        << " the model type " << gtype;
                                                   >> 243       if(gtype ==  fQElastic) G4cout << " CHIPS ";
                                                   >> 244       else if(gtype ==  fLElastic) G4cout << " LElastic ";
                                                   >> 245       else if(gtype ==  fHElastic) G4cout << " HElastic ";
                                                   >> 246       G4cout << " S-wave will be sampled" 
                                                   >> 247        << G4endl; 
138     }                                             248     }
139 #endif                                         << 249     t = 0.0;
140     t = G4HadronElastic::SampleInvariantT(theP << 250     nnans++;
141   }                                               251   }
142                                                   252 
143   G4double phi  = G4UniformRand()*CLHEP::twopi << 253   if(gtype == fSWave) t = G4UniformRand()*tmax;
144   G4double cost = 1. - 2.0*t/pLocalTmax;       << 
145                                                << 
146   if (cost > 1.0) { cost = 1.0; }              << 
147   else if(cost < -1.0) { cost = -1.0; }        << 
148                                                << 
149   G4double sint = std::sqrt((1.0-cost)*(1.0+co << 
150                                                   254 
                                                   >> 255   if(verboseLevel>1) {
                                                   >> 256     G4cout <<"type= " << gtype <<" t= " << t << " tmax= " << tmax 
                                                   >> 257      << " ptot= " << ptot << G4endl;
                                                   >> 258   }
                                                   >> 259   // Sampling in CM system
                                                   >> 260   G4double phi  = G4UniformRand()*twopi;
                                                   >> 261   G4double cost = 1. - 2.0*t/tmax;
                                                   >> 262   G4double sint;
                                                   >> 263 
                                                   >> 264   // problem in sampling
                                                   >> 265   if(cost >= 1.0) {
                                                   >> 266     cost = 1.0;
                                                   >> 267     sint = 0.0;
                                                   >> 268     npos++;
                                                   >> 269   } else if(cost < -1 ) {
                                                   >> 270     /*
                                                   >> 271     G4cout << "G4HadronElastic:WARNING: Z= " << Z << " N= " 
                                                   >> 272      << N << " " << aParticle->GetDefinition()->GetParticleName()
                                                   >> 273      << " mom(GeV)= " << plab/GeV 
                                                   >> 274      << " the model type " << gtype;
                                                   >> 275     if(gtype ==  fQElastic) G4cout << " CHIPS ";
                                                   >> 276     else if(gtype ==  fLElastic) G4cout << " LElastic ";
                                                   >> 277     else if(gtype ==  fHElastic) G4cout << " HElastic ";
                                                   >> 278     G4cout << " cost= " << cost 
                                                   >> 279      << G4endl; 
                                                   >> 280     */
                                                   >> 281     cost = 1.0;
                                                   >> 282     sint = 0.0;
                                                   >> 283     nneg++;
                                                   >> 284 
                                                   >> 285     // normal situation
                                                   >> 286   } else  {
                                                   >> 287     sint = std::sqrt((1.0-cost)*(1.0+cost));
                                                   >> 288   }    
151   if (verboseLevel>1) {                           289   if (verboseLevel>1) {
152     G4cout << " t= " << t << " tmax(GeV^2)= "  << 290     G4cout << "cos(t)=" << cost << " std::sin(t)=" << sint << G4endl;
153      << " Pcms(GeV)= " << momentumCMS/GeV << " << 291   }
154      << " sin(t)=" << sint << G4endl;          << 292   G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
155   }                                            << 293   v1 *= ptot;
156   G4LorentzVector nlv1(momentumCMS*sint*std::c << 294   G4LorentzVector nlv1(v1.x(),v1.y(),v1.z(),std::sqrt(ptot*ptot + m1*m1));
157            momentumCMS*sint*std::sin(phi),     << 
158                        momentumCMS*cost,       << 
159            std::sqrt(momentumCMS*momentumCMS + << 
160                                                   295 
161   nlv1.boost(bst);                                296   nlv1.boost(bst); 
162                                                   297 
163   G4double eFinal = nlv1.e() - m1;                298   G4double eFinal = nlv1.e() - m1;
164   if (verboseLevel > 1) {                         299   if (verboseLevel > 1) {
165     G4cout <<"G4HadronElastic: m= " << m1 << " << 300     G4cout << "Scattered: "
166      << " 4-M Final: " << nlv1                 << 301      << nlv1<<" m= " << m1 << " ekin(MeV)= " << eFinal 
167      << G4endl;                                << 302      << " Proj: 4-mom " << lv1 
168   }                                            << 303      <<G4endl;
169                                                << 304   }
170   if(eFinal <= 0.0) {                          << 305   if(eFinal <= lowestEnergyLimit) {
171     theParticleChange.SetMomentumChange(0.0,0. << 306     if(eFinal < 0.0 && verboseLevel > 0) {
                                                   >> 307       neneg++;
                                                   >> 308       G4cout << "G4HadronElastic WARNING ekin= " << eFinal
                                                   >> 309        << " after scattering of " 
                                                   >> 310        << aParticle->GetDefinition()->GetParticleName()
                                                   >> 311        << " p(GeV/c)= " << plab
                                                   >> 312        << " on " << theDef->GetParticleName()
                                                   >> 313        << G4endl;
                                                   >> 314     }
172     theParticleChange.SetEnergyChange(0.0);       315     theParticleChange.SetEnergyChange(0.0);
                                                   >> 316     nlv1 = G4LorentzVector(0.0,0.0,0.0,m1);
                                                   >> 317 
173   } else {                                        318   } else {
174     theParticleChange.SetMomentumChange(nlv1.v    319     theParticleChange.SetMomentumChange(nlv1.vect().unit());
175     theParticleChange.SetEnergyChange(eFinal);    320     theParticleChange.SetEnergyChange(eFinal);
176   }                                            << 321   }  
177   lv -= nlv1;                                  << 322 
178   G4double erec =  std::max(lv.e() - mass2, 0. << 323   G4LorentzVector nlv0 = lv - nlv1;
                                                   >> 324   G4double erec =  nlv0.e() - m2;
179   if (verboseLevel > 1) {                         325   if (verboseLevel > 1) {
180     G4cout << "Recoil: " <<" m= " << mass2 <<  << 326     G4cout << "Recoil: "
181      << " 4-mom: " << lv                       << 327      << nlv0<<" m= " << m2 << " ekin(MeV)= " << erec 
182      << G4endl;                                << 328      <<G4endl;
183   }                                            << 329   }
184                                                << 330   if(erec > lowEnergyRecoilLimit) {
185   // the recoil is created if kinetic energy a << 331     G4DynamicParticle * aSec = new G4DynamicParticle(theDef, nlv0);
186   if(erec > GetRecoilEnergyThreshold()) {      << 332     theParticleChange.AddSecondary(aSec);
187     G4ParticleDefinition * theDef = nullptr;   << 
188     if(Z == 1 && A == 1)       { theDef = theP << 
189     else if (Z == 1 && A == 2) { theDef = theD << 
190     else if (Z == 1 && A == 3) { theDef = G4Tr << 
191     else if (Z == 2 && A == 3) { theDef = G4He << 
192     else if (Z == 2 && A == 4) { theDef = theA << 
193     else {                                     << 
194       theDef =                                 << 
195   G4ParticleTable::GetParticleTable()->GetIonT << 
196     }                                          << 
197     G4DynamicParticle * aSec = new G4DynamicPa << 
198     theParticleChange.AddSecondary(aSec, secID << 
199   } else {                                        333   } else {
                                                   >> 334     if(erec < 0.0) erec = 0.0;
200     theParticleChange.SetLocalEnergyDeposit(er    335     theParticleChange.SetLocalEnergyDeposit(erec);
201   }                                               336   }
202                                                   337 
203   return &theParticleChange;                      338   return &theParticleChange;
204 }                                                 339 }
205                                                   340 
206 // sample momentum transfer in the CMS system  << 
207 G4double                                          341 G4double 
208 G4HadronElastic::SampleInvariantT(const G4Part << 342 G4HadronElastic::SampleT(G4double tmax, G4double, G4double, G4double atno2)
209           G4double mom, G4int, G4int A)        << 
210 {                                                 343 {
211   const G4double plabLowLimit = 400.0*CLHEP::M << 344   // G4cout << "Entering elastic scattering 2"<<G4endl;
212   const G4double GeV2 = GeV*GeV;               << 345   // Compute the direction of elastic scattering.
213   const G4double z07in13 = std::pow(0.7, 0.333 << 346   // It is planned to replace this code with a method based on
214   const G4double numLimit = 18.;               << 347   // parameterized functions and a Monte Carlo method to invert the CDF.
215                                                << 348 
216   G4int pdg = std::abs(part->GetPDGEncoding()) << 349   //  G4double ran = G4UniformRand();
217   G4double tmax = pLocalTmax/GeV2;             << 350   G4double aa, bb, cc, dd, rr;
218                                                << 351   if (atno2 <= 62.) {
219   G4double aa, bb, cc, dd;                     << 352     aa = std::pow(atno2, 1.63);
220   G4Pow* g4pow = G4Pow::GetInstance();         << 353     bb = 14.5*std::pow(atno2, 0.66);
221   if (A <= 62) {                               << 354     cc = 1.4*std::pow(atno2, 0.33);
222     if (pdg == 211){ //Pions                   << 355     dd = 10.;
223       if(mom >= plabLowLimit){     //High ener << 356   } else {
224   bb = 14.5*g4pow->Z23(A);/*14.5*/             << 357     aa = std::pow(atno2, 1.33);
225   dd = 10.;                                    << 358     bb = 60.*std::pow(atno2, 0.33);
226   cc = 0.075*g4pow->Z13(A)/dd;//1.4            << 359     cc = 0.4*std::pow(atno2, 0.40);
227   //aa = g4pow->powZ(A, 1.93)/bb;//1.63        << 360     dd = 10.;
228   aa = (A*A)/bb;//1.63                         << 361   }
229       } else {                       //Low ene << 362   aa = aa/bb;
230   bb = 29.*z07in13*z07in13*g4pow->Z23(A);      << 363   cc = cc/dd;
231   dd = 15.;                                    << 364   G4double ran, t1, t2;
232   cc = 0.04*g4pow->Z13(A)/dd;//1.4             << 365   do {
233   aa = g4pow->powZ(A, 1.63)/bb;//1.63          << 366     ran = G4UniformRand();
234       }                                        << 367     t1 = -std::log(ran)/bb;
235     } else { //Other particles                 << 368     t2 = -std::log(ran)/dd;
236       bb = 14.5*g4pow->Z23(A);                 << 369   } while(t1 > tmax || t2 > tmax);
237       dd = 20.;                                << 370 
238       aa = (A*A)/bb;//1.63                     << 371   rr = (aa + cc)*ran;
239       cc = 1.4*g4pow->Z13(A)/dd;               << 372 
240     }                                          << 373   if (verboseLevel > 1) {
241       //===========================            << 374     G4cout << "DoIt: aa,bb,cc,dd,rr" << G4endl;
242   } else { //(A>62)                            << 375     G4cout << aa << " " << bb << " " << cc << " " << dd << " " << rr << G4endl;
243     if (pdg == 211) {                          << 376     G4cout << "t1,Fctcos " << t1 << " " << Fctcos(t1, aa, bb, cc, dd, rr) << G4endl;
244       if(mom >= plabLowLimit){ //high          << 377     G4cout << "t2,Fctcos " << t2 << " " << Fctcos(t2, aa, bb, cc, dd, rr) << G4endl;
245   bb = 60.*z07in13*g4pow->Z13(A);//60          << 378   }
246   dd = 30.;                                    << 379   G4double eps = 0.001;
247   aa = 0.5*(A*A)/bb;//1.33                     << 380   G4int ind1 = 10;
248   cc = 4.*g4pow->powZ(A,0.4)/dd;//1:0.4     -- << 381   G4double t = 0.0;
249       } else { //low                           << 382   G4int ier1;
250   bb = 120.*z07in13*g4pow->Z13(A);//60         << 383   ier1 = Rtmi(&t, t1, t2, eps, ind1,
251   dd = 30.;                                    << 384         aa, bb, cc, dd, rr);
252   aa = 2.*g4pow->powZ(A,1.33)/bb;              << 385   if (verboseLevel > 1) {
253   cc = 4.*g4pow->powZ(A,0.4)/dd;//1:0.4     -- << 386     G4cout << "From Rtmi, ier1=" << ier1 << " t= " << t << G4endl;
254       }                                        << 387     G4cout << "t, Fctcos " << t << " " << Fctcos(t, aa, bb, cc, dd, rr) << G4endl;
255     } else {                                   << 
256       bb = 60.*g4pow->Z13(A);                  << 
257       dd = 25.;                                << 
258       aa = g4pow->powZ(A,1.33)/bb;//1.33       << 
259       cc = 0.2*g4pow->powZ(A,0.4)/dd;//1:0.4   << 
260     }                                          << 
261   }                                               388   }
262   G4double q1 = 1.0 - G4Exp(-std::min(bb*tmax, << 389   if (ier1 != 0) t = 0.25*(3.*t1 + t2);
263   G4double q2 = 1.0 - G4Exp(-std::min(dd*tmax, << 390   if (verboseLevel > 1) {
264   G4double s1 = q1*aa;                         << 391       G4cout << "t, Fctcos " << t << " " << Fctcos(t, aa, bb, cc, dd, rr) << 
265   G4double s2 = q2*cc;                         << 392               G4endl;
266   if((s1 + s2)*G4UniformRand() < s2) {         << 
267     q1 = q2;                                   << 
268     bb = dd;                                   << 
269   }                                               393   }
270   return -GeV2*G4Log(1.0 - G4UniformRand()*q1) << 394   return t;
271 }                                                 395 }
272                                                   396 
273 ////////////////////////////////////////////// << 397 // The following is a "translation" of a root-finding routine
274 //                                             << 398 // from GEANT3.21/GHEISHA.  Some of the labelled block structure has
275 // Cofs for s-,c-,b-particles ds/dt slopes     << 399 // been retained for clarity.  This routine will not be needed after
276                                                << 400 // the planned revisions to DoIt().
277 G4double G4HadronElastic::GetSlopeCof(const G4 << 401 
                                                   >> 402 G4int
                                                   >> 403 G4HadronElastic::Rtmi(G4double* x, G4double xli, G4double xri, G4double eps, 
                                                   >> 404           G4int iend, 
                                                   >> 405           G4double aa, G4double bb, G4double cc, G4double dd, 
                                                   >> 406           G4double rr)
278 {                                                 407 {
279   // The input parameter "pdg" should be the a << 408    G4int ier = 0;
280   // (i.e. the same value for a particle and i << 409    G4double xl = xli;
                                                   >> 410    G4double xr = xri;
                                                   >> 411    *x = xl;
                                                   >> 412    G4double tol = *x;
                                                   >> 413    G4double f = Fctcos(tol, aa, bb, cc, dd, rr);
                                                   >> 414    if (f == 0.) return ier;
                                                   >> 415    G4double fl, fr;
                                                   >> 416    fl = f;
                                                   >> 417    *x = xr;
                                                   >> 418    tol = *x;
                                                   >> 419    f = Fctcos(tol, aa, bb, cc, dd, rr);
                                                   >> 420    if (f == 0.) return ier;
                                                   >> 421    fr = f;
                                                   >> 422 
                                                   >> 423 // Error return in case of wrong input data
                                                   >> 424    if (fl*fr >= 0.) {
                                                   >> 425       ier = 2;
                                                   >> 426       return ier;
                                                   >> 427    }
                                                   >> 428 
                                                   >> 429 // Basic assumption fl*fr less than 0 is satisfied.
                                                   >> 430 // Generate tolerance for function values.
                                                   >> 431    G4int i = 0;
                                                   >> 432    G4double tolf = 100.*eps;
                                                   >> 433 
                                                   >> 434 // Start iteration loop
                                                   >> 435 label4:
                                                   >> 436    i++;
                                                   >> 437 
                                                   >> 438 // Start bisection loop
                                                   >> 439    for (G4int k = 1; k <= iend; k++) {
                                                   >> 440       *x = 0.5*(xl + xr);
                                                   >> 441       tol = *x;
                                                   >> 442       f = Fctcos(tol, aa, bb, cc, dd, rr);
                                                   >> 443       if (f == 0.) return 0;
                                                   >> 444       if (f*fr < 0.) {      // Interchange xl and xr in order to get the
                                                   >> 445          tol = xl;          // same Sign in f and fr
                                                   >> 446          xl = xr;
                                                   >> 447          xr = tol;
                                                   >> 448          tol = fl;
                                                   >> 449          fl = fr;
                                                   >> 450          fr = tol;
                                                   >> 451       }
                                                   >> 452       tol = f - fl;
                                                   >> 453       G4double a = f*tol;
                                                   >> 454       a = a + a;
                                                   >> 455       if (a < fr*(fr - fl) && i <= iend) goto label17;
                                                   >> 456       xr = *x;
                                                   >> 457       fr = f;
                                                   >> 458 
                                                   >> 459 // Test on satisfactory accuracy in bisection loop
                                                   >> 460       tol = eps;
                                                   >> 461       a = std::abs(xr);
                                                   >> 462       if (a > 1.) tol = tol*a;
                                                   >> 463       if (std::abs(xr - xl) <= tol && std::abs(fr - fl) <= tolf) goto label14;
                                                   >> 464    }
                                                   >> 465 // End of bisection loop
                                                   >> 466 
                                                   >> 467 // No convergence after iend iteration steps followed by iend
                                                   >> 468 // successive steps of bisection or steadily increasing function
                                                   >> 469 // values at right bounds.  Error return.
                                                   >> 470    ier = 1;
                                                   >> 471 
                                                   >> 472 label14:
                                                   >> 473    if (std::abs(fr) > std::abs(fl)) {
                                                   >> 474       *x = xl;
                                                   >> 475       f = fl;
                                                   >> 476    }
                                                   >> 477    return ier;
                                                   >> 478 
                                                   >> 479 // Computation of iterated x-value by inverse parabolic interp
                                                   >> 480 label17:
                                                   >> 481    G4double a = fr - f;
                                                   >> 482    G4double dx = (*x - xl)*fl*(1. + f*(a - tol)/(a*(fr - fl)))/tol;
                                                   >> 483    G4double xm = *x;
                                                   >> 484    G4double fm = f;
                                                   >> 485    *x = xl - dx;
                                                   >> 486    tol = *x;
                                                   >> 487    f = Fctcos(tol, aa, bb, cc, dd, rr);
                                                   >> 488    if (f == 0.) return ier;
                                                   >> 489 
                                                   >> 490 // Test on satisfactory accuracy in iteration loop
                                                   >> 491    tol = eps;
                                                   >> 492    a = std::abs(*x);
                                                   >> 493    if (a > 1) tol = tol*a;
                                                   >> 494    if (std::abs(dx) <= tol && std::abs(f) <= tolf) return ier;
                                                   >> 495 
                                                   >> 496 // Preparation of next bisection loop
                                                   >> 497    if (f*fl < 0.) {
                                                   >> 498       xr = *x;
                                                   >> 499       fr = f;
                                                   >> 500    }
                                                   >> 501    else {
                                                   >> 502       xl = *x;
                                                   >> 503       fl = f;
                                                   >> 504       xr = xm;
                                                   >> 505       fr = fm;
                                                   >> 506    }
                                                   >> 507    goto label4;
                                                   >> 508 }
281                                                   509 
282   G4double coeff = 1.0;                        << 510 // Test function for root-finder
                                                   >> 511 G4double
                                                   >> 512 G4HadronElastic::Fctcos(G4double t, 
                                                   >> 513       G4double aa, G4double bb, G4double cc, G4double dd, 
                                                   >> 514       G4double rr)
                                                   >> 515 {
                                                   >> 516    const G4double expxl = -82.;
                                                   >> 517    const G4double expxu = 82.;
283                                                   518 
284   // heavy barions                             << 519    G4double test1 = -bb*t;
                                                   >> 520    if (test1 > expxu) test1 = expxu;
                                                   >> 521    if (test1 < expxl) test1 = expxl;
                                                   >> 522 
                                                   >> 523    G4double test2 = -dd*t;
                                                   >> 524    if (test2 > expxu) test2 = expxu;
                                                   >> 525    if (test2 < expxl) test2 = expxl;
285                                                   526 
286   static const G4double  lBarCof1S  = 0.88;    << 527    return aa*std::exp(test1) + cc*std::exp(test2) - rr;
287   static const G4double  lBarCof2S  = 0.76;    << 
288   static const G4double  lBarCof3S  = 0.64;    << 
289   static const G4double  lBarCof1C  = 0.784378 << 
290   static const G4double  lBarCofSC  = 0.664378 << 
291   static const G4double  lBarCof2SC = 0.544378 << 
292   static const G4double  lBarCof1B  = 0.740659 << 
293   static const G4double  lBarCofSB  = 0.620659 << 
294   static const G4double  lBarCof2SB = 0.500659 << 
295                                                << 
296   if( pdg == 3122 || pdg == 3222 ||  pdg == 31 << 
297   {                                            << 
298     coeff = lBarCof1S; // Lambda, Sigma+, Sigm << 
299                                                << 
300   } else if( pdg == 3322 || pdg == 3312   )    << 
301   {                                            << 
302     coeff = lBarCof2S; // Xi-, Xi0             << 
303   }                                            << 
304   else if( pdg == 3324)                        << 
305   {                                            << 
306     coeff = lBarCof3S; // Omega                << 
307   }                                            << 
308   else if( pdg == 4122 ||  pdg == 4212 ||   pd << 
309   {                                            << 
310     coeff = lBarCof1C; // LambdaC+, SigmaC+, S << 
311   }                                            << 
312   else if( pdg == 4332 )                       << 
313   {                                            << 
314     coeff = lBarCof2SC; // OmegaC              << 
315   }                                            << 
316   else if( pdg == 4232 || pdg == 4132 )        << 
317   {                                            << 
318     coeff = lBarCofSC; // XiC+, XiC0           << 
319   }                                            << 
320   else if( pdg == 5122 || pdg == 5222 || pdg = << 
321   {                                            << 
322     coeff = lBarCof1B; // LambdaB, SigmaB+, Si << 
323   }                                            << 
324   else if( pdg == 5332 )                       << 
325   {                                            << 
326     coeff = lBarCof2SB; // OmegaB-             << 
327   }                                            << 
328   else if( pdg == 5132 || pdg == 5232 ) // XiB << 
329   {                                            << 
330     coeff = lBarCofSB;                         << 
331   }                                            << 
332   // heavy mesons Kaons?                       << 
333   static const G4double lMesCof1S = 0.82; // K << 
334   static const G4double llMesCof1C = 0.676568; << 
335   static const G4double llMesCof1B = 0.610989; << 
336   static const G4double llMesCof2C = 0.353135; << 
337   static const G4double llMesCof2B = 0.221978; << 
338   static const G4double llMesCofSC = 0.496568; << 
339   static const G4double llMesCofSB = 0.430989; << 
340   static const G4double llMesCofCB = 0.287557; << 
341   static const G4double llMesCofEtaP = 0.88;   << 
342   static const G4double llMesCofEta = 0.76;    << 
343                                                << 
344   if( pdg == 321 || pdg == 311 || pdg == 310 ) << 
345   {                                            << 
346     coeff = lMesCof1S; //K+-0                  << 
347   }                                            << 
348   else if( pdg == 511 ||  pdg == 521  )        << 
349   {                                            << 
350     coeff = llMesCof1B; // BMeson0, BMeson+    << 
351   }                                            << 
352   else if(pdg == 421 ||  pdg == 411 )          << 
353   {                                            << 
354     coeff = llMesCof1C; // DMeson+, DMeson0    << 
355   }                                            << 
356   else if( pdg == 531  )                       << 
357   {                                            << 
358     coeff = llMesCofSB; // BSMeson0            << 
359   }                                            << 
360   else if( pdg == 541 )                        << 
361   {                                            << 
362     coeff = llMesCofCB; // BCMeson+-           << 
363   }                                            << 
364   else if(pdg == 431 )                         << 
365   {                                            << 
366     coeff = llMesCofSC; // DSMeson+-           << 
367   }                                            << 
368   else if(pdg == 441 || pdg == 443 )           << 
369   {                                            << 
370     coeff = llMesCof2C; // Etac, JPsi          << 
371   }                                            << 
372   else if(pdg == 553 )                         << 
373   {                                            << 
374     coeff = llMesCof2B; // Upsilon             << 
375   }                                            << 
376   else if(pdg == 221 )                         << 
377   {                                            << 
378     coeff = llMesCofEta; // Eta                << 
379   }                                            << 
380   else if(pdg == 331 )                         << 
381   {                                            << 
382     coeff = llMesCofEtaP; // Eta'              << 
383   }                                            << 
384   return coeff;                                << 
385 }                                                 528 }
386                                                   529 
387                                                   530 
388                                                   531