Import Geant4 8.3.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 15:07:44 +02:00
parent fe73f43734
commit 75c7fd177d
764 changed files with 45230 additions and 95238 deletions
@@ -14,6 +14,94 @@ code and to keep track of all tags.
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
03 May 2007 Dennis Wright (hadr-cross-V08-02-06)
------------------------------------------------
- G4HadronCrossSections::GetParticleCode() : replace code which
tested by particle name with code that tests by PDG ID. Also
use switch-case instead of else-if.
02 Apr 2007 Gunter Folger (hadr-cross-V08-02-05)
------------------------------------------------
- G4PiNuclearCrossSection.cc: remove special treatment ('tuning')
for Copper (Z=29), i.e. the Cu cross section is no longer lowered by 4%
22 Mar 2007 Dennis Wright for V. Ivanchenko (hadr-cross-V08-02-04)
------------------------------------------------------------------
- G4UPiNuclearCrossSection.cc: better handling of low energy cross sections
- Added new classes (V.Ivanchenko):
G4BGGNucleonElasticXS: proton and neutron elastic cross section wrapper
class using Barashenkov parameterization below
100 GeV and Glauber-Gribov model above
G4BGGNucleonInelasticXS: proton and neutron inelastic cross section
wrapper of Barashenkov-Glauber-Gribov
G4BGGPionElasticXS: pion elastic cross section wrapper of BGG
G4BGGPionInelasticXS: pion inelastic cross section wrapper of BGG
8 Mar 2007 Dennis Wright for V. Ivanchenko (hadr-cross-V08-02-03)
-----------------------------------------------------------------
- use G4NucleonNuclearCrossSection in G4UInelasticCrossSection and
G4UElasticCrossSection (V.Ivanchenko)
- complete implementations of A and Z interfaces to classes (V.Ivanchenko):
G4UPiNuclearCrossSection
G4UInelasticCrossSection
G4UElasticCrossSection
G4GlauberGribovCrossSection
G4NucleonNuclearCrossSection
30 Jan 2007 Dennis Wright (hadr-cross-V08-02-02)
------------------------------------------------
- add divide by zero protection to
G4CrossSectionDataStore::SelectRandomIsotope
27 Jan 2007 V. Ivanchenko (hadr-cross-V08-02-01)
------------------------------------------------
- add implementations of A and Z interfaces to classes:
G4UPiNuclearCrossSection
G4UInelasticCrossSection
G4UElasticCrossSection
G4GlauberGribovCrossSection
G4NucleonNuclearCrossSection
27 Dec 2006 Dennis Wright (hadr-cross-V08-02-00)
------------------------------------------------
- added handling of user-defined isotope abundances for elements and
proper cross section and abundance weighted choice of isotopes in
reactions. New virtual methods for IsApplicable and GetCrossSections
added to classes G4VCrossSectionDataSet and G4CrossSectionDataStore.
Other classes affected:
G4EMDissociationCrossSection.hh, .cc
G4ElectroNuclearCrossSection.hh, .cc
G4GeneralSpaceNNCrossSection.hh, .cc
G4HadronCaptureDataSet.hh
G4HadronCrossSections.hh, .cc
G4HadronElasticDataSet.hh
G4HadronFissionDataSet.hh
G4HadronInelasticDataSet.hh
G4IonProtonCrossSection.hh
G4IonsKoxCrossSection.hh, .cc
G4IonsShenCrossSection.hh, .cc
G4IonsSihverCrossSection.hh, .cc
G4NeutronInelasticCrossSection.hh, .cc
G4PhotoNuclearCrossSection.hh, .cc
G4PiNuclearCrossSection.hh, .cc
G4ProtonInelasticCrossSection.hh, .cc
G4TripathiCrossSection.hh, .cc
G4TripathiLightCrossSection.hh, .cc
NOTE: This tag should be used with the tag hadr-man-V08-02-00 of the
hadronic/management directory because G4HadronicProcess was affected
also.
- from Vladimir Grichine:
added new class G4NucleonNuclearCrossSection which
contains Barashenkov cross sections for nucleon-nucleus scattering
modified the G4PiData and G4GlauberGribovCrossSection classes
added ROOT files to test/analysis directory
16 Nov 2006 D.W. for Vladimir Grichine (hadr-cross-V08-01-08)
-------------------------------------------------------------
- G4GlauberGribovCrossSection: extend applicability down to 0.3 GeV for
@@ -0,0 +1,133 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGNucleonElasticXS.hh,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4BGGNucleonElasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 13.03.2007
// Modifications:
//
//
// Class Description:
//
// Wrapper of proton and neutron elastic cross-sections using Barashenkov
// parametersation below 100 GeV and Glauber-Gribov model above
//
// -------------------------------------------------------------------
//
#ifndef G4BGGNucleonElasticXS_h
#define G4BGGNucleonElasticXS_h
#include "globals.hh"
#include "G4VCrossSectionDataSet.hh"
#include "G4ParticleDefinition.hh"
#include "G4Element.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4GlauberGribovCrossSection;
class G4NucleonNuclearCrossSection;
class G4BGGNucleonElasticXS : public G4VCrossSectionDataSet
{
public:
G4BGGNucleonElasticXS (const G4ParticleDefinition*);
virtual ~G4BGGNucleonElasticXS();
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&);
virtual
void DumpPhysicsTable(const G4ParticleDefinition&);
private:
void Initialise();
G4double thEnergy; // threshold of Glauber model
G4double theFac[93];
const G4ParticleDefinition* particle;
G4GlauberGribovCrossSection* fGlauber;
G4NucleonNuclearCrossSection* fNucleon;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGNucleonElasticXS::IsApplicable(const G4DynamicParticle* dp,
const G4Element* elm)
{
return IsZAApplicable(dp, elm->GetZ(), elm->GetN());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGNucleonElasticXS::IsZAApplicable(const G4DynamicParticle* dp,
G4double Z, G4double/* A*/)
{
return (dp->GetDefinition() == particle && Z > 1.5);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4BGGNucleonElasticXS::GetCrossSection(const G4DynamicParticle* dp,
const G4Element* elm,
G4double temp)
{
return GetIsoZACrossSection(dp, elm->GetZ(), elm->GetN(), temp);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,133 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGNucleonInelasticXS.hh,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4BGGNucleonInelasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 13.03.2007
// Modifications:
//
//
// Class Description:
//
// Wrapper of proton and neutron inelastic cross-sections using Barashenkov
// parametersation below 100 GeV and Glauber-Gribov model above
//
// -------------------------------------------------------------------
//
#ifndef G4BGGNucleonInelasticXS_h
#define G4BGGNucleonInelasticXS_h
#include "globals.hh"
#include "G4VCrossSectionDataSet.hh"
#include "G4ParticleDefinition.hh"
#include "G4Element.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4GlauberGribovCrossSection;
class G4NucleonNuclearCrossSection;
class G4BGGNucleonInelasticXS : public G4VCrossSectionDataSet
{
public:
G4BGGNucleonInelasticXS (const G4ParticleDefinition*);
virtual ~G4BGGNucleonInelasticXS();
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&);
virtual
void DumpPhysicsTable(const G4ParticleDefinition&);
private:
void Initialise();
G4double thEnergy; // threshold of Glauber model
G4double theFac[93];
const G4ParticleDefinition* particle;
G4GlauberGribovCrossSection* fGlauber;
G4NucleonNuclearCrossSection* fNucleon;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGNucleonInelasticXS::IsApplicable(const G4DynamicParticle* dp,
const G4Element* elm)
{
return IsZAApplicable(dp, elm->GetZ(), elm->GetN());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGNucleonInelasticXS::IsZAApplicable(const G4DynamicParticle* dp,
G4double Z, G4double/* A*/)
{
return (dp->GetDefinition() == particle && Z > 1.5);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4BGGNucleonInelasticXS::GetCrossSection(const G4DynamicParticle* dp,
const G4Element* elm,
G4double temp)
{
return GetIsoZACrossSection(dp, elm->GetZ(), elm->GetN(), temp);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,133 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGPionElasticXS.hh,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4BGGPionElasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 01.10.2003
// Modifications:
//
//
// Class Description:
//
// Wrapper of pi+ and pi- inelastic cross-sections using Barashenkov
// parametersation below 100 GeV and Glauber-Gribov model above
//
// -------------------------------------------------------------------
//
#ifndef G4BGGPionElasticXS_h
#define G4BGGPionElasticXS_h
#include "globals.hh"
#include "G4VCrossSectionDataSet.hh"
#include "G4ParticleDefinition.hh"
#include "G4Element.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4GlauberGribovCrossSection;
class G4UPiNuclearCrossSection;
class G4BGGPionElasticXS : public G4VCrossSectionDataSet
{
public:
G4BGGPionElasticXS (const G4ParticleDefinition*);
virtual ~G4BGGPionElasticXS();
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&);
virtual
void DumpPhysicsTable(const G4ParticleDefinition&);
private:
void Initialise();
G4double thEnergy; // threshold of Glauber model
G4double theFac[93];
const G4ParticleDefinition* particle;
G4GlauberGribovCrossSection* fGlauber;
G4UPiNuclearCrossSection* fPion;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGPionElasticXS::IsApplicable(const G4DynamicParticle* dp,
const G4Element* elm)
{
return IsZAApplicable(dp, elm->GetZ(), elm->GetN());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGPionElasticXS::IsZAApplicable(const G4DynamicParticle* dp,
G4double Z, G4double/* A*/)
{
return (dp->GetDefinition() == particle && Z > 1.5);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4BGGPionElasticXS::GetCrossSection(const G4DynamicParticle* dp,
const G4Element* elm,
G4double temp)
{
return GetIsoZACrossSection(dp, elm->GetZ(), elm->GetN(), temp);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,133 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGPionInelasticXS.hh,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4BGGPionInelasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 01.10.2003
// Modifications:
//
//
// Class Description:
//
// Wrapper of pi+ and pi- inelastic cross-sections using Barashenkov
// parametersation below 100 GeV and Glauber-Gribov model above
//
// -------------------------------------------------------------------
//
#ifndef G4BGGPionInelasticXS_h
#define G4BGGPionInelasticXS_h
#include "globals.hh"
#include "G4VCrossSectionDataSet.hh"
#include "G4ParticleDefinition.hh"
#include "G4Element.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4GlauberGribovCrossSection;
class G4UPiNuclearCrossSection;
class G4BGGPionInelasticXS : public G4VCrossSectionDataSet
{
public:
G4BGGPionInelasticXS (const G4ParticleDefinition*);
virtual ~G4BGGPionInelasticXS();
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&);
virtual
void DumpPhysicsTable(const G4ParticleDefinition&);
private:
void Initialise();
G4double thEnergy; // threshold of Glauber model
G4double theFac[93];
const G4ParticleDefinition* particle;
G4GlauberGribovCrossSection* fGlauber;
G4UPiNuclearCrossSection* fPion;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGPionInelasticXS::IsApplicable(const G4DynamicParticle* dp,
const G4Element* elm)
{
return IsZAApplicable(dp, elm->GetZ(), elm->GetN());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4BGGPionInelasticXS::IsZAApplicable(const G4DynamicParticle* dp,
G4double Z, G4double/* A*/)
{
return (dp->GetDefinition() == particle && Z > 1.5);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4BGGPionInelasticXS::GetCrossSection(const G4DynamicParticle* dp,
const G4Element* elm,
G4double temp)
{
return GetIsoZACrossSection(dp, elm->GetZ(), elm->GetN(), temp);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,15 +23,11 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
//
// GEANT4 physics class: G4CrossSectionDataStore -- header file
// F.W. Jones, TRIUMF, 19-NOV-97
//
// Class Description
// This is the class to which to register data-sets. You can get the instance
// from energy hadronic process, and use its 'AddDataSet(...)' method to tailor
// the cross-sectinos for your application.
// This is the class to which cross section data sets may be registered.
// An instance of it is contained in each hadronic process, allowing
// the use of the AddDataSet() method to tailor the cross sections to
// your application.
// Class Description - End
#ifndef G4CrossSectionDataStore_h
@@ -39,7 +35,9 @@
#include "G4ParticleDefinition.hh"
#include "G4DynamicParticle.hh"
#include "G4Isotope.hh"
#include "G4Element.hh"
#include "G4Material.hh"
#include "G4VCrossSectionDataSet.hh"
@@ -49,16 +47,26 @@ public:
G4CrossSectionDataStore() :
NDataSetList(0), verboseLevel(0)
{
}
{}
~G4CrossSectionDataStore()
{
}
{}
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
G4double GetCrossSection(const G4DynamicParticle*,
const G4Isotope*, G4double aTemperature);
G4double GetCrossSection(const G4DynamicParticle*,
G4double Z, G4double A, G4double aTemperature);
// to replace GetMicroscopicCrossSection
G4double GetCrossSection(const G4DynamicParticle*, const G4Material*);
std::pair<G4double/*Z*/, G4double/*A*/>
SelectRandomIsotope(const G4DynamicParticle*, const G4Material*);
void AddDataSet(G4VCrossSectionDataSet*);
void BuildPhysicsTable(const G4ParticleDefinition&);
@@ -35,7 +35,7 @@
//
#ifndef G4EMDissociationCrossSection_h
#define G4EMDissociationCrossSection_h 1
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// MODULE: G4EMDissociationCrossSection.hh
//
@@ -46,7 +46,7 @@
// Customer: ESA/ESTEC, NOORDWIJK
// Contract: 17191/03/NL/LvH
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// CHANGE HISTORY
// --------------
@@ -57,8 +57,8 @@
// 15 March 2004, P R Truscott, QinetiQ Ltd, UK
// Beta release
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
////////////////////////////////////////////////////////////////////////////////
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
///////////////////////////////////////////////////////////////////////////////
//
#include "G4VCrossSectionDataSet.hh"
#include "G4DynamicParticle.hh"
@@ -67,7 +67,8 @@
#include "G4EMDissociationSpectrum.hh"
#include "G4PhysicsFreeVector.hh"
#include "globals.hh"
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
class G4EMDissociationCrossSection : public G4VCrossSectionDataSet
{
@@ -75,11 +76,18 @@ class G4EMDissociationCrossSection : public G4VCrossSectionDataSet
G4EMDissociationCrossSection ();
~G4EMDissociationCrossSection ();
virtual G4bool IsApplicable (const G4DynamicParticle *, const G4Element *);
virtual G4bool IsApplicable (const G4DynamicParticle*, const G4Element*);
virtual G4bool IsZAApplicable(const G4DynamicParticle*, G4double ZZ,
G4double AA);
virtual G4double GetCrossSection (const G4DynamicParticle *,
const G4Element *, G4double);
virtual G4double GetIsoZACrossSection(const G4DynamicParticle*,
G4double ZZ, G4double AA,
G4double temperature);
G4PhysicsFreeVector *GetCrossSectionForProjectile
(G4double, G4double, G4double, G4double, G4double, G4double);
G4PhysicsFreeVector *GetCrossSectionForTarget
@@ -101,6 +109,6 @@ class G4EMDissociationCrossSection : public G4VCrossSectionDataSet
G4double epsilon;
G4double xd;
};
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
#endif
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// GEANT4 tag $Name: geant4-08-02 $
// GEANT4 tag $Name: geant4-08-03 $
//
//
// GEANT4 physics class: G4ElectroNuclearCrossSection -- header file
@@ -59,16 +59,25 @@ public:
G4bool IsApplicable(const G4DynamicParticle* aParticle, const G4Element* )
{
//return theHadronCrossSections->IsApplicable(aParticle, anElement);
// Possible prototype
G4bool result = false;
if( aParticle->GetDefinition()==G4Electron::ElectronDefinition()) result = true;
if( aParticle->GetDefinition()==G4Positron::PositronDefinition()) result = true;
return result;
return IsZAApplicable(aParticle, 0., 0.);
}
G4double GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
G4double T=0.);
G4bool IsZAApplicable(const G4DynamicParticle* aParticle, G4double /*ZZ*/,
G4double /*AA*/)
{
G4bool result = false;
if( aParticle->GetDefinition()==G4Electron::ElectronDefinition()) result = true;
if( aParticle->GetDefinition()==G4Positron::PositronDefinition()) result = true;
return result;
}
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double T=0.);
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA, G4double T=0.);
G4double GetEquivalentPhotonEnergy();
@@ -90,9 +90,15 @@ class G4GeneralSpaceNNCrossSection : public G4VCrossSectionDataSet
virtual G4bool IsApplicable(const G4DynamicParticle* theProjectile,
const G4Element* theTarget);
virtual G4bool IsZAApplicable(const G4DynamicParticle* theProjectile,
G4double ZZ, G4double AA);
virtual G4double GetCrossSection(const G4DynamicParticle* theProjectile,
const G4Element* theTarget, G4double theTemperature);
virtual G4double GetIsoZACrossSection(const G4DynamicParticle* theProjectile,
G4double ZZ, G4double AA, G4double theTemperature);
virtual void BuildPhysicsTable(const G4ParticleDefinition&)
{;}
@@ -33,6 +33,10 @@
//
//
// 17.07.06 V. Grichine - first implementation
// 22.01.07 V.Ivanchenko - add interface with Z and A
// 05.03.07 V.Ivanchenko - add IfZAApplicable
// 06.03.07 V.Ivanchenko - add GetElasticGlauberGribov and GetElasticGlauberGribov
// for combined dataset
//
//
@@ -57,9 +61,18 @@ public:
virtual
G4bool IsApplicable(const G4DynamicParticle* aDP, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aDP, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
const G4Element*,
G4double aTemperature = 0.0);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*,
G4double Z, G4double A,
G4double aTemperature = 0.0);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&)
@@ -82,6 +95,9 @@ public:
G4double CalcMandelstamS( const G4double , const G4double , const G4double );
G4double GetElasticGlauberGribov(const G4DynamicParticle*,G4double Z, G4double A);
G4double GetInelasticGlauberGribov(const G4DynamicParticle*,G4double Z, G4double A);
G4double GetTotalGlauberGribovXsc() { return fTotalXsc; };
G4double GetElasticGlauberGribovXsc() { return fElasticXsc; };
G4double GetInelasticGlauberGribovXsc(){ return fInelasticXsc; };
@@ -132,4 +148,20 @@ private:
};
inline
G4double G4GlauberGribovCrossSection::GetElasticGlauberGribov(
const G4DynamicParticle* dp, G4double Z, G4double A)
{
GetIsoZACrossSection(dp, Z, A);
return fElasticXsc;
}
inline
G4double G4GlauberGribovCrossSection::GetInelasticGlauberGribov(
const G4DynamicParticle* dp, G4double Z, G4double A)
{
GetIsoZACrossSection(dp, Z, A);
return fInelasticXsc;
}
#endif
@@ -63,6 +63,12 @@ public:
return theHadronCrossSections->IsApplicable(aParticle, anElement);
}
G4bool IsZAApplicable(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA)
{
return theHadronCrossSections->IsApplicable(aParticle, ZZ, AA);
}
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double )
{
@@ -70,6 +76,13 @@ public:
anElement);
}
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/)
{
return theHadronCrossSections->GetCaptureCrossSection(aParticle, ZZ, AA);
}
void BuildPhysicsTable(const G4ParticleDefinition&)
{
}
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// GEANT4 tag $Name: geant4-08-02 $
// GEANT4 tag $Name: geant4-08-03 $
//
//
// GEANT4 Hadron physics class -- header file
@@ -109,34 +109,46 @@ public:
G4bool IsApplicable(const G4DynamicParticle* aParticle,
const G4Element* )
{
return (GetParticleCode(aParticle) > 0);
return (GetParticleCode(aParticle) > 0);
}
G4double GetElasticCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement)
G4bool IsApplicable(const G4DynamicParticle* aParticle,
G4double /*ZZ*/, G4double /*AA*/)
{
if (aParticle->GetDefinition() != prevParticleDefinition ||
anElement != prevElement ||
aParticle->GetKineticEnergy() != prevKineticEnergy)
CalcScatteringCrossSections(aParticle, anElement);
return sigelastic;
return (GetParticleCode(aParticle) > 0);
}
G4double GetInelasticCrossSection(const G4DynamicParticle* aParticle,
G4double GetElasticCrossSection(const G4DynamicParticle*, const G4Element*);
G4double GetElasticCrossSection(const G4DynamicParticle*,
G4double /*ZZ*/, G4double /*AA*/);
G4double GetInelasticCrossSection(const G4DynamicParticle*,
const G4Element*);
G4double GetInelasticCrossSection(const G4DynamicParticle*,
G4double /*ZZ*/, G4double /*AA*/);
G4double GetCaptureCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement)
{
if (aParticle->GetDefinition() != prevParticleDefinition ||
anElement != prevElement ||
aParticle->GetKineticEnergy() != prevKineticEnergy)
CalcScatteringCrossSections(aParticle, anElement);
return siginelastic;
return GetCaptureCrossSection(aParticle, anElement->GetZ(),
anElement->GetN());
}
G4double GetCaptureCrossSection(const G4DynamicParticle*,
const G4Element*);
G4double /*ZZ*/, G4double /*AA*/);
G4double GetFissionCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement)
{
return GetFissionCrossSection(aParticle, anElement->GetZ(),
anElement->GetN());
}
G4double GetFissionCrossSection(const G4DynamicParticle*,
const G4Element*);
G4double /*ZZ*/, G4double /*AA*/);
static void SetCorrectInelasticNearZero(G4bool value)
{
@@ -162,8 +174,8 @@ private:
G4int GetParticleCode(const G4DynamicParticle*);
void CalcScatteringCrossSections(const G4DynamicParticle*,
const G4Element*);
void CalcScatteringCrossSections(const G4DynamicParticle*,
G4double /*ZZ*/, G4double /*AA*/);
static G4HadronCrossSections* theInstance;
@@ -62,6 +62,13 @@ public:
return theHadronCrossSections->IsApplicable(aParticle, anElement);
}
G4bool IsZAApplicable(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA)
{
return theHadronCrossSections->IsApplicable(aParticle, ZZ, AA);
}
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double )
{
@@ -69,6 +76,14 @@ public:
anElement);
}
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/)
{
return theHadronCrossSections->GetElasticCrossSection(aParticle, ZZ, AA);
}
void BuildPhysicsTable(const G4ParticleDefinition&)
{
}
@@ -61,6 +61,13 @@ public:
return theHadronCrossSections->IsApplicable(aParticle, anElement);
}
G4bool IsZAApplicable(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA)
{
return theHadronCrossSections->IsApplicable(aParticle, ZZ, AA);
}
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double )
{
@@ -68,6 +75,14 @@ public:
anElement);
}
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/)
{
return theHadronCrossSections->GetFissionCrossSection(aParticle, ZZ, AA);
}
void BuildPhysicsTable(const G4ParticleDefinition&)
{
}
@@ -54,17 +54,33 @@ public:
{
}
G4bool IsApplicable(const G4DynamicParticle* aParticle,
const G4Element* anElement)
{
return theHadronCrossSections->IsApplicable(aParticle, anElement);
return theHadronCrossSections->IsApplicable(aParticle, anElement);
}
G4bool IsZAApplicable(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA)
{
return theHadronCrossSections->IsApplicable(aParticle, ZZ, AA);
}
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double /*aTemperature*/)
const G4Element* anElement,
G4double /*aTemperature*/)
{
return theHadronCrossSections->GetInelasticCrossSection(aParticle,
anElement);
return theHadronCrossSections->GetInelasticCrossSection(aParticle,
anElement);
}
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/)
{
return theHadronCrossSections->GetInelasticCrossSection(aParticle, ZZ, AA);
}
void BuildPhysicsTable(const G4ParticleDefinition&)
@@ -0,0 +1,133 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// Calculation of the total, elastic and inelastic cross-sections
// based on parametrisations of (proton, pion, kaon, photon) nucleon
// cross-sections and the hadron-nucleous cross-section model in
// the framework of Glauber-Gribov approach
//
//
//
//
//
// 14.03.07 V. Grichine - first implementation
//
//
#ifndef G4HadronNucleonXsc_h
#define G4HadronNucleonXsc_h
#include "globals.hh"
#include "G4Proton.hh"
#include "G4Nucleus.hh"
#include "G4VCrossSectionDataSet.hh"
class G4ParticleDefinition;
class G4DynamicParticle;
class G4HadronNucleonXsc : public G4VCrossSectionDataSet
{
public:
G4HadronNucleonXsc ();
virtual ~G4HadronNucleonXsc ();
virtual
G4bool IsApplicable(const G4DynamicParticle* aDP, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aDP, G4double Z, G4double A);
virtual
void DumpPhysicsTable(const G4ParticleDefinition&)
{G4cout << "G4HadronNucleonXsc: uses parametrisation"<<G4endl;}
// Xsc parametrisations
G4double GetHadronNucleonXscEL(const G4DynamicParticle*, const G4ParticleDefinition*);
G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, const G4ParticleDefinition*);
G4double GetHadronNucleonXscNS(const G4DynamicParticle*, const G4ParticleDefinition*);
G4double GetHadronNucleonXscVU(const G4DynamicParticle*, const G4ParticleDefinition*);
// kinematics and set/get
G4double CalculateEcmValue ( const G4double , const G4double , const G4double );
G4double CalcMandelstamS( const G4double , const G4double , const G4double );
G4double GetTotalHadronNucleonXsc() { return fTotalXsc; };
G4double GetElasticHadronNucleonXsc() { return fElasticXsc; };
G4double GetInelasticHadronNucleonXsc(){ return fInelasticXsc; };
private:
const G4double fUpperLimit;
const G4double fLowerLimit;
G4double fTotalXsc, fElasticXsc, fInelasticXsc;
G4double fHadronNucleonXsc;
G4ParticleDefinition* theGamma;
G4ParticleDefinition* theProton;
G4ParticleDefinition* theNeutron;
G4ParticleDefinition* theAProton;
G4ParticleDefinition* theANeutron;
G4ParticleDefinition* thePiPlus;
G4ParticleDefinition* thePiMinus;
G4ParticleDefinition* thePiZero;
G4ParticleDefinition* theKPlus;
G4ParticleDefinition* theKMinus;
G4ParticleDefinition* theK0S;
G4ParticleDefinition* theK0L;
G4ParticleDefinition* theL;
G4ParticleDefinition* theAntiL;
G4ParticleDefinition* theSPlus;
G4ParticleDefinition* theASPlus;
G4ParticleDefinition* theSMinus;
G4ParticleDefinition* theASMinus;
G4ParticleDefinition* theS0;
G4ParticleDefinition* theAS0;
G4ParticleDefinition* theXiMinus;
G4ParticleDefinition* theXi0;
G4ParticleDefinition* theAXiMinus;
G4ParticleDefinition* theAXi0;
G4ParticleDefinition* theOmega;
G4ParticleDefinition* theAOmega;
G4ParticleDefinition* theD;
G4ParticleDefinition* theT;
G4ParticleDefinition* theA;
G4ParticleDefinition* theHe3;
};
#endif
@@ -43,27 +43,43 @@ class G4IonProtonCrossSection : public G4VCrossSectionDataSet
public:
virtual
G4bool IsApplicable(const G4DynamicParticle* aPart, const G4Element*anEle)
G4bool IsZAApplicable(const G4DynamicParticle* aPart, G4double /*ZZ*/,
G4double AA)
{
G4bool result = false;
if(( anEle->GetN()<1.1) &&
( aPart->GetKineticEnergy()/aPart->GetDefinition()->GetBaryonNumber()<20*GeV&&
aPart->GetDefinition()->GetBaryonNumber()>4)
if((AA < 1.1) &&
( aPart->GetKineticEnergy()/aPart->GetDefinition()
->GetBaryonNumber() < 20*GeV &&
aPart->GetDefinition()->GetBaryonNumber() > 4)
) result = true;
return result;
}
virtual
G4bool IsApplicable(const G4DynamicParticle* aPart, const G4Element* anEle)
{
return IsZAApplicable(aPart, 0., anEle->GetN());
}
virtual
G4double GetCrossSection(const G4DynamicParticle* aPart,
const G4Element*, G4double )
{
G4ProtonInelasticCrossSection theForward;
G4double result = theForward.GetCrossSection(aPart->GetKineticEnergy(),
aPart->GetDefinition()->GetBaryonNumber(),
aPart->GetDefinition()->GetPDGCharge());
return result;
return GetIsoZACrossSection(aPart, 0., 0., 0.);
}
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle* aPart,
G4double /*ZZ*/, G4double /*AA*/,
G4double /*temperature*/)
{
G4ProtonInelasticCrossSection theForward;
return theForward.GetCrossSection(aPart->GetKineticEnergy(),
aPart->GetDefinition()->GetBaryonNumber(),
aPart->GetDefinition()->GetPDGCharge());
}
virtual
void BuildPhysicsTable(const G4ParticleDefinition&)
{}
@@ -53,9 +53,15 @@ class G4IonsKoxCrossSection : public G4VCrossSectionDataSet
{
}
virtual
G4bool IsApplicable(const G4DynamicParticle* aDP, const G4Element*)
{
return IsZAApplicable(aDP, 0., 0.);
}
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aDP, G4double /*ZZ*/,
G4double /*AA*/)
{
G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber();
G4double kineticEnergy = aDP->GetKineticEnergy();
@@ -68,6 +74,10 @@ class G4IonsKoxCrossSection : public G4VCrossSectionDataSet
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double ZZ,
G4double AA, G4double aTemperature);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&)
{}
@@ -39,6 +39,8 @@
// 0 is returned to a partilce with energy lowae than 10 MeV/n
// 15-Nov-2006 Change upper limit to 1 TeV/n
// However above 10GeV/n XS become constant.
// 23-Dec-2006 Isotope dependence added by D. Wright
//
#include "globals.hh"
#include "G4Proton.hh"
@@ -57,6 +59,13 @@ class G4IonsShenCrossSection : public G4VCrossSectionDataSet
virtual
G4bool IsApplicable(const G4DynamicParticle* aDP, const G4Element*)
{
return IsZAApplicable(aDP, 0., 0.);
}
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aDP,
G4double /*ZZ*/, G4double /*AA*/)
{
G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber();
G4double kineticEnergy = aDP->GetKineticEnergy();
@@ -65,10 +74,15 @@ class G4IonsShenCrossSection : public G4VCrossSectionDataSet
return false;
}
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double ZZ,
G4double AA, G4double aTemperature);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&)
{}
@@ -34,6 +34,8 @@
// Valid for 100>MeV/nucleon
// Class Description - End
//
// 23-Dec-2006 Isotope dependence added by D. Wright
//
#include "globals.hh"
#include "G4Proton.hh"
@@ -50,6 +52,13 @@ class G4IonsSihverCrossSection : public G4VCrossSectionDataSet
virtual
G4bool IsApplicable(const G4DynamicParticle* aDP, const G4Element*)
{
return IsZAApplicable(aDP, 0., 0.);
}
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aDP, G4double /*ZZ*/,
G4double /*AA*/)
{
G4int BaryonNumber = aDP->GetDefinition()->GetBaryonNumber();
G4double KineticEnergy = aDP->GetKineticEnergy();
@@ -62,6 +71,10 @@ class G4IonsSihverCrossSection : public G4VCrossSectionDataSet
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double ZZ,
G4double AA, G4double aTemperature);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&)
{}
@@ -24,6 +24,8 @@
// ********************************************************************
//
// by JPW, working, but to be cleaned up. @@@@
// D. Wright, 23-Dec-2006 Added isotope dependence
//
#ifndef G4NeutronInelasticCrossSection_h
#define G4NeutronInelasticCrossSection_h
@@ -54,10 +56,30 @@ class G4NeutronInelasticCrossSection : public G4VCrossSectionDataSet
return result;
}
G4bool IsZAApplicable(const G4DynamicParticle* aPart,
G4double ZZ, G4double /*AA*/)
{
G4bool result = false;
if(( aPart->GetDefinition() == G4Neutron::Neutron()) &&
( aPart->GetKineticEnergy() < 20*GeV) &&
aPart->GetKineticEnergy() > 19.9*MeV) result = true;
if(ZZ < 2) result = false;
return result;
}
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/)
{
return GetCrossSection(aParticle->GetKineticEnergy(), AA, ZZ);
}
G4double GetCrossSection(G4double anEnergy, G4double anA, G4double aZ);
virtual
@@ -0,0 +1,198 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// author: Vladimir.Grichine@cern.ch
//
// Implements data from: Barashenkov V.S., Nucleon-Nucleus Cross Section,
// Preprint JINR P2-89-770, p. 12, Dubna 1989 (scanned version from KEK)
// Based on G. Folger version of G4PiNuclearCrossSection class
//
// Modified:
// 05.03.07 V.Ivanchenko - add IfZAApplicable, remove "debug"
// 06.03.07 V.Ivanchenko - add GetElasticCrossSection for combined dataset
//
#ifndef G4NucleonNuclearCrossSection_h
#define G4NucleonNuclearCrossSection_h
#include "G4VCrossSectionDataSet.hh"
#include "G4ParticleDefinition.hh"
#include "globals.hh"
#include "G4PiData.hh"
#include "G4HadTmpUtil.hh"
class G4NucleonNuclearCrossSection : public G4VCrossSectionDataSet
{
public:
G4NucleonNuclearCrossSection();
virtual ~G4NucleonNuclearCrossSection();
virtual G4bool IsApplicable(const G4DynamicParticle* aParticle, const G4Element* anElement);
virtual G4bool IsZAApplicable(const G4DynamicParticle* aParticle, G4double Z, G4double A);
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement,
G4double T=0.);
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA, G4double T=0. );
G4double GetElasticCrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA);
G4double GetTotalXsc() { return fTotalXsc; };
G4double GetElasticXsc(){ return fElasticXsc; };
void BuildPhysicsTable(const G4ParticleDefinition&) {}
void DumpPhysicsTable(const G4ParticleDefinition&) {}
private:
G4double Interpolate(G4int Z1, G4int Z2, G4int Z, G4double x1, G4double x2);
// add Hydrogen from PDG group.
static const G4double e1[44];
static const G4double he_m_t[44];
static const G4double he_m_in[44];
static const G4double he_p_in[44];
static const G4double be_m_t[44];
static const G4double be_m_in[44];
static const G4double be_p_in[44];
static const G4double c_m_t[44];
static const G4double c_m_in[44];
static const G4double c_p_in[44];
static const G4double e2[44];
static const G4double n_m_t[44];
static const G4double n_m_in[44];
static const G4double n_p_in[44];
static const G4double o_m_t[44];
static const G4double o_m_in[44];
static const G4double o_p_in[44];
static const G4double na_m_t[44];
static const G4double na_m_in[44];
static const G4double na_p_in[44];
static const G4double e3[45];
// static const G4double e3_1[31];
static const G4double al_m_t[45];
static const G4double al_m_in[45];
static const G4double al_p_in[45];
static const G4double si_m_t[45];
static const G4double si_m_in[45];
static const G4double si_p_in[45];
static const G4double ca_m_t[45];
static const G4double ca_m_in[45];
static const G4double ca_p_in[45];
static const G4double e4[47];
static const G4double fe_m_t[47];
static const G4double fe_m_in[47];
static const G4double fe_p_in[47];
static const G4double cu_m_t[47];
static const G4double cu_m_in[47];
static const G4double cu_p_in[47];
static const G4double mo_m_t[47];
static const G4double mo_m_in[47];
static const G4double mo_p_in[47];
static const G4double e5[48];
static const G4double cd_m_t[48];
static const G4double cd_m_in[48];
static const G4double cd_p_in[48];
static const G4double sn_m_t[48];
static const G4double sn_m_in[48];
static const G4double sn_p_in[48];
static const G4double w_m_t[48];
static const G4double w_m_in[48];
static const G4double w_p_in[48];
static const G4double e6[46];
// static const G4double e7[46];
static const G4double pb_m_t[46];
static const G4double pb_m_in[46];
static const G4double pb_p_in[46];
static const G4double u_m_t[46];
static const G4double u_m_in[46];
static const G4double u_p_in[46];
// vectors for treatment
std::vector< G4int > theZ;
std::vector< G4PiData* > thePipData;
std::vector< G4PiData* > thePimData;
// cross sections
G4double fTotalXsc;
G4double fElasticXsc;
// particles
const G4ParticleDefinition* theProton;
const G4ParticleDefinition* theNeutron;
};
inline
G4double G4NucleonNuclearCrossSection::GetElasticCrossSection(
const G4DynamicParticle* dp, G4double ZZ, G4double AA)
{
GetIsoZACrossSection(dp, ZZ, AA);
return fElasticXsc;
}
#endif
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// GEANT4 tag $Name: geant4-08-02 $
// GEANT4 tag $Name: geant4-08-03 $
//
//
// GEANT4 physics class: G4PhotoNuclearCrossSection -- header file
@@ -56,21 +56,28 @@ public:
~G4PhotoNuclearCrossSection() {}
G4bool IsApplicable(const G4DynamicParticle* aParticle, const G4Element* )
G4bool IsApplicable(const G4DynamicParticle* particle, const G4Element* )
{
//return theHadronCrossSections->IsApplicable(aParticle, anElement);
// Possible prototype
G4bool result = false;
if( aParticle->GetDefinition()->GetPDGEncoding()==22) result = true;
return result;
return IsZAApplicable(particle, 0, 0);
}
G4double GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
G4double T=0.);
//{
// return theHadronCrossSections->GetInelasticCrossSection(aParticle,
// anElement);
//}
G4bool IsZAApplicable(const G4DynamicParticle* particle,
G4double /*ZZ*/, G4double /*AA*/)
{
G4bool result = false;
if( particle->GetDefinition()->GetPDGEncoding()==22) result = true;
return result;
}
G4double GetCrossSection(const G4DynamicParticle* particle,
const G4Element* element, G4double temp = 0.);
G4double GetIsoZACrossSection(const G4DynamicParticle* particle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/);
void BuildPhysicsTable(const G4ParticleDefinition&) {}
@@ -122,10 +129,15 @@ inline G4double G4PhotoNuclearCrossSection::ThresholdEnergy(G4int Z, G4int N)
// ---------
G4double mP= infEn;
//if(Z) mP= G4QPDGCode(111).GetNuclMass(Z-1,N,0);
if(Z&&G4NucleiPropertiesTable::IsInTable(Z-1,A-1)) mP=G4NucleiProperties::GetNuclearMass(A-1,Z-1);
if(Z && G4NucleiPropertiesTable::IsInTable(Z-1,A-1))
{
mP = G4NucleiProperties::GetNuclearMass(A-1,Z-1);
}
else
{
G4cerr<<"G4PhotoNucCrossSect.hh::ThrEn:Z="<<Z-1<<",A="<<A-1<<" element isn't in G4NucP"<<G4endl;
G4cerr << "G4PhotoNucCrossSect.hh::ThrEn:Z=" << Z-1 << ",A="
<< A-1 << " element isn't in G4NucP" << G4endl;
}
G4double mN= infEn;
//if(N) mN= G4QPDGCode(111).GetNuclMass(Z,N-1,0);
@@ -35,11 +35,16 @@
class G4PiData : public std::vector<std::pair<G4double, std::pair<G4double, G4double > > >
{
public:
G4PiData(const G4double * aTotal, const G4double * aInelastic, const G4double * anEnergy, G4int nPoints);
G4PiData(const G4double * aTotal, const G4double * aInelastic,
const G4double * anEnergy, G4int nPoints);
struct Delete{void operator()(G4PiData * aP){delete aP;} };
G4bool AppliesTo(G4double kineticEnergy);
G4double ReactionXSection(G4double kineticEnergy);
G4double ElasticXSection(G4double kineticEnergy);
G4double TotalXSection(G4double kineticEnergy);
private:
@@ -40,6 +40,7 @@ class G4PiNuclearCrossSection : public G4VCrossSectionDataSet
G4PiNuclearCrossSection();
virtual ~G4PiNuclearCrossSection();
G4bool IsApplicable(const G4DynamicParticle* aParticle, const G4Element* anElement)
{
G4bool result = false;
@@ -49,9 +50,34 @@ class G4PiNuclearCrossSection : public G4VCrossSectionDataSet
if(aParticle->GetKineticEnergy() > 999.9*GeV) result=false;
return result;
}
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement,
G4double T=0.);
G4bool IsZAApplicable(const G4DynamicParticle* particle,
G4double ZZ, G4double /*AA*/)
{
G4bool result = false;
if(particle->GetDefinition() == G4PionMinus::PionMinus()) result=true;
if(particle->GetDefinition() == G4PionPlus::PionPlus()) result=true;
if(G4lrint(ZZ) == 1) result = false;
if(particle->GetKineticEnergy() > 999.9*GeV) result=false;
return result;
}
G4double GetCrossSection(const G4DynamicParticle* particle,
const G4Element* element,
G4double temperature)
{
return GetIsoZACrossSection(particle, element->GetZ(),
element->GetN(), temperature);
}
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/);
G4double GetTotalXsc() { return fTotalXsc; };
G4double GetElasticXsc(){ return fElasticXsc; };
void BuildPhysicsTable(const G4ParticleDefinition&) {}
void DumpPhysicsTable(const G4ParticleDefinition&) {}
@@ -136,6 +162,12 @@ std::vector<G4int> theZ;
std::vector<G4PiData *> thePipData;
std::vector<G4PiData *> thePimData;
// cross sections
G4double fTotalXsc;
G4double fElasticXsc;
};
#endif
@@ -25,6 +25,8 @@
//
// by JPW, working, but to be cleaned up. @@@@
// G.Folger, 29-sept-2006: extend to 1TeV, using a constant above 20GeV
// D. Wright, 23-Dec-2006: added isotope dependence
//
#ifndef G4ProtonInelasticCrossSection_h
#define G4ProtonInelasticCrossSection_h
@@ -34,7 +36,8 @@
// energy threshold behaviour right.
// H.P. Wellisch (TRIUMF), D. Axen (British Columbia U.). 1996.
// Published in Phys.Rev.C54:1329-1332,1996
// Implements corrected parameterization from http://laws.lanl.gov/XCI/PEOPLE/rep/pdf/RPS96.pdf
// Implements corrected parameterization from
// http://laws.lanl.gov/XCI/PEOPLE/rep/pdf/RPS96.pdf
// Class Description - End
@@ -57,10 +60,28 @@ class G4ProtonInelasticCrossSection : public G4VCrossSectionDataSet
return result;
}
G4bool IsZAApplicable(const G4DynamicParticle* aParticle,
G4double ZZ, G4double /*AA*/)
{
G4bool result = false;
if (( aParticle->GetDefinition() == G4Proton::Proton()) &&
( aParticle->GetKineticEnergy() < 1*TeV) ) result = true;
if (ZZ < 3) result = false;
return result;
}
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double ZZ, G4double AA,
G4double /*aTemperature*/)
{
return GetCrossSection(aParticle->GetKineticEnergy(), AA, ZZ);
}
G4double GetCrossSection(G4double anEnergy, G4double anA, G4double aZ);
virtual
@@ -44,6 +44,13 @@ class G4TripathiCrossSection : public G4VCrossSectionDataSet
virtual
G4bool IsApplicable(const G4DynamicParticle* aPart, const G4Element*)
{
return IsZAApplicable(aPart, 0., 0.);
}
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aPart, G4double /*ZZ*/,
G4double /*AA*/)
{
G4bool result = false;
if(( aPart->GetDefinition()->GetBaryonNumber()>2.5) &&
@@ -51,10 +58,15 @@ class G4TripathiCrossSection : public G4VCrossSectionDataSet
return result;
}
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double ZZ,
G4double AA, G4double aTemperature);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&)
{}
@@ -57,6 +57,8 @@
// 15 March 2004, P R Truscott, QinetiQ Ltd, UK
// Beta release
//
// 26 Dec 2006, D. Wright - added isotope dependence
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// Class Description
@@ -83,9 +85,17 @@ class G4TripathiLightCrossSection : public G4VCrossSectionDataSet
virtual G4bool IsApplicable(const G4DynamicParticle* theProjectile,
const G4Element* theTarget);
virtual G4bool IsZAApplicable(const G4DynamicParticle* theProjectile,
G4double ZZ, G4double AA);
virtual G4double GetCrossSection(const G4DynamicParticle* theProjectile,
const G4Element* theTarget, G4double theTemperature);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle* theProjectile,
G4double ZZ, G4double AA,
G4double theTemperature);
virtual void BuildPhysicsTable(const G4ParticleDefinition&)
{}
@@ -27,6 +27,9 @@
// original componetns
//
// 12.08.06 V.Ivanchenko - first implementation
// 22.01.07 V.Ivanchenko - add GetIsoZACrossSection
// 05.03.07 V.Ivanchenko - use G4NucleonNuclearCrossSection
// 06.03.07 V.Ivanchenko - add Initialise function
//
//
@@ -40,23 +43,32 @@
class G4ParticleDefinition;
class G4GlauberGribovCrossSection;
class G4HadronCrossSections;
class G4NucleonNuclearCrossSection;
class G4UPiNuclearCrossSection;
class G4HadronCrossSections;
class G4ParticleDefinition;
class G4UElasticCrossSection : public G4VCrossSectionDataSet
{
public:
G4UElasticCrossSection ();
G4UElasticCrossSection (const G4ParticleDefinition* p=0);
virtual ~G4UElasticCrossSection ();
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
const G4Element*, G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&);
@@ -66,12 +78,16 @@ public:
private:
G4int idx;
void Initialise(const G4ParticleDefinition*);
G4GlauberGribovCrossSection* fGlauber;
G4HadronCrossSections* fGheisha;
G4UPiNuclearCrossSection* fUPi;
G4bool hasGlauber;
G4double thEnergy; // threshold of Glauber model
G4double theFac[93];
G4GlauberGribovCrossSection* fGlauber;
G4NucleonNuclearCrossSection* fNucleon;
G4UPiNuclearCrossSection* fUPi;
G4HadronCrossSections* fGheisha;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -27,6 +27,9 @@
// original componetns
//
// 12.08.06 V.Ivanchenko - first implementation
// 22.01.07 V.Ivanchenko - add GetIsoZACrossSection
// 05.03.07 V.Ivanchenko - use G4NucleonNuclearCrossSection
// 06.03.07 V.Ivanchenko - add Initialise function
//
//
@@ -40,8 +43,7 @@
class G4ParticleDefinition;
class G4GlauberGribovCrossSection;
class G4ProtonInelasticCrossSection;
class G4NeutronInelasticCrossSection;
class G4NucleonNuclearCrossSection;
class G4UPiNuclearCrossSection;
class G4HadronCrossSections;
class G4ParticleDefinition;
@@ -57,9 +59,16 @@ public:
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*);
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*, G4double aTemperature);
const G4Element*, G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&);
@@ -69,11 +78,14 @@ public:
private:
G4int idx;
void Initialise(const G4ParticleDefinition*);
G4bool hasGlauber;
G4double thEnergy; // threshold of Glauber model
G4double theFac[93];
G4GlauberGribovCrossSection* fGlauber;
G4ProtonInelasticCrossSection* fGhadProton;
G4NeutronInelasticCrossSection* fGhadNeutron;
G4NucleonNuclearCrossSection* fNucleon;
G4UPiNuclearCrossSection* fUPi;
G4HadronCrossSections* fGheisha;
@@ -27,6 +27,8 @@
// based on Barashenkov parametrisations of pion data
//
// 16.08.06 V.Ivanchenko - first implementation
// 22.01.07 V.Ivanchenko - add cross section interfaces with Z and A
// 05.03.07 V.Ivanchenko - add IfZAApplicable
//
@@ -49,18 +51,34 @@ public:
virtual ~G4UPiNuclearCrossSection();
virtual
G4bool IsApplicable(const G4DynamicParticle* aParticle,
const G4Element* anElement);
virtual
G4bool IsZAApplicable(const G4DynamicParticle* aParticle,
G4double Z, G4double A);
virtual
G4double GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double);
const G4Element* anElement, G4double T=0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle* aParticle,
G4double Z, G4double A, G4double T=0.);
G4double GetElasticCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement);
G4double GetElasticCrossSection(const G4DynamicParticle* aParticle,
G4double Z, G4double A);
G4double GetInelasticCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement);
G4double GetInelasticCrossSection(const G4DynamicParticle* aParticle,
G4double Z, G4double A);
void BuildPhysicsTable(const G4ParticleDefinition&);
void DumpPhysicsTable(const G4ParticleDefinition&);
@@ -94,17 +112,45 @@ private:
inline G4bool G4UPiNuclearCrossSection::IsApplicable(
const G4DynamicParticle* part,
const G4Element* elm)
{
return IsZAApplicable(part, elm->GetZ(), elm->GetN());
}
inline G4bool G4UPiNuclearCrossSection::IsZAApplicable(
const G4DynamicParticle* part,
G4double Z, G4double)
{
return ((part->GetDefinition() == piMinus ||
part->GetDefinition() == piPlus) &&
elm->GetZ() > 1.5);
Z > 1.5);
}
inline G4double G4UPiNuclearCrossSection::GetCrossSection(
const G4DynamicParticle* dp,
const G4Element* elm, G4double)
{
return GetInelasticCrossSection(dp, elm);
return GetInelasticCrossSection(dp, elm->GetZ(), elm->GetN());
}
inline G4double G4UPiNuclearCrossSection::GetIsoZACrossSection(
const G4DynamicParticle* dp,
G4double Z, G4double A, G4double)
{
return GetInelasticCrossSection(dp, Z, A);
}
inline G4double G4UPiNuclearCrossSection::GetInelasticCrossSection(
const G4DynamicParticle* dp,
const G4Element* elm)
{
return GetInelasticCrossSection(dp, elm->GetZ(), elm->GetN());
}
inline G4double G4UPiNuclearCrossSection::GetElasticCrossSection(
const G4DynamicParticle* dp,
const G4Element* elm)
{
return GetElasticCrossSection(dp, elm->GetZ(), elm->GetN());
}
#endif
@@ -24,15 +24,13 @@
// ********************************************************************
//
//
//
//
// GEANT4 physics abstract class: G4VCrossSectionData -- header file
// F.W. Jones, TRIUMF, 20-JAN-97
//
// Class Description
// This class serves as base class for cross-section data sets in geant4
// hadronic physics. Users can derive their specialized classes, and register with
// the system, or use provided data sets.
// This is a base class for hadronic cross section data sets. Users may
// derive specialized cross section classes and register them with the
// appropriate process, or use provided data sets.
// Class Description - End
#ifndef G4VCrossSectionDataSet_h
@@ -48,24 +46,33 @@ public:
G4VCrossSectionDataSet() :
verboseLevel(0)
{
}
{}
virtual ~G4VCrossSectionDataSet()
{
}
{}
public: //with description
// the following methods need to be implemented for a new data-set.
// The following methods need to be implemented for each new data set.
virtual
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*) = 0;
virtual
G4bool IsZAApplicable(const G4DynamicParticle*, G4double /*Z*/, G4double /*A*/);
virtual
G4double GetCrossSection(const G4DynamicParticle*,
const G4Element*,
G4double aTemperature = 0.) = 0;
virtual
G4double GetIsoCrossSection(const G4DynamicParticle*, const G4Isotope*,
G4double aTemperature = 0.);
virtual
G4double GetIsoZACrossSection(const G4DynamicParticle*, G4double /*Z*/,
G4double /*A*/, G4double aTemperature = 0.);
virtual
void BuildPhysicsTable(const G4ParticleDefinition&) = 0;
@@ -0,0 +1,157 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGNucleonElasticXS.cc,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class file
//
//
// File name: G4BGGNucleonElasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 13.03.2007
// Modifications:
//
//
// -------------------------------------------------------------------
//
#include "G4BGGNucleonElasticXS.hh"
#include "G4GlauberGribovCrossSection.hh"
#include "G4NucleonNuclearCrossSection.hh"
#include "G4Proton.hh"
#include "G4Neutron.hh"
#include "G4NistManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGNucleonElasticXS::G4BGGNucleonElasticXS(const G4ParticleDefinition* p)
{
verboseLevel = 0;
thEnergy = 100.*GeV;
if(p == G4Proton::Proton() || p == G4Neutron::Neutron()) {
fNucleon = new G4NucleonNuclearCrossSection();
fGlauber = new G4GlauberGribovCrossSection();
particle = p;
Initialise();
} else {
fNucleon = 0;
fGlauber = 0;
particle = 0;
if(p) G4cout << "### G4BGGNucleonElasticXS WARNING: is not applicable to "
<< p->GetParticleName()
<< G4endl;
else G4cout << "### G4BGGNucleonElasticXS WARNING: particle is not defined "
<< G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGNucleonElasticXS::~G4BGGNucleonElasticXS()
{
delete fGlauber;
delete fNucleon;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4BGGNucleonElasticXS::GetIsoZACrossSection(const G4DynamicParticle* dp,
G4double Z,
G4double A,
G4double)
{
G4double cross = 0.0;
G4double ekin = dp->GetKineticEnergy();
G4int iz = G4int(Z + 0.5);
if(iz > 92) iz = 92;
if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetElasticGlauberGribov(dp, Z, A);
} else {
cross = fNucleon->GetIsoZACrossSection(dp, Z, A);
}
if(verboseLevel > 1)
G4cout << "G4BGGNucleonElasticXS::GetCrossSection for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< " in nucleus Z= " << Z << " A= " << A
<< " XS(b)= " << cross/barn
<< G4endl;
return cross;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGNucleonElasticXS::BuildPhysicsTable(const G4ParticleDefinition&)
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGNucleonElasticXS::DumpPhysicsTable(const G4ParticleDefinition&)
{
G4cout << "G4BGGNucleonElasticXS:"<<G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGNucleonElasticXS::Initialise()
{
G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(particle);
G4ThreeVector mom(0.0,0.0,1.0);
G4DynamicParticle dp(part, mom, thEnergy);
G4NistManager* nist = G4NistManager::Instance();
G4double A = nist->GetAtomicMassAmu(2);
G4double csup, csdn;
if(verboseLevel > 0) G4cout << "### G4BGGNucleonElasticXS::Initialise for "
<< particle->GetParticleName() << G4endl;
for(G4int iz=2; iz<93; iz++) {
G4double Z = G4double(iz);
A = nist->GetAtomicMassAmu(iz);
csup = fGlauber->GetElasticGlauberGribov(&dp, Z, A);
csdn = fNucleon->GetIsoZACrossSection(&dp, Z, A);
theFac[iz] = csdn/csup;
if(verboseLevel > 0) G4cout << "Z= " << Z << " A= " << A
<< " factor= " << theFac[iz] << G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -0,0 +1,157 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGNucleonInelasticXS.cc,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class file
//
//
// File name: G4BGGNucleonInelasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 13.03.2007
// Modifications:
//
//
// -------------------------------------------------------------------
//
#include "G4BGGNucleonInelasticXS.hh"
#include "G4GlauberGribovCrossSection.hh"
#include "G4NucleonNuclearCrossSection.hh"
#include "G4Proton.hh"
#include "G4Neutron.hh"
#include "G4NistManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGNucleonInelasticXS::G4BGGNucleonInelasticXS(const G4ParticleDefinition* p)
{
verboseLevel = 0;
thEnergy = 100.*GeV;
if(p == G4Proton::Proton() || p == G4Neutron::Neutron()) {
fNucleon = new G4NucleonNuclearCrossSection();
fGlauber = new G4GlauberGribovCrossSection();
particle = p;
Initialise();
} else {
fNucleon = 0;
fGlauber = 0;
particle = 0;
if(p) G4cout << "### G4BGGNucleonInelasticXS WARNING: is not applicable to "
<< p->GetParticleName()
<< G4endl;
else G4cout << "### G4BGGNucleonInelasticXS WARNING: particle is not defined "
<< G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGNucleonInelasticXS::~G4BGGNucleonInelasticXS()
{
delete fGlauber;
delete fNucleon;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4BGGNucleonInelasticXS::GetIsoZACrossSection(const G4DynamicParticle* dp,
G4double Z,
G4double A,
G4double)
{
G4double cross = 0.0;
G4double ekin = dp->GetKineticEnergy();
G4int iz = G4int(Z + 0.5);
if(iz > 92) iz = 92;
if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetInelasticGlauberGribov(dp, Z, A);
} else {
cross = fNucleon->GetIsoZACrossSection(dp, Z, A);
}
if(verboseLevel > 1)
G4cout << "G4BGGNucleonInelasticXS::GetCrossSection for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< " in nucleus Z= " << Z << " A= " << A
<< " XS(b)= " << cross/barn
<< G4endl;
return cross;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGNucleonInelasticXS::BuildPhysicsTable(const G4ParticleDefinition&)
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGNucleonInelasticXS::DumpPhysicsTable(const G4ParticleDefinition&)
{
G4cout << "G4BGGNucleonInelasticXS:"<<G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGNucleonInelasticXS::Initialise()
{
G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(particle);
G4ThreeVector mom(0.0,0.0,1.0);
G4DynamicParticle dp(part, mom, thEnergy);
G4NistManager* nist = G4NistManager::Instance();
G4double A = nist->GetAtomicMassAmu(2);
G4double csup, csdn;
if(verboseLevel > 0) G4cout << "### G4BGGNucleonInelasticXS::Initialise for "
<< particle->GetParticleName() << G4endl;
for(G4int iz=2; iz<93; iz++) {
G4double Z = G4double(iz);
A = nist->GetAtomicMassAmu(iz);
csup = fGlauber->GetInelasticGlauberGribov(&dp, Z, A);
csdn = fNucleon->GetIsoZACrossSection(&dp, Z, A);
theFac[iz] = csdn/csup;
if(verboseLevel > 0) G4cout << "Z= " << Z << " A= " << A
<< " factor= " << theFac[iz] << G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -0,0 +1,157 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGPionElasticXS.cc,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class file
//
//
// File name: G4BGGPionElasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 01.10.2003
// Modifications:
//
//
// -------------------------------------------------------------------
//
#include "G4BGGPionElasticXS.hh"
#include "G4GlauberGribovCrossSection.hh"
#include "G4UPiNuclearCrossSection.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
#include "G4NistManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGPionElasticXS::G4BGGPionElasticXS(const G4ParticleDefinition* p)
{
verboseLevel = 0;
thEnergy = 100.*GeV;
if(p == G4PionPlus::PionPlus() || p == G4PionMinus::PionMinus()) {
fPion = new G4UPiNuclearCrossSection();
fGlauber = new G4GlauberGribovCrossSection();
particle = p;
Initialise();
} else {
fPion = 0;
fGlauber = 0;
particle = 0;
if(p) G4cout << "### G4BGGPionElasticXS WARNING: is not applicable to "
<< p->GetParticleName()
<< G4endl;
else G4cout << "### G4BGGPionElasticXS WARNING: particle is not defined "
<< G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGPionElasticXS::~G4BGGPionElasticXS()
{
delete fGlauber;
delete fPion;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4BGGPionElasticXS::GetIsoZACrossSection(const G4DynamicParticle* dp,
G4double Z,
G4double A,
G4double)
{
G4double cross = 0.0;
G4double ekin = dp->GetKineticEnergy();
G4int iz = G4int(Z + 0.5);
if(iz > 92) iz = 92;
if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetElasticGlauberGribov(dp, Z, A);
} else {
cross = fPion->GetElasticCrossSection(dp, Z, A);
}
if(verboseLevel > 1)
G4cout << "G4BGGPionElasticXS::GetCrossSection for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< " in nucleus Z= " << Z << " A= " << A
<< " XS(b)= " << cross/barn
<< G4endl;
return cross;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGPionElasticXS::BuildPhysicsTable(const G4ParticleDefinition&)
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGPionElasticXS::DumpPhysicsTable(const G4ParticleDefinition&)
{
G4cout << "G4BGGPionElasticXS:"<<G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGPionElasticXS::Initialise()
{
G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(particle);
G4ThreeVector mom(0.0,0.0,1.0);
G4DynamicParticle dp(part, mom, thEnergy);
G4NistManager* nist = G4NistManager::Instance();
G4double A = nist->GetAtomicMassAmu(2);
G4double csup, csdn;
if(verboseLevel > 0) G4cout << "### G4BGGPionElasticXS::Initialise for "
<< particle->GetParticleName() << G4endl;
for(G4int iz=2; iz<93; iz++) {
G4double Z = G4double(iz);
A = nist->GetAtomicMassAmu(iz);
csup = fGlauber->GetElasticGlauberGribov(&dp, Z, A);
csdn = fPion->GetElasticCrossSection(&dp, Z, A);
theFac[iz] = csdn/csup;
if(verboseLevel > 0) G4cout << "Z= " << Z << " A= " << A
<< " factor= " << theFac[iz] << G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -0,0 +1,157 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BGGPionInelasticXS.cc,v 1.1 2007/03/13 15:19:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class file
//
//
// File name: G4BGGPionInelasticXS
//
// Author: Vladimir Ivanchenko
//
// Creation date: 01.10.2003
// Modifications:
//
//
// -------------------------------------------------------------------
//
#include "G4BGGPionInelasticXS.hh"
#include "G4GlauberGribovCrossSection.hh"
#include "G4UPiNuclearCrossSection.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
#include "G4NistManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGPionInelasticXS::G4BGGPionInelasticXS(const G4ParticleDefinition* p)
{
verboseLevel = 0;
thEnergy = 100.*GeV;
if(p == G4PionPlus::PionPlus() || p == G4PionMinus::PionMinus()) {
fPion = new G4UPiNuclearCrossSection();
fGlauber = new G4GlauberGribovCrossSection();
particle = p;
Initialise();
} else {
fPion = 0;
fGlauber = 0;
particle = 0;
if(p) G4cout << "### G4BGGPionInelasticXS WARNING: is not applicable to "
<< p->GetParticleName()
<< G4endl;
else G4cout << "### G4BGGPionInelasticXS WARNING: particle is not defined "
<< G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4BGGPionInelasticXS::~G4BGGPionInelasticXS()
{
delete fGlauber;
delete fPion;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4BGGPionInelasticXS::GetIsoZACrossSection(const G4DynamicParticle* dp,
G4double Z,
G4double A,
G4double)
{
G4double cross = 0.0;
G4double ekin = dp->GetKineticEnergy();
G4int iz = G4int(Z + 0.5);
if(iz > 92) iz = 92;
if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetInelasticGlauberGribov(dp, Z, A);
} else {
cross = fPion->GetInelasticCrossSection(dp, Z, A);
}
if(verboseLevel > 1)
G4cout << "G4BGGPionInelasticXS::GetCrossSection for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< " in nucleus Z= " << Z << " A= " << A
<< " XS(b)= " << cross/barn
<< G4endl;
return cross;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGPionInelasticXS::BuildPhysicsTable(const G4ParticleDefinition&)
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGPionInelasticXS::DumpPhysicsTable(const G4ParticleDefinition&)
{
G4cout << "G4BGGPionInelasticXS:"<<G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4BGGPionInelasticXS::Initialise()
{
G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(particle);
G4ThreeVector mom(0.0,0.0,1.0);
G4DynamicParticle dp(part, mom, thEnergy);
G4NistManager* nist = G4NistManager::Instance();
G4double A = nist->GetAtomicMassAmu(2);
G4double csup, csdn;
if(verboseLevel > 0) G4cout << "### G4BGGPionInelasticXS::Initialise for "
<< particle->GetParticleName() << G4endl;
for(G4int iz=2; iz<93; iz++) {
G4double Z = G4double(iz);
A = nist->GetAtomicMassAmu(iz);
csup = fGlauber->GetInelasticGlauberGribov(&dp, Z, A);
csdn = fPion->GetInelasticCrossSection(&dp, Z, A);
theFac[iz] = csdn/csup;
if(verboseLevel > 0) G4cout << "Z= " << Z << " A= " << A
<< " factor= " << theFac[iz] << G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -24,13 +24,12 @@
// ********************************************************************
//
//
//
// GEANT4 physics class: G4CrossSectionDataStore
// F.W. Jones, TRIUMF, 19-NOV-97
//
#include "G4CrossSectionDataStore.hh"
#include "G4HadronicException.hh"
#include "G4StableIsotopes.hh"
#include "G4HadTmpUtil.hh"
#include "Randomize.hh"
G4double
@@ -38,20 +37,186 @@ G4CrossSectionDataStore::GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement,
G4double aTemperature)
{
if (NDataSetList == 0)
{
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no data sets registered");
return DBL_MIN;
}
for (G4int i = NDataSetList-1; i >= 0; i--) {
if (DataSetList[i]->IsApplicable(aParticle, anElement))
return DataSetList[i]->GetCrossSection(aParticle, anElement, aTemperature);
}
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no applicable data set found "
"for particle/element");
return DBL_MIN;
if (NDataSetList == 0)
{
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no data sets registered");
return DBL_MIN;
}
for (G4int i = NDataSetList-1; i >= 0; i--) {
if (DataSetList[i]->IsApplicable(aParticle, anElement))
return DataSetList[i]->GetCrossSection(aParticle,anElement,aTemperature);
}
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no applicable data set found "
"for particle/element");
return DBL_MIN;
}
G4double
G4CrossSectionDataStore::GetCrossSection(const G4DynamicParticle* aParticle,
const G4Isotope* anIsotope,
G4double aTemperature)
{
if (NDataSetList == 0)
{
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no data sets registered");
return DBL_MIN;
}
for (G4int i = NDataSetList-1; i >= 0; i--) {
if (DataSetList[i]->IsZAApplicable(aParticle, anIsotope->GetZ(), anIsotope->GetN()))
return DataSetList[i]->GetIsoCrossSection(aParticle,anIsotope,aTemperature);
}
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no applicable data set found "
"for particle/element");
return DBL_MIN;
}
G4double
G4CrossSectionDataStore::GetCrossSection(const G4DynamicParticle* aParticle,
G4double Z, G4double A,
G4double aTemperature)
{
if (NDataSetList == 0)
{
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no data sets registered");
return DBL_MIN;
}
for (G4int i = NDataSetList-1; i >= 0; i--) {
if (DataSetList[i]->IsZAApplicable(aParticle, Z, A))
return DataSetList[i]->GetIsoZACrossSection(aParticle,Z,A,aTemperature);
}
throw G4HadronicException(__FILE__, __LINE__,
"G4CrossSectionDataStore: no applicable data set found "
"for particle/element");
return DBL_MIN;
}
G4double
G4CrossSectionDataStore::GetCrossSection(const G4DynamicParticle* aParticle,
const G4Material* aMaterial)
{
G4double sigma(0);
G4double aTemp = aMaterial->GetTemperature();
G4int nElements = aMaterial->GetNumberOfElements();
const G4double* theAtomsPerVolumeVector = aMaterial->GetVecNbOfAtomsPerVolume();
G4double xSection(0);
for(G4int i=0; i<nElements; i++) {
xSection = GetCrossSection( aParticle, (*aMaterial->GetElementVector())[i], aTemp);
sigma += theAtomsPerVolumeVector[i] * xSection;
}
return sigma;
}
std::pair<G4double, G4double>
G4CrossSectionDataStore::SelectRandomIsotope(const G4DynamicParticle* particle,
const G4Material* aMaterial)
{
static G4StableIsotopes theDefaultIsotopes; // natural abundances and
// stable isotopes
G4double aTemp = aMaterial->GetTemperature();
G4int nElements = aMaterial->GetNumberOfElements();
const G4ElementVector* theElementVector = aMaterial->GetElementVector();
const G4double* theAtomsPerVolumeVector = aMaterial->GetVecNbOfAtomsPerVolume();
std::vector<std::vector<G4double> > awicsPerElement;
std::vector<std::vector<G4double> > AvaluesPerElement;
G4Element* anElement;
// Collect abundance weighted cross sections and A values for each isotope
// in each element
for (G4int i = 0; i < nElements; i++) {
anElement = (*theElementVector)[i];
G4int nIsoPerElement = anElement->GetNumberOfIsotopes();
std::vector<G4double> isoholder;
std::vector<G4double> aholder;
G4double iso_xs;
if (nIsoPerElement) { // user-defined isotope abundances
G4IsotopeVector* isoVector = anElement->GetIsotopeVector();
G4double* abundVector = anElement->GetRelativeAbundanceVector();
for (G4int j = 0; j < nIsoPerElement; j++) {
iso_xs = GetCrossSection(particle, (*isoVector)[j], aTemp);
isoholder.push_back(abundVector[j]*iso_xs);
aholder.push_back(G4double((*isoVector)[j]->GetN()));
}
} else { // natural abundances
G4int ZZ = G4lrint(anElement->GetZ());
nIsoPerElement = theDefaultIsotopes.GetNumberOfIsotopes(ZZ);
G4int index = theDefaultIsotopes.GetFirstIsotope(ZZ);
G4double AA;
G4double abundance;
for (G4int j = 0; j < nIsoPerElement; j++) {
AA = G4double(theDefaultIsotopes.GetIsotopeNucleonCount(index+j));
aholder.push_back(AA);
iso_xs = GetCrossSection(particle, G4double(ZZ), AA, aTemp);
abundance = theDefaultIsotopes.GetAbundance(index+j)/100.0;
isoholder.push_back(abundance*iso_xs);
}
}
awicsPerElement.push_back(isoholder);
AvaluesPerElement.push_back(aholder);
}
// Calculate running sums for isotope selection
G4double crossSectionTotal = 0;
G4double xSectionPerElement;
std::vector<G4double> runningSum;
for (G4int i=0; i < nElements; i++) {
xSectionPerElement = 0;
for (G4int j=0; j < G4int(awicsPerElement[i].size()); j++)
xSectionPerElement += awicsPerElement[i][j];
runningSum.push_back(theAtomsPerVolumeVector[i]*xSectionPerElement);
crossSectionTotal += runningSum[i];
}
// Compare random number to running sum over element xc to choose Z
// Initialize Z and A to first element and first isotope in case
// cross section is zero
G4double ZZ = (*theElementVector)[0]->GetZ();
G4double AA = AvaluesPerElement[0][0];
if (crossSectionTotal != 0.) {
G4double random = G4UniformRand();
for(G4int i=0; i < nElements; i++) {
if(i!=0) runningSum[i] += runningSum[i-1];
if(random <= runningSum[i]/crossSectionTotal) {
ZZ = ((*theElementVector)[i])->GetZ();
// Compare random number to running sum over isotope xc to choose A
G4int nIso = awicsPerElement[i].size();
G4double* running = new G4double[nIso];
for (G4int j=0; j < nIso; j++) {
running[j] = awicsPerElement[i][j];
if(j!=0) running[j] += running[j-1];
}
G4double trial = G4UniformRand();
for (G4int j=0; j < nIso; j++) {
AA = AvaluesPerElement[i][j];
if (trial <= running[j]/running[nIso-1]) break;
}
delete [] running;
break;
}
}
}
return std::pair<G4double, G4double>(ZZ, AA);
}
@@ -91,13 +91,12 @@ G4EMDissociationCrossSection::~G4EMDissociationCrossSection()
{
delete thePhotonSpectrum;
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
G4bool G4EMDissociationCrossSection::IsApplicable
(const G4DynamicParticle *theDynamicParticle, const G4Element* theElement)
G4bool G4EMDissociationCrossSection::IsZAApplicable
(const G4DynamicParticle* theDynamicParticle, G4double /*ZZ*/, G4double AA)
{
//
//
// The condition for the applicability of this class is that the projectile
// must be an ion and the target must have more than one nucleon. In reality
// the value of A for either the projectile or target could be much higher,
@@ -105,16 +104,54 @@ G4bool G4EMDissociationCrossSection::IsApplicable
// Z, the probability of the EMD process is, I think, VERY small.
//
if (G4ParticleTable::GetParticleTable()->GetIonTable()->
IsIon(theDynamicParticle->GetDefinition()) && theElement->GetN() > 1.0)
IsIon(theDynamicParticle->GetDefinition()) && AA > 1.0)
return true;
else
return false;
}
////////////////////////////////////////////////////////////////////////////////
G4bool G4EMDissociationCrossSection::IsApplicable
(const G4DynamicParticle* theDynamicParticle, const G4Element* theElement)
{
return IsZAApplicable(theDynamicParticle, 0., theElement->GetN());
}
//////////////////////////////////////////////////////////////////////////////
//
G4double G4EMDissociationCrossSection::GetCrossSection
(const G4DynamicParticle *theDynamicParticle, const G4Element* theElement,
G4double )
(const G4DynamicParticle* theDynamicParticle, const G4Element* theElement,
G4double temperature)
{
G4int nIso = theElement->GetNumberOfIsotopes();
G4double crossSection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = theElement->GetIsotopeVector();
G4double* abundVector = theElement->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(theDynamicParticle, ZZ, AA, temperature);
crossSection += sig*abundVector[i];
}
} else {
crossSection =
GetIsoZACrossSection(theDynamicParticle, theElement->GetZ(),
theElement->GetN(), temperature);
}
return crossSection;
}
G4double G4EMDissociationCrossSection::GetIsoZACrossSection
(const G4DynamicParticle *theDynamicParticle, G4double ZZ, G4double AA,
G4double /*temperature*/)
{
//
//
@@ -127,8 +164,8 @@ G4double G4EMDissociationCrossSection::GetCrossSection
G4double b = theDynamicParticle->Get4Momentum().beta();
// G4double bsq = b * b;
G4double AT = theElement->GetN();
G4double ZT = theElement->GetZ();
G4double AT = AA;
G4double ZT = ZZ;
G4double bmin = thePhotonSpectrum->GetClosestApproach(AP, ZP, AT, ZT, b);
//
//
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4ElectroNuclearCrossSection.cc,v 1.25 2006/06/29 19:57:31 gunter Exp $
// GEANT4 tag $Name: geant4-08-02 $
// $Id: G4ElectroNuclearCrossSection.cc,v 1.26 2006/12/28 04:34:12 dennis Exp $
// GEANT4 tag $Name: geant4-08-03 $
//
//
// G4 Physics class: G4ElectroNuclearCrossSection for gamma+A cross sections
@@ -57,9 +57,45 @@ G4int G4ElectroNuclearCrossSection::lastZ=0; // The last Z of calculated n
G4double G4ElectroNuclearCrossSection::lastTH=0.; // Last energy threshold
G4double G4ElectroNuclearCrossSection::lastSig=0.;// Last value of the Cross Section
// The main member function giving the gamma-A cross section (E in GeV, CS in mb)
G4double G4ElectroNuclearCrossSection::GetCrossSection(const G4DynamicParticle* aPart,
const G4Element* anEle, G4double )
// The main member function giving the gamma-A cross section
// (E in GeV, CS in mb)
G4double
G4ElectroNuclearCrossSection::GetCrossSection(const G4DynamicParticle* aPart,
const G4Element* anEle,
G4double temperature)
{
G4int nIso = anEle->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = anEle->GetIsotopeVector();
G4double* abundVector = anEle->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(aPart, ZZ, AA, temperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(aPart, anEle->GetZ(), anEle->GetN(),
temperature);
}
return xsection;
}
G4double
G4ElectroNuclearCrossSection::GetIsoZACrossSection(const G4DynamicParticle* aPart,
G4double ZZ, G4double AA,
G4double /*temperature*/)
{
static const G4int nE=336; // !! If you change this, change it in GetFunctions() (*.hh) !!
static const G4int mL=nE-1;
@@ -82,8 +118,8 @@ G4double G4ElectroNuclearCrossSection::GetCrossSection(const G4DynamicParticle*
static std::vector <G4double*> J3; // Vector of pointers to the J3 tabulated functions
// *** End of Static Definitions (Associative Memory) ***
const G4double Energy = aPart->GetKineticEnergy()/MeV; // Energy of the electron
const G4int targetAtomicNumber = static_cast<int>(anEle->GetN()+.499); //@@ Nat mixture (?!)
const G4int targZ = static_cast<int>(anEle->GetZ()+.001);
const G4int targetAtomicNumber = static_cast<int>(AA+.499); //@@ Nat mixture (?!)
const G4int targZ = static_cast<int>(ZZ+.001);
const G4int targN = targetAtomicNumber-targZ; // @@ Get isotops (can change initial A)
if (Energy<=EMi) return 0.; // Energy is below the minimum energy in the table
G4int PDG=aPart->GetDefinition()->GetPDGEncoding();
@@ -33,7 +33,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// MODULE: G4GeneralSpaceNNCrossSection.cc
//
@@ -44,7 +44,7 @@
// Customer: ESA/ESTEC, NOORDWIJK
// Contract: 17191/03/NL/LvH
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// CHANGE HISTORY
// --------------
@@ -55,8 +55,8 @@
// 15 March 2004, P R Truscott, QinetiQ Ltd, UK
// Beta release
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
////////////////////////////////////////////////////////////////////////////////
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
///////////////////////////////////////////////////////////////////////////////
//
#include "G4GeneralSpaceNNCrossSection.hh"
#include "G4DynamicParticle.hh"
@@ -66,7 +66,7 @@
#include "G4IonTable.hh"
#include <iomanip>
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
G4GeneralSpaceNNCrossSection::G4GeneralSpaceNNCrossSection ()
{
@@ -78,7 +78,7 @@ G4GeneralSpaceNNCrossSection::G4GeneralSpaceNNCrossSection ()
return;
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
G4GeneralSpaceNNCrossSection::~G4GeneralSpaceNNCrossSection ()
{
@@ -88,8 +88,26 @@ G4GeneralSpaceNNCrossSection::~G4GeneralSpaceNNCrossSection ()
delete TripathiLight;
delete Shen;
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
G4bool G4GeneralSpaceNNCrossSection::IsZAApplicable
(const G4DynamicParticle* theProjectile, G4double ZZ, G4double AA)
{
G4bool result = protonInelastic->IsZAApplicable(theProjectile, ZZ, AA);
if (!result)
{
result = ionProton->IsZAApplicable(theProjectile, ZZ, AA);
if (!result)
{
result = TripathiGeneral->IsZAApplicable(theProjectile, ZZ, AA);
if (!result)
result = Shen->IsZAApplicable(theProjectile, ZZ, AA);
}
}
return result;
}
G4bool G4GeneralSpaceNNCrossSection::IsApplicable
(const G4DynamicParticle* theProjectile, const G4Element* theTarget)
{
@@ -106,16 +124,48 @@ G4bool G4GeneralSpaceNNCrossSection::IsApplicable
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
G4double G4GeneralSpaceNNCrossSection::GetCrossSection
(const G4DynamicParticle* theProjectile, const G4Element* theTarget,
G4double theTemperature)
{
G4int nIso = theTarget->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = theTarget->GetIsotopeVector();
G4double* abundVector = theTarget->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(theProjectile, theTarget->GetZ(), theTarget->GetN(),
theTemperature);
}
return xsection;
}
G4double G4GeneralSpaceNNCrossSection::GetIsoZACrossSection
(const G4DynamicParticle* theProjectile, G4double ZZ, G4double AA,
G4double theTemperature)
{
G4double result = 0.0;
const G4double AT = theTarget->GetN();
const G4double ZT = theTarget->GetZ();
const G4double AT = AA;
const G4double ZT = ZZ;
const G4double AP = theProjectile->GetDefinition()->GetBaryonNumber();
const G4double ZP = theProjectile->GetDefinition()->GetPDGCharge();
@@ -135,14 +185,14 @@ G4double G4GeneralSpaceNNCrossSection::GetCrossSection
if (ZT>5)
{
result = protonInelastic->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4ProtonInelasticCrossSection" <<G4endl;
}
else
{
result = TripathiLight->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4TripathiLightCrossSection" <<G4endl;
}
@@ -152,38 +202,38 @@ G4double G4GeneralSpaceNNCrossSection::GetCrossSection
if (ZP>5)
{
result = ionProton->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4IonProtonCrossSection" <<G4endl;
}
else
{
result = TripathiLight->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4TripathiLightCrossSection" <<G4endl;
}
}
else
{
if (TripathiLight->IsApplicable(theProjectile, theTarget))
if (TripathiLight->IsZAApplicable(theProjectile, ZZ, AA))
{
result = TripathiLight->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4TripathiLightCrossSection" <<G4endl;
}
else if (TripathiGeneral->IsApplicable(theProjectile, theTarget))
else if (TripathiGeneral->IsZAApplicable(theProjectile, ZZ, AA))
{
result = TripathiGeneral->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4TripathiCrossSection" <<G4endl;
}
else if (Shen->IsApplicable(theProjectile, theTarget))
else if (Shen->IsZAApplicable(theProjectile, ZZ, AA))
{
result = Shen->
GetCrossSection(theProjectile, theTarget, theTemperature);
GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
if (verboseLevel >= 2)
G4cout <<"Selecting G4IonsShenCrossSection" <<G4endl;
}
@@ -196,5 +246,5 @@ G4double G4GeneralSpaceNNCrossSection::GetCrossSection
return result;
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
@@ -25,8 +25,9 @@
//
//
// 17.07.06 V. Grichine - first implementation
// 22.01.07 V.Ivanchenko - add interface with Z and A
// 05.03.07 V.Ivanchenko - add IfZAApplicable
//
#include "G4GlauberGribovCrossSection.hh"
@@ -91,7 +92,19 @@ G4GlauberGribovCrossSection::~G4GlauberGribovCrossSection()
G4bool
G4GlauberGribovCrossSection::IsApplicable(const G4DynamicParticle* aDP, const G4Element* anElement)
G4GlauberGribovCrossSection::IsApplicable(const G4DynamicParticle* aDP,
const G4Element* anElement)
{
return IsZAApplicable(aDP, anElement->GetZ(), anElement->GetN());
}
////////////////////////////////////////////////////////////////////////////////////////
//
//
G4bool
G4GlauberGribovCrossSection::IsZAApplicable(const G4DynamicParticle* aDP,
G4double Z, G4double)
{
G4bool applicable = false;
// G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber();
@@ -100,22 +113,36 @@ G4GlauberGribovCrossSection::IsApplicable(const G4DynamicParticle* aDP, const G4
const G4ParticleDefinition* theParticle = aDP->GetDefinition();
if ( ( kineticEnergy >= fLowerLimit &&
anElement->GetZ() > 1. && // >= He
Z > 1.5 && // >= He
( theParticle == theAProton ||
theParticle == theGamma ||
theParticle == thePiPlus ||
theParticle == thePiMinus ||
theParticle == theKPlus ||
theParticle == theKMinus ||
theParticle == theSMinus) ) ||
( kineticEnergy >= 0.1*fLowerLimit &&
anElement->GetZ() > 1. && // >= He
Z > 1.5 && // >= He
( theParticle == theProton ||
theParticle == theNeutron ) ) ) applicable = true;
theParticle == theNeutron ||
theParticle == thePiPlus ||
theParticle == thePiMinus ) ) ) applicable = true;
return applicable;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Calculates total and inelastic Xsc, derives elastic as total - inelastic accordong to
// Glauber model with Gribov correction calculated in the dipole approximation on
// light cone. Gaussian density helps to calculate rest integrals of the model.
// [1] B.Z. Kopeliovich, nucl-th/0306044
G4double G4GlauberGribovCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement, G4double T)
{
return GetIsoZACrossSection(aParticle, anElement->GetZ(), anElement->GetN(), T);
}
////////////////////////////////////////////////////////////////////////////////////////
//
@@ -127,24 +154,25 @@ G4GlauberGribovCrossSection::IsApplicable(const G4DynamicParticle* aDP, const G4
G4double G4GlauberGribovCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement, G4double )
GetIsoZACrossSection(const G4DynamicParticle* aParticle, G4double Z, G4double A, G4double)
{
G4double xsection, sigma, cofInelastic, cofTotal, nucleusSquare, ratio;
G4double R = GetNucleusRadius(aParticle, anElement);
G4double R = GetNucleusRadius(A);
const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
if(theParticle == theProton || theParticle == theNeutron)
if( theParticle == theProton ||
theParticle == theNeutron ||
theParticle == thePiPlus ||
theParticle == thePiMinus )
{
sigma = GetHadronNucleaonXscNS(aParticle, anElement);
sigma = GetHadronNucleaonXscNS(aParticle, A, Z);
cofInelastic = 2.4;
cofTotal = 2.0;
}
else
{
sigma = GetHadronNucleaonXscPDG(aParticle, anElement);
sigma = GetHadronNucleaonXscPDG(aParticle, A, Z);
cofInelastic = 2.2;
cofTotal = 2.0;
}
@@ -166,7 +194,9 @@ GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
*/
fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
fElasticXsc = fTotalXsc - fInelasticXsc;
if (fElasticXsc < 0.) fElasticXsc = 0.;
return xsection;
@@ -424,7 +454,7 @@ G4double
G4GlauberGribovCrossSection::GetHadronNucleaonXscNS(const G4DynamicParticle* aParticle,
G4double At, G4double Zt )
{
G4double xsection, Delta, A0, B0;
G4double xsection(0), Delta, A0, B0;
G4double hpXsc(0);
G4double hnXsc(0);
@@ -483,38 +513,36 @@ G4GlauberGribovCrossSection::GetHadronNucleaonXscNS(const G4DynamicParticle* aPa
{
// nn to be pp
if( proj_momentum < 10. )
{
hnXsc = 39.0+
75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
}
if( proj_momentum < 1.05 )
{
hnXsc = 23 + 40*(std::log(proj_momentum/0.73))*
(std::log(proj_momentum/0.73));
}
if( proj_momentum < 0.73 )
{
hnXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
}
else if( proj_momentum < 1.05 )
{
hnXsc = 23 + 40*(std::log(proj_momentum/0.73))*
(std::log(proj_momentum/0.73));
}
else // if( proj_momentum < 10. )
{
hnXsc = 39.0+
75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
}
// pn to be np
if( proj_momentum < 10. )
{
hpXsc = 33.3+
20.8*(std::pow(proj_momentum,2.0)-1.35)/
(std::pow(proj_momentum,2.50)+0.95);
}
if( proj_momentum < 1.4 )
{
hpXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
}
if( proj_momentum < 0.8 )
{
hpXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
}
else if( proj_momentum < 1.4 )
{
hpXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
}
else // if( proj_momentum < 10. )
{
hpXsc = 33.3+
20.8*(std::pow(proj_momentum,2.0)-1.35)/
(std::pow(proj_momentum,2.50)+0.95);
}
xsection = hpXsc*Zt + hnXsc*Nt;
}
}
@@ -542,38 +570,36 @@ G4GlauberGribovCrossSection::GetHadronNucleaonXscNS(const G4DynamicParticle* aPa
{
// pp
if( proj_momentum < 10. )
{
hpXsc = 39.0+
75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
}
if( proj_momentum < 1.05 )
{
hpXsc = 23 + 40*(std::log(proj_momentum/0.73))*
(std::log(proj_momentum/0.73));
}
if( proj_momentum < 0.73 )
{
hpXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
}
else if( proj_momentum < 1.05 )
{
hpXsc = 23 + 40*(std::log(proj_momentum/0.73))*
(std::log(proj_momentum/0.73));
}
else // if( proj_momentum < 10. )
{
hpXsc = 39.0+
75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
}
// pn to be np
if( proj_momentum < 10. )
{
hnXsc = 33.3+
20.8*(std::pow(proj_momentum,2.0)-1.35)/
(std::pow(proj_momentum,2.50)+0.95);
}
if( proj_momentum < 1.4 )
{
hnXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
}
if( proj_momentum < 0.8 )
{
hnXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
}
else if( proj_momentum < 1.4 )
{
hnXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
}
else // if( proj_momentum < 10. )
{
hnXsc = 33.3+
20.8*(std::pow(proj_momentum,2.0)-1.35)/
(std::pow(proj_momentum,2.50)+0.95);
}
xsection = hpXsc*Zt + hnXsc*Nt;
// xsection = hpXsc*(Zt + Nt);
// xsection = hnXsc*(Zt + Nt);
@@ -590,13 +616,105 @@ G4GlauberGribovCrossSection::GetHadronNucleaonXscNS(const G4DynamicParticle* aPa
}
else if(theParticle == thePiPlus)
{
xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
+ 19.24*std::pow(sMand,-eta1) - 6.03*std::pow(sMand,-eta2));
if(proj_momentum < 0.4)
{
G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
hpXsc = Ex3+20.0;
}
else if(proj_momentum < 1.15)
{
G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
hpXsc = Ex4+14.0;
}
else if(proj_momentum < 3.5)
{
G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
hpXsc = Ex1+Ex2+27.5;
}
else // if(proj_momentum > 3.5) // mb
{
hpXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
}
// pi+n = pi-p??
if(proj_momentum < 0.37)
{
hnXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
}
else if(proj_momentum<0.65)
{
hnXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
}
else if(proj_momentum<1.3)
{
hnXsc = 36.1+
10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
}
else if(proj_momentum<3.0)
{
hnXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
}
else // mb
{
hnXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
}
xsection = hpXsc*Zt + hnXsc*Nt;
}
else if(theParticle == thePiMinus)
{
xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
+ 19.24*std::pow(sMand,-eta1) + 6.03*std::pow(sMand,-eta2));
// pi-n = pi+p??
if(proj_momentum < 0.4)
{
G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
hnXsc = Ex3+20.0;
}
else if(proj_momentum < 1.15)
{
G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
hnXsc = Ex4+14.0;
}
else if(proj_momentum < 3.5)
{
G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
hnXsc = Ex1+Ex2+27.5;
}
else // if(proj_momentum > 3.5) // mb
{
hnXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
}
// pi-p
if(proj_momentum < 0.37)
{
hpXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
}
else if(proj_momentum<0.65)
{
hpXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
}
else if(proj_momentum<1.3)
{
hpXsc = 36.1+
10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
}
else if(proj_momentum<3.0)
{
hpXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
}
else // mb
{
hpXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
}
xsection = hpXsc*Zt + hnXsc*Nt;
}
else if(theParticle == theKPlus)
{
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// GEANT4 tag $Name: geant4-08-02 $
// GEANT4 tag $Name: geant4-08-03 $
//
//
// G4 Hadron Physics class G4HadronCrossSections
@@ -1215,6 +1215,94 @@ G4int G4HadronCrossSections::ipart2[7] = {9, 8, 7, 11, 10, 13, 12};
G4bool G4HadronCrossSections::correctInelasticNearZero = 0;
G4double G4HadronCrossSections::GetInelasticCrossSection(
const G4DynamicParticle* particle,
const G4Element* element)
{
if (particle->GetDefinition() != prevParticleDefinition ||
element != prevElement ||
particle->GetKineticEnergy() != prevKineticEnergy) {
G4int nIso = element->GetNumberOfIsotopes();
if (nIso) {
G4double cross_section = 0;
G4IsotopeVector* isoVector = element->GetIsotopeVector();
G4double* abundVector = element->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
CalcScatteringCrossSections(particle, ZZ, AA);
cross_section += siginelastic*abundVector[i];
}
siginelastic = cross_section;
} else {
CalcScatteringCrossSections(particle, element->GetZ(), element->GetN());
}
}
return siginelastic;
}
G4double G4HadronCrossSections::GetInelasticCrossSection(
const G4DynamicParticle* particle,
G4double ZZ, G4double AA)
{
prevElement = 0; // force new cross section calculation for next call of
// GetInelasticCrossSection(particle, element, temp)
CalcScatteringCrossSections(particle, ZZ, AA);
return siginelastic;
}
G4double G4HadronCrossSections::GetElasticCrossSection(
const G4DynamicParticle* particle,
const G4Element* element)
{
if (particle->GetDefinition() != prevParticleDefinition ||
element != prevElement ||
particle->GetKineticEnergy() != prevKineticEnergy) {
G4int nIso = element->GetNumberOfIsotopes();
if (nIso) {
G4double cross_section = 0;
G4IsotopeVector* isoVector = element->GetIsotopeVector();
G4double* abundVector = element->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
CalcScatteringCrossSections(particle, ZZ, AA);
cross_section += sigelastic*abundVector[i];
}
sigelastic = cross_section;
} else {
CalcScatteringCrossSections(particle, element->GetZ(), element->GetN());
}
}
return sigelastic;
}
G4double G4HadronCrossSections::GetElasticCrossSection(
const G4DynamicParticle* particle,
G4double ZZ, G4double AA)
{
prevElement = 0; // force new cross section calculation for next call of
// GetElasticCrossSection(particle, element, temp)
CalcScatteringCrossSections(particle, ZZ, AA);
return sigelastic;
}
// Method to calculate cross sections for all processes.
// To facilitate comparison with the original Fortran source, and because
// of the interdependence of the elastic and inelastic cross section
@@ -1223,7 +1311,7 @@ G4bool G4HadronCrossSections::correctInelasticNearZero = 0;
void
G4HadronCrossSections::CalcScatteringCrossSections(
const G4DynamicParticle* aParticle,
const G4Element* anElement)
G4double ZZ, G4double AA)
{
G4double sigel, sigin, sigtot;
G4double xsecel, xsecin=0;
@@ -1233,8 +1321,8 @@ G4HadronCrossSections::CalcScatteringCrossSections(
G4double xspiel, xspiin;
G4int ipart = GetParticleCode(aParticle);
G4double a = anElement->GetA()*mole/g;
G4double z = anElement->GetZ();
G4double a = AA;
G4double z = ZZ;
if (verboseLevel > 1) {
G4cout << "G4HadronCrossSections: a=" << a << G4endl;
@@ -1483,7 +1571,6 @@ G4HadronCrossSections::CalcScatteringCrossSections(
sigel = corh*sigel;
sigin = corh*sigin;
// Convert cross section from mb to default units
sigelastic = sigel*millibarn;
siginelastic = sigin*millibarn;
@@ -1495,15 +1582,14 @@ G4HadronCrossSections::CalcScatteringCrossSections(
G4double
G4HadronCrossSections::GetCaptureCrossSection(
const G4DynamicParticle* aParticle,
const G4Element* anElement)
G4double ZZ, G4double /*AA*/)
{
if (GetParticleCode(aParticle) != 16) return 0.;
G4double ek = aParticle->GetKineticEnergy()/GeV;
if (ek > 0.0327) return 0.;
G4double ekx = std::max(ek, 1.e-9);
G4double z = anElement->GetZ();
G4int izno = static_cast<G4int> (z + 0.01);
G4int izno = static_cast<G4int> (ZZ + 0.01);
if (izno > 100) izno = 100; // Not in GHESIG
izno = izno - 1; // For array indexing
G4double sigcap = 11.12*cscap[izno]/std::pow(ekx*1.e6, 0.577);
@@ -1516,12 +1602,9 @@ G4HadronCrossSections::GetCaptureCrossSection(
G4double
G4HadronCrossSections::GetFissionCrossSection(
const G4DynamicParticle* aParticle,
const G4Element* anElement)
G4double ZZ, G4double AA)
{
G4double a = anElement->GetA()*mole/g;
if (a < 230.) return 0;
G4double z = anElement->GetZ();
if (AA < 230.) return 0;
G4double ek = aParticle->GetKineticEnergy()/GeV;
@@ -1548,13 +1631,13 @@ G4HadronCrossSections::GetFissionCrossSection(
G4int j = 4;
if (ek <= 0.01) {
if (z == 92. && std::abs(a - 233.) < 0.5) j = 1;
else if (z == 92. && std::abs(a - 235.) < 0.5) j = 2;
else if (z == 94. && std::abs(a - 239.) < 0.5) j = 3;
if (ZZ == 92. && std::abs(AA - 233.) < 0.5) j = 1;
else if (ZZ == 92. && std::abs(AA - 235.) < 0.5) j = 2;
else if (ZZ == 94. && std::abs(AA - 239.) < 0.5) j = 3;
}
G4double z43ba;
if (j == 4) {
z43ba = std::pow(z, 4./3.)/a;
z43ba = std::pow(ZZ, 4./3.)/AA;
z43ba = std::max(-67. + 38.7*z43ba, 0.);
}
else {
@@ -1573,44 +1656,101 @@ G4HadronCrossSections::GetFissionCrossSection(
G4int
G4HadronCrossSections::GetParticleCode(const G4DynamicParticle* aParticle)
{
// Returns GHEISHA code for particle...
// There are 35 particle codes of which only the hadrons are treated here.
// Returns GHEISHA code for particle
// Case entries ordered by estimated frequency
G4int ipart;
G4ParticleDefinition* aParticleType = aParticle->GetDefinition();
G4int ipart;
if (aParticleType == G4PionPlus::PionPlus()) ipart = 7;
else if (aParticleType == G4PionZero::PionZero()) ipart = 8;
else if (aParticleType == G4PionMinus::PionMinus()) ipart = 9;
else if (aParticleType == G4KaonPlus::KaonPlus()) ipart = 10;
else if (aParticleType == G4KaonZeroShort::KaonZeroShort()) ipart = 11;
else if (aParticleType == G4KaonZeroLong::KaonZeroLong()) ipart = 12;
else if (aParticleType == G4KaonMinus::KaonMinus()) ipart = 13;
else if (aParticleType == G4Proton::Proton()) ipart = 14;
else if (aParticleType == G4AntiProton::AntiProton()) ipart = 15;
else if (aParticleType == G4Neutron::Neutron()) ipart = 16;
else if (aParticleType == G4AntiNeutron::AntiNeutron()) ipart = 17;
else if (aParticleType == G4Lambda::Lambda()) ipart = 18;
else if (aParticleType == G4AntiLambda::AntiLambda()) ipart = 19;
else if (aParticleType == G4SigmaPlus::SigmaPlus()) ipart = 20;
else if (aParticleType == G4SigmaZero::SigmaZero()) ipart = 21;
else if (aParticleType == G4SigmaMinus::SigmaMinus()) ipart = 22;
else if (aParticleType == G4AntiSigmaPlus::AntiSigmaPlus()) ipart = 23;
else if (aParticleType == G4AntiSigmaZero::AntiSigmaZero()) ipart = 24;
else if (aParticleType == G4AntiSigmaMinus::AntiSigmaMinus()) ipart = 25;
else if (aParticleType == G4XiZero::XiZero()) ipart = 26;
else if (aParticleType == G4XiMinus::XiMinus()) ipart = 27;
else if (aParticleType == G4AntiXiZero::AntiXiZero()) ipart = 28;
else if (aParticleType == G4AntiXiMinus::AntiXiMinus()) ipart = 29;
else if (aParticleType == G4Deuteron::Deuteron()) ipart = 30;
else if (aParticleType == G4Triton::Triton()) ipart = 31;
else if (aParticleType == G4Alpha::Alpha()) ipart = 32;
else if (aParticleType == G4OmegaMinus::OmegaMinus()) ipart = 33;
else if (aParticleType == G4AntiOmegaMinus::AntiOmegaMinus()) ipart = 34;
else {
switch( aParticle->GetPDGcode()) {
case 111:
ipart = 8; // pi0
break;
case 211:
ipart = 7; // pi+
break;
case -211:
ipart = 9; // pi-
break;
case 2112:
ipart = 16; // neutron
break;
case 2212:
ipart = 14; // proton
break;
case 321:
ipart = 10; // K+
break;
case -321:
ipart = 13; // K-
break;
case 130:
ipart = 12; // K0L
break;
case 310:
ipart = 11; // K0S
break;
case 1000010020:
ipart = 30; // deuteron
break;
case 1000010030:
ipart = 31; // triton
break;
case 1000020040:
ipart = 32; // alpha
break;
case 3122:
ipart = 18; // lambda
break;
case -2112:
ipart = 17; // anti-neutron
break;
case -2212:
ipart = 15; // anti-proton
break;
case -3122:
ipart = 19; // anti-lambda
break;
case 3222:
ipart = 20; // sigma+
break;
case 3212:
ipart = 21; // sigma0
break;
case 3112:
ipart = 22; // sigma-
break;
case 3322:
ipart = 26; // xi0
break;
case 3312:
ipart = 27; // xi-
break;
case 3334:
ipart = 33; // omega-
break;
case -3222:
ipart = 23; // anti-sigma+
break;
case -3212:
ipart = 24; // anti-sigma0
break;
case -3112:
ipart = 25; // anti-sigma-
break;
case -3322:
ipart = 28; // anti-xi0
break;
case -3312:
ipart = 29; // anti-xi-
break;
case -3334:
ipart = 34; // anti-omega-
break;
default:
G4Exception("G4HadronCrossSections", "007", FatalException,
"GetParticleCode: unsupported particle");
return 0;
}
return ipart;
}
return ipart;
}
@@ -0,0 +1,918 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
// 14.03.07 V. Grichine - first implementation
//
#include "G4HadronNucleonXsc.hh"
#include "G4ParticleTable.hh"
#include "G4IonTable.hh"
#include "G4ParticleDefinition.hh"
//////////////////////////////////////////////////////////////////////////////////////
//
//
G4HadronNucleonXsc::G4HadronNucleonXsc()
: fUpperLimit( 10000 * GeV ),
fLowerLimit( 3 * GeV )
{
theGamma = G4Gamma::Gamma();
theProton = G4Proton::Proton();
theNeutron = G4Neutron::Neutron();
theAProton = G4AntiProton::AntiProton();
theANeutron = G4AntiNeutron::AntiNeutron();
thePiPlus = G4PionPlus::PionPlus();
thePiMinus = G4PionMinus::PionMinus();
thePiZero = G4PionZero::PionZero();
theKPlus = G4KaonPlus::KaonPlus();
theKMinus = G4KaonMinus::KaonMinus();
theK0S = G4KaonZeroShort::KaonZeroShort();
theK0L = G4KaonZeroLong::KaonZeroLong();
theL = G4Lambda::Lambda();
theAntiL = G4AntiLambda::AntiLambda();
theSPlus = G4SigmaPlus::SigmaPlus();
theASPlus = G4AntiSigmaPlus::AntiSigmaPlus();
theSMinus = G4SigmaMinus::SigmaMinus();
theASMinus = G4AntiSigmaMinus::AntiSigmaMinus();
theS0 = G4SigmaZero::SigmaZero();
theAS0 = G4AntiSigmaZero::AntiSigmaZero();
theXiMinus = G4XiMinus::XiMinus();
theXi0 = G4XiZero::XiZero();
theAXiMinus = G4AntiXiMinus::AntiXiMinus();
theAXi0 = G4AntiXiZero::AntiXiZero();
theOmega = G4OmegaMinus::OmegaMinus();
theAOmega = G4AntiOmegaMinus::AntiOmegaMinus();
theD = G4Deuteron::Deuteron();
theT = G4Triton::Triton();
theA = G4Alpha::Alpha();
theHe3 = G4He3::He3();
}
///////////////////////////////////////////////////////////////////////////////////////
//
//
G4HadronNucleonXsc::~G4HadronNucleonXsc()
{
}
////////////////////////////////////////////////////////////////////////////////////////
//
//
G4bool
G4HadronNucleonXsc::IsApplicable(const G4DynamicParticle* aDP,
const G4Element* anElement)
{
return IsZAApplicable(aDP, anElement->GetZ(), anElement->GetN());
}
////////////////////////////////////////////////////////////////////////////////////////
//
//
G4bool
G4HadronNucleonXsc::IsZAApplicable(const G4DynamicParticle* aDP,
G4double Z, G4double)
{
G4bool applicable = false;
// G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber();
G4double kineticEnergy = aDP->GetKineticEnergy();
const G4ParticleDefinition* theParticle = aDP->GetDefinition();
if ( ( kineticEnergy >= fLowerLimit &&
Z > 1.5 && // >= He
( theParticle == theAProton ||
theParticle == theGamma ||
theParticle == theKPlus ||
theParticle == theKMinus ||
theParticle == theSMinus) ) ||
( kineticEnergy >= 0.1*fLowerLimit &&
Z > 1.5 && // >= He
( theParticle == theProton ||
theParticle == theNeutron ||
theParticle == thePiPlus ||
theParticle == thePiMinus ) ) ) applicable = true;
return applicable;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Returns hadron-nucleon Xsc according to differnt parametrisations:
// [2] E. Levin, hep-ph/9710546
// [3] U. Dersch, et al, hep-ex/9910052
// [4] M.J. Longo, et al, Phys.Rev.Lett. 33 (1974) 725
G4double
G4HadronNucleonXsc::GetHadronNucleonXscEL(const G4DynamicParticle* aParticle,
const G4ParticleDefinition* nucleon )
{
G4double xsection;
G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
G4double proj_mass = aParticle->GetMass();
G4double proj_momentum = aParticle->GetMomentum().mag();
G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
sMand /= GeV*GeV; // in GeV for parametrisation
proj_momentum /= GeV;
const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
if(theParticle == theGamma && pORn )
{
xsection = (0.0677*std::pow(sMand,0.0808) + 0.129*std::pow(sMand,-0.4525));
}
else if(theParticle == theNeutron && pORn ) // as proton ???
{
xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
}
else if(theParticle == theProton && pORn )
{
xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
// xsection = At*( 49.51*std::pow(sMand,-0.097) + 0.314*std::log(sMand)*std::log(sMand) );
// xsection = At*( 38.4 + 0.85*std::abs(std::pow(log(sMand),1.47)) );
}
else if(theParticle == theAProton && pORn )
{
xsection = ( 21.70*std::pow(sMand,0.0808) + 98.39*std::pow(sMand,-0.4525));
}
else if(theParticle == thePiPlus && pORn )
{
xsection = (13.63*std::pow(sMand,0.0808) + 27.56*std::pow(sMand,-0.4525));
}
else if(theParticle == thePiMinus && pORn )
{
// xsection = At*( 55.2*std::pow(sMand,-0.255) + 0.346*std::log(sMand)*std::log(sMand) );
xsection = (13.63*std::pow(sMand,0.0808) + 36.02*std::pow(sMand,-0.4525));
}
else if(theParticle == theKPlus && pORn )
{
xsection = (11.82*std::pow(sMand,0.0808) + 8.15*std::pow(sMand,-0.4525));
}
else if(theParticle == theKMinus && pORn )
{
xsection = (11.82*std::pow(sMand,0.0808) + 26.36*std::pow(sMand,-0.4525));
}
else // as proton ???
{
xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
}
xsection *= millibarn;
fTotalXsc = xsection;
fInelasticXsc = 0.5*xsection;
fElasticXsc = fTotalXsc - fInelasticXsc;
if (fElasticXsc < 0.)fElasticXsc = 0.;
return xsection;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Returns hadron-nucleon Xsc according to PDG parametrisation (2005):
// http://pdg.lbl.gov/2006/reviews/hadronicrpp.pdf
// At = number of nucleons, Zt = number of protons
G4double
G4HadronNucleonXsc::GetHadronNucleonXscPDG(const G4DynamicParticle* aParticle,
const G4ParticleDefinition* nucleon )
{
G4double xsection(0);
G4int Zt=1, Nt=1, At=1;
G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
G4double proj_mass = aParticle->GetMass();
G4double proj_momentum = aParticle->GetMomentum().mag();
G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
sMand /= GeV*GeV; // in GeV for parametrisation
// General PDG fit constants
G4double s0 = 5.38*5.38; // in Gev^2
G4double eta1 = 0.458;
G4double eta2 = 0.458;
G4double B = 0.308;
const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
G4bool proton = (nucleon == theProton);
G4bool neutron = (nucleon == theNeutron);
if(theParticle == theNeutron) // proton-neutron fit
{
if ( proton )
{
xsection = Zt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
+ 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));// on p
}
if ( neutron )
{
xsection = Nt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
+ 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // on n pp for nn
}
}
else if(theParticle == theProton)
{
if ( proton )
{
xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
+ 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
}
if ( neutron )
{
xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
+ 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
}
}
else if(theParticle == theAProton)
{
if ( proton )
{
xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
+ 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
}
if ( neutron )
{
xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
+ 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
}
}
else if(theParticle == thePiPlus && pORn )
{
xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
+ 19.24*std::pow(sMand,-eta1) - 6.03*std::pow(sMand,-eta2));
}
else if(theParticle == thePiMinus && pORn )
{
xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
+ 19.24*std::pow(sMand,-eta1) + 6.03*std::pow(sMand,-eta2));
}
else if(theParticle == theKPlus)
{
if ( proton )
{
xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
+ 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
}
if ( neutron )
{
xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
+ 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
}
}
else if(theParticle == theKMinus)
{
if ( proton )
{
xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
+ 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
}
if ( neutron )
{
xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
+ 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2) );
}
}
else if(theParticle == theSMinus && pORn )
{
xsection = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.)
- 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2) );
}
else if(theParticle == theGamma && pORn ) // modify later on
{
xsection = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.)
+ 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2) );
}
else // as proton ???
{
if ( proton )
{
xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
+ 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2) );
}
if ( neutron )
{
xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
+ 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
}
}
xsection *= millibarn; // parametrised in mb
fTotalXsc = xsection;
fInelasticXsc = 0.5*xsection;
fElasticXsc = fTotalXsc - fInelasticXsc;
if (fElasticXsc < 0.)fElasticXsc = 0.;
return xsection;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Returns hadron-nucleon cross-section based on N. Starkov parametrisation of
// data from mainly http://wwwppds.ihep.su:8001/c5-6A.html database
G4double
G4HadronNucleonXsc::GetHadronNucleonXscNS(const G4DynamicParticle* aParticle,
const G4ParticleDefinition* nucleon )
{
G4double xsection(0), Delta, A0, B0;
G4int Zt=1, Nt=1, At=1;
G4double hpXsc(0);
G4double hnXsc(0);
G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
G4double proj_mass = aParticle->GetMass();
G4double proj_energy = aParticle->GetTotalEnergy();
G4double proj_momentum = aParticle->GetMomentum().mag();
G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
sMand /= GeV*GeV; // in GeV for parametrisation
proj_momentum /= GeV;
proj_energy /= GeV;
proj_mass /= GeV;
// General PDG fit constants
G4double s0 = 5.38*5.38; // in Gev^2
G4double eta1 = 0.458;
G4double eta2 = 0.458;
G4double B = 0.308;
const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
G4bool proton = (nucleon == theProton);
G4bool neutron = (nucleon == theNeutron);
if( theParticle == theNeutron && pORn)
{
if( proj_momentum >= 10.)
// if( proj_momentum >= 2.)
{
Delta = 1.;
if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy;
if(proj_momentum >= 10.)
{
B0 = 7.5;
A0 = 100. - B0*std::log(3.0e7);
xsection = A0 + B0*std::log(proj_energy) - 11
+ 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
0.93827*0.93827,-0.165); // mb
}
fTotalXsc = xsection;
}
else
{
// nn to be pp
if(neutron)
{
if( proj_momentum < 0.73 )
{
hnXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
}
else if( proj_momentum < 1.05 )
{
hnXsc = 23 + 40*(std::log(proj_momentum/0.73))*
(std::log(proj_momentum/0.73));
}
else // if( proj_momentum < 10. )
{
hnXsc = 39.0+
75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
}
fTotalXsc = hnXsc;
}
// pn to be np
if(proton)
{
if( proj_momentum < 0.8 )
{
hpXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
}
else if( proj_momentum < 1.4 )
{
hpXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
}
else // if( proj_momentum < 10. )
{
hpXsc = 33.3+
20.8*(std::pow(proj_momentum,2.0)-1.35)/
(std::pow(proj_momentum,2.50)+0.95);
}
fTotalXsc = hpXsc;
}
// xsection = hpXsc*Zt + hnXsc*Nt;
}
}
else if(theParticle == theProton && pORn)
{
if( proj_momentum >= 10.)
// if( proj_momentum >= 2.)
{
Delta = 1.;
if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy;
if(proj_momentum >= 10.)
{
B0 = 7.5;
A0 = 100. - B0*std::log(3.0e7);
xsection = A0 + B0*std::log(proj_energy) - 11
+ 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
0.93827*0.93827,-0.165); // mb
}
fTotalXsc = xsection;
}
else
{
// pp
if(proton)
{
if( proj_momentum < 0.73 )
{
hpXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
}
else if( proj_momentum < 1.05 )
{
hpXsc = 23 + 40*(std::log(proj_momentum/0.73))*
(std::log(proj_momentum/0.73));
}
else // if( proj_momentum < 10. )
{
hpXsc = 39.0+
75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
}
fTotalXsc = hpXsc;
}
// pn to be np
if(neutron)
{
if( proj_momentum < 0.8 )
{
hnXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
}
else if( proj_momentum < 1.4 )
{
hnXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
}
else // if( proj_momentum < 10. )
{
hnXsc = 33.3+
20.8*(std::pow(proj_momentum,2.0)-1.35)/
(std::pow(proj_momentum,2.50)+0.95);
}
fTotalXsc = hnXsc;
}
// xsection = hpXsc*Zt + hnXsc*Nt;
// xsection = hpXsc*(Zt + Nt);
// xsection = hnXsc*(Zt + Nt);
}
// xsection *= 0.95;
}
else if(theParticle == theAProton && pORn)
{
if(proton)
{
xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
+ 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
}
if(proton)
{
xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
+ 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
}
fTotalXsc = xsection;
}
else if(theParticle == thePiPlus && pORn)
{
if(proton)
{
if(proj_momentum < 0.4)
{
G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
hpXsc = Ex3+20.0;
}
else if(proj_momentum < 1.15)
{
G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
hpXsc = Ex4+14.0;
}
else if(proj_momentum < 3.5)
{
G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
hpXsc = Ex1+Ex2+27.5;
}
else // if(proj_momentum > 3.5) // mb
{
hpXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
}
fTotalXsc = hpXsc;
}
// pi+n = pi-p??
if(neutron)
{
if(proj_momentum < 0.37)
{
hnXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
}
else if(proj_momentum<0.65)
{
hnXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
}
else if(proj_momentum<1.3)
{
hnXsc = 36.1+
10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
}
else if(proj_momentum<3.0)
{
hnXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
}
else // mb
{
hnXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
}
fTotalXsc = hnXsc;
}
// xsection = hpXsc*Zt + hnXsc*Nt;
}
else if(theParticle == thePiMinus && pORn)
{
// pi-n = pi+p??
if(neutron)
{
if(proj_momentum < 0.4)
{
G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
hnXsc = Ex3+20.0;
}
else if(proj_momentum < 1.15)
{
G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
hnXsc = Ex4+14.0;
}
else if(proj_momentum < 3.5)
{
G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
hnXsc = Ex1+Ex2+27.5;
}
else // if(proj_momentum > 3.5) // mb
{
hnXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
}
fTotalXsc = hnXsc;
}
// pi-p
if(proton)
{
if(proj_momentum < 0.37)
{
hpXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
}
else if(proj_momentum<0.65)
{
hpXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
}
else if(proj_momentum<1.3)
{
hpXsc = 36.1+
10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
}
else if(proj_momentum<3.0)
{
hpXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
}
else // mb
{
hpXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
}
fTotalXsc = hpXsc;
}
// xsection = hpXsc*Zt + hnXsc*Nt;
}
else if(theParticle == theKPlus && pORn)
{
if(proton)
{
xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
+ 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
}
if(neutron)
{
xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
+ 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
}
fTotalXsc = xsection;
}
else if(theParticle == theKMinus && pORn)
{
if(proton)
{
xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
+ 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
}
if(neutron)
{
xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
+ 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2));
}
fTotalXsc = xsection;
}
else if(theParticle == theSMinus && pORn)
{
xsection = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.)
- 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2));
}
else if(theParticle == theGamma && pORn) // modify later on
{
xsection = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.)
+ 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2));
fTotalXsc = xsection;
}
else // as proton ???
{
if(proton)
{
xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
+ 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
}
if(neutron)
{
xsection += Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
+ 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
}
fTotalXsc = xsection;
}
fTotalXsc *= millibarn; // parametrised in mb
fInelasticXsc = 0.5*xsection;
fElasticXsc = fTotalXsc - fInelasticXsc;
if (fElasticXsc < 0.)fElasticXsc = 0.;
return xsection;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Returns hadron-nucleon cross-section based on V. Uzjinsky parametrisation of
// data from G4FTFCrossSection class
G4double
G4HadronNucleonXsc::GetHadronNucleonXscVU(const G4DynamicParticle* aParticle,
const G4ParticleDefinition* nucleon )
{
G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
G4int absPDGcode = std::abs(PDGcode);
G4double Elab = aParticle->GetTotalEnergy();
// (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
G4double Plab = aParticle->GetMomentum().mag();
// std::sqrt(Elab * Elab - 0.88);
Elab /= GeV;
Plab /= GeV;
G4double LogPlab = std::log( Plab );
G4double sqrLogPlab = LogPlab * LogPlab;
G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
G4bool proton = (nucleon == theProton);
G4bool neutron = (nucleon == theNeutron);
if( absPDGcode > 1000 && pORn ) //------Projectile is baryon -
{
if(proton)
{
fTotalXsc = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
}
if(neutron)
{
fTotalXsc = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
}
}
else if( PDGcode == 211 && pORn ) //------Projectile is PionPlus ----
{
if(proton)
{
fTotalXsc = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
fElasticXsc = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
}
if(neutron)
{
fTotalXsc = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
}
}
else if( PDGcode == -211 && pORn ) //------Projectile is PionMinus ----
{
if(proton)
{
fTotalXsc = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
}
if(neutron)
{
fTotalXsc = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
fElasticXsc = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
}
}
else if( PDGcode == 111 && pORn ) //------Projectile is PionZero --
{
if(proton)
{
fTotalXsc = (16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab + //Pi+
33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab)/2; //Pi-
fElasticXsc = ( 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab + //Pi+
1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
}
if(neutron)
{
fTotalXsc = (33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab + //Pi+
16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
fElasticXsc = ( 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab + //Pi+
0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
}
}
else if( PDGcode == 321 && pORn ) //------Projectile is KaonPlus --
{
if(proton)
{
fTotalXsc = 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab;
fElasticXsc = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab;
}
if(neutron)
{
fTotalXsc = 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab;
fElasticXsc = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab;
}
}
else if( PDGcode ==-321 && pORn ) //------Projectile is KaonMinus ----
{
if(proton)
{
fTotalXsc = 32.1 + 0. *std::pow(Plab, 0. ) + 0.66*sqrLogPlab - 5.6*LogPlab;
fElasticXsc = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29*sqrLogPlab - 2.4*LogPlab;
}
if(neutron)
{
fTotalXsc = 25.2 + 0. *std::pow(Plab, 0. ) + 0.38*sqrLogPlab - 2.9*LogPlab;
fElasticXsc = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16*sqrLogPlab - 1.3*LogPlab;
}
}
else if( PDGcode == 311 && pORn ) //------Projectile is KaonZero -----
{
if(proton)
{
fTotalXsc = ( 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab + //K+
32.1 + 0. *std::pow(Plab, 0. ) + 0.66 *sqrLogPlab - 5.6 *LogPlab)/2; //K-
fElasticXsc = ( 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab + //K+
7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab)/2; //K-
}
if(neutron)
{
fTotalXsc = ( 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab + //K+
25.2 + 0. *std::pow(Plab, 0. ) + 0.38 *sqrLogPlab - 2.9 *LogPlab)/2; //K-
fElasticXsc = ( 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab + //K+
5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab)/2; //K-
}
}
else //------Projectile is undefined, Nucleon assumed
{
if(proton)
{
fTotalXsc = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
}
if(neutron)
{
fTotalXsc = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
}
}
fTotalXsc *= millibarn;
fElasticXsc *= millibarn;
fInelasticXsc = fTotalXsc - fElasticXsc;
if (fInelasticXsc < 0.) fInelasticXsc = 0.;
return fTotalXsc;
}
////////////////////////////////////////////////////////////////////////////////////
//
//
G4double G4HadronNucleonXsc::CalculateEcmValue( const G4double mp ,
const G4double mt ,
const G4double Plab )
{
G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
// G4double Pcm = Plab * mt / Ecm;
// G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
return Ecm ; // KEcm;
}
////////////////////////////////////////////////////////////////////////////////////
//
//
G4double G4HadronNucleonXsc::CalcMandelstamS( const G4double mp ,
const G4double mt ,
const G4double Plab )
{
G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
return sMand;
}
//
//
///////////////////////////////////////////////////////////////////////////////////////
@@ -26,14 +26,15 @@
// 18-Sep-2003 First version is written by T. Koi
// 10-Nov-2003 Bug fix at Cal. ke_per_n and D T. Koi
// 12-Nov-2003 Add energy check at lower side T. Koi
// 26-Dec-2006 Add isotope dependence D. Wright
#include "G4IonsKoxCrossSection.hh"
#include "G4ParticleTable.hh"
#include "G4IonTable.hh"
G4double G4IonsKoxCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double )
GetIsoZACrossSection(const G4DynamicParticle* aParticle, G4double ZZ,
G4double AA, G4double /*temperature*/)
{
G4double xsection = 0.0;
@@ -45,8 +46,8 @@ GetCrossSection(const G4DynamicParticle* aParticle,
if ( ke_per_N < lowerLimit )
return xsection;
G4int At = int ( anElement->GetN() + 0.5 );
G4int Zt = int ( anElement->GetZ() + 0.5 );
G4int At = int (AA + 0.5);
G4int Zt = int (ZZ + 0.5 );
G4double one_third = 1.0 / 3.0;
@@ -79,6 +80,37 @@ GetCrossSection(const G4DynamicParticle* aParticle,
return xsection;
}
G4double G4IonsKoxCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double temperature)
{
G4int nIso = anElement->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = anElement->GetIsotopeVector();
G4double* abundVector = anElement->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(aParticle, ZZ, AA, temperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(aParticle, anElement->GetZ(), anElement->GetN(),
temperature);
}
return xsection;
}
G4double G4IonsKoxCrossSection::calEcm ( G4double mp , G4double mt , G4double Plab )
{
G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
@@ -88,6 +120,7 @@ G4double G4IonsKoxCrossSection::calEcm ( G4double mp , G4double mt , G4double Pl
return KEcm;
}
G4double G4IonsKoxCrossSection::calCeValue( const G4double ke )
{
// Calculate c value
@@ -26,6 +26,8 @@
// 18-Sep-2003 First version is written by T. Koi
// 12-Nov-2003 Add energy check at lower side T. Koi
// 15-Nov-2006 Above 10GeV/n Cross Section become constant T. Koi (SLAC/SCCS)
// 23-Dec-2006 Isotope dependence adde by D. Wright
//
#include "G4IonsShenCrossSection.hh"
#include "G4ParticleTable.hh"
@@ -33,7 +35,8 @@
G4double G4IonsShenCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement, G4double )
GetIsoZACrossSection(const G4DynamicParticle* aParticle, G4double ZZ,
G4double AA, G4double /*temperature*/)
{
G4double xsection = 0.0;
@@ -46,9 +49,8 @@ GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
if ( ke_per_N < lowerLimit )
return xsection;
G4int At = int ( anElement->GetN() + 0.5 );
G4int Zt = int ( anElement->GetZ() + 0.5 );
G4int At = G4int(AA);
G4int Zt = G4int(ZZ);
G4double one_third = 1.0 / 3.0;
@@ -88,6 +90,36 @@ GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
}
G4double G4IonsShenCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
G4double temperature)
{
G4int nIso = anElement->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = anElement->GetIsotopeVector();
G4double* abundVector = anElement->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(aParticle, ZZ, AA, temperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(aParticle, anElement->GetZ(), anElement->GetN(),
temperature);
}
return xsection;
}
G4double G4IonsShenCrossSection::calEcmValue( const G4double mp , const G4double mt , const G4double Plab )
{
@@ -24,19 +24,21 @@
// ********************************************************************
//
// 18-Sep-2003 First version is written by T. Koi
// 23-Dec-2006 Isotope dependence added by D. Wright
//
#include "G4IonsSihverCrossSection.hh"
#include "G4ParticleTable.hh"
#include "G4IonTable.hh"
G4double G4IonsSihverCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double )
GetIsoZACrossSection(const G4DynamicParticle* aParticle, G4double /*ZZ*/,
G4double AA, G4double /*aTemperature*/)
{
G4double xsection = 0.0;
G4int At = int ( anElement->GetN() + 0.5 );
//Zt = int ( anElement->GetZ() + 0.5 ); // not used
G4int At = G4int(AA);
//G4int Zt = G4int(ZZ); // not used
G4int Ap = aParticle->GetDefinition()->GetBaryonNumber();
//Zp = aParticle->GetDefinition()->GetPDGCharge(); // not used
@@ -53,3 +55,34 @@ GetCrossSection(const G4DynamicParticle* aParticle,
return xsection;
}
G4double G4IonsSihverCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement, G4double temperature)
{
G4int nIso = anElement->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = anElement->GetIsotopeVector();
G4double* abundVector = anElement->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(aParticle, ZZ, AA, temperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(aParticle, anElement->GetZ(), anElement->GetN(),
temperature);
}
return xsection;
}
@@ -24,43 +24,67 @@
// ********************************************************************
//
// By JPW, working, but to be cleaned up. @@@
// 22 Dec 2006 - DHW added isotope dependence
//
#include "G4NeutronInelasticCrossSection.hh"
#include "globals.hh"
G4double G4NeutronInelasticCrossSection::
GetCrossSection(const G4DynamicParticle* aPart,
const G4Element* anEle, G4double )
{
G4double atomicNumber = anEle->GetN();
G4double nOfProtons = anEle->GetZ();
return GetCrossSection(aPart->GetKineticEnergy(), atomicNumber, nOfProtons);
}
G4double G4NeutronInelasticCrossSection::
GetCrossSection(G4double anEnergy, G4double atomicNumber, G4double nOfProtons)
{
G4double kineticEnergy = std::log10(anEnergy/MeV);
G4double nOfNeutrons = atomicNumber-nOfProtons;
const G4double p1=1.3773;
const G4double p2=1.+10./atomicNumber-0.0006*atomicNumber;
const G4double p3=0.6+13./atomicNumber-0.0005*atomicNumber;
const G4double p4=7.2449-0.018242*atomicNumber;
const G4double p5=1.64-1.8/atomicNumber-0.0005*atomicNumber;
const G4double p6=1.+200./atomicNumber+0.02*atomicNumber;
const G4double p7=(atomicNumber-70.)*(atomicNumber-200.)/11000.;
double part1 = pi*(p1*p1)*std::log(nOfNeutrons);
double part2 = 1.+ std::pow(atomicNumber, 1./3.) - p2*(1.-1./std::pow(atomicNumber, 1./3.));
G4double G4NeutronInelasticCrossSection::
GetCrossSection(const G4DynamicParticle* aPart,
const G4Element* anEle, G4double /*aTemperature*/)
{
G4int nIso = anEle->GetNumberOfIsotopes();
G4double KE = aPart->GetKineticEnergy();
G4double cross_section = 0;
if (nIso) {
G4double psig;
G4IsotopeVector* isoVector = anEle->GetIsotopeVector();
G4double* abundVector = anEle->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
double firstexp = -p4*(kineticEnergy-p5);
double first=1.+std::exp(firstexp);
double corr = 1.+p3*(1.-1./first);
double secondexp = -p6*(kineticEnergy-p7);
double second=1.+std::exp(secondexp);
double corr2 =1./second;
double xsec = corr*corr2*part1*part2*10.*millibarn;
return xsec;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
psig = GetCrossSection(KE, AA, ZZ);
cross_section += psig*abundVector[i];
}
} else {
cross_section = GetCrossSection(KE, anEle->GetN(), anEle->GetZ());
}
return cross_section;
}
G4double G4NeutronInelasticCrossSection::
GetCrossSection(G4double anEnergy, G4double atomicNumber, G4double nOfProtons)
{
G4double kineticEnergy = std::log10(anEnergy/MeV);
G4double nOfNeutrons = atomicNumber-nOfProtons;
const G4double p1=1.3773;
const G4double p2=1.+10./atomicNumber-0.0006*atomicNumber;
const G4double p3=0.6+13./atomicNumber-0.0005*atomicNumber;
const G4double p4=7.2449-0.018242*atomicNumber;
const G4double p5=1.64-1.8/atomicNumber-0.0005*atomicNumber;
const G4double p6=1.+200./atomicNumber+0.02*atomicNumber;
const G4double p7=(atomicNumber-70.)*(atomicNumber-200.)/11000.;
G4double part1 = pi*(p1*p1)*std::log(nOfNeutrons);
G4double part2 = 1.+ std::pow(atomicNumber, 1./3.)
- p2*(1.-1./std::pow(atomicNumber, 1./3.));
G4double firstexp = -p4*(kineticEnergy-p5);
G4double first=1.+std::exp(firstexp);
G4double corr = 1.+p3*(1.-1./first);
G4double secondexp = -p6*(kineticEnergy-p7);
G4double second=1.+std::exp(secondexp);
G4double corr2 =1./second;
G4double xsec = corr*corr2*part1*part2*10.*millibarn;
return xsec;
}
@@ -0,0 +1,731 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// author: Vladimir.Grichine@cern.ch
//
// Implements data from: Barashenkov V.S., Nucleon-Nucleus Cross Section,
// Preprint JINR P2-89-770, p. 12, Dubna 1989 (scanned version from KEK)
// Based on G. Folger version of G4PiNuclearCrossSection class
//
// Modified:
// 05.03.07 V.Ivanchenko - add IfZAApplicable, remove "debug"
//
#include "G4NucleonNuclearCrossSection.hh"
//#include "G4HadronicException.hh"
//#include "G4HadTmpUtil.hh"
#include "G4Neutron.hh"
#include "G4Proton.hh"
//#include "G4ping.hh"
// Group 1: He, Be, C for 44 energies
const G4double G4NucleonNuclearCrossSection::e1[44] =
{
0.014, 0.015, 0.017, .02, 0.022, 0.025, 0.027, 0.03, 0.035, .04, 0.045, 0.05, .06, 0.07,
.08, 0.09, .1, .12, .14, .15, .16, .18, .20, .25, .30, .35, .4 , 0.5, 0.6, 0.7, 0.8,
0.9, 1, 1.5, 2, 3, 5, 7, 10,
20, 50, 100, 500, 1000
};
const G4double G4NucleonNuclearCrossSection::he_m_t[44] =
{
1090, 1020, 915, 800, 710, 640, 600, 560, 500, 440, 390, 360, 295, 256, 220, 192,
168, 136, 120, 116, 114, 110, 107, 104, 106, 108, 110, 120, 126, 135, 140, 144, 146,
148, 152, 150, 146, 142, 138, 132, 129, 126, 127, 128
};
const G4double G4NucleonNuclearCrossSection::he_m_in[44] =
{
0, 5, 10, 20, 35, 55, 70, 80, 90, 105, 115, 115, 100, 90, 86, 84, 84, 82, 80, 80, 80, 80,
79, 78, 80, 84, 88, 94, 100, 105, 108, 108, 108, 112, 114, 114, 112, 110, 108, 106, 104,
101, 102, 102
};
const G4double G4NucleonNuclearCrossSection::he_p_in[44] =
{
0, 2, 3, 13, 30, 50, 65, 77, 90, 105, 115, 115, 100, 90, 86, 84, 84, 82, 80, 80, 80, 80,
79, 78, 80, 84, 88, 94, 100, 105, 108, 108, 108, 112, 114, 114, 112, 110, 108, 106, 104,
101, 102, 102
};
const G4double G4NucleonNuclearCrossSection::be_m_t[44] =
{
1490, 1460, 1400, 1350, 1270, 1200, 1160, 1100, 1000, 910, 810, 740, 625, 575, 455, 406,
365, 310, 275, 262, 255, 240, 235, 225, 225, 230, 238, 252, 270, 282, 288, 290, 294, 303,
303, 300, 292, 284, 277, 267, 263, 264, 268, 268
};
const G4double G4NucleonNuclearCrossSection::be_m_in[44] =
{
650, 640, 617, 595, 555, 520, 495, 470, 430, 385, 350, 320, 270, 250, 210, 190, 185, 178,
175, 175, 175, 175, 175, 170, 170, 172, 176, 184, 194, 200, 209, 213, 214, 216, 216, 212,
210, 210, 210, 210, 210, 210, 210, 210
};
const G4double G4NucleonNuclearCrossSection::be_p_in[44] =
{
490, 540, 580, 545, 525, 495, 470, 450, 420, 370, 340, 310, 262, 242, 205, 185, 180, 175,
172, 175, 175, 175, 175, 170, 170, 172, 176, 184, 194, 200, 209, 213, 214, 216, 216, 212,
210, 210, 210, 210, 210, 210, 210, 210
};
const G4double G4NucleonNuclearCrossSection::c_m_t[44] =
{
1240, 1370, 1450, 1455, 1445, 1385, 1345, 1290, 1210, 1110, 1020, 940, 800, 700, 604, 530,
475, 396, 350, 336, 320, 303, 294, 280, 280, 286, 296, 314, 330, 344, 356, 360, 364, 384,
388, 384, 364, 352, 344, 330, 324, 324, 332, 332
};
const G4double G4NucleonNuclearCrossSection::c_m_in[44] =
{
590, 570, 542, 510, 500, 460, 445, 430, 395, 380, 350, 330, 295, 270, 255, 240, 228, 222,
216, 216, 210, 210, 210, 208, 210, 214, 216, 228, 240, 248, 254, 257, 260, 262, 260, 256,
252, 252, 250, 250, 248, 248, 248, 248
};
const G4double G4NucleonNuclearCrossSection::c_p_in[44] =
{
310, 330, 400, 440, 450, 435, 430, 420, 385, 370, 340, 320, 288, 263, 249, 234, 222, 216,
210, 211, 205, 208, 210, 208, 210, 214, 216, 228, 240, 248, 254, 257, 260, 262, 260, 256,
252, 252, 250, 250, 248, 248, 248, 248
};
// Group 2: N, O, Na for 44 energies (e1=e2)
const G4double G4NucleonNuclearCrossSection::e2[44] =
{
0.014, 0.015, 0.017, .02, 0.022, 0.025, 0.027, 0.03, 0.035, .04, 0.045, 0.05, .06, 0.07,
.08, 0.09, .1, .12, .14, .15, .16, .18, .20, .25, .30, .35, .4 , 0.5, 0.6, 0.7, 0.8,
0.9, 1, 1.5, 2, 3, 5, 7, 10,
20, 50, 100, 500, 1000
};
const G4double G4NucleonNuclearCrossSection::n_m_t[44] =
{
1420,1480, 1537, 1550, 1525, 1500, 1480, 1425, 1340, 1260, 1175, 1090, 930, 805, 690, 612,
552, 462, 402, 384, 372, 350, 345, 326, 324, 328, 336, 356, 372, 388, 400, 408, 415, 430,
435, 432, 415, 402, 390, 375, 367, 370, 382, 385
};
const G4double G4NucleonNuclearCrossSection::n_m_in[44] =
{
680, 665, 625, 580, 562, 525, 510, 485, 450, 435, 410, 387, 340, 310, 290, 280, 276, 274,
260, 258, 254, 247, 245, 240, 240, 244, 250, 260, 268, 275, 280, 285, 290, 295, 300, 294,
292, 290, 285, 285, 282, 282, 282, 282
};
const G4double G4NucleonNuclearCrossSection::n_p_in[44] =
{
420, 440, 470, 490, 497, 500, 480, 462, 440, 425, 400, 377, 333, 303, 284, 274, 270, 268,
254, 252, 247, 245, 245, 240, 240, 244, 250, 260, 268, 275, 280, 285, 290, 295, 300, 294,
292, 290, 285, 285, 282, 282, 282, 282
};
const G4double G4NucleonNuclearCrossSection::o_m_t[44] =
{
1520, 1570, 1630, 1660, 1647, 1623, 1595, 1555, 1475, 1395, 1290, 1207, 1035, 925, 816,
720, 645, 540, 462, 438, 415, 392, 378, 362, 361, 381, 390, 403, 417, 440, 460, 470,
479, 498, 504, 498, 477, 457, 443, 427, 420, 425, 429, 430
};
const G4double G4NucleonNuclearCrossSection::o_m_in[44] =
{
750, 740, 700, 650, 620, 575, 555, 530, 505, 462, 435, 420, 375, 345, 320, 310, 300, 293,
288, 282, 282, 280, 276, 270, 271, 275, 280, 290, 295, 304, 310, 315, 318, 332, 335, 330,
323, 320, 317, 315, 315, 315, 315, 315
};
const G4double G4NucleonNuclearCrossSection::o_p_in[44] =
{
460, 485, 510, 535, 537, 532, 520, 500, 460, 432, 405, 390, 350, 320, 310, 304, 293, 287,
283, 279, 279, 278, 276, 270, 271, 275, 280, 290, 295, 304, 310, 315, 318, 332, 335, 330,
323, 320, 317, 315, 315, 315, 315, 315
};
const G4double G4NucleonNuclearCrossSection::na_m_t[44] =
{
1570, 1620, 1695, 1730, 1750, 1760, 1755, 1740, 1710, 1643, 1560, 1480, 1343, 1220, 1073,
953, 860, 720, 618, 582, 546, 522, 504, 484, 492, 500, 512, 538, 560, 586, 608, 622, 632,
660, 668, 664, 640, 616, 596, 568, 568, 568, 568, 568
};
const G4double G4NucleonNuclearCrossSection::na_m_in[44] =
{
960, 930, 890, 822, 790, 750, 725, 686, 620, 600, 575, 540, 497, 450, 414, 390, 380, 372,
354, 360, 355, 354, 350, 350, 350, 356, 364, 384, 392, 400, 408, 410, 420, 408, 412, 420,
411, 409, 407, 403, 400, 400, 400, 400
};
const G4double G4NucleonNuclearCrossSection::na_p_in[44] =
{
600, 617, 660, 675, 680, 680, 670, 650, 575, 550, 525, 490, 450, 420, 385, 367, 360, 350,
350, 350, 345, 347, 350, 350, 350, 356, 364, 384, 392, 400, 408, 410, 420, 408, 412, 420,
411, 409, 407, 403, 400, 400, 400, 400
};
// Al, Si, Ca for 45 energies
const G4double G4NucleonNuclearCrossSection::e3[45] =
{
0.014, 0.015, 0.016, 0.017, .02, 0.022, 0.025, 0.027, 0.03, 0.035, .04, 0.045, 0.05,
.06, 0.07, .08, 0.09, .1, .12, .14, .15, .16, .18, .20, .25, .30, .35, .4 , 0.5, 0.6,
0.7, 0.8, 0.9, 1, 1.5, 2, 3, 5, 7, 10, 20, 50, 100, 500, 1000
};
const G4double G4NucleonNuclearCrossSection::al_m_t[45] =
{
1735, 1750, 1760, 1795, 1830, 1855, 1885, 1895, 1900, 1870, 1835, 1785, 1710, 1522,
1350, 1212, 1080, 972, 816, 720, 678, 642, 600, 567, 558, 560, 578, 592, 616, 644,
672, 688, 708, 720, 736, 754, 736, 706, 680, 672, 646, 632, 632, 632, 632
};
const G4double G4NucleonNuclearCrossSection::al_m_in[45] =
{
1000, 990, 975, 950, 905, 875, 825, 800, 762, 690, 652, 610, 570, 495, 480, 456, 444,
432, 420, 420, 420, 420, 410, 410, 400, 402, 404, 408, 424, 438, 448, 450, 454, 456,
472, 480, 466, 456, 452, 448, 444, 440, 440, 440, 440
};
const G4double G4NucleonNuclearCrossSection::al_p_in[45] =
{
650, 682, 690, 715, 750, 762, 750, 740, 720, 655, 617, 575, 540, 470, 455, 532, 420,
408, 400, 403, 403, 408, 406, 404, 400, 402, 404, 408, 424, 438, 448, 450, 454, 456,
472, 480, 466, 456, 452, 448, 444, 440, 440, 440, 440
};
const G4double G4NucleonNuclearCrossSection::si_m_t[45] =
{
1810, 1833, 1850, 1872, 1920, 1950, 1995, 2020, 2035, 2000, 1930, 1850, 1760, 1570,
1400, 1255, 1110, 1008, 846, 742, 696, 671, 623, 588, 584, 584, 602, 618, 645, 679,
708, 727, 746, 757, 769, 782, 771, 734, 710, 698, 672, 654, 650, 650, 650
};
const G4double G4NucleonNuclearCrossSection::si_m_in[45] =
{
1060, 1035, 1015, 990, 935, 900, 860, 830, 790, 725, 665, 630, 600, 520, 504, 486,
470, 456, 444, 432, 432, 432, 418, 418, 415, 412, 416, 422, 440, 460, 472, 476, 479,
480, 492, 496, 488, 472, 472, 464, 460, 452, 448, 448, 448
};
const G4double G4NucleonNuclearCrossSection::si_p_in[45] =
{
670, 700, 725, 750, 780, 780, 770, 757, 735, 690, 635, 585, 570, 490, 475, 460, 446,
431, 423, 425, 425, 425, 425, 422, 422, 412, 416, 422, 440, 460, 472, 476, 479,
480, 492, 496, 488, 472, 472, 464, 460, 452, 448, 448, 448
};
const G4double G4NucleonNuclearCrossSection::ca_m_t[45] =
{
2180, 2130, 2095, 2075, 2115, 2150, 2220, 2250, 2300, 2365, 2360, 2280, 2180, 2000,
1805, 1650, 1500, 1340, 1140, 990, 940, 890, 825, 790, 770, 773, 787, 800, 830, 870,
905, 930, 950, 965, 990, 1002, 990, 965, 945, 925, 892, 860, 860, 860, 860
};
const G4double G4NucleonNuclearCrossSection::ca_m_in[45] =
{
1240, 1225, 1200, 1180, 1125, 1090, 1045, 1020, 980, 925, 880, 825, 770, 680, 640,
620, 615, 600, 580, 565, 560, 560, 560, 550, 535, 530, 540, 550, 570, 595, 610, 615,
620, 622, 629, 630, 620, 612, 607, 592, 587, 580, 580, 580, 580
};
const G4double G4NucleonNuclearCrossSection::ca_p_in[45] =
{
770, 800, 823, 850, 900, 925, 935, 920, 895, 835, 800, 750, 715, 640, 605, 590, 588,
573, 555, 543, 540, 540, 540, 535, 530, 530, 540, 550, 570, 595, 610, 615,
620, 622, 629, 630, 620, 612, 607, 592, 587, 580, 580, 580, 580
};
// Fe, Cu, Mo for 47 energies
const G4double G4NucleonNuclearCrossSection::e4[47] =
{
0.014, 0.015, 0.017, .02, 0.022, 0.025, 0.027, 0.03, 0.033, 0.035, 0.037, .04, 0.045,
0.05, 0.055, .06, 0.07, .08, 0.09, .1, .12, .14, .15, .16, .18, .20, .25, .30, .35,
.4 , 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.5, 2, 3, 5, 7, 10,
20, 50, 100, 500, 1000
};
const G4double G4NucleonNuclearCrossSection::fe_m_t[47] =
{
2580, 2490, 2370, 2282, 2275, 2285, 2320, 2370, 2432, 2445, 2460, 2485, 2530, 2540,
2517, 2480, 2290, 2110, 1940, 1790, 1510, 1290, 1220, 1150, 1070, 1030, 1013, 1020,
1030, 1043, 1075, 1110, 1133, 1163, 1185, 1225, 1252, 1260, 1260, 1233, 1207, 1185,
1140, 1110, 1110, 1110, 1110
};
const G4double G4NucleonNuclearCrossSection::fe_m_in[47] =
{
1440, 1433, 1390, 1325, 1280, 1260, 1215, 1180, 1140, 1110, 1080, 1040, 990, 955, 920,
885, 835, 800, 780, 765, 750, 725, 720, 720, 710, 700, 700, 700, 712, 705, 735, 750,
765, 775, 780, 795, 810, 813, 810, 784, 757, 743, 735, 720, 720, 720, 720
};
const G4double G4NucleonNuclearCrossSection::fe_p_in[47] =
{
900, 960, 1070, 1090, 1115, 1120, 1115, 1080, 1045, 1025, 1000, 960, 900, 885, 865, 790,
765, 740, 720, 700, 697, 697, 697, 697, 695, 690, 688, 690, 712, 705, 735, 750,
765, 775, 780, 795, 810, 813, 810, 784, 757, 743, 735, 720, 720, 720, 720
};
const G4double G4NucleonNuclearCrossSection::cu_m_t[47] =
{
2920, 2800, 2615, 2480, 2455, 2430, 2440, 2460, 2500, 2530, 2560, 2615, 2690, 2720,
2700, 2645, 2500, 2320, 2140, 1970, 1670, 1460, 1380, 1285, 1200, 1160, 1140, 1147,
1163, 1170, 1200, 1237, 1265, 1285, 1305, 1328, 1375, 1390, 1395, 1370, 1335, 1315,
1270, 1230, 1230, 1230, 1230
};
const G4double G4NucleonNuclearCrossSection::cu_m_in[47] =
{
1540, 1535, 1500, 1445, 1407, 1380, 1330, 1300, 1285, 1270, 1240, 1190, 1090, 1010,
940, 920, 860, 835, 820, 810, 800, 780, 775, 770, 760, 760, 758, 765, 765, 770, 795,
810, 825, 830, 840, 848, 870, 870, 868, 840, 825, 810, 803, 795, 795, 795, 795
};
const G4double G4NucleonNuclearCrossSection::cu_p_in[47] =
{
935, 1000, 1060, 1190, 1220, 1250, 1240, 1210, 1150, 1130, 1115, 1050, 985, 950, 890,
870, 820, 800, 785, 780, 770, 750, 745, 740, 735, 735, 745, 760, 762, 770, 795,
810, 825, 830, 840, 848, 870, 870, 868, 840, 825, 810, 803, 795, 795, 795, 795
};
const G4double G4NucleonNuclearCrossSection::mo_m_t[47] =
{
4150, 4040, 3800, 3490, 3300, 3060, 2960, 2845, 2785, 2820, 2850, 2980, 3170, 3230,
3270, 3280, 3225, 3075, 2895, 2710, 2355, 2060, 1925, 1800, 1630, 1560, 1540, 1550,
1570, 1590, 1650, 1685, 1715, 1740, 1760, 1780, 1850, 1880, 1858, 1815, 1790, 1782,
1720, 1690, 1690, 1690, 1690
};
const G4double G4NucleonNuclearCrossSection::mo_m_in[47] =
{
1790, 1775, 1740, 1680, 1640, 1580, 1550, 1510, 1460, 1440, 1418, 1380, 1330, 1280,
1240, 1200, 1155, 1140, 1110, 1110, 1080, 1065, 1050, 1050, 1025, 1020, 1015, 1020,
1022, 1026, 1060, 1085, 1100, 1110, 1120, 1127, 1150, 1160, 1140, 1100, 1085, 1080,
1070, 1070, 1070, 1070, 1070
};
const G4double G4NucleonNuclearCrossSection::mo_p_in[47] =
{
1025, 1080, 1190, 1380, 1440, 1495, 1475, 1420, 1350, 1310, 1300, 1290, 1250, 1200,
1170, 1130, 1095, 1060, 1040, 1022, 1020, 1016, 1016, 1016, 1016, 1012, 1005, 1005,
1005, 1010, 1060, 1085, 1100, 1110, 1120, 1127, 1150, 1160, 1140, 1100, 1085, 1080,
1070, 1070, 1070, 1070, 1070
};
// Cd, Sn, W for 48 energies
const G4double G4NucleonNuclearCrossSection::e5[48] =
{
0.014, 0.015, 0.017, 0.018, .02, 0.022, 0.025, 0.027, 0.03, 0.033, 0.035, .04,
0.045, 0.05, 0.055, .06, .065, 0.07, .08, 0.09, .1, .12, .14, .15, .16, .18,
.20, .25, .30, .35, .4 , 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.5, 2, 3, 5, 7, 10, 20,
50, 100, 500, 1000
};
const G4double G4NucleonNuclearCrossSection::cd_m_t[48] =
{
4420, 4280, 4170, 4070, 3860, 3680, 3420, 3280, 3125, 3060, 3080, 3190, 3350, 3445,
3510, 3540, 3560, 3550, 3460, 3300, 3030, 2640, 2340, 2190, 2070, 1950, 1770, 1732,
1740, 1760, 1780, 1832, 1885, 1925, 1945, 1960, 1980, 2070, 2080, 2065, 2040, 2022,
1980, 1940, 1870, 1870, 1870, 1870
};
const G4double G4NucleonNuclearCrossSection::cd_m_in[48]=
{
1920, 1910, 1880, 1860, 1840, 1800, 1760, 1720, 1675, 1630, 1600, 1520, 1465, 1420,
1390, 1340, 1310, 1280, 1275, 1235, 1225, 1200, 1170, 1170, 1170, 1165, 1145, 1140,
1140, 1135, 1160, 1180, 1220, 1240, 1250, 1260, 1265, 1270, 1275, 1250, 1222, 1222,
1220, 1215, 1190, 1190, 1190, 1190
};
const G4double G4NucleonNuclearCrossSection::cd_p_in[48] =
{
1020, 1100, 1225, 1290, 1440, 1520, 1575, 1560, 1518, 1460, 1420, 1400, 1365, 1340,
1300, 1280, 1260, 1200, 1190, 1160, 1125, 1125, 1125, 1125, 1125, 1125, 1120, 1120,
1120, 1118, 1146, 1180, 1220, 1240, 1250, 1260, 1265, 1270, 1275, 1250, 1222, 1222,
1220, 1215, 1190, 1190, 1190, 1190
};
const G4double G4NucleonNuclearCrossSection::sn_m_t[48] =
{
4420, 4400, 4260, 4150, 3980, 3770, 3530, 3370, 3245, 3180, 3170, 3260, 3400, 3500,
3560, 3610, 3650, 3680, 3580, 3390, 3190, 2760, 2430, 2295, 2175, 1990, 1880, 1810,
1820, 1840, 1865, 1940, 1985, 2020, 2040, 2060, 2080, 2160, 2185, 2180, 2110, 2105,
2080, 2050, 1980, 1980, 1980, 1980
};
const G4double G4NucleonNuclearCrossSection::sn_m_in[48] =
{
1945, 1940, 1905, 1890, 1860, 1830, 1780, 1755, 1717, 1680, 1645, 1570, 1500, 1455,
1410, 1370, 1340, 1320, 1290, 1285, 1260, 1240, 1235, 1212, 1200, 1200, 1200, 1190,
1190, 1200, 1210, 1240, 1270, 1285, 1300, 1300, 1310, 1320, 1320, 1290, 1240, 1240,
1240, 1240, 1240, 1240, 1240, 1240
};
const G4double G4NucleonNuclearCrossSection::sn_p_in[48] =
{
1020, 1080, 1270, 1335, 1465, 1505, 1610, 1610, 1550, 1535, 1500, 1440, 1407, 1370,
1340, 1300, 1285, 1260, 1230, 1215, 1200, 1180, 1170, 1170, 1165, 1165, 1170, 1165,
1165, 1183, 1195, 1240, 1270, 1285, 1300, 1300, 1310, 1320, 1320, 1290, 1240, 1240,
1240, 1240, 1240, 1240, 1240, 1240
};
const G4double G4NucleonNuclearCrossSection::w_m_t[48] =
{
5320, 5430, 5480, 5450, 5330, 5190, 4960, 4790, 4550, 4340, 4200, 4070, 4000, 4030,
4125, 4220, 4270, 4390, 4440, 4360, 4200, 3800, 3380, 3200, 3040, 2790, 2660, 2575,
2575, 2600, 2640, 2690, 2755, 2790, 2812, 2837, 2850, 2950, 3000, 2970, 2940, 2910,
2880, 2820, 2730, 2730, 2730, 2730
};
const G4double G4NucleonNuclearCrossSection::w_m_in[48] =
{
2440, 2400, 2370, 2350, 2310, 2270, 2220, 2195, 2150, 2100, 2070, 2010, 1945, 1900,
1850, 1820, 1780, 1760, 1730, 1720, 1680, 1680, 1660, 1660, 1650, 1650, 1640, 1640,
1612, 1615, 1625, 1640, 1700, 1720, 1730, 1740, 1750, 1780, 1780, 1750, 1740, 1735,
1710, 1695, 1680, 1680, 1680, 1680
};
const G4double G4NucleonNuclearCrossSection::w_p_in[48] =
{
950, 1020, 1240, 1400, 1560, 1670, 1760, 1830, 1850, 1855, 1870, 1840, 1800, 1770,
1740, 1715, 1680, 1670, 1650, 1620, 1610, 1600, 1600, 1600, 1600, 1600, 1600, 1595,
1585, 1595, 1615, 1640, 1700, 1720, 1730, 1740, 1750, 1780, 1780, 1750, 1740, 1735,
1710, 1695, 1680, 1680, 1680, 1680
};
// Pb, U for 46 energies
const G4double G4NucleonNuclearCrossSection::e6[46] =
{
0.014, 0.015, 0.017, 0.019, .02, 0.022, 0.025, 0.027, 0.03, 0.035, .04, 0.045, 0.05,
0.055, .06, 0.07, .08, 0.09, .1, .12, .14, .15, .16, .18, .20, .25, .30, .35, .4 ,
0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.5, 2, 3, 5, 7, 10, 20, 50, 100, 500, 1000
};
const G4double G4NucleonNuclearCrossSection::pb_m_t[46] =
{
5300, 5440, 5720, 5880, 5765, 5745, 5480, 5280, 4970, 4550, 4390, 4300, 4265, 4325,
4450, 4540, 4740, 4710, 4600, 4100, 3660, 3480, 3300, 3000, 2890, 2865, 2855, 2850,
2865, 2920, 2955, 3000, 3030, 3060, 3105, 3240, 3290, 3270, 3240, 3180, 3090, 3060,
2970, 2970, 2970, 2970
};
const G4double G4NucleonNuclearCrossSection::pb_m_in[46] =
{
2580, 2550, 2505, 2462, 2460, 2435, 2380, 2355, 2280, 2180, 2170, 2130, 2080, 2035,
1980, 1940, 1900, 1870, 1840, 1800, 1800, 1800, 1780, 1760, 1760, 1740, 1730, 1725,
1740, 1785, 1815, 1835, 1860, 1890, 1895, 1920, 1920, 1890, 1850, 1835, 1830, 1830,
1830, 1830, 1830, 1830
};
const G4double G4NucleonNuclearCrossSection::pb_p_in[46] =
{
900, 1060, 1200, 1420, 1515, 1620, 1750, 1800, 1915, 2030, 1960, 1940, 1910, 1860,
1840, 1780, 1770, 1760, 1740, 1720, 1725, 1740, 1740, 1730, 1720, 1700, 1710, 1720,
1730, 1740, 1815, 1835, 1860, 1890, 1895, 1920, 1920, 1890, 1850, 1835, 1830, 1830,
1830, 1830, 1830, 1830
};
const G4double G4NucleonNuclearCrossSection::u_m_t[46] =
{
5800, 5940, 6160, 6345, 6360, 6350, 6170, 6020, 5760, 5350, 4990, 4800, 4710, 4690,
4760, 5040, 5190, 5200, 5080, 4600, 4120, 3920, 3720, 3420, 3240, 3150, 3160, 3180,
3210, 3240, 3280, 3350, 3390, 3435, 3480, 3560, 3585, 3580, 3540, 3500, 3470, 3410,
3335, 3335, 3335, 3335
};
const G4double G4NucleonNuclearCrossSection::u_m_in[46] =
{
2820, 2770, 2700, 2660, 2645, 2620, 2580, 2550, 2515, 2450, 2390, 2320, 2260, 2225,
2200, 2140, 2080, 2060, 2040, 2000, 1980, 1965, 1960, 1930, 1920, 1890, 1905, 1920,
1945, 1970, 1985, 2010, 2040, 2070, 2080, 2090, 2095, 2080, 2063, 2060, 2050, 2040,
2005, 2005, 2005, 2005
};
const G4double G4NucleonNuclearCrossSection::u_p_in[46] =
{
800, 900, 1100, 1300, 1410, 1510, 1680, 1800, 2000, 2200, 2080, 2060, 2035, 2100,
2030, 2030, 2000, 1960, 1960, 1960, 1940, 1925, 1920, 1905, 1890, 1860, 1880, 1910,
1930, 1945, 1985, 2010, 2040, 2070, 2080, 2090, 2095, 2080, 2063, 2060, 2050, 2040,
2005, 2005, 2005, 2005
};
using namespace std;
//////////////////////////////////////////////////////////////////////////////////
//
//
G4NucleonNuclearCrossSection::G4NucleonNuclearCrossSection()
{
theNeutron = G4Neutron::Neutron();
theProton = G4Proton::Proton();
// He, Be, C
thePimData.push_back(new G4PiData(he_m_t, he_m_in, e1, 44));
thePipData.push_back(new G4PiData(he_m_t, he_p_in, e1, 44));
thePimData.push_back(new G4PiData(be_m_t, be_m_in, e1, 44));
thePipData.push_back(new G4PiData(be_m_t, be_p_in, e1, 44));
thePimData.push_back(new G4PiData(c_m_t, c_m_in, e1, 44));
thePipData.push_back(new G4PiData(c_m_t, c_p_in, e1, 44));
// N, O, Na
thePimData.push_back(new G4PiData(n_m_t, n_m_in, e2, 44));
thePipData.push_back(new G4PiData(n_m_t, n_p_in, e2, 44));
thePimData.push_back(new G4PiData(o_m_t, o_m_in, e2, 44));
thePipData.push_back(new G4PiData(o_m_t, o_p_in, e2, 44));
thePimData.push_back(new G4PiData(na_m_t, na_m_in, e2, 44));
thePipData.push_back(new G4PiData(na_m_t, na_p_in, e2, 44));
// Al, Si, Ca
thePimData.push_back(new G4PiData(al_m_t, al_m_in, e3, 45));
thePipData.push_back(new G4PiData(al_m_t, al_p_in, e3, 45));
thePimData.push_back(new G4PiData(si_m_t, si_m_in, e3, 45));
thePipData.push_back(new G4PiData(si_m_t, si_p_in, e3, 45));
thePimData.push_back(new G4PiData(ca_m_t, ca_m_in, e3, 45));
thePipData.push_back(new G4PiData(ca_m_t, ca_p_in, e3, 45));
// Fe, Cu, Mo
thePimData.push_back(new G4PiData(fe_m_t, fe_m_in, e4, 47));
thePipData.push_back(new G4PiData(fe_m_t, fe_p_in, e4, 47));
thePimData.push_back(new G4PiData(cu_m_t, cu_m_in, e4, 47));
thePipData.push_back(new G4PiData(cu_m_t, cu_p_in, e4, 47));
thePimData.push_back(new G4PiData(mo_m_t, mo_m_in, e4, 47));
thePipData.push_back(new G4PiData(mo_m_t, mo_p_in, e4, 47));
// Cd, Sn, W
thePimData.push_back(new G4PiData(cd_m_t, cd_m_in, e5, 48));
thePipData.push_back(new G4PiData(cd_m_t, cd_p_in, e5, 48));
thePimData.push_back(new G4PiData(sn_m_t, sn_m_in, e5, 48));
thePipData.push_back(new G4PiData(sn_m_t, sn_p_in, e5, 48));
thePimData.push_back(new G4PiData(w_m_t, w_m_in, e5, 48));
thePipData.push_back(new G4PiData(w_m_t, w_p_in, e5, 48));
// Pb, U
thePimData.push_back(new G4PiData(pb_m_t, pb_m_in, e6, 46));
thePipData.push_back(new G4PiData(pb_m_t, pb_p_in, e6, 46));
thePimData.push_back(new G4PiData(u_m_t, u_m_in, e6, 46));
thePipData.push_back(new G4PiData(u_m_t, u_p_in, e6, 46));
theZ.push_back(2); // He
theZ.push_back(4); // Be
theZ.push_back(6); // C
theZ.push_back(7); // N
theZ.push_back(8); // O
theZ.push_back(11); // Na
theZ.push_back(13); // Al
theZ.push_back(14); // Si
theZ.push_back(20); // Ca
theZ.push_back(26); // Fe
theZ.push_back(29); // Cu
theZ.push_back(42); // Mo
theZ.push_back(48); // Cd
theZ.push_back(50); // Sn
theZ.push_back(74); // W
theZ.push_back(82); // Pb
theZ.push_back(92); // U
}
///////////////////////////////////////////////////////////////////////////////////
//
//
G4NucleonNuclearCrossSection::~G4NucleonNuclearCrossSection()
{
std::for_each(thePimData.begin(), thePimData.end(), G4PiData::Delete());
std::for_each(thePipData.begin(), thePipData.end(), G4PiData::Delete());
}
////////////////////////////////////////////////////////////////////////////
//
//
G4double G4NucleonNuclearCrossSection::
GetCrossSection( const G4DynamicParticle* aParticle,
const G4Element* anElement,
G4double )
{
return GetIsoZACrossSection(aParticle, anElement->GetZ(), anElement->GetN(), 0.);
}
////////////////////////////////////////////////////////////////////////////
//
//
G4bool G4NucleonNuclearCrossSection::IsApplicable(const G4DynamicParticle* aParticle,
const G4Element* anElement)
{
return IsZAApplicable(aParticle, anElement->GetZ(), anElement->GetN());
}
////////////////////////////////////////////////////////////////////////////
//
//
G4bool G4NucleonNuclearCrossSection::IsZAApplicable(const G4DynamicParticle* aParticle,
G4double Z, G4double)
{
G4bool result = false;
if(aParticle->GetDefinition() == theNeutron ) result = true;
if(aParticle->GetDefinition() == theProton) result = true;
if(Z < 1.5) result = false;
if(aParticle->GetKineticEnergy() > 999.9*GeV) result = false;
return result;
}
////////////////////////////////////////////////////////////////////////////
//
//
G4double G4NucleonNuclearCrossSection::
GetIsoZACrossSection( const G4DynamicParticle* aParticle,
G4double zElement, G4double, G4double )
{
G4double kineticEnergy = aParticle->GetKineticEnergy();
G4double result = 0;
G4int Z = G4int(zElement + 0.5);
// G4cout<<"Z = "<<Z<<G4endl;
size_t it = 0;
while( it < theZ.size() && Z > theZ[it] ) it++;
// if( Z == 29 ) tuning=.96;
if( Z > theZ[it] ) Z = theZ[it];
G4int Z1, Z2;
G4double x1, x2, xt1, xt2;
if(aParticle->GetDefinition() == theNeutron )
{
if( theZ[it] == Z )
{
result = thePimData[it]->ReactionXSection(kineticEnergy);
fTotalXsc = thePimData[it]->TotalXSection(kineticEnergy);
}
else
{
x1 = thePimData[it-1]->ReactionXSection(kineticEnergy);
xt1 = thePimData[it-1]->TotalXSection(kineticEnergy);
Z1 = theZ[it-1];
x2 = thePimData[it]->ReactionXSection(kineticEnergy);
xt2 = thePimData[it]->TotalXSection(kineticEnergy);
Z2 = theZ[it];
result = Interpolate(Z1, Z2, Z, x1, x2);
fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
}
}
else if(aParticle->GetDefinition() == theProton)
{
if( theZ[it] == Z )
{
// at high energies, when no data for proton, use neutron
std::vector<G4PiData *> * theData = &thePimData;
if( thePipData[it]->AppliesTo(kineticEnergy) )
{
theData = &thePipData;
}
result = theData->operator[](it)->ReactionXSection(kineticEnergy);
fTotalXsc = theData->operator[](it)->TotalXSection(kineticEnergy);
}
else
{
std::vector<G4PiData*>* theLData = &thePimData;
if(thePipData[it-1]->AppliesTo(kineticEnergy))
{
theLData = &thePipData;
}
std::vector<G4PiData *> * theHData = &thePimData;
if( thePipData[it]->AppliesTo(kineticEnergy) )
{
theHData = &thePipData;
}
x1 = theLData->operator[](it-1)->ReactionXSection(kineticEnergy);
xt1 = theLData->operator[](it-1)->TotalXSection(kineticEnergy);
Z1 = theZ[it-1];
x2 = theHData->operator[](it)->ReactionXSection(kineticEnergy);
xt2 = theHData->operator[](it)->TotalXSection(kineticEnergy);
Z2 = theZ[it];
result = Interpolate(Z1, Z2, Z, x1, x2);
fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
}
}
fElasticXsc = fTotalXsc - result;
if( fElasticXsc < 0.) fElasticXsc = 0.;
return result;
}
/////////////////////////////////////////////////////////////////////////////
//
//
G4double G4NucleonNuclearCrossSection::
Interpolate(G4int Z1, G4int Z2, G4int Z, G4double x1, G4double x2)
{
// Nucleon numbers obtained from G4NistManager G4 8.0
static G4double alpha = 2./3.;
static const G4double A[92] =
{
1.0001, 4.0000, 6.9241, 9.0000, 10.801, 12.011, 14.004, 16.004, 19.000, 20.188,
23.000, 24.320, 27.000, 28.109, 31.000, 32.094, 35.484, 39.985, 39.135, 40.116,
45.000, 47.918, 50.998, 52.055, 55.000, 55.910, 59.000, 58.760, 63.617, 65.468,
69.798, 72.691, 75.000, 79.042, 79.986, 83.887, 85.557, 87.710, 89.000, 91.318,
93.000, 96.025, 98.000, 101.16, 103.00, 106.51, 107.96, 112.51, 114.91, 118.81,
121.86, 127.70, 127.00, 131.39, 133.00, 137.42, 139.00, 140.21, 141.00, 144.32,
145.00, 150.45, 152.04, 157.33, 159.00, 162.57, 165.00, 167.32, 169.00, 173.10,
175.03, 178.54, 181.00, 183.89, 186.25, 190.27, 192.25, 195.11, 197.00, 200.63,
204.41, 207.24, 209.00, 209.00, 210.00, 222.00, 223.00, 226.00, 227.00, 232.00,
231.00, 237.98
};
static G4bool NeedInit = true;
static G4double A75[92];
if ( NeedInit )
{
for (G4int i=0; i<92; ++i)
{
A75[i] = std::pow(A[i], alpha); // interpolate by square ~ A^(2/3)
}
NeedInit=false;
}
// for tabulated data, cross section scales with A^(2/3)
G4double r1 = x1 / A75[Z1-1] * A75[Z-1];
G4double r2 = x2 / A75[Z2-1] * A75[Z-1];
G4double result = 0.5*(r1+r2);
// More precise average
if(Z1 != Z2) {
G4double alp1 = G4double(Z - Z1);
G4double alp2 = G4double(Z2 - Z);
result = (r1*alp2 + r2*alp1)/(alp1 + alp2);
}
// G4cout << "x1/2, z1/2 z" <<x1<<" "<<x2<<" "<<Z1<<" "<<Z2<<" "<<Z<<G4endl;
// G4cout << "res1/2 " << r1 <<" " << r2 <<" " << result<< G4endl;
return result;
}
File diff suppressed because it is too large Load Diff
@@ -23,18 +23,21 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// GEANT4 tag $Name: geant4-08-02 $
// GEANT4 tag $Name: geant4-08-03 $
//
// --------------------------------------------------------------------
// by J.P Wellisch, Sun Sep 15 2002.
#include "G4PiData.hh"
G4PiData::
G4PiData(const G4double * aT, const G4double * aIn, const G4double * anE, G4int nP)
///////////////////////////////////////////////////////////////////////
G4PiData::G4PiData(const G4double * aT, const G4double * aIn,
const G4double * anE, G4int nP)
{
G4int i=0;
for(i=0; i<nP; i++)
for( i = 0; i < nP; i++ )
{
std::pair<G4double, G4double> x;
x.first=aT[i]*millibarn;
@@ -46,16 +49,18 @@ G4PiData(const G4double * aT, const G4double * aIn, const G4double * anE, G4int
}
}
G4bool G4PiData::
AppliesTo(G4double kineticEnergy)
////////////////////////////////////////////////////////////////////////
G4bool G4PiData::AppliesTo(G4double kineticEnergy)
{
G4bool result = true;
if(kineticEnergy>back().first) result = false;
return result;
}
G4double G4PiData::
ReactionXSection(G4double kineticEnergy)
//////////////////////////////////////////////////////////////////////////
G4double G4PiData::ReactionXSection(G4double kineticEnergy)
{
G4double result = 0;
G4PiData::iterator it=begin();
@@ -75,8 +80,9 @@ ReactionXSection(G4double kineticEnergy)
return result;
}
G4double G4PiData::
ElasticXSection(G4double kineticEnergy)
////////////////////////////////////////////////////////////////////////////
G4double G4PiData::ElasticXSection(G4double kineticEnergy)
{
G4double result = 0;
G4PiData::iterator it=begin();
@@ -95,3 +101,25 @@ ElasticXSection(G4double kineticEnergy)
result = std::max(0., x1 + (kineticEnergy-e1)*(x2-x1)/(e2-e1));
return result;
}
////////////////////////////////////////////////////////////////////////////
G4double G4PiData::TotalXSection(G4double kineticEnergy)
{
G4double result = 0;
G4PiData::iterator it=begin();
while(it!=end()&&kineticEnergy>(*it).first) {it++;}
if(it==end())
{
G4Exception("G4PiData", "007", FatalException,
"ElasticXSection used outside validity range");
}
if(it==begin()) it++;
G4double x1,x2,e1,e2;
e1=(*(it-1)).first;
x1=(*(it-1)).second.first;
e2=(*(it)).first;
x2=(*(it)).second.first;
result = std::max(0., x1 + (kineticEnergy-e1)*(x2-x1)/(e2-e1));
return result;
}
@@ -29,88 +29,257 @@
#include "G4ping.hh"
// by J.P Wellisch, Sun Sep 15 2002.
// corrected G.Folger 17-8-2006: inel. Ca pim was missing two number, + formatting
// updated G.Folger 21-8-2006: Change scaling of cross section for elements not tabulated from scaling in Z^(2/3) to A^0.75
// corrected G.Folger 17-8-2006: inel. Ca pim was missing two number,
// + formatting
//
// updated G.Folger 21-8-2006: Change scaling of cross section for
// elements not tabulated from scaling in Z^(2/3) to A^0.75
// Implements P2-90-158;
//
// 22 Dec 2006 - D.H. Wright added isotope dependence
//
const G4double G4PiNuclearCrossSection::e1[38] = {
.02, .04, .06, .08, .1, .12, .13, .14, .15, .16, .17, .18, .19, .20,
.22, .24, .26, .28, .30, .35, .40, .45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9,
1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::e1[38] = {.02, .04, .06, .08, .1, .12, .13, .14, .15, .16, .17, .18, .19, .20, .22, .24, .26, .28, .30, .35, .40, .45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::he_t[38] = { 40, 70, 108, 152, 208, 276, 300, 320, 329, 333, 332, 328, 322, 310, 288, 260, 240, 216, 196, 144, 125, 112,108.5, 109, 110.5, 117, 123,128.5, 135, 110, 96, 87, 85, 83.5, 83.5, 83.5, 83.5, 83.5};
const G4double G4PiNuclearCrossSection::he_in[38] = { 18, 38, 62, 98, 136, 176, 190, 200, 209, 212, 212, 208, 204, 196, 176, 164, 150, 134, 124,97.5, 90, 85, 82.5, 83.5, 86.5, 93, 97.5, 100, 102, 83, 77, 75, 74, 72.5, 72.5, 72.5, 72.5, 72.5};
const G4double G4PiNuclearCrossSection::be_m_t[38] = {150, 210, 294, 396, 520, 600, 623, 635, 642, 640, 630, 615, 600, 576, 540, 504, 470, 435, 400, 340, 294, 258, 236, 230, 233, 244, 257, 270, 276, 250, 230, 215, 205, 194, 188, 186, 186, 186};
const G4double G4PiNuclearCrossSection::be_m_in[38] ={ 90, 126, 177, 240, 320, 380, 400, 410, 414, 410, 400, 387, 371, 360, 333, 312, 285, 260, 237, 216, 198, 187, 182, 180, 182, 187, 193, 203, 207, 179, 172, 165, 159, 155, 144, 144, 144, 144};
const G4double G4PiNuclearCrossSection::be_p_t[24] = { 96, 150, 222, 320, 430, 514, 545, 565, 574, 574, 564, 552, 535, 522, 490, 462, 432, 398, 367, 314, 276, 248, 232, 230};
const G4double G4PiNuclearCrossSection::be_p_in[24] ={ 60, 95, 142, 194, 262, 319, 345, 361, 364, 364, 354, 350, 330, 319, 298, 280, 258, 237, 216, 200, 189, 183, 182, 180};
const G4double G4PiNuclearCrossSection::he_t[38] = {
40, 70, 108, 152, 208, 276, 300, 320, 329, 333, 332, 328, 322, 310, 288,
260, 240, 216, 196, 144, 125, 112,108.5, 109, 110.5, 117, 123,128.5, 135,
110, 96, 87, 85, 83.5, 83.5, 83.5, 83.5, 83.5};
const G4double G4PiNuclearCrossSection::e2[39] = {.02, .04, .06, .08, 0.1, .11, .12, .13, .14, .15, .16, .17, .18, 0.2, .22, .24, .26, .28, 0.3, .35, 0.4, .45, 0.5, .55, .575, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::c_m_t[39] = {204, 260, 366, 517, 630, 673, 694, 704, 710, 711, 706, 694, 676, 648, 616, 584, 548, 518, 489, 426, 376, 342, 323, 310, 312, 313, 319, 333, 342, 348, 310, 290, 268, 250, 245, 237, 234, 234, 234};
const G4double G4PiNuclearCrossSection::c_m_in[39] ={128, 160, 224, 315, 388, 416, 430, 438, 444, 445, 440, 432, 416, 400, 380, 354, 320, 304, 288, 264, 246, 240, 233, 232, 233, 234, 238, 246, 252, 256, 220, 210, 198, 187, 183, 176, 174, 174, 174};
const G4double G4PiNuclearCrossSection::c_p_t[24] = {140, 192, 294, 428, 594, 642, 662, 687, 685, 688, 684, 672, 656, 630, 598, 567, 533, 504, 474, 416, 369, 336, 319, 310};
const G4double G4PiNuclearCrossSection::c_p_in[24] ={ 94, 132, 184, 260, 370, 398, 408, 420, 426, 428, 424, 416, 400, 386, 366, 340, 308, 294, 280, 257, 241, 236, 231, 232};
const G4double G4PiNuclearCrossSection::n_m_t[39] = {246, 308, 424, 590, 729, 776, 800, 821, 822, 817, 800, 778, 768, 728, 690, 654, 615, 584, 556, 480, 430, 393, 373, 367, 368, 370, 375, 388, 390, 397, 364, 337, 310, 291, 275, 268, 268, 268, 268};
const G4double G4PiNuclearCrossSection::n_m_in[39] ={155, 188, 256, 360, 456, 492, 512, 526, 526, 520, 504, 491, 475, 450, 425, 396, 376, 360, 340, 300, 282, 270, 265, 265, 266, 268, 273, 280, 288, 288, 256, 237, 226, 218, 208, 202, 202, 202, 202};
const G4double G4PiNuclearCrossSection::n_p_t[27] = {150, 212, 328, 500, 680, 735, 762, 781, 782, 779, 770, 748, 740, 706, 672, 633, 600, 569, 541, 467, 419, 385, 368, 364, 366, 368, 375};
const G4double G4PiNuclearCrossSection::n_p_in[27] ={ 90, 140, 208, 300, 426, 467, 490, 504, 504, 500, 484, 474, 460, 437, 413, 381, 365, 350, 330, 292, 276, 267, 263, 264, 265, 267, 273};
const G4double G4PiNuclearCrossSection::he_in[38] = {
18, 38, 62, 98, 136, 176, 190, 200, 209, 212, 212, 208, 204, 196,
176, 164, 150, 134, 124,97.5, 90, 85, 82.5, 83.5, 86.5, 93, 97.5, 100,
102, 83, 77, 75, 74, 72.5, 72.5, 72.5, 72.5, 72.5};
const G4double G4PiNuclearCrossSection::e3[31] = {.02, .04, .06, .08, 0.1, .12, .14, .16, 0.18, 0.2, .22, .25, 0.3, .35, 0.4, .45, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::o_m_t[31] = {280, 360, 500, 685, 812, 861, 870, 865, 835, 800, 755, 700, 600, 537, 493, 468, 441, 436, 443, 449, 460, 463, 432, 385, 350, 325, 312, 307, 303, 303, 303};
const G4double G4PiNuclearCrossSection::o_m_in[31] = {190, 207, 300, 420, 500, 540, 550, 542, 520, 490, 460, 423, 360, 339, 321, 314, 312, 314, 319, 324, 328, 330, 300, 275, 250, 240, 229, 225, 222, 222, 222};
const G4double G4PiNuclearCrossSection::o_p_t[20] = {170, 240, 390, 570, 740, 818, 830, 822, 800, 765, 725, 675, 585, 525, 483, 458, 444, 447, 453, 449};
const G4double G4PiNuclearCrossSection::o_p_in[20] = {100, 145, 240, 340, 470, 518, 530, 522, 505, 477, 448, 412, 350, 330, 316, 310, 308, 311, 317, 324};
const G4double G4PiNuclearCrossSection::na_m_t[31] = {450, 545, 705, 910, 1020, 1075, 1087, 1080, 1042, 987, 943, 885, 790, 700, 650, 610, 585, 575, 585, 595, 600, 610, 556, 524, 494, 458, 445, 429, 427, 427, 427};
const G4double G4PiNuclearCrossSection::na_m_in[31] ={275, 315, 413, 545, 620, 660, 670, 662, 630, 593, 570, 520, 465, 420, 410, 395, 390, 400, 410, 418, 420, 422, 372, 348, 330, 320, 310, 294, 292, 292, 292};
const G4double G4PiNuclearCrossSection::na_p_t[22] = {210, 320, 530, 795, 960, 1035, 1050, 1040, 1007, 957, 918, 865, 773, 685, 636, 598, 575, 565, 578, 590, 598, 610};
const G4double G4PiNuclearCrossSection::na_p_in[22] ={115, 210, 340, 495, 585, 630, 645, 637, 605, 572, 550, 505, 455, 410, 401, 388, 383, 393, 405, 414, 418, 422};
const G4double G4PiNuclearCrossSection::be_m_t[38] = {
150, 210, 294, 396, 520, 600, 623, 635, 642, 640, 630, 615, 600, 576, 540,
504, 470, 435, 400, 340, 294, 258, 236, 230, 233, 244, 257, 270, 276, 250,
230, 215, 205, 194, 188, 186, 186, 186};
const G4double G4PiNuclearCrossSection::e3_1[31] = { 0.02, .04, .06, .08, .1, .12, .14, .16, .18, .2, .22, .25, .3, .35, .4, .45, .5, .6, .7, .8, .9, 1., 2., 3., 5., 10., 20., 50., 100.,500.,1000.};
const G4double G4PiNuclearCrossSection::al_m_t[31] = { 532, 637, 832, 1057, 1207, 1230, 1210, 1174, 1133, 1095, 1038, 970, 890, 807, 750, 710, 675, 665, 670, 673, 678, 682, 618, 574, 546, 520, 507, 495, 488, 488, 488};
const G4double G4PiNuclearCrossSection::al_m_in[31] = {300, 360, 495, 665, 750, 765, 750, 730, 700, 660, 615, 570, 520, 490, 470, 450, 448, 450, 450, 452, 456, 460, 408, 392, 376, 356, 347, 338, 332, 332, 332};
const G4double G4PiNuclearCrossSection::al_p_t[21] = { 225, 350, 616, 945, 1122, 1175, 1157, 1128, 1088, 1045, 988, 935, 870, 787, 730, 690, 660, 652, 660, 668, 678};
const G4double G4PiNuclearCrossSection::al_p_in[21] = {120, 238, 390, 610, 712, 735, 720, 703, 655, 635, 590, 550, 505, 475, 455, 438, 440, 445, 445, 450, 456};
const G4double G4PiNuclearCrossSection::ca_m_t[31] = { 800, 980, 1240, 1460, 1570, 1600, 1580, 1535, 1475, 1425, 1375, 1295, 1200, 1083, 1000, 948, 915, 895, 900, 908, 915, 922, 856, 795, 740, 705, 682, 660, 660, 660, 660};
const G4double G4PiNuclearCrossSection::ca_m_in[31] = {470, 550, 620, 860, 955, 980, 960, 920, 860, 820, 780, 740, 665, 637, 615, 600, 590, 590, 600, 608, 610, 615, 550, 525, 510, 488, 470, 450, 450, 450, 450};
const G4double G4PiNuclearCrossSection::ca_p_t[23] = { 275, 445, 790, 1195, 1440, 1485, 1475, 1435, 1385, 1335, 1295, 1245, 1160, 1050, 970, 923, 895, 877, 887, 897, 904, 913, 855};
const G4double G4PiNuclearCrossSection::ca_p_in[23] = {160, 315, 500, 745, 870, 905, 900, 860, 810, 770, 740, 710, 640, 617, 595, 585, 575, 575, 590, 600, 602, 608, 510}; // last number is 500 in org, changed to make things smooth.
const G4double G4PiNuclearCrossSection::be_m_in[38] = {
90, 126, 177, 240, 320, 380, 400, 410, 414, 410, 400, 387, 371, 360, 333,
312, 285, 260, 237, 216, 198, 187, 182, 180, 182, 187, 193, 203, 207, 179,
172, 165, 159, 155, 144, 144, 144, 144};
const G4double G4PiNuclearCrossSection::e4[32] = {0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::fe_m_t[32] = {1175, 1363, 1670, 1950, 2050, 2040, 1975, 1886, 1834, 1773, 1720, 1635, 1474, 1380, 1269, 1225, 1182, 1162, 1159, 1162, 1178, 1190, 1197, 1102, 1135, 975, 945, 925, 905, 905, 905, 905};
const G4double G4PiNuclearCrossSection::fe_m_in[32] = {625, 725, 910, 1180, 1275, 1250, 1200, 1150, 1100, 1040, 995, 925, 825, 810, 780, 760, 745, 740, 740, 740, 750, 760, 765, 690, 660, 635, 615, 600, 585, 585, 585, 585};
const G4double G4PiNuclearCrossSection::fe_p_t[25] = {330, 575, 1010, 1500, 1837, 1875, 1820, 1751, 1691, 1636, 1690, 1450, 1396, 1305, 1219, 1190, 1148, 1138, 1134, 1144, 1163, 1175, 1183, 1198, 1135};
const G4double G4PiNuclearCrossSection::fe_p_in[25] = {210, 410, 707, 1010, 1125, 1150, 1100, 1070, 1010, 960, 920, 776, 780, 760, 750, 740, 720, 725, 725, 730, 740, 750, 755, 690, 660};
const G4double G4PiNuclearCrossSection::cu_m_t[32] = {1400, 1600, 1875, 2088, 2200, 2220, 2175, 2125, 2075, 2012, 1950, 1855, 1670, 1530, 1430, 1370, 1315, 1315, 1315, 1330, 1345, 1360, 1365, 1250, 1185, 1128, 1070, 1035, 1010, 1010, 1010, 1010};
const G4double G4PiNuclearCrossSection::cu_m_in[32] = {725, 840, 1020, 1200, 1295, 1300, 1267, 1240, 1213, 1175, 1125, 1042, 950, 900, 860, 840, 830, 832, 835, 840, 850, 860, 865, 785, 735, 705, 680, 650, 630, 630, 630, 630};
const G4double G4PiNuclearCrossSection::cu_p_t[25] = {355, 605, 1120, 1630, 1940, 2010, 2010, 1980, 1925, 1895, 1830, 1730, 1585, 1490, 1400, 1340, 1290, 1290, 1290, 1310, 1330, 1345, 1350, 1240, 1185};
const G4double G4PiNuclearCrossSection::cu_p_in[25] = {230, 425, 780, 1025, 1155, 1190, 1190, 1180, 1125, 1100, 1050, 1000, 900, 870, 835, 815, 810, 812, 815, 825, 840, 850, 855, 780, 735};
const G4double G4PiNuclearCrossSection::be_p_t[24] = {
96, 150, 222, 320, 430, 514, 545, 565, 574, 574, 564, 552, 535, 522, 490,
462, 432, 398, 367, 314, 276, 248, 232, 230};
const G4double G4PiNuclearCrossSection::e5[34] = {0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::mo_m_t[34] = {2430, 2610, 2710, 2790, 2880, 2940, 2965, 2970, 2970, 2920, 2840, 2720, 2570, 2500, 2365, 2200, 2050, 1926, 1825, 1768, 1749, 1750, 1778, 1789, 1808, 1690, 1645, 1530, 1492, 1450, 1425, 1425, 1425, 1425};
const G4double G4PiNuclearCrossSection::mo_m_in[34] = {925, 1125, 1250, 1375, 1500, 1600, 1680, 1750, 1770, 1730, 1660, 1580, 1500, 1450, 1330, 1250, 1190, 1140, 1100, 1075, 1075, 1070, 1088, 1095, 1110, 1035, 1005, 940, 917, 880, 860, 860, 860, 860};
const G4double G4PiNuclearCrossSection::mo_p_t[27] = {410, 730, 1110, 1530, 1920, 2200, 2385, 2520, 2600, 2630, 2575, 2470, 2320, 2285, 2185, 2053, 1945, 1852, 1776, 1719, 1710, 1716, 1746, 1759, 1778, 1675, 1645};
const G4double G4PiNuclearCrossSection::mo_p_in[27] = {270, 540, 825, 975, 1140, 1285, 1400, 1480, 1555, 1580, 1525, 1470, 1360, 1340, 1255, 1160, 1120, 1085, 1060, 1045, 1045, 1045, 1065, 1075, 1090, 1025, 1005};
const G4double G4PiNuclearCrossSection::cd_m_t[34] = {3060, 3125, 3170, 3220, 3255, 3280, 3290, 3260, 3270, 3200, 3120, 3080, 3090, 2920, 2810, 2640, 2362, 2230, 2115, 2050, 2020, 2025, 2040, 2070, 2100, 1900, 1795, 1740, 1675, 1645, 1625, 1620, 1620, 1620};
const G4double G4PiNuclearCrossSection::cd_m_in[34]= {1025, 1275, 1440, 1625, 1740, 1800, 1880, 1920, 1980, 1920, 1850, 1810, 1720, 1650, 1560, 1450, 1330, 1290, 1245, 1210, 1200, 1200, 1205, 1205, 1230, 1130, 1085, 1060, 1000, 985, 975, 970, 970, 970};
const G4double G4PiNuclearCrossSection::cd_p_t[28] = {455, 780, 1170, 1700, 2120, 2400, 2600, 2720, 2820, 2840, 2800, 2760, 2720, 2640, 2560, 2450, 2252, 2130, 2035, 1985, 1970, 1975, 2005, 2035, 2070, 1880, 1795, 1740};
const G4double G4PiNuclearCrossSection::cd_p_in[28] = {310, 580, 880, 1060, 1270, 1400, 1530, 1610, 1660, 1680, 1640, 1600, 1560, 1500, 1430, 1330, 1280, 1230, 1200, 1180, 1170, 1175, 1180, 1180, 1210, 1120, 1085, 1060};
const G4double G4PiNuclearCrossSection::be_p_in[24] = {
60, 95, 142, 194, 262, 319, 345, 361, 364, 364, 354, 350, 330, 319, 298,
280, 258, 237, 216, 200, 189, 183, 182, 180};
const G4double G4PiNuclearCrossSection::e6[35] = {0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::sn_m_t[35] = {3000, 3180, 3250, 3300, 3300, 3410, 3470, 3450, 3410, 3350, 3280, 3200, 3120, 3050, 2900, 2630, 2500, 2325, 2190, 2100, 2060, 2055, 2055, 2055, 2067, 2085, 2000, 1900, 1835, 1770, 1720, 1700, 1695, 1695, 1695};
const G4double G4PiNuclearCrossSection::sn_m_in[35] = {1050, 1350, 1520, 1650, 1800, 1980, 2070, 2120, 2090, 2050, 1980, 1920, 1830, 1770, 1670, 1500, 1435, 1350, 1300, 1230, 1220, 1235, 1235, 1235, 1237, 1240, 1160, 1120, 1090, 1065, 1040, 1020, 1015, 1015, 1015};
const G4double G4PiNuclearCrossSection::sn_p_t[29] = { 465, 800, 1200, 1760, 2170, 2480, 2730, 2885, 2970, 2980, 2970, 2890, 2840, 2790, 2620, 2450, 2335, 2205, 2080, 2020, 2010, 1990, 1990, 2015, 2030, 2045, 1980, 1890, 1835};
const G4double G4PiNuclearCrossSection::sn_p_in[29] = { 315, 590, 880, 1220, 1460, 1580, 1700, 1770, 1810, 1810, 1800, 1730, 1680, 1630, 1530, 1400, 1335, 1270, 1210, 1180, 1190, 1190, 1190, 1205, 1210, 1210, 1150, 1115, 1090};
const G4double G4PiNuclearCrossSection::w_m_t[35] = {5200, 5115, 5025, 4975, 4900, 4850, 4780, 4725, 4600, 4490, 4355, 4255, 4125, 4040, 3830, 3580, 3330, 3110, 2955, 2860, 2852, 2845, 2885, 2900, 2915, 2940, 2800, 2660, 2570, 2490, 2460, 2425, 2420, 2420, 2420};
const G4double G4PiNuclearCrossSection::w_m_in[35] = {1450, 1850, 2100, 2350, 2550, 2700, 2825, 2900, 2850, 2750, 2630, 2525, 2400, 2300, 2200, 2070, 1880, 1770, 1715, 1680, 1680, 1680, 1685, 1690, 1700, 1720, 1635, 1560, 1530, 1460, 1440, 1410, 1410, 1410, 1410};
const G4double G4PiNuclearCrossSection::w_p_t[30] = { 480, 900, 1500, 2350, 3020, 3420, 3650, 3775, 3875, 3830, 3750, 3700, 3630, 3550, 3550, 3290, 3070, 2890, 2840, 2730, 2725, 2720, 2770, 2805, 2828, 2865, 2770, 2640, 2570, 2490};
const G4double G4PiNuclearCrossSection::w_p_in[30] = { 325, 680, 990, 1500, 1850, 2150, 2250, 2300, 2350, 2330, 2280, 2230, 2200, 2120, 2130, 1900, 1780, 1670, 1635, 1600, 1602, 1605, 1610, 1615, 1630, 1660, 1620, 1550, 1530, 1460};
const G4double G4PiNuclearCrossSection::e2[39] = {
.02, .04, .06, .08, .10, .11, .12, .13, .14, .15, .16, .17, .18, .20, .22,
.24, .26, .28, .30, .35, .40, .45, .50, .55, .575, .60, .70, .80, .90, 1,
2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::e7[35] = {0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 5, 10, 20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::pb_m_t[35] = {5890, 5700, 5610, 5580, 5550, 5480, 5400, 5300, 5100, 4930, 4750, 4600, 4400, 4280, 4170, 3915, 3650, 3470, 3260, 3150, 3120, 3070, 3085, 3100, 3120, 3160, 3070, 2930, 2820, 2750, 2710, 2655, 2640, 2640, 2640};
const G4double G4PiNuclearCrossSection::pb_m_in[35] = {1575, 2025, 2300, 2575, 2850, 3000, 3115, 3180, 3080, 2940, 2800, 2670, 2550, 2450, 2370, 2220, 2110, 2000, 1920, 1880, 1850, 1800, 1805, 1810, 1820, 1840, 1800, 1720, 1640, 1620, 1570, 1530, 1530, 1530, 1530};
const G4double G4PiNuclearCrossSection::pb_p_t[30] = { 515, 940, 1500, 2400, 3270, 3750, 4050, 4140, 4260, 4200, 4080, 3990, 3990, 3810, 3730, 3520, 3370, 3186, 3110, 3010, 2990, 2985, 3005, 3020, 3040, 3080, 3020, 2905, 2790, 2750};
const G4double G4PiNuclearCrossSection::pb_p_in[30] = { 348, 707, 1040, 1650, 2100, 2400, 2580, 2640, 2650, 2520, 2410, 2300, 2250, 2190, 2130, 2000, 1930, 1870, 1830, 1790, 1770, 1765, 1775, 1780, 1790, 1800, 1775, 1710, 1620, 1620};
const G4double G4PiNuclearCrossSection::u_m_t[35] = {7080, 6830, 6650, 6530, 6400, 6280, 6100, 5840, 5660, 5520, 5330, 5160, 4990, 4810, 4630, 4323, 4130, 3870, 3700, 3550, 3490, 3465, 3467, 3475, 3495, 3515, 3440, 3360, 3150, 3040, 2985, 2955, 2940, 2940, 2940};
const G4double G4PiNuclearCrossSection::u_m_in[35] = {1740, 2220, 2500, 2820, 3080, 3300, 3420, 3500, 3420, 3330, 3200, 3060, 2940, 2850, 2710, 2470, 2380, 2250, 2160, 2080, 2040, 2045, 2047, 2050, 2055, 2060, 2010, 1980, 1830, 1780, 1735, 1710, 1700, 1700, 1700};
const G4double G4PiNuclearCrossSection::u_p_t[30] = { 485, 960, 1580, 2700, 3550, 4050, 4320, 4420, 4620, 4660, 4580, 4470, 4350, 4295, 4187, 3938, 3755, 3573, 3450, 3342, 3310, 3295, 3310, 3330, 3375, 3405, 3350, 3338, 3135, 3040};
const G4double G4PiNuclearCrossSection::u_p_in[30] = { 334, 720, 1020, 1560, 2100, 2300, 2550, 2700, 2880, 2880, 2760, 2660, 2550, 2510, 2430, 2270, 2130, 2060, 2000, 1970, 1950, 1950, 1960, 1960, 1970, 1980, 1950, 1978, 1830, 1780};
const G4double G4PiNuclearCrossSection::c_m_t[39] = {
204, 260, 366, 517, 630, 673, 694, 704, 710, 711, 706, 694, 676, 648, 616,
584, 548, 518, 489, 426, 376, 342, 323, 310, 312, 313, 319, 333, 342, 348,
310, 290, 268, 250, 245, 237, 234, 234, 234};
const G4double G4PiNuclearCrossSection::c_m_in[39] = {
128, 160, 224, 315, 388, 416, 430, 438, 444, 445, 440, 432, 416, 400, 380,
354, 320, 304, 288, 264, 246, 240, 233, 232, 233, 234, 238, 246, 252, 256,
220, 210, 198, 187, 183, 176, 174, 174, 174};
const G4double G4PiNuclearCrossSection::c_p_t[24] = {
140, 192, 294, 428, 594, 642, 662, 687, 685, 688, 684, 672, 656, 630, 598,
567, 533, 504, 474, 416, 369, 336, 319, 310};
const G4double G4PiNuclearCrossSection::c_p_in[24] = {
94, 132, 184, 260, 370, 398, 408, 420, 426, 428, 424, 416, 400, 386, 366,
340, 308, 294, 280, 257, 241, 236, 231, 232};
const G4double G4PiNuclearCrossSection::n_m_t[39] = {
246, 308, 424, 590, 729, 776, 800, 821, 822, 817, 800, 778, 768, 728, 690,
654, 615, 584, 556, 480, 430, 393, 373, 367, 368, 370, 375, 388, 390, 397,
364, 337, 310, 291, 275, 268, 268, 268, 268};
const G4double G4PiNuclearCrossSection::n_m_in[39] = {
155, 188, 256, 360, 456, 492, 512, 526, 526, 520, 504, 491, 475, 450, 425,
396, 376, 360, 340, 300, 282, 270, 265, 265, 266, 268, 273, 280, 288, 288,
256, 237, 226, 218, 208, 202, 202, 202, 202};
const G4double G4PiNuclearCrossSection::n_p_t[27] = {
150, 212, 328, 500, 680, 735, 762, 781, 782, 779, 770, 748, 740, 706, 672,
633, 600, 569, 541, 467, 419, 385, 368, 364, 366, 368, 375};
const G4double G4PiNuclearCrossSection::n_p_in[27] = {
90, 140, 208, 300, 426, 467, 490, 504, 504, 500, 484, 474, 460, 437, 413,
381, 365, 350, 330, 292, 276, 267, 263, 264, 265, 267, 273};
const G4double G4PiNuclearCrossSection::e3[31] = {
.02, .04, .06, .08, .10, .12, .14, .16, .18, .20, .22, .25, .30, .35, .40,
.45, .50, .60, .70, .80, .90, 1, 2, 3, 5, 10, 20, 50, 100, 500,
1000};
const G4double G4PiNuclearCrossSection::o_m_t[31] = {
280, 360, 500, 685, 812, 861, 870, 865, 835, 800, 755, 700, 600, 537, 493,
468, 441, 436, 443, 449, 460, 463, 432, 385, 350, 325, 312, 307, 303, 303,
303};
const G4double G4PiNuclearCrossSection::o_m_in[31] = {
190, 207, 300, 420, 500, 540, 550, 542, 520, 490, 460, 423, 360, 339, 321,
314, 312, 314, 319, 324, 328, 330, 300, 275, 250, 240, 229, 225, 222, 222,
222};
const G4double G4PiNuclearCrossSection::o_p_t[20] = {
170, 240, 390, 570, 740, 818, 830, 822, 800, 765, 725, 675, 585, 525, 483,
458, 444, 447, 453, 449};
const G4double G4PiNuclearCrossSection::o_p_in[20] = {
100, 145, 240, 340, 470, 518, 530, 522, 505, 477, 448, 412, 350, 330, 316,
310, 308, 311, 317, 324};
const G4double G4PiNuclearCrossSection::na_m_t[31] = {
450, 545, 705, 910, 1020, 1075, 1087, 1080, 1042, 987, 943, 885, 790, 700, 650,
610, 585, 575, 585, 595, 600, 610, 556, 524, 494, 458, 445, 429, 427, 427,
427};
const G4double G4PiNuclearCrossSection::na_m_in[31] = {
275, 315, 413, 545, 620, 660, 670, 662, 630, 593, 570, 520, 465, 420, 410,
395, 390, 400, 410, 418, 420, 422, 372, 348, 330, 320, 310, 294, 292, 292,
292};
const G4double G4PiNuclearCrossSection::na_p_t[22] = {
210, 320, 530, 795, 960, 1035, 1050, 1040, 1007, 957, 918, 865, 773, 685,
636, 598, 575, 565, 578, 590, 598, 610};
const G4double G4PiNuclearCrossSection::na_p_in[22] = {
115, 210, 340, 495, 585, 630, 645, 637, 605, 572, 550, 505, 455, 410, 401,
388, 383, 393, 405, 414, 418, 422};
const G4double G4PiNuclearCrossSection::e3_1[31] = {
0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22, 0.25, 0.30, 0.35, 0.40,
0.45, 0.50, 0.60, 0.70, 0.80, 0.90, 1, 2, 3, 5, 10, 20, 50, 100, 500,
1000};
const G4double G4PiNuclearCrossSection::al_m_t[31] = {
532, 637, 832, 1057, 1207, 1230, 1210, 1174, 1133, 1095, 1038, 970, 890, 807, 750,
710, 675, 665, 670, 673, 678, 682, 618, 574, 546, 520, 507, 495, 488, 488,
488};
const G4double G4PiNuclearCrossSection::al_m_in[31] = {
300, 360, 495, 665, 750, 765, 750, 730, 700, 660, 615, 570, 520, 490, 470,
450, 448, 450, 450, 452, 456, 460, 408, 392, 376, 356, 347, 338, 332, 332,
332};
const G4double G4PiNuclearCrossSection::al_p_t[21] = {
225, 350, 616, 945, 1122, 1175, 1157, 1128, 1088, 1045, 988, 935, 870, 787, 730,
690, 660, 652, 660, 668, 678};
const G4double G4PiNuclearCrossSection::al_p_in[21] = {
120, 238, 390, 610, 712, 735, 720, 703, 655, 635, 590, 550, 505, 475, 455,
438, 440, 445, 445, 450, 456};
const G4double G4PiNuclearCrossSection::ca_m_t[31] = {
800, 980, 1240, 1460, 1570, 1600, 1580, 1535, 1475, 1425, 1375, 1295, 1200, 1083, 1000,
948, 915, 895, 900, 908, 915, 922, 856, 795, 740, 705, 682, 660, 660, 660,
660};
const G4double G4PiNuclearCrossSection::ca_m_in[31] = {
470, 550, 620, 860, 955, 980, 960, 920, 860, 820, 780, 740, 665, 637, 615,
600, 590, 590, 600, 608, 610, 615, 550, 525, 510, 488, 470, 450, 450, 450,
450};
const G4double G4PiNuclearCrossSection::ca_p_t[23] = {
275, 445, 790, 1195, 1440, 1485, 1475, 1435, 1385, 1335, 1295, 1245, 1160, 1050, 970,
923, 895, 877, 887, 897, 904, 913, 855};
const G4double G4PiNuclearCrossSection::ca_p_in[23] = {
160, 315, 500, 745, 870, 905, 900, 860, 810, 770, 740, 710, 640, 617, 595,
585, 575, 575, 590, 600, 602, 608, 510};
// last number is 500 in org, changed to make things smooth.
const G4double G4PiNuclearCrossSection::e4[32] = {
0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22, 0.25, 0.30, 0.35, 0.40,
0.45, 0.50, 0.55, 0.60, 0.70, 0.80, 0.90, 1, 2, 3, 5, 10, 20, 50, 100,
500, 1000};
const G4double G4PiNuclearCrossSection::fe_m_t[32] = {1175, 1363, 1670, 1950, 2050, 2040, 1975, 1886, 1834, 1773, 1720, 1635, 1474, 1380, 1269, 1225, 1182, 1162, 1159, 1162, 1178, 1190, 1197, 1102, 1135, 975, 945, 925, 905, 905, 905, 905};
const G4double G4PiNuclearCrossSection::fe_m_in[32] = {625, 725, 910, 1180, 1275, 1250, 1200, 1150, 1100, 1040, 995, 925, 825, 810, 780, 760, 745, 740, 740, 740, 750, 760, 765, 690, 660, 635, 615, 600, 585, 585, 585, 585};
const G4double G4PiNuclearCrossSection::fe_p_t[25] = {330, 575, 1010, 1500, 1837, 1875, 1820, 1751, 1691, 1636, 1690, 1450, 1396, 1305, 1219, 1190, 1148, 1138, 1134, 1144, 1163, 1175, 1183, 1198, 1135};
const G4double G4PiNuclearCrossSection::fe_p_in[25] = {210, 410, 707, 1010, 1125, 1150, 1100, 1070, 1010, 960, 920, 776, 780, 760, 750, 740, 720, 725, 725, 730, 740, 750, 755, 690, 660};
const G4double G4PiNuclearCrossSection::cu_m_t[32] = {1400, 1600, 1875, 2088, 2200, 2220, 2175, 2125, 2075, 2012, 1950, 1855, 1670, 1530, 1430, 1370, 1315, 1315, 1315, 1330, 1345, 1360, 1365, 1250, 1185, 1128, 1070, 1035, 1010, 1010, 1010, 1010};
const G4double G4PiNuclearCrossSection::cu_m_in[32] = {725, 840, 1020, 1200, 1295, 1300, 1267, 1240, 1213, 1175, 1125, 1042, 950, 900, 860, 840, 830, 832, 835, 840, 850, 860, 865, 785, 735, 705, 680, 650, 630, 630, 630, 630};
const G4double G4PiNuclearCrossSection::cu_p_t[25] = {355, 605, 1120, 1630, 1940, 2010, 2010, 1980, 1925, 1895, 1830, 1730, 1585, 1490, 1400, 1340, 1290, 1290, 1290, 1310, 1330, 1345, 1350, 1240, 1185};
const G4double G4PiNuclearCrossSection::cu_p_in[25] = {230, 425, 780, 1025, 1155, 1190, 1190, 1180, 1125, 1100, 1050, 1000, 900, 870, 835, 815, 810, 812, 815, 825, 840, 850, 855, 780, 735};
const G4double G4PiNuclearCrossSection::e5[34] = {
0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22, 0.25,
0.30, 0.35, 0.40, 0.45, 0.50, 0.60, 0.70, 0.80, 0.90, 1, 2, 3, 5, 10, 20,
50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::mo_m_t[34] = {2430, 2610, 2710, 2790, 2880, 2940, 2965, 2970, 2970, 2920, 2840, 2720, 2570, 2500, 2365, 2200, 2050, 1926, 1825, 1768, 1749, 1750, 1778, 1789, 1808, 1690, 1645, 1530, 1492, 1450, 1425, 1425, 1425, 1425};
const G4double G4PiNuclearCrossSection::mo_m_in[34] = {925, 1125, 1250, 1375, 1500, 1600, 1680, 1750, 1770, 1730, 1660, 1580, 1500, 1450, 1330, 1250, 1190, 1140, 1100, 1075, 1075, 1070, 1088, 1095, 1110, 1035, 1005, 940, 917, 880, 860, 860, 860, 860};
const G4double G4PiNuclearCrossSection::mo_p_t[27] = {410, 730, 1110, 1530, 1920, 2200, 2385, 2520, 2600, 2630, 2575, 2470, 2320, 2285, 2185, 2053, 1945, 1852, 1776, 1719, 1710, 1716, 1746, 1759, 1778, 1675, 1645};
const G4double G4PiNuclearCrossSection::mo_p_in[27] = {270, 540, 825, 975, 1140, 1285, 1400, 1480, 1555, 1580, 1525, 1470, 1360, 1340, 1255, 1160, 1120, 1085, 1060, 1045, 1045, 1045, 1065, 1075, 1090, 1025, 1005};
const G4double G4PiNuclearCrossSection::cd_m_t[34] = {3060, 3125, 3170, 3220, 3255, 3280, 3290, 3260, 3270, 3200, 3120, 3080, 3090, 2920, 2810, 2640, 2362, 2230, 2115, 2050, 2020, 2025, 2040, 2070, 2100, 1900, 1795, 1740, 1675, 1645, 1625, 1620, 1620, 1620};
const G4double G4PiNuclearCrossSection::cd_m_in[34]= {1025, 1275, 1440, 1625, 1740, 1800, 1880, 1920, 1980, 1920, 1850, 1810, 1720, 1650, 1560, 1450, 1330, 1290, 1245, 1210, 1200, 1200, 1205, 1205, 1230, 1130, 1085, 1060, 1000, 985, 975, 970, 970, 970};
const G4double G4PiNuclearCrossSection::cd_p_t[28] = {455, 780, 1170, 1700, 2120, 2400, 2600, 2720, 2820, 2840, 2800, 2760, 2720, 2640, 2560, 2450, 2252, 2130, 2035, 1985, 1970, 1975, 2005, 2035, 2070, 1880, 1795, 1740};
const G4double G4PiNuclearCrossSection::cd_p_in[28] = {310, 580, 880, 1060, 1270, 1400, 1530, 1610, 1660, 1680, 1640, 1600, 1560, 1500, 1430, 1330, 1280, 1230, 1200, 1180, 1170, 1175, 1180, 1180, 1210, 1120, 1085, 1060};
const G4double G4PiNuclearCrossSection::e6[35] = {
0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22, 0.25,
0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.70, 0.80, 0.90, 1, 2, 3, 5, 10,
20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::sn_m_t[35] = {3000, 3180, 3250, 3300, 3300, 3410, 3470, 3450, 3410, 3350, 3280, 3200, 3120, 3050, 2900, 2630, 2500, 2325, 2190, 2100, 2060, 2055, 2055, 2055, 2067, 2085, 2000, 1900, 1835, 1770, 1720, 1700, 1695, 1695, 1695};
const G4double G4PiNuclearCrossSection::sn_m_in[35] = {1050, 1350, 1520, 1650, 1800, 1980, 2070, 2120, 2090, 2050, 1980, 1920, 1830, 1770, 1670, 1500, 1435, 1350, 1300, 1230, 1220, 1235, 1235, 1235, 1237, 1240, 1160, 1120, 1090, 1065, 1040, 1020, 1015, 1015, 1015};
const G4double G4PiNuclearCrossSection::sn_p_t[29] = { 465, 800, 1200, 1760, 2170, 2480, 2730, 2885, 2970, 2980, 2970, 2890, 2840, 2790, 2620, 2450, 2335, 2205, 2080, 2020, 2010, 1990, 1990, 2015, 2030, 2045, 1980, 1890, 1835};
const G4double G4PiNuclearCrossSection::sn_p_in[29] = { 315, 590, 880, 1220, 1460, 1580, 1700, 1770, 1810, 1810, 1800, 1730, 1680, 1630, 1530, 1400, 1335, 1270, 1210, 1180, 1190, 1190, 1190, 1205, 1210, 1210, 1150, 1115, 1090};
const G4double G4PiNuclearCrossSection::w_m_t[35] = {5200, 5115, 5025, 4975, 4900, 4850, 4780, 4725, 4600, 4490, 4355, 4255, 4125, 4040, 3830, 3580, 3330, 3110, 2955, 2860, 2852, 2845, 2885, 2900, 2915, 2940, 2800, 2660, 2570, 2490, 2460, 2425, 2420, 2420, 2420};
const G4double G4PiNuclearCrossSection::w_m_in[35] = {1450, 1850, 2100, 2350, 2550, 2700, 2825, 2900, 2850, 2750, 2630, 2525, 2400, 2300, 2200, 2070, 1880, 1770, 1715, 1680, 1680, 1680, 1685, 1690, 1700, 1720, 1635, 1560, 1530, 1460, 1440, 1410, 1410, 1410, 1410};
const G4double G4PiNuclearCrossSection::w_p_t[30] = { 480, 900, 1500, 2350, 3020, 3420, 3650, 3775, 3875, 3830, 3750, 3700, 3630, 3550, 3550, 3290, 3070, 2890, 2840, 2730, 2725, 2720, 2770, 2805, 2828, 2865, 2770, 2640, 2570, 2490};
const G4double G4PiNuclearCrossSection::w_p_in[30] = { 325, 680, 990, 1500, 1850, 2150, 2250, 2300, 2350, 2330, 2280, 2230, 2200, 2120, 2130, 1900, 1780, 1670, 1635, 1600, 1602, 1605, 1610, 1615, 1630, 1660, 1620, 1550, 1530, 1460};
const G4double G4PiNuclearCrossSection::e7[35] = {
0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22, 0.25,
0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.70, 0.80, 0.90, 1, 2, 3, 5, 10,
20, 50, 100, 500, 1000};
const G4double G4PiNuclearCrossSection::pb_m_t[35] = {
5890, 5700, 5610, 5580, 5550, 5480, 5400, 5300, 5100, 4930, 4750, 4600, 4400, 4280, 4170,
3915, 3650, 3470, 3260, 3150, 3120, 3070, 3085, 3100, 3120, 3160, 3070, 2930, 2820, 2750,
2710, 2655, 2640, 2640, 2640};
const G4double G4PiNuclearCrossSection::pb_m_in[35] = {
1575, 2025, 2300, 2575, 2850, 3000, 3115, 3180, 3080, 2940, 2800, 2670, 2550, 2450, 2370,
2220, 2110, 2000, 1920, 1880, 1850, 1800, 1805, 1810, 1820, 1840, 1800, 1720, 1640, 1620,
1570, 1530, 1530, 1530, 1530};
const G4double G4PiNuclearCrossSection::pb_p_t[30] = {
515, 940, 1500, 2400, 3270, 3750, 4050, 4140, 4260, 4200, 4080, 3990, 3990, 3810, 3730,
3520, 3370, 3186, 3110, 3010, 2990, 2985, 3005, 3020, 3040, 3080, 3020, 2905, 2790, 2750};
const G4double G4PiNuclearCrossSection::pb_p_in[30] = {
348, 707, 1040, 1650, 2100, 2400, 2580, 2640, 2650, 2520, 2410, 2300, 2250, 2190, 2130,
2000, 1930, 1870, 1830, 1790, 1770, 1765, 1775, 1780, 1790, 1800, 1775, 1710, 1620, 1620};
const G4double G4PiNuclearCrossSection::u_m_t[35] = {
7080, 6830, 6650, 6530, 6400, 6280, 6100, 5840, 5660, 5520, 5330, 5160,
4990, 4810, 4630, 4323, 4130, 3870, 3700, 3550, 3490, 3465, 3467, 3475,
3495, 3515, 3440, 3360, 3150, 3040, 2985, 2955, 2940, 2940, 2940};
const G4double G4PiNuclearCrossSection::u_m_in[35] = {
1740, 2220, 2500, 2820, 3080, 3300, 3420, 3500, 3420, 3330, 3200, 3060,
2940, 2850, 2710, 2470, 2380, 2250, 2160, 2080, 2040, 2045, 2047, 2050,
2055, 2060, 2010, 1980, 1830, 1780, 1735, 1710, 1700, 1700, 1700};
const G4double G4PiNuclearCrossSection::u_p_t[30] = {
485, 960, 1580, 2700, 3550, 4050, 4320, 4420, 4620, 4660, 4580, 4470,
4350, 4295, 4187, 3938, 3755, 3573, 3450, 3342, 3310, 3295, 3310, 3330,
3375, 3405, 3350, 3338, 3135, 3040};
const G4double G4PiNuclearCrossSection::u_p_in[30] = {
334, 720, 1020, 1560, 2100, 2300, 2550, 2700, 2880, 2880, 2760, 2660,
2550, 2510, 2430, 2270, 2130, 2060, 2000, 1970, 1950, 1950, 1960, 1960,
1970, 1980, 1950, 1978, 1830, 1780};
G4PiNuclearCrossSection::
G4PiNuclearCrossSection()
@@ -167,114 +336,137 @@
}
G4PiNuclearCrossSection::
~G4PiNuclearCrossSection()
{
std::for_each(thePimData.begin(), thePimData.end(), G4PiData::Delete());
std::for_each(thePipData.begin(), thePipData.end(), G4PiData::Delete());
}
G4PiNuclearCrossSection::
~G4PiNuclearCrossSection()
{
std::for_each(thePimData.begin(), thePimData.end(), G4PiData::Delete());
std::for_each(thePipData.begin(), thePipData.end(), G4PiData::Delete());
}
G4double G4PiNuclearCrossSection::
GetCrossSection(const G4DynamicParticle* aParticle,
const G4Element* anElement,
G4double )
{
// precondition
G4ping debug("debug_PiNuclearCrossSection");
G4double tuning = 1.;
using namespace std;
G4bool ok = false;
if(aParticle->GetDefinition() == G4PionMinus::PionMinus()) ok=true;
if(aParticle->GetDefinition() == G4PionPlus::PionPlus()) ok=true;
if(!ok)
{
throw G4HadronicException(__FILE__, __LINE__,
"Call to G4PiNuclearCrossSection failed.");
}
G4double charge = aParticle->GetDefinition()->GetPDGCharge();
G4double kineticEnergy = aParticle->GetKineticEnergy();
// body
G4double result = 0;
G4int Z=G4lrint(anElement->GetZ());
debug.push_back(Z);
size_t it=0;
while(it<theZ.size() && Z>theZ[it]) it++;
debug.push_back(theZ[it]);
debug.push_back(kineticEnergy);
if(Z==29) tuning=.96;
if(Z > theZ[it])
{
throw G4HadronicException(__FILE__, __LINE__,
"Called G4PiNuclearCrossSection outside parametrization");
}
G4int Z1, Z2;
G4double x1, x2;
if(charge<0)
{
if(theZ[it]==Z)
{
result = thePimData[it]->ReactionXSection(kineticEnergy);
debug.push_back("D1 ");
debug.push_back(result);
}
else
{
x1 = thePimData[it-1]->ReactionXSection(kineticEnergy);
Z1 = theZ[it-1];
x2 = thePimData[it]->ReactionXSection(kineticEnergy);
Z2 = theZ[it];
result = Interpolate(Z1, Z2, Z, x1, x2);
debug.push_back("D2 ");
debug.push_back(x1);
debug.push_back(x2);
debug.push_back(Z1);
debug.push_back(Z2);
debug.push_back(result);
}
}
else
{
if(theZ[it]==Z)
{
// at high energies, when no data for pi+, use pi-
std::vector<G4PiData *> * theData = &thePimData;
if(thePipData[it]->AppliesTo(kineticEnergy))
{
theData = &thePipData;
}
result = theData->operator[](it)->ReactionXSection(kineticEnergy);
debug.push_back("D3 ");
debug.push_back(result);
}
else
{
std::vector<G4PiData *> * theLData = &thePimData;
if(thePipData[it-1]->AppliesTo(kineticEnergy))
{
theLData = &thePipData;
}
std::vector<G4PiData *> * theHData = &thePimData;
if(thePipData[it]->AppliesTo(kineticEnergy))
{
theHData = &thePipData;
}
x1 = theLData->operator[](it-1)->ReactionXSection(kineticEnergy);
Z1 = theZ[it-1];
x2 = theHData->operator[](it)->ReactionXSection(kineticEnergy);
Z2 = theZ[it];
result = Interpolate(Z1, Z2, Z, x1, x2);
debug.push_back("D4 ");
debug.push_back(x1);
debug.push_back(x2);
debug.push_back(Z1);
debug.push_back(Z2);
debug.push_back(result);
}
}
G4double G4PiNuclearCrossSection::
GetIsoZACrossSection(const G4DynamicParticle* particle, G4double ZZ,
G4double /*AA*/, G4double /*temperature*/)
{
// precondition
G4ping debug("debug_PiNuclearCrossSection");
using namespace std;
G4bool ok = false;
if(particle->GetDefinition() == G4PionMinus::PionMinus()) ok=true;
if(particle->GetDefinition() == G4PionPlus::PionPlus()) ok=true;
if(!ok)
{
throw G4HadronicException(__FILE__, __LINE__,
"Call to G4PiNuclearCrossSection failed.");
}
debug.dump();
return tuning*result;
G4double charge = particle->GetDefinition()->GetPDGCharge();
G4double kineticEnergy = particle->GetKineticEnergy();
// body
G4double result = 0;
G4int Z=G4lrint(ZZ);
debug.push_back(Z);
size_t it=0;
while(it<theZ.size() && Z>theZ[it]) it++;
debug.push_back(theZ[it]);
debug.push_back(kineticEnergy);
if(Z > theZ[it])
{
throw G4HadronicException(__FILE__, __LINE__,
"Called G4PiNuclearCrossSection outside parametrization");
}
G4int Z1, Z2;
G4double x1, x2, xt1, xt2;
if(charge<0)
{
if(theZ[it]==Z)
{
result = thePimData[it]->ReactionXSection(kineticEnergy);
debug.push_back("D1 ");
debug.push_back(result);
}
else
{
x1 = thePimData[it-1]->ReactionXSection(kineticEnergy);
xt1 = thePimData[it-1]->TotalXSection(kineticEnergy);
Z1 = theZ[it-1];
x2 = thePimData[it]->ReactionXSection(kineticEnergy);
xt2 = thePimData[it]->TotalXSection(kineticEnergy);
Z2 = theZ[it];
result = Interpolate(Z1, Z2, Z, x1, x2);
fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
debug.push_back("D2 ");
debug.push_back(x1);
debug.push_back(x2);
debug.push_back(xt1);
debug.push_back(xt2);
debug.push_back(Z1);
debug.push_back(Z2);
debug.push_back(result);
debug.push_back(fTotalXsc);
}
}
else
{
if(theZ[it]==Z)
{
// at high energies, when no data for pi+, use pi-
std::vector<G4PiData *> * theData = &thePimData;
if(thePipData[it]->AppliesTo(kineticEnergy))
{
theData = &thePipData;
}
result = theData->operator[](it)->ReactionXSection(kineticEnergy);
fTotalXsc = theData->operator[](it)->TotalXSection(kineticEnergy);
debug.push_back("D3 ");
debug.push_back(result);
debug.push_back(fTotalXsc);
}
else
{
std::vector<G4PiData *> * theLData = &thePimData;
if(thePipData[it-1]->AppliesTo(kineticEnergy))
{
theLData = &thePipData;
}
std::vector<G4PiData *> * theHData = &thePimData;
if(thePipData[it]->AppliesTo(kineticEnergy))
{
theHData = &thePipData;
}
x1 = theLData->operator[](it-1)->ReactionXSection(kineticEnergy);
xt1 = theLData->operator[](it-1)->TotalXSection(kineticEnergy);
Z1 = theZ[it-1];
x2 = theHData->operator[](it)->ReactionXSection(kineticEnergy);
xt2 = theHData->operator[](it)->TotalXSection(kineticEnergy);
Z2 = theZ[it];
result = Interpolate(Z1, Z2, Z, x1, x2);
fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
debug.push_back("D4 ");
debug.push_back(x1);
debug.push_back(xt1);
debug.push_back(x2);
debug.push_back(xt2);
debug.push_back(Z1);
debug.push_back(Z2);
debug.push_back(result);
debug.push_back(fTotalXsc);
}
}
debug.dump();
fElasticXsc = fTotalXsc - result;
if( fElasticXsc < 0.) fElasticXsc = 0.;
return result;
}
G4double G4PiNuclearCrossSection::
@@ -25,51 +25,79 @@
//
// By JPW, working, but to be cleaned up. @@@
// G.Folger, 29-sept-2006: extend to 1TeV, using a constant above 20GeV
// 22 Dec 2006 - DHW added isotope dependence
//
#include "G4ProtonInelasticCrossSection.hh"
#include "globals.hh"
G4double G4ProtonInelasticCrossSection::
GetCrossSection(const G4DynamicParticle* aPart,
const G4Element* anEle, G4double )
{
G4double atomicNumber = anEle->GetN();
G4double nOfProtons = anEle->GetZ();
return GetCrossSection(aPart->GetKineticEnergy(), atomicNumber, nOfProtons);
}
G4double G4ProtonInelasticCrossSection::
GetCrossSection(G4double kineticEnergy, G4double atomicNumber, G4double nOfProtons)
{
if (kineticEnergy > 19.9*GeV )
{ // constant cross section above ~20GeV.
return GetCrossSection(19.8*GeV,atomicNumber,nOfProtons);
}
G4double nOfNeutrons = atomicNumber-nOfProtons;
kineticEnergy /=GeV;
G4double a = atomicNumber;
const G4double nuleonRadius=1.36E-15;
const G4double pi=3.14159265;
G4double fac=pi*nuleonRadius*nuleonRadius;
G4double b0=2.247-0.915*(1-std::pow(a,-0.3333));
G4double fac1=b0*(1-std::pow(a,-0.3333));
G4double fac2=1.;
if(nOfNeutrons>1.5) fac2=std::log((nOfNeutrons));
G4double crossSection = 1E31*fac*fac2*(1+std::pow(a,0.3333)-fac1);
// high energy correction
crossSection = (1-0.15*std::exp(-kineticEnergy))*crossSection/(1.00-0.0007*a);
// first try on low energies: rise
G4double ff1= 0.70-0.002*a; // slope of the drop at medium energies.
G4double ff2= 1.00+1/a; // start of the slope.
G4double ff3= 0.8+18/a-0.002*a; // stephight
fac=1-(1/(1+std::exp(-8*ff1*(std::log10(kineticEnergy)+1.37*ff2))));
crossSection = crossSection*(1+ff3*fac);
// low energy return to zero
ff1=1.-1/a-0.001*a; // slope of the rise
ff2=1.17-2.7/a-0.0014*a; // start of the rise
fac=-8.*ff1*(std::log10(kineticEnergy)+2.0*ff2);
fac=1/(1+std::exp(fac));
crossSection = crossSection*fac;
return crossSection*millibarn;
G4double G4ProtonInelasticCrossSection::
GetCrossSection(const G4DynamicParticle* aPart,
const G4Element* anEle, G4double /*aTemperature*/)
{
G4int nIso = anEle->GetNumberOfIsotopes();
G4double KE = aPart->GetKineticEnergy();
G4double cross_section = 0;
if (nIso) {
G4double psig;
G4IsotopeVector* isoVector = anEle->GetIsotopeVector();
G4double* abundVector = anEle->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
psig = GetCrossSection(KE, AA, ZZ);
cross_section += psig*abundVector[i];
}
} else {
cross_section = GetCrossSection(KE, anEle->GetN(), anEle->GetZ());
}
return cross_section;
}
G4double G4ProtonInelasticCrossSection::
GetCrossSection(G4double kineticEnergy, G4double atomicNumber, G4double nOfProtons)
{
if (kineticEnergy > 19.9*GeV )
{ // constant cross section above ~20GeV.
return GetCrossSection(19.8*GeV,atomicNumber,nOfProtons);
}
G4double nOfNeutrons = atomicNumber-nOfProtons;
kineticEnergy /=GeV;
G4double a = atomicNumber;
const G4double nuleonRadius=1.36E-15;
const G4double pi=3.14159265;
G4double fac=pi*nuleonRadius*nuleonRadius;
G4double b0=2.247-0.915*(1-std::pow(a,-0.3333));
G4double fac1=b0*(1-std::pow(a,-0.3333));
G4double fac2=1.;
if(nOfNeutrons>1.5) fac2=std::log((nOfNeutrons));
G4double crossSection = 1E31*fac*fac2*(1+std::pow(a,0.3333)-fac1);
// high energy correction
crossSection = (1-0.15*std::exp(-kineticEnergy))*crossSection/(1.00-0.0007*a);
// first try on low energies: rise
G4double ff1= 0.70-0.002*a; // slope of the drop at medium energies.
G4double ff2= 1.00+1/a; // start of the slope.
G4double ff3= 0.8+18/a-0.002*a; // stephight
fac=1-(1/(1+std::exp(-8*ff1*(std::log10(kineticEnergy)+1.37*ff2))));
crossSection = crossSection*(1+ff3*fac);
// low energy return to zero
ff1=1.-1/a-0.001*a; // slope of the rise
ff2=1.17-2.7/a-0.0014*a; // start of the rise
fac=-8.*ff1*(std::log10(kineticEnergy)+2.0*ff2);
fac=1/(1+std::exp(fac));
crossSection = crossSection*fac;
return crossSection*millibarn;
}
@@ -23,7 +23,11 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// Implementation of formulas in analogy to NASA technical paper 3621 by Tripathi, et al.
// Implementation of formulas in analogy to NASA technical paper 3621 by
// Tripathi, et al.
//
// 26-Dec-2006 Isotope dependence added by D. Wright
//
#include "G4TripathiCrossSection.hh"
#include "G4ParticleTable.hh"
@@ -31,33 +35,36 @@
#include "G4HadTmpUtil.hh"
G4double G4TripathiCrossSection::
GetCrossSection(const G4DynamicParticle* aPart,
const G4Element*anEle, G4double )
GetIsoZACrossSection(const G4DynamicParticle* aPart, G4double ZZ, G4double AA,
G4double /*temperature*/)
{
G4double result = 0;
const G4double targetAtomicNumber = anEle->GetN();
const G4double nTargetProtons = anEle->GetZ();
const G4double targetAtomicNumber = AA;
const G4double nTargetProtons = ZZ;
const G4double kineticEnergy = aPart->GetKineticEnergy()/MeV;
const G4double nProjProtons = aPart->GetDefinition()->GetPDGCharge();
const G4double projectileAtomicNumber = aPart->GetDefinition()->GetBaryonNumber();
const G4double projectileAtomicNumber =
aPart->GetDefinition()->GetBaryonNumber();
const G4double nuleonRadius=1.1E-15;
const G4double myNuleonRadius=1.36E-15;
// needs target mass
G4double targetMass = G4ParticleTable::GetParticleTable()
->GetIonTable()
->GetIonMass(G4lrint(nTargetProtons), G4lrint(targetAtomicNumber));
G4double targetMass =
G4ParticleTable::GetParticleTable()->GetIonTable()
->GetIonMass(G4lrint(nTargetProtons), G4lrint(targetAtomicNumber));
G4LorentzVector pTarget(0,0,0,targetMass);
G4LorentzVector pProjectile(aPart->Get4Momentum());
pTarget = pTarget+pProjectile;
G4double E_cm = (pTarget.mag()-targetMass-pProjectile.m())/MeV;
// done
G4double r_rms_p = 0.6 * myNuleonRadius * std::pow(projectileAtomicNumber, 1./3.);
G4double r_rms_t = 0.6 * myNuleonRadius * std::pow(targetAtomicNumber, 1./3.);
G4double r_rms_p = 0.6 * myNuleonRadius *
std::pow(projectileAtomicNumber, 1./3.);
G4double r_rms_t = 0.6 * myNuleonRadius *
std::pow(targetAtomicNumber, 1./3.);
// done
G4double r_p = 1.29*r_rms_p/nuleonRadius ;
@@ -65,9 +72,9 @@ GetCrossSection(const G4DynamicParticle* aPart,
// done
G4double Radius = r_p + r_t +
1.2*(std::pow(targetAtomicNumber, 1./3.) + std::pow(projectileAtomicNumber, 1./3.))/
std::pow(E_cm, 1./3.);
1.2*(std::pow(targetAtomicNumber, 1./3.) +
std::pow(projectileAtomicNumber, 1./3.))/std::pow(E_cm, 1./3.);
//done
G4double B = 1.44*nProjProtons*nTargetProtons/Radius;
@@ -77,10 +84,12 @@ GetCrossSection(const G4DynamicParticle* aPart,
// done
//
// Note that this correction to G4TripathiCrossSection is just to accurately
// reflect Tripathi's algorithm. However, if you're using alpha particles/protons
// consider using the more accurate G4TripathiLightCrossSection, which
// Tripathi developed specifically for light systems.
// reflect Tripathi's algorithm. However, if you're using alpha
// particles/protons consider using the more accurate
// G4TripathiLightCrossSection, which Tripathi developed specifically for
// light systems.
//
G4double D;
if (nProjProtons==1 && projectileAtomicNumber==1)
{
@@ -88,25 +97,29 @@ GetCrossSection(const G4DynamicParticle* aPart,
}
else if (nProjProtons==2 && projectileAtomicNumber==4)
{
D = 2.77-(8.0E-3*targetAtomicNumber)+(1.8E-5*targetAtomicNumber*targetAtomicNumber)
D = 2.77-(8.0E-3*targetAtomicNumber)+
(1.8E-5*targetAtomicNumber*targetAtomicNumber)
- 0.8/(1+std::exp((250.-Energy)/75.));
}
else
{
//
// This is the original value used in the G4TripathiCrossSection implementation,
// and was used for all projectile/target conditions. I'm not touching this,
// althoughJudging from Tripathi's paper, this is valid for cases where the
// nucleon density changes little with A.
// This is the original value used in the G4TripathiCrossSection
// implementation, and was used for all projectile/target conditions.
// I'm not touching this, although judging from Tripathi's paper, this is
// valid for cases where the nucleon density changes little with A.
//
D = 1.75;
}
// done
G4double C_E = D * (1-std::exp(-Energy/40.)) - 0.292*std::exp(-Energy/792.)*std::cos(0.229*std::pow(Energy, 0.453));
G4double C_E = D * (1-std::exp(-Energy/40.)) -
0.292*std::exp(-Energy/792.)*std::cos(0.229*std::pow(Energy, 0.453));
// done
G4double S = std::pow(projectileAtomicNumber, 1./3.)*std::pow(targetAtomicNumber, 1./3.)/
(std::pow(projectileAtomicNumber, 1./3.) + std::pow(targetAtomicNumber, 1./3.));
G4double S = std::pow(projectileAtomicNumber, 1./3.)*
std::pow(targetAtomicNumber, 1./3.)/
(std::pow(projectileAtomicNumber, 1./3.) +
std::pow(targetAtomicNumber, 1./3.));
// done
G4double deltaE = 1.85*S + 0.16*S/std::pow(E_cm,1./3.) - C_E +
@@ -116,9 +129,41 @@ GetCrossSection(const G4DynamicParticle* aPart,
// done
result = pi * nuleonRadius*nuleonRadius *
std::pow(( std::pow(targetAtomicNumber, 1./3.) +
std::pow(projectileAtomicNumber, 1./3.) + deltaE),2.) * (1-B/E_cm);
std::pow(projectileAtomicNumber, 1./3.) + deltaE),2.) *
(1-B/E_cm);
if(result < 0) result = 0;
return result*m2;
}
G4double G4TripathiCrossSection::
GetCrossSection(const G4DynamicParticle* aPart, const G4Element* anEle,
G4double temperature)
{
G4int nIso = anEle->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = anEle->GetIsotopeVector();
G4double* abundVector = anEle->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(aPart, ZZ, AA, temperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(aPart, anEle->GetZ(), anEle->GetN(),
temperature);
}
return xsection;
}
@@ -99,10 +99,17 @@ G4TripathiLightCrossSection::~G4TripathiLightCrossSection ()
//
G4bool G4TripathiLightCrossSection::IsApplicable
(const G4DynamicParticle* theProjectile, const G4Element* theTarget)
{
return IsZAApplicable(theProjectile, theTarget->GetZ(), theTarget->GetA());
}
G4bool G4TripathiLightCrossSection::IsZAApplicable
(const G4DynamicParticle* theProjectile, G4double ZZ, G4double AA)
{
G4bool result = false;
const G4double AT = theTarget->GetN();
const G4double ZT = theTarget->GetZ();
const G4double AT = AA;
const G4double ZT = ZZ;
const G4double ZP = theProjectile->GetDefinition()->GetPDGCharge();
const G4double AP = theProjectile->GetDefinition()->GetBaryonNumber();
if (theProjectile->GetKineticEnergy()/
@@ -116,12 +123,11 @@ G4bool G4TripathiLightCrossSection::IsApplicable
}
///////////////////////////////////////////////////////////////////////////////
//
G4double G4TripathiLightCrossSection::GetCrossSection
(const G4DynamicParticle* theProjectile, const G4Element* theTarget,
G4double /* theTemperature*/)
G4double G4TripathiLightCrossSection::GetIsoZACrossSection
(const G4DynamicParticle* theProjectile, G4double ZZ, G4double AA,
G4double /*theTemperature*/)
{
//
//
// Initialise the result.
G4double result = 0.0;
//
@@ -129,8 +135,8 @@ G4double G4TripathiLightCrossSection::GetCrossSection
// Get details of the projectile and target (nucleon number, atomic number,
// kinetic enery and energy/nucleon.
//
const G4double AT = theTarget->GetN();
const G4double ZT = theTarget->GetZ();
const G4double AT = AA;
const G4double ZT = ZZ;
const G4double EA = theProjectile->GetKineticEnergy()/MeV;
const G4double AP = theProjectile->GetDefinition()->GetBaryonNumber();
const G4double ZP = theProjectile->GetDefinition()->GetPDGCharge();
@@ -292,14 +298,47 @@ G4double G4TripathiLightCrossSection::GetCrossSection
G4TripathiLightCrossSection theTripathiLightCrossSection;
theTripathiLightCrossSection.SetLowEnergyCheck(true);
G4double resultp =
theTripathiLightCrossSection.GetCrossSection
(&slowerProjectile, theTarget, 0.0);
theTripathiLightCrossSection.GetIsoZACrossSection
(&slowerProjectile, ZZ, AA, 0.0);
if (resultp >result) result = 0.0;
}
}
return result;
}
G4double G4TripathiLightCrossSection::GetCrossSection
(const G4DynamicParticle* theProjectile, const G4Element* theTarget,
G4double theTemperature)
{
G4int nIso = theTarget->GetNumberOfIsotopes();
G4double xsection = 0;
if (nIso) {
G4double sig;
G4IsotopeVector* isoVector = theTarget->GetIsotopeVector();
G4double* abundVector = theTarget->GetRelativeAbundanceVector();
G4double ZZ;
G4double AA;
for (G4int i = 0; i < nIso; i++) {
ZZ = G4double( (*isoVector)[i]->GetZ() );
AA = G4double( (*isoVector)[i]->GetN() );
sig = GetIsoZACrossSection(theProjectile, ZZ, AA, theTemperature);
xsection += sig*abundVector[i];
}
} else {
xsection =
GetIsoZACrossSection(theProjectile, theTarget->GetZ(), theTarget->GetN(),
theTemperature);
}
return xsection;
}
///////////////////////////////////////////////////////////////////////////////
//
void G4TripathiLightCrossSection::SetLowEnergyCheck (G4bool aLowEnergyCheck)
@@ -25,6 +25,9 @@
//
//
// 12.08.06 V.Ivanchenko - first implementation
// 22.01.07 V.Ivanchenko - add GetIsoZACrossSection
// 05.03.07 V.Ivanchenko - use G4NucleonNuclearCrossSection
// 06.03.07 V.Ivanchenko - add Initialise function
//
//
@@ -33,18 +36,33 @@
#include "G4ParticleTable.hh"
#include "G4GlauberGribovCrossSection.hh"
#include "G4NucleonNuclearCrossSection.hh"
#include "G4UPiNuclearCrossSection.hh"
#include "G4HadronCrossSections.hh"
#include "G4ParticleDefinition.hh"
#include "G4Element.hh"
#include "G4Proton.hh"
#include "G4Neutron.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
#include "G4NistManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4UElasticCrossSection::G4UElasticCrossSection()
G4UElasticCrossSection::G4UElasticCrossSection(const G4ParticleDefinition* p)
{
fGlauber = new G4GlauberGribovCrossSection();
fUPi = new G4UPiNuclearCrossSection();
fGheisha = new G4HadronCrossSections();
hasGlauber = false;
thEnergy = 100.*GeV;
fGlauber = new G4GlauberGribovCrossSection();
fGheisha = G4HadronCrossSections::Instance();
fNucleon = 0;
fUPi = 0;
if(p == G4Proton::Proton() || p == G4Neutron::Neutron())
fNucleon = new G4NucleonNuclearCrossSection();
else if(p == G4PionPlus::PionPlus() || p == G4PionMinus::PionMinus())
fUPi = new G4UPiNuclearCrossSection();
verboseLevel = 0;
Initialise(p);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -52,58 +70,149 @@ G4UElasticCrossSection::G4UElasticCrossSection()
G4UElasticCrossSection::~G4UElasticCrossSection()
{
delete fGlauber;
delete fGheisha;
delete fUPi;
if(fNucleon) delete fNucleon;
if(fUPi) delete fUPi;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4bool G4UElasticCrossSection::IsApplicable(const G4DynamicParticle* dp,
const G4Element* elm)
const G4Element* elm)
{
return IsZAApplicable(dp, elm->GetZ(), elm->GetN());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4bool G4UElasticCrossSection::IsZAApplicable(const G4DynamicParticle* dp,
G4double Z, G4double A)
{
G4bool res = false;
idx = 0;
if(fGlauber->IsApplicable(dp,elm)) {
res = true;
idx = 1;
} else if(fUPi->IsApplicable(dp,elm)) {
res = true;
idx = 2;
} else if(fGheisha->IsApplicable(dp,elm)) {
res = true;
idx = 3;
}
if(fNucleon || fUPi) res = true;
else res = fGheisha->IsApplicable(dp, Z, A);
if(verboseLevel > 1)
G4cout << "G4UElasticCrossSection::IsApplicable for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< G4endl;
return res;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4UElasticCrossSection::GetCrossSection(const G4DynamicParticle* dp,
const G4Element* elm,
G4double temp)
const G4Element* elm,
G4double temp)
{
return GetIsoZACrossSection(dp, elm->GetZ(), elm->GetN(), temp);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4UElasticCrossSection::GetIsoZACrossSection(const G4DynamicParticle* dp,
G4double Z,
G4double A,
G4double)
{
G4double cross = 0.0;
if(idx == 1) {
cross = fGlauber->GetCrossSection(dp,elm,temp);
cross = fGlauber->GetElasticGlauberGribovXsc();
}
else if(idx == 2) cross = fUPi->GetElasticCrossSection(dp,elm);
else if(idx == 3) cross = fGheisha->GetElasticCrossSection(dp,elm);
G4double ekin = dp->GetKineticEnergy();
G4int iz = G4int(Z + 0.5);
if(iz > 92) iz = 92;
// proton and neutron
if(fNucleon) {
if(iz == 1) cross = fGheisha->GetElasticCrossSection(dp, Z, A);
else if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetElasticGlauberGribov(dp, Z, A);
} else {
cross = fNucleon->GetElasticCrossSection(dp, Z, A);
}
// pions
} else if(fUPi) {
if(iz == 1) cross = fGheisha->GetElasticCrossSection(dp, Z, A);
else if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetElasticGlauberGribov(dp, Z, A);
} else {
cross = fUPi->GetElasticCrossSection(dp, Z, A);
}
//others
} else {
if(hasGlauber && ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetElasticGlauberGribov(dp, Z, A);
} else if(fGheisha->IsApplicable(dp, Z, A)) {
cross = fGheisha->GetElasticCrossSection(dp, Z, A);
}
}
if(verboseLevel > 1)
G4cout << "G4UElasticCrossSection::GetCrossSection for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< " in nucleus Z= " << Z << " A= " << A
<< " XS(b)= " << cross/barn
<< G4endl;
return cross;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4UElasticCrossSection::BuildPhysicsTable(const G4ParticleDefinition&)
{}
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4UElasticCrossSection::DumpPhysicsTable(const G4ParticleDefinition&)
{
G4cout << "G4UElasticCrossSection: uses Glauber-Gribov formula"<<G4endl;
G4cout << "G4UElasticCrossSection:"<<G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4UElasticCrossSection::Initialise(const G4ParticleDefinition* p)
{
G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(p);
G4ThreeVector mom(0.0,0.0,1.0);
G4DynamicParticle dp(part, mom, thEnergy);
G4NistManager* nist = G4NistManager::Instance();
G4double A = nist->GetAtomicMassAmu(2);
if(fGlauber->IsZAApplicable(&dp, 2.0, A)) {
hasGlauber = true;
if(verboseLevel > 0) G4cout << "### G4UElasticCrossSection::Initialise for "
<< p->GetParticleName() << G4endl;
G4double csup, csdn;
for(G4int iz=2; iz<93; iz++) {
G4double Z = G4double(iz);
A = nist->GetAtomicMassAmu(iz);
csup = fGlauber->GetElasticGlauberGribov(&dp, Z, A);
// proton and neutron
if(fNucleon) {
csdn = fNucleon->GetElasticCrossSection(&dp, Z, A);
// pions
} else if(fUPi) {
csdn = fUPi->GetElasticCrossSection(&dp, Z, A);
// other
} else if(fGheisha->IsApplicable(&dp, Z, A)) {
csdn = fGheisha->GetElasticCrossSection(&dp, Z, A);
} else {
csdn = csup;
}
theFac[iz] = csdn/csup;
if(verboseLevel > 0) G4cout << "Z= " << Z << " A= " << A
<< " factor= " << theFac[iz] << G4endl;
}
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -25,6 +25,9 @@
//
//
// 12.08.06 V.Ivanchenko - first implementation
// 22.01.07 V.Ivanchenko - add GetIsoZACrossSection
// 05.03.07 V.Ivanchenko - use G4NucleonNuclearCrossSection
// 06.03.07 V.Ivanchenko - add Initialise function
//
//
@@ -33,8 +36,7 @@
#include "G4ParticleTable.hh"
#include "G4GlauberGribovCrossSection.hh"
#include "G4ProtonInelasticCrossSection.hh"
#include "G4NeutronInelasticCrossSection.hh"
#include "G4NucleonNuclearCrossSection.hh"
#include "G4UPiNuclearCrossSection.hh"
#include "G4HadronCrossSections.hh"
#include "G4ParticleDefinition.hh"
@@ -43,22 +45,24 @@
#include "G4Neutron.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
#include "G4NistManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4UInelasticCrossSection::G4UInelasticCrossSection(const G4ParticleDefinition* p)
{
fGlauber = new G4GlauberGribovCrossSection();
fGhadProton = 0;
if(p == G4Proton::Proton())
fGhadProton = new G4ProtonInelasticCrossSection();
fGhadNeutron= 0;
if(p == G4Neutron::Neutron())
fGhadNeutron = new G4NeutronInelasticCrossSection();
fUPi = 0;
if(p == G4PionPlus::PionPlus() || p == G4PionMinus::PionMinus())
hasGlauber = false;
thEnergy = 100.*GeV;
fGlauber = new G4GlauberGribovCrossSection();
fGheisha = G4HadronCrossSections::Instance();
fNucleon = 0;
fUPi = 0;
if(p == G4Proton::Proton() || p == G4Neutron::Neutron())
fNucleon = new G4NucleonNuclearCrossSection();
else if(p == G4PionPlus::PionPlus() || p == G4PionMinus::PionMinus())
fUPi = new G4UPiNuclearCrossSection();
fGheisha = new G4HadronCrossSections();
verboseLevel = 0;
Initialise(p);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -66,37 +70,28 @@ G4UInelasticCrossSection::G4UInelasticCrossSection(const G4ParticleDefinition* p
G4UInelasticCrossSection::~G4UInelasticCrossSection()
{
delete fGlauber;
delete fGhadProton;
delete fGhadNeutron;
delete fUPi;
delete fGheisha;
if(fNucleon) delete fNucleon;
if(fUPi) delete fUPi;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4bool G4UInelasticCrossSection::IsApplicable(const G4DynamicParticle* dp,
const G4Element* elm)
{
return IsZAApplicable(dp, elm->GetZ(), elm->GetN());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4bool G4UInelasticCrossSection::IsZAApplicable(const G4DynamicParticle* dp,
G4double Z, G4double A)
{
G4bool res = false;
idx = 0;
if(fGlauber->IsApplicable(dp,elm)) {
res = true;
idx = 1;
} else if(fGhadProton && fGhadProton->IsApplicable(dp,elm)) {
res = true;
idx = 2;
} else if(fGhadNeutron && fGhadNeutron->IsApplicable(dp,elm)) {
res = true;
idx = 3;
} else if(fUPi && fUPi->IsApplicable(dp,elm)) {
res = true;
idx = 4;
} else if(fGheisha->IsApplicable(dp,elm)) {
res = true;
idx = 5;
}
if(fNucleon || fUPi) res = true;
else res = fGheisha->IsApplicable(dp, Z, A);
if(verboseLevel > 1)
G4cout << "G4UInelasticCrossSection::IsApplicable idx= " << idx << " for "
G4cout << "G4UInelasticCrossSection::IsApplicable for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< G4endl;
@@ -108,38 +103,117 @@ G4bool G4UInelasticCrossSection::IsApplicable(const G4DynamicParticle* dp,
G4double G4UInelasticCrossSection::GetCrossSection(const G4DynamicParticle* dp,
const G4Element* elm,
G4double temp)
{
return GetIsoZACrossSection(dp, elm->GetZ(), elm->GetN(), temp);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double G4UInelasticCrossSection::GetIsoZACrossSection(const G4DynamicParticle* dp,
G4double Z,
G4double A,
G4double)
{
G4double cross = 0.0;
if(idx == 1) {
cross = fGlauber->GetCrossSection(dp,elm,temp);
cross = fGlauber->GetInelasticGlauberGribovXsc();
G4double ekin = dp->GetKineticEnergy();
G4int iz = G4int(Z + 0.5);
if(iz > 92) iz = 92;
// proton and neutron
if(fNucleon) {
if(iz == 1) cross = fGheisha->GetInelasticCrossSection(dp, Z, A);
else if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetInelasticGlauberGribov(dp, Z, A);
} else {
cross = fNucleon->GetIsoZACrossSection(dp, Z, A);
}
// pions
} else if(fUPi) {
if(iz == 1) cross = fGheisha->GetInelasticCrossSection(dp, Z, A);
else if(ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetInelasticGlauberGribov(dp, Z, A);
} else {
cross = fUPi->GetInelasticCrossSection(dp, Z, A);
}
//others
} else {
if(hasGlauber && ekin > thEnergy) {
cross = theFac[iz]*fGlauber->GetInelasticGlauberGribov(dp, Z, A);
} else if(fGheisha->IsApplicable(dp, Z, A)){
cross = fGheisha->GetInelasticCrossSection(dp, Z, A);
}
}
else if(idx == 2) cross = fGhadProton->GetCrossSection(dp,elm,temp);
else if(idx == 3) cross = fGhadNeutron->GetCrossSection(dp,elm,temp);
else if(idx == 4) cross = fUPi->GetInelasticCrossSection(dp,elm);
else if(idx == 5) cross = fGheisha->GetInelasticCrossSection(dp,elm);
if(verboseLevel > 1)
G4cout << "G4UInelasticCrossSection::GetCrossSection: idx= " << idx << " for "
G4cout << "G4UInelasticCrossSection::GetCrossSection for "
<< dp->GetDefinition()->GetParticleName()
<< " Ekin(GeV)= " << dp->GetKineticEnergy()
<< " in " << elm->GetName()
<< " in nucleus Z= " << Z << " A= " << A
<< " XS(b)= " << cross/barn
<< G4endl;
return cross;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4UInelasticCrossSection::BuildPhysicsTable(const G4ParticleDefinition&)
{}
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4UInelasticCrossSection::DumpPhysicsTable(const G4ParticleDefinition&)
{
G4cout << "G4UInelasticCrossSection: uses Glauber-Gribov formula"<<G4endl;
G4cout << "G4UInelasticCrossSection:"<<G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4UInelasticCrossSection::Initialise(const G4ParticleDefinition* p)
{
G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(p);
G4ThreeVector mom(0.0,0.0,1.0);
G4DynamicParticle dp(part, mom, thEnergy);
G4NistManager* nist = G4NistManager::Instance();
G4double A = nist->GetAtomicMassAmu(2);
if(fGlauber->IsZAApplicable(&dp, 2.0, A)) {
hasGlauber = true;
if(verboseLevel > 0) G4cout << "### G4UInelasticCrossSection::Initialise for "
<< p->GetParticleName() << G4endl;
G4double csup, csdn;
for(G4int iz=2; iz<93; iz++) {
G4double Z = G4double(iz);
A = nist->GetAtomicMassAmu(iz);
csup = fGlauber->GetInelasticGlauberGribov(&dp, Z, A);
// proton and neutron
if(fNucleon) {
csdn = fNucleon->GetIsoZACrossSection(&dp, Z, A);
// pions
} else if(fUPi) {
csdn = fUPi->GetInelasticCrossSection(&dp, Z, A);
// other
} else if(fGheisha->IsApplicable(&dp, Z, A)) {
csdn = fGheisha->GetInelasticCrossSection(&dp, Z, A);
} else {
csdn = csup;
}
theFac[iz] = csdn/csup;
if(verboseLevel > 0) G4cout << "Z= " << Z << " A= " << A
<< " factor= " << theFac[iz] << G4endl;
}
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -28,7 +28,10 @@
// based on Barashenkov parametrisations of pion data
//
// 16.08.06 V.Ivanchenko - first implementation on base of
// J.P Wellisch class G4PiNuclearCrossSection
// J.P Wellisch class G4PiNuclearCrossSection
// 22.01.07 V.Ivanchenko - add cross section interfaces with Z and A
// 05.03.07 V.Ivanchenko - fix weight for interpolation
// 13.03.07 V.Ivanchenko - cleanup at low energies
//
#include "G4UPiNuclearCrossSection.hh"
@@ -52,7 +55,7 @@ G4UPiNuclearCrossSection::~G4UPiNuclearCrossSection()
}
G4double G4UPiNuclearCrossSection::GetElasticCrossSection(
const G4DynamicParticle* dp, const G4Element* elm)
const G4DynamicParticle* dp, G4double Z, G4double A)
{
G4double cross = 0.0;
G4PhysicsTable* table = 0;
@@ -60,13 +63,12 @@ G4double G4UPiNuclearCrossSection::GetElasticCrossSection(
if(part == piPlus) table = piPlusElastic;
else if(part == piMinus) table = piMinusElastic;
if(table)
cross = Interpolate(elm->GetZ(),elm->GetA(),
dp->GetKineticEnergy(),table);
cross = Interpolate(Z, A, dp->GetKineticEnergy(),table);
return cross;
}
G4double G4UPiNuclearCrossSection::GetInelasticCrossSection(
const G4DynamicParticle* dp, const G4Element* elm)
const G4DynamicParticle* dp, G4double Z, G4double A)
{
G4double cross = 0.0;
G4double fact = 1.0;
@@ -79,7 +81,7 @@ G4double G4UPiNuclearCrossSection::GetInelasticCrossSection(
if(ekin > elowest) {
table = piPlusInelastic;
if(ekin < elow) {
fact = ekin/elow;
fact = std::sqrt((ekin-elowest)/(elow-elowest));
ekin = elow;
}
}
@@ -88,7 +90,7 @@ G4double G4UPiNuclearCrossSection::GetInelasticCrossSection(
if(ekin < elow) ekin = elow;
}
if(table)
cross = fact*Interpolate(elm->GetZ(), elm->GetA(), ekin, table);
cross = fact*Interpolate(Z, A, ekin, table);
return cross;
}
@@ -102,8 +104,14 @@ G4double G4UPiNuclearCrossSection::Interpolate(
G4double x = (((*table)[idx])->GetValue(ekin, b));
// one of elements in the table
if(iz >= theZ[idx]) {
G4double A1 = theA[idx];
x *= std::pow(A/A1,aPower);
// Interpolation between Z
if(iz < theZ[idx]) {
} else {
G4double x2 = x;
G4double x1 = x;
if(idx == 0) {
@@ -117,10 +125,14 @@ G4double G4UPiNuclearCrossSection::Interpolate(
G4double w1 = A - A1;
G4double w2 = A2 - A;
G4double y1 = x1*std::pow(A/A1,aPower);
G4double y2 = x2*std::pow(A/A2,aPower);
x = (w1*y1 + w2*y2)/(w1 + w2);
if(w1 <= 0.0) x = y1;
else {
G4double y2 = x2*std::pow(A/A2,aPower);
if(w2 <= 0.0) x = y2;
else x = (w2*y1 + w1*y2)/(w1 + w2);
}
}
return std::exp(x);
return x;
}
void G4UPiNuclearCrossSection::AddDataSet(const G4String& p,
@@ -132,8 +144,8 @@ void G4UPiNuclearCrossSection::AddDataSet(const G4String& p,
G4LPhysicsFreeVector* pvin = new G4LPhysicsFreeVector(n,e[0]*GeV,e[n-1]*GeV);
G4LPhysicsFreeVector* pvel = new G4LPhysicsFreeVector(n,e[0]*GeV,e[n-1]*GeV);
for(G4int i=0; i<n; i++) {
pvin->PutValues(i,e[i]*GeV,std::log(in[i]*millibarn));
pvel->PutValues(i,e[i]*GeV,std::log((tot[i]-in[i])*millibarn));
pvin->PutValues(i,e[i]*GeV,in[i]*millibarn);
pvel->PutValues(i,e[i]*GeV,std::max(0.0,(tot[i]-in[i])*millibarn));
}
if(p == "pi+") {
piPlusInelastic->push_back(pvin);
@@ -0,0 +1,59 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4VCrossSectionDataSet.cc,v 1.7 2006/12/29 02:05:48 dennis Exp $
//
#include "G4VCrossSectionDataSet.hh"
// Override this method to test for particle and isotope applicability
G4bool
G4VCrossSectionDataSet::IsZAApplicable(const G4DynamicParticle*,
G4double /*ZZ*/, G4double /*AA*/)
{
return true;
}
G4double
G4VCrossSectionDataSet::GetIsoCrossSection(const G4DynamicParticle* aParticle,
const G4Isotope* anIsotope,
G4double aTemperature)
{
G4double ZZ = anIsotope->GetZ();
G4double AA = anIsotope->GetN();
return GetIsoZACrossSection(aParticle, ZZ, AA, aTemperature);
}
// Override this method to get real isotopic cross sections
G4double
G4VCrossSectionDataSet::GetIsoZACrossSection(const G4DynamicParticle*,
G4double /*ZZ*/, G4double AA,
G4double /*aTemperature*/)
{
return 62*std::pow(AA, 2./3.)*millibarn;
}