Files
geant4/source/processes/hadronic/models/coherent_elastic/src/G4hhElastic.cc
T
2016-12-09 12:35:28 +01:00

716 lines
22 KiB
C++

//
// ********************************************************************
// * 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: G4hhElastic.cc,v 1.5 2010-11-09 09:04:29 grichine Exp $
// GEANT4 tag $Name: not supported by cvs2svn $
//
//
// Physics model class G4hhElastic
//
//
// G4 Model: qQ hadron hadron elastic scattering with 4-momentum balance
//
// 02.05.2014 V. Grichine 1-st version
//
#include "G4hhElastic.hh"
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"
#include "G4IonTable.hh"
#include "G4NucleiProperties.hh"
#include "Randomize.hh"
#include "G4Integrator.hh"
#include "globals.hh"
#include "G4PhysicalConstants.hh"
#include "G4SystemOfUnits.hh"
#include "G4Proton.hh"
#include "G4Neutron.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
#include "G4Element.hh"
#include "G4ElementTable.hh"
#include "G4PhysicsTable.hh"
#include "G4PhysicsLogVector.hh"
#include "G4PhysicsFreeVector.hh"
#include "G4HadronNucleonXsc.hh"
#include "G4Pow.hh"
using namespace std;
/////////////////////////////////////////////////////////////////////////
//
// Tracking constructor. Target is proton
G4hhElastic::G4hhElastic()
: G4HadronElastic("HadrHadrElastic")
{
SetMinEnergy( 1.*GeV );
SetMaxEnergy( 10000.*TeV );
verboseLevel = 0;
lowEnergyRecoilLimit = 100.*keV;
lowEnergyLimitQ = 0.0*GeV;
lowEnergyLimitHE = 0.0*GeV;
lowestEnergyLimit= 0.0*keV;
plabLowLimit = 20.0*MeV;
fRhoReIm=fSigmaTot=fOptRatio=fSpp=fPcms=0.0;
fInTkin=0;
theProton = G4Proton::Proton();
theNeutron = G4Neutron::Neutron();
thePionPlus = G4PionPlus::PionPlus();
thePionMinus= G4PionMinus::PionMinus();
fTarget = G4Proton::Proton();
fProjectile = 0;
fHadrNuclXsc = new G4HadronNucleonXsc();
fEnergyBin = 200;
fBinT = 514; // 514; // 500; // 200;
fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
fTableT = 0;
fOldTkin = 0.;
SetParameters();
Initialise();
}
/////////////////////////////////////////////////////////////////////////
//
// test constructor
G4hhElastic::G4hhElastic( G4ParticleDefinition* target, G4ParticleDefinition* projectile, G4double plab)
: G4HadronElastic("HadrHadrElastic")
{
SetMinEnergy( 1.*GeV );
SetMaxEnergy( 10000.*TeV );
verboseLevel = 0;
lowEnergyRecoilLimit = 100.*keV;
lowEnergyLimitQ = 0.0*GeV;
lowEnergyLimitHE = 0.0*GeV;
lowestEnergyLimit = 0.0*keV;
plabLowLimit = 20.0*MeV;
fRhoReIm=fSigmaTot=fOptRatio=fSpp=fPcms=0.0;
fInTkin=0;
theProton = G4Proton::Proton();
theNeutron = G4Neutron::Neutron();
thePionPlus = G4PionPlus::PionPlus();
thePionMinus= G4PionMinus::PionMinus();
fTarget = target;
fProjectile = projectile;
fMassTarg = fTarget->GetPDGMass();
fMassProj = fProjectile->GetPDGMass();
fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
fHadrNuclXsc = new G4HadronNucleonXsc();
fEnergyBin = 200;
fBinT = 514; // 200;
fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
fTableT = 0;
fOldTkin = 0.;
SetParameters();
SetParametersCMS( plab);
}
/////////////////////////////////////////////////////////////////////////
//
// constructor used for low mass diffraction
G4hhElastic::G4hhElastic( G4ParticleDefinition* target, G4ParticleDefinition* projectile)
: G4HadronElastic("HadrHadrElastic")
{
SetMinEnergy( 1.*GeV );
SetMaxEnergy( 10000.*TeV );
verboseLevel = 0;
lowEnergyRecoilLimit = 100.*keV;
lowEnergyLimitQ = 0.0*GeV;
lowEnergyLimitHE = 0.0*GeV;
lowestEnergyLimit= 0.0*keV;
plabLowLimit = 20.0*MeV;
fRhoReIm=fSigmaTot=fOptRatio=fSpp=fPcms=0.0;
fInTkin=0;
fTarget = target; // later vmg
fProjectile = projectile;
theProton = G4Proton::Proton();
theNeutron = G4Neutron::Neutron();
thePionPlus = G4PionPlus::PionPlus();
thePionMinus= G4PionMinus::PionMinus();
fTarget = G4Proton::Proton(); // later vmg
fMassTarg = fTarget->GetPDGMass();
fMassProj = fProjectile->GetPDGMass();
fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
fHadrNuclXsc = new G4HadronNucleonXsc();
fEnergyBin = 200;
fBinT = 514; // 514; // 500; // 200;
fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
fTableT = 0;
fOldTkin = 0.;
SetParameters();
}
//////////////////////////////////////////////////////////////////////////////
//
// Destructor
G4hhElastic::~G4hhElastic()
{
if ( fEnergyVector ) {
delete fEnergyVector;
fEnergyVector = 0;
}
for ( std::vector<G4PhysicsTable*>::iterator it = fBankT.begin();
it != fBankT.end(); ++it ) {
if ( (*it) ) (*it)->clearAndDestroy();
delete *it;
*it = 0;
}
fTableT = 0;
if(fHadrNuclXsc) delete fHadrNuclXsc;
}
/////////////////////////////////////////////////////////////////////////////
///////////////////// Table preparation and reading ////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// Initialisation for given particle on the proton target
void G4hhElastic::Initialise()
{
// pp,pn
fProjectile = G4Proton::Proton();
BuildTableT(fTarget, fProjectile);
fBankT.push_back(fTableT); // 0
// pi+-p
fProjectile = G4PionPlus::PionPlus();
BuildTableT(fTarget, fProjectile);
fBankT.push_back(fTableT); // 1
//K+-p
fProjectile = G4KaonPlus::KaonPlus();
BuildTableT(fTarget, fProjectile);
fBankT.push_back(fTableT); // 2
}
///////////////////////////////////////////////////////////////////////////////
//
// Build for given particle and proton table of momentum transfers.
void G4hhElastic::BuildTableT( G4ParticleDefinition* target, G4ParticleDefinition* projectile) // , G4double plab)
{
G4int iTkin, jTransfer;
G4double plab, Tkin, tMax;
G4double t1, t2, dt, delta = 0., sum = 0.;
fTarget = target;
fProjectile = projectile;
fMassTarg = fTarget->GetPDGMass();
fMassProj = fProjectile->GetPDGMass();
fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
G4Integrator<G4hhElastic,G4double(G4hhElastic::*)(G4double)> integral;
// G4HadronNucleonXsc* hnXsc = new G4HadronNucleonXsc();
fTableT = new G4PhysicsTable(fEnergyBin);
for( iTkin = 0; iTkin < fEnergyBin; iTkin++)
{
Tkin = fEnergyVector->GetLowEdgeEnergy(iTkin);
plab = std::sqrt( Tkin*( Tkin + 2*fMassProj ) );
// G4DynamicParticle* theDynamicParticle = new G4DynamicParticle(projectile,
// G4ParticleMomentum(0.,0.,1.),
// Tkin);
// fSigmaTot = fHadrNuclXsc->GetHadronNucleonXscNS( theDynamicParticle, target );
SetParametersCMS( plab );
tMax = 4.*fPcms*fPcms;
if( tMax > 15.*GeV*GeV ) tMax = 15.*GeV*GeV; // Check vs. energy ???
G4PhysicsFreeVector* vectorT = new G4PhysicsFreeVector(fBinT-1);
sum = 0.;
dt = tMax/fBinT;
// for(j = 1; j < fBinT; j++)
for( jTransfer = fBinT-1; jTransfer >= 1; jTransfer--)
{
t1 = dt*(jTransfer-1);
t2 = t1 + dt;
if( fMassProj > 900.*MeV ) // pp, pn
{
delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123, t1, t2);
// delta = integral.Legendre96(this, &G4hhElastic::GetdsdtF123, t1, t2);
}
else // pi+-p, K+-p
{
delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123qQgG, t1, t2);
// delta = integral.Legendre96(this, &G4hhElastic::GetdsdtF123qQgG, t1, t2);
}
sum += delta;
vectorT->PutValue( jTransfer-1, t1, sum ); // t2
}
// vectorT->PutValue( fBinT-1, dt*(fBinT-1), 0. ); // t2
fTableT->insertAt( iTkin, vectorT );
// delete theDynamicParticle;
}
// delete hnXsc;
return;
}
////////////////////////////////////////////////////////////////////////////
//
// Return inv momentum transfer -t > 0 from initialisation table
G4double G4hhElastic::SampleInvariantT( const G4ParticleDefinition* aParticle, G4double p,
G4int, G4int )
{
G4int iTkin, iTransfer;
G4double t, t2, position, m1 = aParticle->GetPDGMass();
G4double Tkin = std::sqrt(m1*m1+p*p) - m1;
if( aParticle == G4Proton::Proton() || aParticle == G4Neutron::Neutron() )
{
fTableT = fBankT[0];
}
if( aParticle == G4PionPlus::PionPlus() || aParticle == G4PionMinus::PionMinus() )
{
fTableT = fBankT[1];
}
if( aParticle == G4KaonPlus::KaonPlus() || aParticle == G4KaonMinus::KaonMinus() )
{
fTableT = fBankT[2];
}
G4double delta = std::abs(Tkin - fOldTkin)/(Tkin + fOldTkin);
G4double deltaMax = 1.e-2;
if ( delta < deltaMax ) iTkin = fInTkin;
else
{
for( iTkin = 0; iTkin < fEnergyBin; iTkin++)
{
if( Tkin < fEnergyVector->GetLowEdgeEnergy(iTkin) ) break;
}
}
if ( iTkin >= fEnergyBin ) iTkin = fEnergyBin-1; // Tkin is more then theMaxEnergy
if ( iTkin < 0 ) iTkin = 0; // against negative index, Tkin < theMinEnergy
fOldTkin = Tkin;
fInTkin = iTkin;
if (iTkin == fEnergyBin -1 || iTkin == 0 ) // the table edges
{
position = (*(*fTableT)(iTkin))(0)*G4UniformRand();
// G4cout<<"position = "<<position<<G4endl;
for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
{
if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
}
if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
// G4cout<<"iTransfer = "<<iTransfer<<G4endl;
t = GetTransfer(iTkin, iTransfer, position);
// G4cout<<"t = "<<t<<G4endl;
}
else // Tkin inside between energy table edges
{
// position = (*(*fTableT)(iTkin))(fBinT-2)*G4UniformRand();
position = (*(*fTableT)(iTkin))(0)*G4UniformRand();
// G4cout<<"position = "<<position<<G4endl;
for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
{
// if( position < (*(*fTableT)(iTkin))(iTransfer) ) break;
if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
}
if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
// G4cout<<"iTransfer = "<<iTransfer<<G4endl;
t2 = GetTransfer(iTkin, iTransfer, position);
return t2;
/*
G4double t1, E1, E2, W, W1, W2;
// G4cout<<"t2 = "<<t2<<G4endl;
E2 = fEnergyVector->GetLowEdgeEnergy(iTkin);
// G4cout<<"E2 = "<<E2<<G4endl;
iTkin--;
// position = (*(*fTableT)(iTkin))(fBinT-2)*G4UniformRand();
// G4cout<<"position = "<<position<<G4endl;
for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
{
// if( position < (*(*fTableT)(iTkin))(iTransfer) ) break;
if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
}
if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
t1 = GetTransfer(iTkin, iTransfer, position);
// G4cout<<"t1 = "<<t1<<G4endl;
E1 = fEnergyVector->GetLowEdgeEnergy(iTkin);
// G4cout<<"E1 = "<<E1<<G4endl;
W = 1.0/(E2 - E1);
W1 = (E2 - Tkin)*W;
W2 = (Tkin - E1)*W;
t = W1*t1 + W2*t2;
*/
}
return t;
}
////////////////////////////////////////////////////////////////////////////
//
// Return inv momentum transfer -t > 0 from initialisation table
G4double G4hhElastic::SampleBisectionalT( const G4ParticleDefinition* aParticle, G4double p)
{
G4int iTkin, iTransfer;
G4double t, position, m1 = aParticle->GetPDGMass();
G4double Tkin = std::sqrt(m1*m1+p*p) - m1;
if( aParticle == G4Proton::Proton() || aParticle == G4Neutron::Neutron() )
{
fTableT = fBankT[0];
}
if( aParticle == G4PionPlus::PionPlus() || aParticle == G4PionMinus::PionMinus() )
{
fTableT = fBankT[1];
}
if( aParticle == G4KaonPlus::KaonPlus() || aParticle == G4KaonMinus::KaonMinus() )
{
fTableT = fBankT[2];
}
G4double delta = std::abs(Tkin - fOldTkin)/(Tkin + fOldTkin);
G4double deltaMax = 1.e-2;
if ( delta < deltaMax ) iTkin = fInTkin;
else
{
for( iTkin = 0; iTkin < fEnergyBin; iTkin++ )
{
if( Tkin < fEnergyVector->GetLowEdgeEnergy(iTkin) ) break;
}
}
if ( iTkin >= fEnergyBin ) iTkin = fEnergyBin-1; // Tkin is more then theMaxEnergy
if ( iTkin < 0 ) iTkin = 0; // against negative index, Tkin < theMinEnergy
fOldTkin = Tkin;
fInTkin = iTkin;
if (iTkin == fEnergyBin -1 || iTkin == 0 ) // the table edges
{
position = (*(*fTableT)(iTkin))(0)*G4UniformRand();
for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
{
if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
}
if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
t = GetTransfer(iTkin, iTransfer, position);
}
else // Tkin inside between energy table edges
{
G4double rand = G4UniformRand();
position = (*(*fTableT)(iTkin))(0)*rand;
//
// (*fTableT)(iTkin)->GetLowEdgeEnergy(fBinT-2);
G4int sTransfer = 0, fTransfer = fBinT - 2, dTransfer = fTransfer - sTransfer;
G4double y2;
for( iTransfer = 0; iTransfer < fBinT - 1; iTransfer++ )
{
// dTransfer %= 2;
dTransfer /= 2;
// dTransfer *= 0.5;
y2 = (*(*fTableT)(iTkin))( sTransfer + dTransfer );
if( y2 > position ) sTransfer += dTransfer;
// if( dTransfer <= 1 ) break;
if( dTransfer < 1 ) break;
}
t = (*fTableT)(iTkin)->GetLowEdgeEnergy(sTransfer); // +(-0.5+rand)*(*fTableT)(iTkin)->GetLowEdgeEnergy(3);
}
return t;
}
///////////////////////////////////////////////////////////////////////////////
//
// Build for given particle and proton table of momentum transfers.
void G4hhElastic::BuildTableTest( G4ParticleDefinition* target, G4ParticleDefinition* projectile, G4double plab)
{
G4int jTransfer;
G4double tMax; // , sQq, sQG;
G4double t1, t2, dt, delta = 0., sum = 0. ; // , threshold;
fTarget = target;
fProjectile = projectile;
fMassTarg = fTarget->GetPDGMass();
fMassProj = fProjectile->GetPDGMass();
fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
fSpp = fMassProj*fMassProj + fMassTarg*fMassTarg + 2.*fMassTarg*std::sqrt(plab*plab + fMassProj*fMassProj);
fPcms = std::sqrt( (fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
G4cout<<"fMassTarg = "<<fMassTarg<<" MeV; fMassProj = "<<fMassProj<<" MeV"<<G4endl;
tMax = 4.*fPcms*fPcms;
if( tMax > 15.*GeV*GeV ) tMax = 15.*GeV*GeV; // Check vs. energy ???
G4Integrator<G4hhElastic,G4double(G4hhElastic::*)(G4double)> integral;
fTableT = new G4PhysicsTable(1);
G4PhysicsFreeVector* vectorT = new G4PhysicsFreeVector(fBinT-1);
sum = 0.;
dt = tMax/G4double(fBinT);
G4cout<<"s = "<<std::sqrt(fSpp)/GeV<<" GeV; fPcms = "<<fPcms/GeV
<<" GeV; qMax = "<<tMax/GeV/GeV<<" GeV2; dt = "<<dt/GeV/GeV<<" GeV2"<<G4endl;
// G4cout<<"fRA = "<<fRA*GeV<<"; fRB = "<<fRB*GeV<<G4endl;
// for(jTransfer = 1; jTransfer < fBinT; jTransfer++)
for( jTransfer = fBinT-1; jTransfer >= 1; jTransfer-- )
{
t1 = dt*(jTransfer-1);
t2 = t1 + dt;
if( fMassProj > 900.*MeV ) // pp, pn
{
delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123, t1, t2);
// threshold = integral.Legendre96(this, &G4hhElastic::GetdsdtF123, t1, tMax);
}
else // pi+-p, K+-p
{
delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123qQgG, t1, t2);
// threshold = integral.Legendre96(this, &G4hhElastic::GetdsdtF123qQgG, t1, tMax);
// delta = integral.Legendre96(this, &G4hhElastic::GetdsdtF123, t1, t2);
}
sum += delta;
// G4cout<<delta<<"\t"<<sum<<"\t"<<threshold<<G4endl;
// sQq = GetdsdtF123(q1);
// sQG = GetdsdtF123qQgG(q1);
// G4cout<<q1/GeV<<"\t"<<sQG*GeV*GeV/millibarn<<"\t"<<sQq*GeV*GeV/millibarn<<G4endl;
// G4cout<<"sum = "<<sum<<", ";
vectorT->PutValue( jTransfer-1, t1, sum ); // t2
}
// vectorT->PutValue( fBinT-1, dt*(fBinT-1), 0. ); // t2
fTableT->insertAt( 0, vectorT );
fBankT.push_back( fTableT ); // 0
// for(jTransfer = 0; jTransfer < fBinT-1; jTransfer++)
// G4cout<<(*(*fTableT)(0))(jTransfer)/sum<<"\t\t"<<G4Pow::GetInstance()->powN(2.,-jTransfer)<<G4endl;
return;
}
////////////////////////////////////////////////////////////////////////////
//
// Return inv momentum transfer -t > 0 from initialisation table
G4double G4hhElastic::SampleTest(G4double tMin ) // const G4ParticleDefinition* aParticle, )
{
G4int iTkin, iTransfer, iTmin;
G4double t, position;
// G4double qMin = std::sqrt(tMin);
fTableT = fBankT[0];
iTkin = 0;
for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
{
// if( qMin <= (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer) ) break;
if( tMin <= (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer) ) break;
}
iTmin = iTransfer-1;
if(iTmin < 0 ) iTmin = 0;
position = (*(*fTableT)(iTkin))(iTmin)*G4UniformRand();
for( iTmin = 0; iTransfer < fBinT-1; iTransfer++)
{
if( position > (*(*fTableT)(iTkin))(iTransfer) ) break;
}
if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
t = GetTransfer(iTkin, iTransfer, position);
return t;
}
/////////////////////////////////////////////////////////////////////////////////
//
// Check with PAI sampling
G4double
G4hhElastic:: GetTransfer( G4int iTkin, G4int iTransfer, G4double position )
{
G4double x1, x2, y1, y2, randTransfer, delta, mean, epsilon = 1.e-6;
if( iTransfer == 0 )
{
randTransfer = (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer);
// iTransfer++;
}
else
{
if ( iTransfer >= G4int((*fTableT)(iTkin)->GetVectorLength()) )
{
iTransfer = (*fTableT)(iTkin)->GetVectorLength() - 1;
}
y1 = (*(*fTableT)(iTkin))(iTransfer-1);
y2 = (*(*fTableT)(iTkin))(iTransfer);
x1 = (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer-1);
x2 = (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer);
delta = y2 - y1;
mean = y2 + y1;
if ( x1 == x2 ) randTransfer = x2;
else
{
// if ( y1 == y2 )
if ( delta < epsilon*mean )
randTransfer = x1 + ( x2 - x1 )*G4UniformRand();
else randTransfer = x1 + ( position - y1 )*( x2 - x1 )/delta; // ( y2 - y1 );
}
}
return randTransfer;
}
const G4double G4hhElastic::theNuclNuclData[18][6] =
{
// sqrt(fSpp) in GeV, fRA in 1/GeV, fRB in 1/GeV, fBq, fBQ, fImCof
{ 2.76754, 4.8, 4.8, 0.05, 0.742441, 10.5 }, // pp 3GeV/c
{ 3.07744, 5.4, 5.4, 0.02, 0.83818, 6.5 }, // pp 4GeV/c
{ 3.36305, 5.2, 5.2, 0.02, 0.838893, 7.5 }, // np 5GeV/c
{ 4.32941, 6, 6, 0.03, 0.769389, 7.5 }, // np 9 GeV/c
{ 4.62126, 6, 6, 0.03, 0.770111, 6.5 }, // pp 10.4 GeV/c
{ 5.47416, 4.5, 4.5, 0.03, 0.813185, 7.5 }, // np 15 GeV/c
{ 6.15088, 6.5, 6.5, 0.02, 0.799539, 6.5 }, // pp 19.2 GeV/c
{ 6.77474, 5.2, 5.2, 0.03, 0.784901, 7.5 }, // np 23.5 GeV/c
{ 9.77775, 7, 7, 0.03, 0.742531, 6.5 }, // pp 50 GeV/c
// {9.77775, 7, 7, 0.011, 0.84419, 4.5 }, // pp 50 GeV/c
{ 10.4728, 5.2, 5.2, 0.03, 0.780439, 7.5 }, // np 57.5 GeV/c
{ 13.7631, 7, 7, 0.008, 0.8664, 5.0 }, // pp 100 GeV/c
{ 19.4184, 6.8, 6.8, 0.009, 0.861337, 2.5 }, // pp 200 GeV/c
{ 23.5, 6.8, 6.8, 0.007, 0.878112, 1.5 }, // pp 23.5 GeV
// {24.1362, 6.4, 6.4, 0.09, 0.576215, 7.5 }, // np 309.5 GeV/c
{ 24.1362, 7.2, 7.2, 0.008, 0.864745, 5.5 },
{ 52.8, 6.8, 6.8, 0.008, 0.871929, 1.5 }, // pp 58.2 GeV
{ 546, 7.4, 7.4, 0.013, 0.845877, 5.5 }, // pb-p 546 GeV
{ 1960, 7.8, 7.8, 0.022, 0.809062, 7.5 }, // pb-p 1960 GeV
{ 7000, 8, 8, 0.024, 0.820441, 5.5 } // pp TOTEM
};
//////////////////////////////////////////////////////////////////////////////////
const G4double G4hhElastic::thePiKaNuclData[8][6] =
{
// sqrt(fSpp) in GeV, fRA in 1/GeV, fRB in 1/GeV, fBq, fBQ, fImCof
{ 2.5627, 3.8, 3.3, 0.22, 0.222, 1.5 }, // pipp 3.017 GeV/c
{ 2.93928, 4.3, 3.8, 0.2, 0.250601, 1.3 }, // pipp 4.122 GeV/c
{ 3.22326, 4.8, 4.3, 0.13, 0.32751, 2.5 }, // pipp 5.055 GeV/c
{ 7.80704, 5.5, 5, 0.13, 0.340631, 2.5 }, // pipp 32 GeV/c
{ 9.7328, 5, 4.5, 0.05, 0.416319, 5.5 }, // pipp 50 GeV/c
{ 13.7315, 5.3, 4.8, 0.05, 0.418426, 5.5 }, // pipp 100 GeV/c
{ 16.6359, 6.3, 5.8, 0.05, 0.423817, 5.5 }, // pipp 147 GeV/c
{ 19.3961, 5, 4.5, 0.05, 0.413477, 3.5 } // pimp 200 GeV/c
};
//
//
/////////////////////////////////////////////////////////////////////////////////