Import Geant4 10.7.0.beta source tree
This commit is contained in:
@@ -86,7 +86,13 @@ G4CrossSectionElastic::GetElementCrossSection(const G4DynamicParticle* p,
|
||||
void G4CrossSectionElastic::BuildPhysicsTable(const G4ParticleDefinition& p)
|
||||
{
|
||||
component->BuildPhysicsTable(p);
|
||||
SetMaxKinEnergy(G4HadronicParameters::Instance()->GetMaxEnergy());
|
||||
// For ions, the max energy of applicability of the cross sections must scale
|
||||
// with the absolute baryonic number; however, the cross sections objects are
|
||||
// often shared between the different types of ions (d, t, He3, alpha, and
|
||||
// genericIon) therefore we scale by Zmax - which is safely larger than the
|
||||
// number of nucleons of the heaviest nuclides.
|
||||
SetMaxKinEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() *
|
||||
( std::abs( p.GetBaryonNumber() ) > 1 ? Zmax : 1 ) );
|
||||
}
|
||||
|
||||
void G4CrossSectionElastic::DumpPhysicsTable(const G4ParticleDefinition& p)
|
||||
|
||||
@@ -86,7 +86,13 @@ G4CrossSectionInelastic::GetElementCrossSection(const G4DynamicParticle* p,
|
||||
void G4CrossSectionInelastic::BuildPhysicsTable(const G4ParticleDefinition& p)
|
||||
{
|
||||
component->BuildPhysicsTable(p);
|
||||
SetMaxKinEnergy(G4HadronicParameters::Instance()->GetMaxEnergy());
|
||||
// For ions, the max energy of applicability of the cross sections must scale
|
||||
// with the absolute baryonic number; however, the cross sections objects are
|
||||
// often shared between the different types of ions (d, t, He3, alpha, and
|
||||
// genericIon) therefore we scale by Zmax - which is safely larger than the
|
||||
// number of nucleons of the heaviest nuclides.
|
||||
SetMaxKinEnergy( G4HadronicParameters::Instance()->GetMaxEnergy() *
|
||||
( std::abs( p.GetBaryonNumber() ) > 1 ? Zmax : 1 ) );
|
||||
}
|
||||
|
||||
void G4CrossSectionInelastic::DumpPhysicsTable(const G4ParticleDefinition& p)
|
||||
|
||||
@@ -0,0 +1,359 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// 24.04.20 V. Grichine
|
||||
//
|
||||
// (nu_e,anti_nu_e)-nucleus xsc
|
||||
|
||||
|
||||
|
||||
#include "G4ElNeutrinoNucleusTotXsc.hh"
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4DynamicParticle.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
#include "G4IonTable.hh"
|
||||
#include "G4HadTmpUtil.hh"
|
||||
#include "G4NistManager.hh"
|
||||
#include "G4Material.hh"
|
||||
#include "G4Element.hh"
|
||||
#include "G4Isotope.hh"
|
||||
#include "G4ElementVector.hh"
|
||||
|
||||
#include "G4Electron.hh"
|
||||
#include "G4Positron.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace CLHEP;
|
||||
|
||||
G4ElNeutrinoNucleusTotXsc::G4ElNeutrinoNucleusTotXsc()
|
||||
: G4VCrossSectionDataSet("NuElNuclTotXsc")
|
||||
{
|
||||
fCofXsc = 1.e-38*cm2/GeV;
|
||||
|
||||
// G4cout<<"fCofXsc = "<<fCofXsc*GeV/cm2<<" cm2/GeV"<<G4endl;
|
||||
|
||||
// PDG2016: sin^2 theta Weinberg
|
||||
|
||||
fSin2tW = 0.23129; // 0.2312;
|
||||
|
||||
// 9 <-> 6, 5/9 or 5/6 ?
|
||||
|
||||
fCofS = 5.*fSin2tW*fSin2tW/9.;
|
||||
fCofL = 1. - fSin2tW + fCofS;
|
||||
|
||||
// G4cout<<"fCosL = "<<fCofL<<", fCofS = "<<fCofS<<G4endl;
|
||||
|
||||
fCutEnergy = 0.; // default value
|
||||
|
||||
fBiasingFactor = 1.; // default as physics
|
||||
|
||||
fIndex = 50;
|
||||
|
||||
fTotXsc = 0.;
|
||||
fCcTotRatio = 0.75; // from nc/cc~0.33 ratio
|
||||
fCcFactor = fNcFactor = 1.;
|
||||
|
||||
theElectron = G4Electron::Electron();
|
||||
thePositron = G4Positron::Positron();
|
||||
}
|
||||
|
||||
G4ElNeutrinoNucleusTotXsc::~G4ElNeutrinoNucleusTotXsc()
|
||||
{}
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
G4bool
|
||||
G4ElNeutrinoNucleusTotXsc::IsIsoApplicable( const G4DynamicParticle* aPart, G4int, G4int, const G4Element*, const G4Material*)
|
||||
{
|
||||
G4bool result = false;
|
||||
G4String pName = aPart->GetDefinition()->GetParticleName();
|
||||
|
||||
if( pName == "nu_e" || pName == "anti_nu_e" )
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//////////////////////////////////////
|
||||
|
||||
G4double G4ElNeutrinoNucleusTotXsc::GetElementCrossSection(const G4DynamicParticle* part,
|
||||
G4int Z, const G4Material* mat )
|
||||
{
|
||||
G4int Zi(0);
|
||||
size_t i(0), j(0);
|
||||
const G4ElementVector* theElementVector = mat->GetElementVector();
|
||||
|
||||
for ( i = 0; i < theElementVector->size(); ++i )
|
||||
{
|
||||
Zi = (*theElementVector)[i]->GetZasInt();
|
||||
if( Zi == Z ) break;
|
||||
}
|
||||
const G4Element* elm = (*theElementVector)[i];
|
||||
size_t nIso = elm->GetNumberOfIsotopes();
|
||||
G4double fact = 0.0;
|
||||
G4double xsec = 0.0;
|
||||
const G4Isotope* iso = nullptr;
|
||||
const G4IsotopeVector* isoVector = elm->GetIsotopeVector();
|
||||
const G4double* abundVector = elm->GetRelativeAbundanceVector();
|
||||
|
||||
for (j = 0; j<nIso; ++j)
|
||||
{
|
||||
iso = (*isoVector)[j];
|
||||
G4int A = iso->GetN();
|
||||
|
||||
if( abundVector[j] > 0.0 && IsIsoApplicable(part, Z, A, elm, mat) )
|
||||
{
|
||||
fact += abundVector[j];
|
||||
xsec += abundVector[j]*GetIsoCrossSection( part, Z, A, iso, elm, mat);
|
||||
}
|
||||
}
|
||||
if( fact > 0.0) { xsec /= fact; }
|
||||
return xsec;
|
||||
}
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
//
|
||||
//
|
||||
|
||||
G4double G4ElNeutrinoNucleusTotXsc::GetIsoCrossSection(const G4DynamicParticle* aPart, G4int, G4int A,
|
||||
const G4Isotope*, const G4Element*, const G4Material* )
|
||||
{
|
||||
fCcFactor = fNcFactor = 1.;
|
||||
fCcTotRatio = 0.25;
|
||||
|
||||
G4double ccnuXsc, ccanuXsc, ncXsc, totXsc(0.);
|
||||
|
||||
G4double energy = aPart->GetTotalEnergy();
|
||||
G4String pName = aPart->GetDefinition()->GetParticleName();
|
||||
|
||||
G4int index = GetEnergyIndex(energy);
|
||||
|
||||
if( index >= fIndex )
|
||||
{
|
||||
G4double pm = proton_mass_c2;
|
||||
G4double s2 = 2.*energy*pm+pm*pm;
|
||||
G4double aa = 1.;
|
||||
G4double bb = 1.085;
|
||||
G4double mw = 80.385*GeV;
|
||||
fCcFactor = bb/(1.+ aa*s2/mw/mw);
|
||||
|
||||
G4double mz = 91.1876*GeV;
|
||||
fNcFactor = bb/(1.+ aa*s2/mz/mz);
|
||||
}
|
||||
ccnuXsc = GetNuElTotCsXsc(index, energy);
|
||||
ccnuXsc *= fCcFactor;
|
||||
ccanuXsc = GetANuElTotCsXsc(index, energy);
|
||||
ccanuXsc *= fCcFactor;
|
||||
|
||||
if( pName == "nu_e")
|
||||
{
|
||||
ncXsc = fCofL*ccnuXsc + fCofS*ccanuXsc;
|
||||
ncXsc *= fNcFactor/fCcFactor;
|
||||
totXsc = ccnuXsc + ncXsc;
|
||||
if( totXsc > 0.) fCcTotRatio = ccnuXsc/totXsc;
|
||||
}
|
||||
else if( pName == "anti_nu_e")
|
||||
{
|
||||
ncXsc = fCofL*ccanuXsc + fCofS*ccnuXsc;
|
||||
ncXsc *= fNcFactor/fCcFactor;
|
||||
totXsc = ccanuXsc + ncXsc;
|
||||
if( totXsc > 0.) fCcTotRatio = ccanuXsc/totXsc;
|
||||
}
|
||||
else return totXsc;
|
||||
|
||||
totXsc *= fCofXsc;
|
||||
totXsc *= energy;
|
||||
totXsc *= A; // incoherent sum over all isotope nucleons
|
||||
|
||||
totXsc *= fBiasingFactor; // biasing up, if set >1
|
||||
|
||||
fTotXsc = totXsc;
|
||||
|
||||
return totXsc;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
//
|
||||
// Return index of nu/anu energy array corresponding to the neutrino energy
|
||||
|
||||
G4int G4ElNeutrinoNucleusTotXsc::GetEnergyIndex(G4double energy)
|
||||
{
|
||||
G4int i, eIndex = 0;
|
||||
|
||||
for( i = 0; i < fIndex; i++)
|
||||
{
|
||||
if( energy <= fNuElEnergy[i]*GeV )
|
||||
{
|
||||
eIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( i >= fIndex-1 ) eIndex = fIndex-1;
|
||||
// G4cout<<"eIndex = "<<eIndex<<G4endl;
|
||||
return eIndex;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
//
|
||||
// nu_e xsc for index-1, index linear over energy
|
||||
|
||||
G4double G4ElNeutrinoNucleusTotXsc::GetNuElTotCsXsc(G4int index, G4double energy)
|
||||
{
|
||||
G4double xsc(0.);
|
||||
|
||||
if( index <= 0 || energy < theElectron->GetPDGMass() ) xsc = fNuElTotXsc[0];
|
||||
else if (index >= fIndex) xsc = fNuElTotXsc[fIndex-1];
|
||||
else
|
||||
{
|
||||
G4double x1 = fNuElEnergy[index-1]*GeV;
|
||||
G4double x2 = fNuElEnergy[index]*GeV;
|
||||
G4double y1 = fNuElTotXsc[index-1];
|
||||
G4double y2 = fNuElTotXsc[index];
|
||||
|
||||
if(x1 >= x2) return fNuElTotXsc[index];
|
||||
else
|
||||
{
|
||||
G4double angle = (y2-y1)/(x2-x1);
|
||||
xsc = y1 + (energy-x1)*angle;
|
||||
}
|
||||
}
|
||||
return xsc;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
//
|
||||
// anu_e xsc for index-1, index linear over energy
|
||||
|
||||
G4double G4ElNeutrinoNucleusTotXsc::GetANuElTotCsXsc(G4int index, G4double energy)
|
||||
{
|
||||
G4double xsc(0.);
|
||||
|
||||
if( index <= 0 || energy < thePositron->GetPDGMass() ) xsc = fANuElTotXsc[0];
|
||||
else if (index >= fIndex) xsc = fANuElTotXsc[fIndex-1];
|
||||
else
|
||||
{
|
||||
G4double x1 = fNuElEnergy[index-1]*GeV;
|
||||
G4double x2 = fNuElEnergy[index]*GeV;
|
||||
G4double y1 = fANuElTotXsc[index-1];
|
||||
G4double y2 = fANuElTotXsc[index];
|
||||
|
||||
if( x1 >= x2 ) return fANuElTotXsc[index];
|
||||
else
|
||||
{
|
||||
G4double angle = (y2-y1)/(x2-x1);
|
||||
xsc = y1 + (energy-x1)*angle;
|
||||
}
|
||||
}
|
||||
return xsc;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
//
|
||||
// return fNuElTotXsc[index] if the index is in the array range
|
||||
|
||||
G4double G4ElNeutrinoNucleusTotXsc::GetNuElTotCsArray( G4int index)
|
||||
{
|
||||
if( index >= 0 && index < fIndex) return fNuElTotXsc[index];
|
||||
else
|
||||
{
|
||||
G4cout<<"Inproper index of fNuElTotXsc array"<<G4endl;
|
||||
return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
//
|
||||
// return fANuElTotXsc[index] if the index is in the array range
|
||||
|
||||
G4double G4ElNeutrinoNucleusTotXsc::GetANuElTotCsArray( G4int index)
|
||||
{
|
||||
if( index >= 0 && index < fIndex) return fANuElTotXsc[index];
|
||||
else
|
||||
{
|
||||
G4cout<<"Inproper index of fANuElTotXsc array"<<G4endl;
|
||||
return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// E_nu in GeV
|
||||
|
||||
const G4double G4ElNeutrinoNucleusTotXsc::fNuElEnergy[50] =
|
||||
{
|
||||
0.000561138, 0.000735091, 0.000962969, 0.00126149, 0.00165255,
|
||||
0.00216484, 0.00283594, 0.00371508, 0.00486676, 0.00637546,
|
||||
0.00835185, 0.0109409, 0.0143326, 0.0187757, 0.0245962,
|
||||
0.032221, 0.0422095, 0.0552945, 0.0724358, 0.0948908,
|
||||
0.124307, 0.162842, 0.213323, 0.279453, 0.366084,
|
||||
0.47957, 0.628237, 0.82299, 1.07812, 1.41233,
|
||||
1.85016, 2.42371, 3.17505, 4.15932, 5.44871,
|
||||
7.13781, 9.35053, 12.2492, 16.0464, 21.0208,
|
||||
27.5373, 36.0739, 47.2568, 61.9064, 81.0973,
|
||||
106.238, 139.171, 182.314, 238.832, 312.869
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// nu_e CC xsc_tot/E_nu, in 10^-38 cm2/GeV
|
||||
|
||||
const G4double G4ElNeutrinoNucleusTotXsc::fNuElTotXsc[50] =
|
||||
{
|
||||
0.0026484, 0.00609503, 0.00939421, 0.0132163, 0.0178983,
|
||||
0.0237692, 0.0312066, 0.0406632, 0.0526867, 0.0679357,
|
||||
0.0871913, 0.111359, 0.141458, 0.178584, 0.223838,
|
||||
0.27822, 0.342461, 0.416865, 0.501361, 0.596739,
|
||||
0.713623, 0.905749, 1.20718, 1.52521, 1.75286,
|
||||
1.82072, 1.67119, 1.50074, 1.3077, 1.14923,
|
||||
1.0577, 0.977911, 0.918526, 0.792889, 0.702282,
|
||||
0.678615, 0.687099, 0.725167, 0.706795, 0.678045,
|
||||
0.649791, 0.651328, 0.651934, 0.658062, 0.660659,
|
||||
0.662534, 0.662601, 0.660261, 0.656724, 0.65212
|
||||
};
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// anu_e CC xsc_tot/E_nu, in 10^-38 cm2/GeV
|
||||
|
||||
const G4double G4ElNeutrinoNucleusTotXsc::fANuElTotXsc[50] =
|
||||
{
|
||||
0.00103385, 0.00237807, 0.00366358, 0.00515192, 0.00697434,
|
||||
0.00925859, 0.0121508, 0.0158252, 0.0204908, 0.0263959,
|
||||
0.0338304, 0.0431234, 0.0546346, 0.068735, 0.0857738,
|
||||
0.106025, 0.129614, 0.15643, 0.186063, 0.21784,
|
||||
0.251065, 0.28525, 0.319171, 0.348995, 0.369448,
|
||||
0.378165, 0.377353, 0.371224, 0.363257, 0.355433,
|
||||
0.348618, 0.343082, 0.338825, 0.33574, 0.333684,
|
||||
0.332504, 0.332052, 0.332187, 0.332781, 0.333716,
|
||||
0.33489, 0.336213, 0.337608, 0.339008, 0.340362,
|
||||
0.341606, 0.342706, 0.343628, 0.344305, 0.344675
|
||||
};
|
||||
@@ -42,75 +42,12 @@
|
||||
#include "G4Pow.hh"
|
||||
#include "G4NuclearRadii.hh"
|
||||
|
||||
#include "G4LambdacPlus.hh"
|
||||
#include "G4AntiLambdacPlus.hh"
|
||||
#include "G4AntiXibZero.hh"
|
||||
#include "G4OmegacZero.hh"
|
||||
#include "G4SigmacZero.hh"
|
||||
#include "G4AntiLambdab.hh"
|
||||
#include "G4AntiSigmabMinus.hh"
|
||||
#include "G4AntiXicPlus.hh"
|
||||
#include "G4AntiLambdacPlus.hh"
|
||||
#include "G4AntiSigmabPlus.hh"
|
||||
#include "G4AntiXicZero.hh"
|
||||
#include "G4AntiSigmabZero.hh"
|
||||
#include "G4XibMinus.hh"
|
||||
#include "G4AntiSigmacPlus.hh"
|
||||
#include "G4XibZero.hh"
|
||||
#include "G4AntiOmegabMinus.hh"
|
||||
#include "G4AntiSigmacPlusPlus.hh"
|
||||
|
||||
#include "G4Lambdab.hh"
|
||||
#include "G4SigmabMinus.hh"
|
||||
#include "G4XicPlus.hh"
|
||||
#include "G4AntiOmegacZero.hh"
|
||||
#include "G4AntiSigmacZero.hh"
|
||||
#include "G4LambdacPlus.hh"
|
||||
#include "G4SigmabPlus.hh"
|
||||
#include "G4XicZero.hh"
|
||||
#include "G4SigmabZero.hh"
|
||||
#include "G4SigmacPlus.hh"
|
||||
#include "G4AntiXibMinus.hh"
|
||||
#include "G4OmegabMinus.hh"
|
||||
#include "G4SigmacPlusPlus.hh"
|
||||
|
||||
#include "G4BMesonZero.hh"
|
||||
#include "G4AntiBMesonZero.hh"
|
||||
#include "G4DMesonZero.hh"
|
||||
#include "G4AntiDMesonZero.hh"
|
||||
#include "G4BsMesonZero.hh"
|
||||
#include "G4AntiBsMesonZero.hh"
|
||||
#include "G4BcMesonPlus.hh"
|
||||
#include "G4BcMesonMinus.hh"
|
||||
#include "G4DsMesonPlus.hh"
|
||||
#include "G4DsMesonMinus.hh"
|
||||
#include "G4Eta.hh"
|
||||
#include "G4EtaPrime.hh"
|
||||
#include "G4Etac.hh"
|
||||
|
||||
#include "G4BMesonPlus.hh"
|
||||
#include "G4BMesonMinus.hh"
|
||||
|
||||
#include "G4DMesonPlus.hh"
|
||||
#include "G4DMesonMinus.hh"
|
||||
|
||||
#include "G4JPsi.hh"
|
||||
#include "G4Upsilon.hh"
|
||||
|
||||
#include "G4Lambda.hh"
|
||||
#include "G4AntiLambda.hh"
|
||||
#include "G4SigmaPlus.hh"
|
||||
#include "G4AntiSigmaPlus.hh"
|
||||
#include "G4SigmaMinus.hh"
|
||||
#include "G4AntiSigmaMinus.hh"
|
||||
#include "G4SigmaZero.hh"
|
||||
#include "G4AntiSigmaZero.hh"
|
||||
#include "G4XiMinus.hh"
|
||||
#include "G4XiZero.hh"
|
||||
#include "G4AntiXiMinus.hh"
|
||||
#include "G4AntiXiZero.hh"
|
||||
#include "G4OmegaMinus.hh"
|
||||
#include "G4AntiOmegaMinus.hh"
|
||||
#include "G4Neutron.hh"
|
||||
#include "G4PionPlus.hh"
|
||||
#include "G4KaonPlus.hh"
|
||||
#include "G4KaonMinus.hh"
|
||||
#include "G4KaonZeroShort.hh"
|
||||
#include "G4KaonZeroLong.hh"
|
||||
|
||||
static const G4double invGeV = 1.0/CLHEP::GeV;
|
||||
static const G4double invGeV2 = 1.0/(CLHEP::GeV*CLHEP::GeV);
|
||||
@@ -120,93 +57,21 @@ static const G4double cofLogE = .0557; // elastic (lnP-minLogP)^2
|
||||
static const G4double cofLogT = .3; // total (lnP-minLogP)^2
|
||||
static const G4double pMin = .1; // fast LE calculation
|
||||
static const G4double pMax = 1000.; // fast HE calculation
|
||||
static const G4double ekinmin = 0.1*CLHEP::MeV; // protection against zero ekin
|
||||
static const G4double ekinmin = 0.1*CLHEP::MeV; // protection against zero ekin
|
||||
static const G4double ekinmaxQB = 100*CLHEP::MeV; // max kinetic energy for Coulomb barrier
|
||||
|
||||
G4HadronNucleonXsc::G4HadronNucleonXsc()
|
||||
: fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0)
|
||||
{
|
||||
fHypTotXscCof = 0.88; // for transformation pp(pn) to hyperon-nucleon
|
||||
|
||||
theGamma = G4Gamma::Gamma();
|
||||
theProton = G4Proton::Proton();
|
||||
theNeutron = G4Neutron::Neutron();
|
||||
theAProton = G4AntiProton::AntiProton();
|
||||
theANeutron = G4AntiNeutron::AntiNeutron();
|
||||
thePiPlus = G4PionPlus::PionPlus();
|
||||
thePiMinus = G4PionMinus::PionMinus();
|
||||
thePiZero = G4PionZero::PionZero();
|
||||
theD = G4Deuteron::Deuteron();
|
||||
theT = G4Triton::Triton();
|
||||
theA = G4Alpha::Alpha();
|
||||
theHe3 = G4He3::He3();
|
||||
|
||||
// strange
|
||||
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();
|
||||
// c- and b- hyperons
|
||||
theLambdaCPlus = G4LambdacPlus::LambdacPlus();
|
||||
theALambdaCPlus = G4AntiLambdacPlus::AntiLambdacPlus();
|
||||
theOmegaC0 = G4OmegacZero::OmegacZero();
|
||||
theAOmegaC0 = G4AntiOmegacZero::AntiOmegacZero();
|
||||
theSigmaCPlus = G4SigmacPlus::SigmacPlus();
|
||||
theASigmaCPlus = G4AntiSigmacPlus::AntiSigmacPlus();
|
||||
theSigmacPP = G4SigmacPlusPlus::SigmacPlusPlus();
|
||||
theASigmacPP = G4AntiSigmacPlusPlus::AntiSigmacPlusPlus();
|
||||
theSigmaC0 = G4SigmacZero::SigmacZero();
|
||||
theASigmaC0 = G4AntiSigmacZero::AntiSigmacZero();
|
||||
theXiCPlus = G4XicPlus::XicPlus();
|
||||
theAXiCPlus = G4AntiXicPlus::AntiXicPlus();
|
||||
theXiC0 = G4XicZero::XicZero();
|
||||
theAXiC0 = G4AntiXicZero::AntiXicZero();
|
||||
theLambdaB = G4Lambdab::Lambdab();
|
||||
theALambdaB = G4AntiLambdab::AntiLambdab();
|
||||
theOmegaBMinus = G4OmegabMinus::OmegabMinus();
|
||||
theAOmegaBMinus = G4AntiOmegabMinus::AntiOmegabMinus();
|
||||
theSigmaBMinus = G4SigmabMinus::SigmabMinus();
|
||||
theASigmaBMinus = G4AntiSigmabMinus::AntiSigmabMinus();
|
||||
theSigmaBPlus = G4SigmabPlus::SigmabPlus();
|
||||
theASigmaBPlus = G4AntiSigmabPlus::AntiSigmabPlus();
|
||||
theSigmaB0 = G4SigmabZero::SigmabZero();
|
||||
theASigmaB0 = G4AntiSigmabZero::AntiSigmabZero();
|
||||
theXiBMinus = G4XibMinus::XibMinus();
|
||||
theAXiBMinus = G4AntiXibMinus::AntiXibMinus();
|
||||
theXiB0 = G4XibZero::XibZero();
|
||||
theAXiB0 = G4AntiXibZero::AntiXibZero();
|
||||
//(s-) c- and b-mesons
|
||||
theBMeson0 = G4BMesonZero::BMesonZero();
|
||||
theABMeson0 = G4AntiBMesonZero::AntiBMesonZero();
|
||||
theDMeson0 = G4DMesonZero::DMesonZero();
|
||||
theADMeson0 = G4AntiDMesonZero::AntiDMesonZero();
|
||||
theBsMeson0 = G4BsMesonZero::BsMesonZero();
|
||||
theABsMeson0 = G4AntiBsMesonZero::AntiBsMesonZero();
|
||||
theBcMesonPlus = G4BcMesonPlus::BcMesonPlus();
|
||||
theBcMesonMinus = G4BcMesonMinus::BcMesonMinus();
|
||||
theDsMesonPlus = G4DsMesonPlus::DsMesonPlus();
|
||||
theDsMesonMinus = G4DsMesonMinus::DsMesonMinus();
|
||||
theDMesonPlus = G4DMesonPlus::DMesonPlus();
|
||||
theDMesonMinus = G4DMesonMinus::DMesonMinus();
|
||||
theBMesonPlus = G4BMesonPlus::BMesonPlus();
|
||||
theBMesonMinus = G4BMesonMinus::BMesonMinus();
|
||||
theEta = G4Eta::Eta();
|
||||
theEtaPrime = G4EtaPrime::EtaPrime();
|
||||
theEtaC = G4Etac::Etac();
|
||||
theJPsi = G4JPsi::JPsi();
|
||||
theUpsilon = G4Upsilon::Upsilon();
|
||||
|
||||
g4calc = G4Pow::GetInstance();
|
||||
}
|
||||
@@ -224,48 +89,53 @@ void G4HadronNucleonXsc::CrossSectionDescription(std::ostream& outFile) const
|
||||
<< "is to be used to build a cross section data set.\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
G4double G4HadronNucleonXsc::HadronNucleonXsc( const G4ParticleDefinition* theParticle,
|
||||
const G4ParticleDefinition* nucleon, G4double ekin)
|
||||
{
|
||||
G4double xsc(0.);
|
||||
G4int pdg = std::abs( theParticle->GetPDGEncoding() );
|
||||
G4int pdg = std::abs(theParticle->GetPDGEncoding());
|
||||
|
||||
if ( pdg == 2212 || pdg == 2112 || pdg == 211 ) // p, n, pi+-
|
||||
{
|
||||
xsc = HadronNucleonXscNS( theParticle, nucleon, ekin);
|
||||
// p, n, pi+-, pbar, nbar
|
||||
if ( pdg == 2212 || pdg == 2112 || pdg == 211 ) {
|
||||
xsc = HadronNucleonXscNS(theParticle, nucleon, ekin);
|
||||
}
|
||||
else if ( pdg == 321 || pdg == 310 || pdg == 130 ) // K+-, K0, Ks
|
||||
else if ( pdg == 22 ) // gamma
|
||||
{
|
||||
xsc = KaonNucleonXscNS( theParticle, nucleon, ekin);
|
||||
xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
|
||||
}
|
||||
else if ( pdg == 3122 || pdg == 3222 || pdg == 3112 || pdg == 3212 || pdg == 3322 || pdg == 3312 || pdg == 3324 ||
|
||||
|
||||
pdg == 4122 || pdg == 4332 || pdg == 4122 || pdg == 4212 || pdg == 4222 || pdg == 4112 || pdg == 4232 || pdg == 4132 ||
|
||||
|
||||
pdg == 5122 || pdg == 5332 || pdg == 5122 || pdg == 5112 || pdg == 5222 || pdg == 5212 || pdg == 5132 || pdg == 5232
|
||||
|
||||
) // heavy s-,c-,b-hyperons
|
||||
else if ( pdg == 321 || pdg == 310 || pdg == 130 ) // K+-, K0L, K0S
|
||||
{
|
||||
xsc = HyperonNucleonXscNS( theParticle, nucleon, ekin);
|
||||
xsc = KaonNucleonXscNS(theParticle, nucleon, ekin);
|
||||
}
|
||||
else if ( pdg == 511 || pdg == 421 || pdg == 531 || pdg == 541 || pdg == 431 || pdg == 411 || pdg == 521 ||
|
||||
|
||||
pdg == 221 || pdg == 331 || pdg == 441 || pdg == 443 || pdg == 543
|
||||
|
||||
) // s-,c-,b-mesons
|
||||
else if (pdg > 3000)
|
||||
{
|
||||
xsc = SCBMesonNucleonXscNS( theParticle, nucleon, ekin);
|
||||
}
|
||||
else
|
||||
{
|
||||
xsc = HadronNucleonXscNS( theParticle, nucleon, ekin);
|
||||
if (pdg == 3122 || pdg == 3222 || pdg == 3112 || pdg == 3212 || pdg == 3322 || pdg == 3312 || pdg == 3324 ||
|
||||
pdg == 4122 || pdg == 4332 || pdg == 4122 || pdg == 4212 || pdg == 4222 || pdg == 4112 || pdg == 4232 || pdg == 4132 ||
|
||||
pdg == 5122 || pdg == 5332 || pdg == 5122 || pdg == 5112 || pdg == 5222 || pdg == 5212 || pdg == 5132 || pdg == 5232
|
||||
) // heavy s-,c-,b-hyperons
|
||||
{
|
||||
xsc = HyperonNucleonXscNS(theParticle, nucleon, ekin);
|
||||
}
|
||||
else
|
||||
{
|
||||
xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
|
||||
}
|
||||
} else if (pdg > 220) {
|
||||
if (pdg == 511 || pdg == 421 || pdg == 531 || pdg == 541 || pdg == 431 || pdg == 411 || pdg == 521 ||
|
||||
pdg == 221 || pdg == 331 || pdg == 441 || pdg == 443 || pdg == 543) // s-,c-,b-mesons
|
||||
{
|
||||
xsc = SCBMesonNucleonXscNS(theParticle, nucleon, ekin);
|
||||
}
|
||||
else
|
||||
{
|
||||
xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
|
||||
}
|
||||
} else {
|
||||
xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
|
||||
}
|
||||
return xsc;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Returns hadron-nucleon Xsc according to PDG parametrisation (2017):
|
||||
@@ -280,8 +150,9 @@ G4double G4HadronNucleonXsc::HadronNucleonXscPDG(
|
||||
static const G4double eta2 = 0.5486;
|
||||
static const G4double H = 0.272;
|
||||
|
||||
G4double mass1 = theParticle->GetPDGMass();
|
||||
if(theParticle == theGamma) { mass1 = 770.; }
|
||||
G4int pdg = theParticle->GetPDGEncoding();
|
||||
|
||||
G4double mass1 = (pdg == 22) ? 770. : theParticle->GetPDGMass();
|
||||
G4double mass2 = nucleon->GetPDGMass();
|
||||
|
||||
G4double sMand = CalcMandelstamS(ekin, mass1, mass2)*invGeV2;
|
||||
@@ -323,7 +194,8 @@ G4double G4HadronNucleonXsc::HadronNucleonXscPDG(
|
||||
R2 = -7.394;
|
||||
}
|
||||
}
|
||||
else if(theParticle == theAProton)
|
||||
// pbar
|
||||
else if(pdg == -2212)
|
||||
{
|
||||
if ( neutron )
|
||||
{
|
||||
@@ -338,7 +210,8 @@ G4double G4HadronNucleonXsc::HadronNucleonXscPDG(
|
||||
R2 = 7.394;
|
||||
}
|
||||
}
|
||||
else if(theParticle == theANeutron)
|
||||
// nbar
|
||||
else if(pdg == -2112)
|
||||
{
|
||||
if ( proton )
|
||||
{
|
||||
@@ -353,13 +226,15 @@ G4double G4HadronNucleonXsc::HadronNucleonXscPDG(
|
||||
R2 = 7.394;
|
||||
}
|
||||
}
|
||||
else if(theParticle == thePiPlus)
|
||||
// pi+
|
||||
else if(pdg == 211)
|
||||
{
|
||||
P = 18.75;
|
||||
R1 = 9.56;
|
||||
R2 = -1.767;
|
||||
}
|
||||
else if(theParticle == thePiMinus)
|
||||
// pi-
|
||||
else if(pdg == -211)
|
||||
{
|
||||
P = 18.75;
|
||||
R1 = 9.56;
|
||||
@@ -401,19 +276,20 @@ G4double G4HadronNucleonXsc::HadronNucleonXscPDG(
|
||||
R1 = 2.5;
|
||||
R2 = 0.;
|
||||
}
|
||||
else if(theParticle == theSMinus)
|
||||
// sigma-
|
||||
else if(pdg == 3112)
|
||||
{
|
||||
P = 34.7;
|
||||
R1 = -46.;
|
||||
R2 = 48.;
|
||||
}
|
||||
else if(theParticle == theGamma) // modify later on
|
||||
// gamma
|
||||
else if(pdg == 22) // modify later on
|
||||
{
|
||||
del= 0.003063;
|
||||
P = 34.71*del;
|
||||
R1 = (neutron) ? 0.0231 : 0.0139;
|
||||
R2 = 0.;
|
||||
|
||||
}
|
||||
else // as proton ???
|
||||
{
|
||||
@@ -435,7 +311,7 @@ G4double G4HadronNucleonXsc::HadronNucleonXscPDG(
|
||||
fInelasticXsc = 0.75*fTotalXsc;
|
||||
fElasticXsc = fTotalXsc - fInelasticXsc;
|
||||
|
||||
if( proton && theParticle->GetPDGCharge() > 0. && ekin < 100*MeV)
|
||||
if( proton && theParticle->GetPDGCharge() > 0. && ekin < ekinmaxQB )
|
||||
{
|
||||
G4double cB = CoulombBarrier(theParticle, nucleon, ekin);
|
||||
fTotalXsc *= cB;
|
||||
@@ -462,12 +338,13 @@ G4double G4HadronNucleonXsc::HadronNucleonXscNS(
|
||||
const G4ParticleDefinition* nucleon, G4double ekin0)
|
||||
{
|
||||
const G4double ekin = std::max(ekin0, ekinmin);
|
||||
G4int pdg = theParticle->GetPDGEncoding();
|
||||
/*
|
||||
G4cout<< "HadronNucleonXscNS: Ekin(GeV)= " << ekin/GeV << " "
|
||||
<< theParticle->GetParticleName() << " + "
|
||||
<< nucleon->GetParticleName() << G4endl;
|
||||
*/
|
||||
if(theParticle == theAProton || theParticle == theANeutron) {
|
||||
if(pdg == -2212 || pdg == -2112) {
|
||||
return HadronNucleonXscPDG(theParticle, nucleon, ekin);
|
||||
}
|
||||
|
||||
@@ -629,8 +506,7 @@ G4double G4HadronNucleonXsc::HadronNucleonXscNS(
|
||||
}
|
||||
}
|
||||
// pi+ p; pi- n
|
||||
else if((theParticle == thePiPlus && proton) ||
|
||||
(theParticle == thePiMinus && neutron))
|
||||
else if((pdg == 211 && proton) || (pdg == -211 && neutron))
|
||||
{
|
||||
if( pLab < 0.28 )
|
||||
{
|
||||
@@ -686,8 +562,7 @@ G4double G4HadronNucleonXsc::HadronNucleonXscNS(
|
||||
}
|
||||
}
|
||||
// pi+ n; pi- p
|
||||
else if((theParticle == thePiPlus && neutron) ||
|
||||
(theParticle == thePiMinus && proton))
|
||||
else if((pdg == 211 && neutron) || (pdg == -211 && proton))
|
||||
{
|
||||
if( pLab < 0.28 )
|
||||
{
|
||||
@@ -878,7 +753,7 @@ G4double G4HadronNucleonXsc::HadronNucleonXscNS(
|
||||
fElasticXsc *= CLHEP::millibarn;
|
||||
fElasticXsc = std::min(fElasticXsc, fTotalXsc);
|
||||
|
||||
if( proton && theParticle->GetPDGCharge() > 0. && ekin < 100*MeV)
|
||||
if( proton && theParticle->GetPDGCharge() > 0. && ekin < ekinmaxQB )
|
||||
{
|
||||
G4double cB = G4NuclearRadii::CoulombFactor(theParticle, nucleon, ekin);
|
||||
fTotalXsc *= cB;
|
||||
@@ -935,15 +810,29 @@ G4double G4HadronNucleonXsc::KaonNucleonXscNS(
|
||||
HadronNucleonXscNS(theParticle, nucleon, ekin);
|
||||
|
||||
} else if(theParticle == theK0S || theParticle == theK0L) {
|
||||
G4double stot = HadronNucleonXscNS(theKMinus, nucleon, ekin);
|
||||
G4double sel = fElasticXsc;
|
||||
G4double sinel = fInelasticXsc;
|
||||
stot += HadronNucleonXscNS(theKPlus, nucleon, ekin);
|
||||
sel += fElasticXsc;
|
||||
sinel += fInelasticXsc;
|
||||
fTotalXsc = stot*0.5;
|
||||
fElasticXsc = sel*0.5;
|
||||
fInelasticXsc = sinel*0.5;
|
||||
G4double fact = 0.5;
|
||||
G4double stot = 0.0;
|
||||
G4double sel = 0.0;
|
||||
G4double sinel= 0.0;
|
||||
if(ekin > ekinmaxQB) {
|
||||
stot = HadronNucleonXscNS(theKMinus, nucleon, ekin);
|
||||
sel = fElasticXsc;
|
||||
sinel = fInelasticXsc;
|
||||
stot += HadronNucleonXscNS(theKPlus, nucleon, ekin);
|
||||
sel += fElasticXsc;
|
||||
sinel += fInelasticXsc;
|
||||
} else {
|
||||
fact *= std::sqrt(ekinmaxQB/std::max(ekin, ekinmin));
|
||||
stot = HadronNucleonXscNS(theKMinus, nucleon, ekinmaxQB);
|
||||
sel = fElasticXsc;
|
||||
sinel = fInelasticXsc;
|
||||
stot += HadronNucleonXscNS(theKPlus, nucleon, ekinmaxQB);
|
||||
sel += fElasticXsc;
|
||||
sinel += fInelasticXsc;
|
||||
}
|
||||
fTotalXsc = stot*fact;
|
||||
fElasticXsc = sel*fact;
|
||||
fInelasticXsc = sinel*fact;
|
||||
}
|
||||
return fTotalXsc;
|
||||
}
|
||||
@@ -1106,66 +995,52 @@ G4double G4HadronNucleonXsc::HyperonNucleonXscNS(
|
||||
const G4ParticleDefinition* nucleon, G4double ekin)
|
||||
{
|
||||
G4double coeff = 1.0;
|
||||
|
||||
static const G4double lBarCof1S = 0.88;
|
||||
static const G4double lBarCof2S = 0.76;
|
||||
static const G4double lBarCof3S = 0.64;
|
||||
static const G4double lBarCof1C = 0.784378;
|
||||
static const G4double lBarCofSC = 0.664378;
|
||||
static const G4double lBarCof2SC = 0.544378;
|
||||
static const G4double lBarCof1B = 0.740659;
|
||||
static const G4double lBarCofSB = 0.620659;
|
||||
static const G4double lBarCof2SB = 0.500659;
|
||||
|
||||
if( theParticle == theL || theParticle == theSPlus ||
|
||||
theParticle == theSMinus || theParticle == theS0 ||
|
||||
theParticle == theAntiL || theParticle == theASPlus ||
|
||||
theParticle == theASMinus || theParticle == theAS0 )
|
||||
G4int pdg = std::abs(theParticle->GetPDGEncoding());
|
||||
|
||||
// lambda, sigma+-0 and anti-hyperons
|
||||
if( pdg == 3122 || pdg == 3112 || pdg == 3212 || pdg == 3222 )
|
||||
{
|
||||
coeff = lBarCof1S;
|
||||
|
||||
} else if( theParticle == theXiMinus || theParticle == theXi0 ||
|
||||
theParticle == theAXiMinus || theParticle == theAXi0 )
|
||||
coeff = 0.88;
|
||||
}
|
||||
// Xi hyperons and anti-hyperons
|
||||
else if( pdg == 3312 || pdg == 3322 )
|
||||
{
|
||||
coeff = lBarCof2S;
|
||||
coeff = 0.76;
|
||||
}
|
||||
else if( theParticle == theOmega || theParticle == theAOmega)
|
||||
// omega, anti_omega
|
||||
else if( pdg == 3334 )
|
||||
{
|
||||
coeff = lBarCof3S;
|
||||
coeff = 0.64;
|
||||
}
|
||||
else if( theParticle == theLambdaCPlus || theParticle == theALambdaCPlus ||
|
||||
theParticle == theSigmaCPlus || theParticle == theASigmaCPlus ||
|
||||
theParticle == theSigmacPP || theParticle == theASigmacPP ||
|
||||
theParticle == theSigmaC0 || theParticle == theASigmaC0
|
||||
)
|
||||
// lambdaC, sigmaC+-0 and anti-hyperonsC
|
||||
else if( pdg == 4122 || pdg == 4112 || pdg == 4212 || pdg == 4222 )
|
||||
{
|
||||
coeff = lBarCof1C;
|
||||
coeff = 0.784378;
|
||||
}
|
||||
else if( theParticle == theOmegaC0 || theParticle == theAOmegaC0 )
|
||||
// omegaC0, anti_omegaC0
|
||||
else if( pdg == 4332 )
|
||||
{
|
||||
coeff = lBarCof2SC;
|
||||
coeff = 0.544378;
|
||||
}
|
||||
else if( theParticle == theXiCPlus || theParticle == theXiC0 ||
|
||||
theParticle == theAXiCPlus || theParticle == theAXiC0)
|
||||
// XiC+0 and anti-hyperonC
|
||||
else if( pdg == 4132 || pdg == 4232 )
|
||||
{
|
||||
coeff = lBarCofSC;
|
||||
coeff = 0.664378;
|
||||
}
|
||||
else if( theParticle == theLambdaB || theParticle == theALambdaB ||
|
||||
theParticle == theSigmaBPlus || theParticle == theASigmaBPlus ||
|
||||
theParticle == theSigmaBMinus || theParticle == theASigmaBMinus ||
|
||||
theParticle == theSigmaB0 || theParticle == theASigmaB0
|
||||
)
|
||||
// lambdaB, sigmaB+-0 and anti-hyperonsB
|
||||
else if( pdg == 5122 || pdg == 5112 || pdg == 5212 || pdg == 5222 )
|
||||
{
|
||||
coeff = lBarCof1B;
|
||||
coeff = 0.740659;
|
||||
}
|
||||
else if( theParticle == theOmegaBMinus || theParticle == theAOmegaBMinus)
|
||||
// omegaB0, anti_omegaB0
|
||||
else if( pdg == 5332 )
|
||||
{
|
||||
coeff = lBarCof2SB;
|
||||
coeff = 0.500659;
|
||||
}
|
||||
else if( theParticle == theXiBMinus || theParticle == theXiB0 ||
|
||||
theParticle == theAXiBMinus || theParticle == theAXiB0)
|
||||
// XiB+0 and anti-hyperonB
|
||||
else if( pdg == 5132 || pdg == 5232 )
|
||||
{
|
||||
coeff = lBarCofSB;
|
||||
coeff = 0.620659;
|
||||
}
|
||||
fTotalXsc = coeff*HadronNucleonXscNS( theProton, nucleon, ekin);
|
||||
fInelasticXsc *= coeff;
|
||||
@@ -1183,64 +1058,54 @@ G4double G4HadronNucleonXsc::SCBMesonNucleonXscNS(
|
||||
const G4ParticleDefinition* nucleon, G4double ekin )
|
||||
{
|
||||
G4double coeff(1.0);
|
||||
// static const G4double lMesCof1S = 0.82; // Kp/piP
|
||||
static const G4double llMesCof1C = 0.676568;
|
||||
static const G4double llMesCof1B = 0.610989;
|
||||
static const G4double llMesCof2C = 0.353135;
|
||||
static const G4double llMesCof2B = 0.221978;
|
||||
static const G4double llMesCofSC = 0.496568;
|
||||
static const G4double llMesCofSB = 0.430989;
|
||||
static const G4double llMesCofCB = 0.287557;
|
||||
static const G4double llMesCofEtaP = 0.88;
|
||||
static const G4double llMesCofEta = 0.76;
|
||||
G4int pdg = std::abs(theParticle->GetPDGEncoding());
|
||||
|
||||
if( theParticle == theBMeson0 || theParticle == theABMeson0 ||
|
||||
theParticle == theBMesonPlus || theParticle == theBMesonMinus )
|
||||
// B+-0 anti
|
||||
if( pdg == 511 || pdg == 521 )
|
||||
{
|
||||
coeff = llMesCof1B;
|
||||
coeff = 0.610989;
|
||||
}
|
||||
else if(theParticle == theDMeson0 || theParticle == theADMeson0 ||
|
||||
theParticle == theDMesonPlus || theParticle == theDMesonMinus )
|
||||
// D+-0 anti
|
||||
else if( pdg == 411 || pdg == 421 )
|
||||
{
|
||||
coeff = llMesCof1C;
|
||||
coeff = 0.676568;
|
||||
}
|
||||
else if(theParticle == theBsMeson0 || theParticle == theABsMeson0 )
|
||||
// Bs, antiBs
|
||||
else if( pdg == 531 )
|
||||
{
|
||||
coeff = llMesCofSB;
|
||||
coeff = 0.430989;
|
||||
}
|
||||
else if(theParticle == theBcMesonPlus || theParticle == theBcMesonMinus )
|
||||
// Bc+-
|
||||
else if( pdg == 541 )
|
||||
{
|
||||
coeff = llMesCofCB;
|
||||
coeff = 0.287557;
|
||||
}
|
||||
else if(theParticle == theDsMesonPlus || theParticle == theDsMesonMinus )
|
||||
// Ds+-
|
||||
else if( pdg == 431 )
|
||||
{
|
||||
coeff = llMesCofSC;
|
||||
coeff = 0.496568;
|
||||
}
|
||||
else if(theParticle == theBMesonPlus || theParticle == theBMesonMinus )
|
||||
// etaC, J/Psi
|
||||
else if( pdg == 441 || pdg == 443 )
|
||||
{
|
||||
coeff = llMesCof1B;
|
||||
coeff = 0.353135;
|
||||
}
|
||||
else if(theParticle == theDMesonPlus || theParticle == theDMesonMinus )
|
||||
// Upsilon
|
||||
else if( pdg == 553 )
|
||||
{
|
||||
coeff = llMesCof1C;
|
||||
coeff = 0.221978;
|
||||
}
|
||||
else if(theParticle == theEtaC || theParticle == theJPsi )
|
||||
// eta
|
||||
else if( pdg == 221 )
|
||||
{
|
||||
coeff = llMesCof2C;
|
||||
coeff = 0.76;
|
||||
}
|
||||
else if(theParticle == theUpsilon )
|
||||
// eta'
|
||||
else if( pdg == 331 )
|
||||
{
|
||||
coeff = llMesCof2B;
|
||||
coeff = 0.88;
|
||||
}
|
||||
else if(theParticle == theEta )
|
||||
{
|
||||
coeff = llMesCofEta;
|
||||
}
|
||||
else if(theParticle == theEtaPrime )
|
||||
{
|
||||
coeff = llMesCofEtaP;
|
||||
}
|
||||
fTotalXsc = coeff*HadronNucleonXscNS( thePiPlus, nucleon, ekin);
|
||||
fTotalXsc = coeff*HadronNucleonXscNS(thePiPlus, nucleon, ekin);
|
||||
fElasticXsc *= coeff;
|
||||
fInelasticXsc *= coeff;
|
||||
return fTotalXsc;
|
||||
@@ -1404,6 +1269,7 @@ G4double G4HadronNucleonXsc::HadronNucleonXscEL(
|
||||
const G4ParticleDefinition* theParticle,
|
||||
const G4ParticleDefinition*, G4double ekin)
|
||||
{
|
||||
G4int pdg = theParticle->GetPDGEncoding();
|
||||
G4double xsection(0.);
|
||||
static const G4double targ_mass =
|
||||
0.5*(CLHEP::proton_mass_c2 + CLHEP::neutron_mass_c2);
|
||||
@@ -1413,7 +1279,7 @@ G4double G4HadronNucleonXsc::HadronNucleonXscEL(
|
||||
G4double x1 = G4Exp(G4Log(sMand)*0.0808);
|
||||
G4double x2 = G4Exp(G4Log(-sMand)*0.4525);
|
||||
|
||||
if(theParticle == theGamma)
|
||||
if(pdg == 22)
|
||||
{
|
||||
xsection = 0.0677*x1 + 0.129*x2;
|
||||
}
|
||||
@@ -1425,7 +1291,8 @@ G4double G4HadronNucleonXsc::HadronNucleonXscEL(
|
||||
{
|
||||
xsection = 21.70*x1 + 56.08*x2;
|
||||
}
|
||||
else if(theParticle == theAProton)
|
||||
// pbar
|
||||
else if(pdg == -2212)
|
||||
{
|
||||
xsection = 21.70*x1 + 98.39*x2;
|
||||
}
|
||||
@@ -1433,7 +1300,8 @@ G4double G4HadronNucleonXsc::HadronNucleonXscEL(
|
||||
{
|
||||
xsection = 13.63*x1 + 27.56*x2;
|
||||
}
|
||||
else if(theParticle == thePiMinus)
|
||||
// pi-
|
||||
else if(pdg == -211)
|
||||
{
|
||||
xsection = 13.63*x1 + 36.02*x2;
|
||||
}
|
||||
@@ -1469,9 +1337,9 @@ G4HadronNucleonXsc::CoulombBarrier(const G4ParticleDefinition* theParticle,
|
||||
G4double tR = 0.895*CLHEP::fermi;
|
||||
G4double pR = 0.5*CLHEP::fermi;
|
||||
|
||||
if ( theParticle == theProton ) pR = 0.895*fermi;
|
||||
else if( theParticle == thePiPlus ) pR = 0.663*fermi;
|
||||
else if( theParticle == theKPlus ) pR = 0.340*fermi;
|
||||
if ( theParticle == theProton ) pR = 0.895*CLHEP::fermi;
|
||||
else if( theParticle == thePiPlus ) pR = 0.663*CLHEP::fermi;
|
||||
else if( theParticle == theKPlus ) pR = 0.340*CLHEP::fermi;
|
||||
|
||||
G4double pZ = theParticle->GetPDGCharge();
|
||||
G4double tZ = nucleon->GetPDGCharge();
|
||||
@@ -1497,4 +1365,3 @@ G4HadronNucleonXsc::CoulombBarrier(const G4ParticleDefinition* theParticle,
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -1493,8 +1493,10 @@ static const G4double* SH[nHA]={
|
||||
// Bug 2092 fix (ejc3) Init deuteron_GDR ptr to null
|
||||
G4PhotoNuclearCrossSection::G4PhotoNuclearCrossSection()
|
||||
: G4VCrossSectionDataSet(Default_Name()), lastZ(0), lastSig(0), lastGDR(0),
|
||||
lastHEN(0), lastE(0), lastTH(0), lastSP(0), deuteron_GDR(0), deuteron_HR(0),
|
||||
deuteron_TH(0), deuteron_SP(0),
|
||||
lastHEN(0), lastE(0), lastTH(0), lastSP(0),
|
||||
deuteron_GDR(0), deuteron_HR(0), deuteron_TH(0), deuteron_SP(0),
|
||||
triton_GDR(0), triton_HR(0), triton_TH(0), triton_SP(0),
|
||||
he3_GDR(0), he3_HR(0), he3_TH(0), he3_SP(0),
|
||||
mNeut(G4NucleiProperties::GetNuclearMass(1,0)),
|
||||
mProt(G4NucleiProperties::GetNuclearMass(1,1))
|
||||
{
|
||||
@@ -1532,15 +1534,17 @@ G4PhotoNuclearCrossSection::CrossSectionDescription(std::ostream& outFile) const
|
||||
}
|
||||
|
||||
|
||||
// Method added to fix Bug 2092 (ejc3)
|
||||
// Allow D, T, 3He targets
|
||||
G4bool
|
||||
G4PhotoNuclearCrossSection::IsIsoApplicable(const G4DynamicParticle*,
|
||||
G4int Z, G4int A,
|
||||
const G4Element*,
|
||||
const G4Material*)
|
||||
{
|
||||
// explicitly allow deuterium
|
||||
if (Z == 1 && A == 2) return true;
|
||||
// explicitly allow deuterium and tritium
|
||||
// if (Z == 1 && (A == 2 || A == 3) ) return true;
|
||||
if ((Z == 1 && A == 2) || (Z == 1 && A == 3) ||
|
||||
(Z == 2 && A == 3) ) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1552,7 +1556,8 @@ G4PhotoNuclearCrossSection::IsElementApplicable(const G4DynamicParticle* /*parti
|
||||
return true;
|
||||
}
|
||||
|
||||
// Method added to fix Bug 2092 (ejc3)
|
||||
|
||||
// Get cross sections for deuterium, tritium and 3He only
|
||||
G4double
|
||||
G4PhotoNuclearCrossSection::GetIsoCrossSection(const G4DynamicParticle* aPart,
|
||||
G4int Z, G4int A,
|
||||
@@ -1560,42 +1565,80 @@ G4PhotoNuclearCrossSection::GetIsoCrossSection(const G4DynamicParticle* aPart,
|
||||
const G4Element*,
|
||||
const G4Material* mat)
|
||||
{
|
||||
// if not deuterium, go back to old style
|
||||
if (!(Z == 1 && A == 2)) return GetElementCrossSection(aPart, Z, mat);
|
||||
|
||||
// Otherwise, follow a similar routine
|
||||
const G4double Energy = aPart->GetKineticEnergy()/MeV;
|
||||
if (Energy < THmin) return 0.;
|
||||
G4double sigma = 0.;
|
||||
|
||||
// init the XS table if need be
|
||||
if (deuteron_GDR == NULL) {
|
||||
deuteron_TH = ThresholdEnergy(1,1); // threshold calculation is correct
|
||||
deuteron_GDR = new G4double[nL]; // direct copies
|
||||
for (G4int i = 0 ; i < nL ; i++) deuteron_GDR[i] = SL[0][i]; // A = 2 -> SL0
|
||||
deuteron_HR = new G4double[nH];
|
||||
for (G4int i = 0 ; i < nH ; i++) deuteron_HR[i] = SH[1][i]; // A = 2 -> SH1
|
||||
deuteron_SP = 1; // as would be assigned for proton
|
||||
G4double sigma;
|
||||
G4double lE;
|
||||
if (Z == 1 && A == 2) {
|
||||
// init the XS table if need be
|
||||
if (deuteron_GDR == NULL) {
|
||||
deuteron_TH = ThresholdEnergy(1,1); // threshold calculation is correct
|
||||
deuteron_GDR = new G4double[nL]; // direct copies
|
||||
for (G4int i = 0 ; i < nL ; i++) deuteron_GDR[i] = SL[0][i]; // A = 2 -> SL0
|
||||
deuteron_HR = new G4double[nH];
|
||||
for (G4int i = 0 ; i < nH ; i++) deuteron_HR[i] = SH[1][i]; // A = 2 -> SH1
|
||||
deuteron_SP = 1; // as would be assigned for proton
|
||||
}
|
||||
if (Energy < deuteron_TH) {
|
||||
sigma = 0.;
|
||||
} else if (Energy < Emin) { // GDR region (approximated in E, not in lnE)
|
||||
sigma = EquLinearFit(Energy,nL,THmin,dE,deuteron_GDR);
|
||||
} else if (Energy < Emax) { // High Energy region
|
||||
lE = G4Log(Energy);
|
||||
sigma = EquLinearFit(lE,nH,milE,dlE,deuteron_HR);
|
||||
} else { // Very high energy region
|
||||
lE = G4Log(Energy);
|
||||
sigma = deuteron_SP*(poc*(lE-pos)+shd*std::exp(-reg*lE));
|
||||
}
|
||||
|
||||
} else if (Z == 1 && A == 3) {
|
||||
if (triton_GDR == NULL) {
|
||||
triton_TH = ThresholdEnergy(1,2);
|
||||
triton_GDR = new G4double[nL]; // same as for deuteron since no A = 3 entry
|
||||
for (G4int i = 0 ; i < nL ; i++) triton_GDR[i] = SL[0][i]; // A = 3 -> SL0
|
||||
triton_HR = new G4double[nH];
|
||||
for (G4int i = 0 ; i < nH ; i++) triton_HR[i] = SH[2][i]; // A = 3 -> SH2
|
||||
triton_SP = 1;
|
||||
}
|
||||
if (Energy < triton_TH) {
|
||||
sigma = 0.;
|
||||
} else if (Energy < Emin) { // GDR region
|
||||
sigma = EquLinearFit(Energy,nL,THmin,dE,triton_GDR);
|
||||
} else if (Energy < Emax) { // High Energy region
|
||||
lE = G4Log(Energy);
|
||||
sigma = EquLinearFit(lE,nH,milE,dlE,triton_HR);
|
||||
} else {
|
||||
lE = G4Log(Energy);
|
||||
sigma = triton_SP*(poc*(lE-pos)+shd*std::exp(-reg*lE));
|
||||
}
|
||||
|
||||
} else if (Z == 2 && A == 3) {
|
||||
if (he3_GDR == NULL) {
|
||||
he3_TH = ThresholdEnergy(2,1);
|
||||
he3_GDR = new G4double[nL]; // same as for deuteron since no A = 3 entry
|
||||
for (G4int i = 0 ; i < nL ; i++) he3_GDR[i] = SL[0][i]; // A = 3 -> SL0
|
||||
he3_HR = new G4double[nH];
|
||||
for (G4int i = 0 ; i < nH ; i++) he3_HR[i] = SH[2][i]; // A = 3 -> SH2
|
||||
he3_SP = 2;
|
||||
}
|
||||
if (Energy < he3_TH) {
|
||||
sigma = 0.;
|
||||
} else if (Energy < Emin) { // GDR region
|
||||
sigma = EquLinearFit(Energy,nL,THmin,dE,he3_GDR);
|
||||
} else if (Energy < Emax) { // High Energy region
|
||||
lE = G4Log(Energy);
|
||||
sigma = EquLinearFit(lE,nH,milE,dlE,he3_HR);
|
||||
} else {
|
||||
lE = G4Log(Energy);
|
||||
sigma = he3_SP*(poc*(lE-pos)+shd*std::exp(-reg*lE));
|
||||
}
|
||||
|
||||
} else {
|
||||
return GetElementCrossSection(aPart, Z, mat);
|
||||
}
|
||||
|
||||
// =================== now the "magic" formula ===================
|
||||
if (Energy < deuteron_TH) {
|
||||
return 0.;
|
||||
|
||||
} else if (Energy < Emin) { // GDR region (approximated in E, not in lnE)
|
||||
sigma = EquLinearFit(Energy,nL,THmin,dE,deuteron_GDR);
|
||||
|
||||
} else if (Energy < Emax) { // High Energy region
|
||||
G4double lE = G4Log(Energy);
|
||||
sigma = EquLinearFit(lE,nH,milE,dlE,deuteron_HR);
|
||||
|
||||
} else { // UHE region (calculation, but not so frequent)
|
||||
G4double lE = G4Log(Energy);
|
||||
sigma = deuteron_SP*(poc*(lE-pos)+shd*std::exp(-reg*lE));
|
||||
}
|
||||
// End of "sigma" calculation
|
||||
|
||||
if(sigma < 0.) return 0.;
|
||||
if(sigma < 0.) sigma = 0.;
|
||||
return sigma*millibarn;
|
||||
}
|
||||
|
||||
@@ -1675,37 +1718,39 @@ G4PhotoNuclearCrossSection::GetElementCrossSection(const G4DynamicParticle* aPar
|
||||
return sigma*millibarn;
|
||||
}
|
||||
|
||||
// Gives the threshold energy for different nuclei (min of p- and n-threshold)
|
||||
// Threshold energy for nuclei: explicitly calculated for p, D, T, 3He,
|
||||
// min of p- and n-threshold for heavier targets
|
||||
G4double G4PhotoNuclearCrossSection::ThresholdEnergy(G4int Z, G4int N)
|
||||
{
|
||||
// ---------
|
||||
|
||||
G4int A=Z+N;
|
||||
if(A<1) return infEn;
|
||||
else if(A==1) return 134.9766; // Pi0 threshold for the nucleon
|
||||
|
||||
G4double mT= 0.;
|
||||
if(G4NucleiProperties::IsInStableTable(A,Z))
|
||||
mT=G4NucleiProperties::GetNuclearMass(A,Z);
|
||||
else
|
||||
{
|
||||
return infEn;
|
||||
}
|
||||
// ---------
|
||||
G4double mP= infEn;
|
||||
|
||||
if(Z && G4NucleiProperties::IsInStableTable(A-1,Z-1))
|
||||
{
|
||||
mP = G4NucleiProperties::GetNuclearMass(A-1,Z-1);
|
||||
}
|
||||
G4double mN= infEn;
|
||||
if(N&&G4NucleiProperties::IsInStableTable(A-1,Z))
|
||||
mN=G4NucleiProperties::GetNuclearMass(A-1,Z);
|
||||
|
||||
G4double dP= mP+mProt-mT;
|
||||
G4double dN= mN+mNeut-mT;
|
||||
if(dP<dN)dN=dP;
|
||||
return dN;
|
||||
G4int A = Z + N;
|
||||
if (A < 1) return infEn;
|
||||
|
||||
// Thresholds for p, d, t, 3He in lab frame
|
||||
else if (A == 1) return 144.6821; // pi0 production
|
||||
else if (Z == 1 && N == 1) return 2.2263; // disintegration
|
||||
else if (Z == 1 && N == 2) return 6.2650; // n separation
|
||||
else if (Z == 2 && N == 1) return 5.4994; // p separation
|
||||
|
||||
G4double mT = 0.;
|
||||
if (G4NucleiProperties::IsInStableTable(A,Z) ) {
|
||||
mT = G4NucleiProperties::GetNuclearMass(A,Z);
|
||||
} else {
|
||||
return infEn;
|
||||
}
|
||||
|
||||
G4double mP = infEn;
|
||||
if (Z && G4NucleiProperties::IsInStableTable(A-1,Z-1) ) {
|
||||
mP = G4NucleiProperties::GetNuclearMass(A-1,Z-1);
|
||||
}
|
||||
G4double mN = infEn;
|
||||
if (N && G4NucleiProperties::IsInStableTable(A-1,Z) ) {
|
||||
mN = G4NucleiProperties::GetNuclearMass(A-1,Z);
|
||||
}
|
||||
|
||||
G4double dP = mP + mProt - mT;
|
||||
G4double dN = mN + mNeut - mT;
|
||||
if (dP < dN) dN = dP;
|
||||
return dN;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user