Import Geant4 8.3.0 source tree
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user