Files
geant4/source/processes/hadronic/util/src/G4LightMedia.cc
T
2016-06-08 15:55:53 +02:00

1244 lines
45 KiB
C++

// This code implementation is the intellectual property of
// the GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4LightMedia.cc,v 1.2 1999/12/15 14:53:40 gunter Exp $
// GEANT4 tag $Name: geant4-03-00 $
//
// Hadronic Process: Light Media Charge and/or Strangeness Exchange
// J.L. Chuma, TRIUMF, 21-Feb-1997
// Last modified: 13-Mar-1997
#include "G4LightMedia.hh"
#include "Randomize.hh"
G4DynamicParticle *
G4LightMedia::PionPlusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus & targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aPiZero = G4PionZero::PionZero();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aNeutron ) {
// for pi+ n reactions, change some of the elastic cross section to pi0 p
const G4double cech[] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.10,0.09,0.07};
G4int iplab = G4int(G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*5.0 ));
if( G4UniformRand() > cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( aPiZero );
// targetParticle->SetDefinition( aProton );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::PionMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::KaonPlusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aKaonZS = G4KaonZeroShort::KaonZeroShort();
G4ParticleDefinition* aKaonZL = G4KaonZeroLong::KaonZeroLong();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aNeutron ) {
// for k+ n reactions, change some of the elastic cross section to k0 p
const G4double cech[] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.10,0.09,0.07};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*5.0 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
if( G4UniformRand() < 0.5 )
resultant->SetDefinition( aKaonZS );
else
resultant->SetDefinition( aKaonZL );
// targetParticle->SetDefinition( aProton );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::KaonZeroShortExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aKaonPlus = G4KaonPlus::KaonPlus();
G4ParticleDefinition* aKaonZL = G4KaonZeroLong::KaonZeroLong();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aProton ) {
// for k0 p reactions, change some of the elastic cross section to k+ n
const G4double cech[] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.10,0.09,0.07};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*5.0 ) );
if( G4UniformRand() > cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( aKaonPlus );
// targetParticle->SetDefinition( aNeutron );
delete targetParticle;
return resultant;
}
} else {
if( G4UniformRand() >= 0.5 ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( aKaonZL );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::KaonZeroLongExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aKaonZS = G4KaonZeroShort::KaonZeroShort();
if( G4UniformRand() >= 0.5 ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( aKaonZS );
return resultant;
}
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::KaonMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::ProtonExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aNeutron ) {
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aProton );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiProtonExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* anAntiNeutron = G4AntiNeutron::AntiNeutron();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aProton ) {
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.};
G4int iplab = G4int( incidentParticle->GetTotalMomentum()/GeV*10.0 );
if( iplab > 9 )iplab = G4int( incidentParticle->GetTotalMomentum()/GeV ) + 9;
if( iplab > 19 )iplab = 19;
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.75) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( anAntiNeutron );
// targetParticle->SetDefinition( aNeutron );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::NeutronExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aProton ) {
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() > cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aNeutron );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiNeutronExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* anAntiProton = G4AntiProton::AntiProton();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
if( targetParticle->GetDefinition() == aNeutron ) {
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4std::min( 9, G4int( incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.75) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
resultant->SetDefinition( anAntiProton );
// targetParticle->SetDefinition( aProton );
delete targetParticle;
return resultant;
}
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::LambdaExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aSigmaPlus = G4SigmaPlus::SigmaPlus();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
G4int irn = G4int( G4UniformRand()/0.2 );
if( targetParticle->GetDefinition() == aNeutron ) {
// LN --> S0 N, LN --> S- P, LN --> N L, LN --> N S0, LN --> P S-
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aProton );
break;
case 2:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aSigmaZero );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aSigmaMinus );
break;
}
} else { // target particle is a proton
// LP --> S+ N, LP --> S0 P, LP --> P L, LP --> P S0, LP --> N S+
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aNeutron );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
break;
case 2:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aSigmaZero );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aSigmaPlus );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiLambdaExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* anAntiSigmaPlus = G4AntiSigmaPlus::AntiSigmaPlus();
G4ParticleDefinition* anAntiSigmaMinus = G4AntiSigmaMinus::AntiSigmaMinus();
G4ParticleDefinition* anAntiSigmaZero = G4AntiSigmaZero::AntiSigmaZero();
G4ParticleDefinition* anAntiLambda = G4AntiLambda::AntiLambda();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
G4int irn = G4int( G4UniformRand()/0.2 );
if( targetParticle->GetDefinition() == aNeutron ) {
// LB N --> S+B P, LB N --> S0B N, LB N --> N LB,
// LB N --> N S0B, LB N --> P S+B
switch( irn ) {
case 0:
resultant->SetDefinition( anAntiSigmaPlus );
// targetParticle->SetDefinition( aProton );
break;
case 1:
resultant->SetDefinition( anAntiSigmaZero );
break;
case 2:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiLambda );
break;
case 3:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiSigmaZero );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiSigmaPlus );
break;
}
} else { // target particle is a proton
// LB P --> S0B P, LB P --> S-B N, LB P --> P LB,
// LB P --> P S0B, LB P --> N S-B
switch( irn ) {
case 0:
resultant->SetDefinition( anAntiSigmaZero );
break;
case 1:
resultant->SetDefinition( anAntiSigmaMinus );
// targetParticle->SetDefinition( aNeutron );
break;
case 2:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiLambda );
break;
case 3:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiSigmaZero );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiSigmaMinus );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::SigmaPlusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaPlus = G4SigmaPlus::SigmaPlus();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
// introduce charge and strangeness exchange reactions
G4int irn = G4int( G4UniformRand()/0.2 );
if( targetParticle->GetDefinition() == aNeutron ) {
// S+ N --> S0 P, S+ N --> L P, S+ N --> N S+, S+ N --> P S0, S+ N --> P L
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aProton );
break;
case 1:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aProton );
break;
case 2:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aSigmaPlus );
break;
case 3:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aSigmaZero );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aLambda );
break;
}
} else { // target particle is a proton
// S+ P --> P S+
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aSigmaPlus );
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::SigmaMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
// introduce charge and strangeness exchange reactions
G4int irn = G4int( G4UniformRand()/0.2 );
if( targetParticle->GetDefinition() == aNeutron ) {
// S- N --> N S-
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aSigmaMinus );
} else { // target particle is a proton
// S+ N --> S0 P, S+ N --> L P, S+ N --> N S+, S+ N --> P S0, S+ N --> P L
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aNeutron );
break;
case 1:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aNeutron );
break;
case 2:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 3:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aSigmaZero );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aLambda );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiSigmaPlusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* anAntiLambda = G4AntiLambda::AntiLambda();
G4ParticleDefinition* anAntiSigmaZero = G4AntiSigmaZero::AntiSigmaZero();
G4ParticleDefinition* anAntiSigmaPlus = G4AntiSigmaPlus::AntiSigmaPlus();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
G4int irn = G4int( G4UniformRand()/0.2 );
if( targetParticle->GetDefinition() == aNeutron ) {
// S+B N --> N S+B
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiSigmaPlus );
} else { // target particle is a proton
// S+ N --> S0 P, S+ N --> L P, S+ N --> N S+, S+ N --> P S0, S+ N --> P L
switch( irn ) {
case 0:
resultant->SetDefinition( anAntiLambda );
// targetParticle->SetDefinition( aNeutron );
break;
case 1:
resultant->SetDefinition( anAntiSigmaZero );
// targetParticle->SetDefinition( aNeutron );
break;
case 2:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiLambda );
break;
case 3:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiSigmaZero );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiLambda );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiSigmaMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* anAntiLambda = G4AntiLambda::AntiLambda();
G4ParticleDefinition* anAntiSigmaZero = G4AntiSigmaZero::AntiSigmaZero();
G4ParticleDefinition* anAntiSigmaMinus = G4AntiSigmaMinus::AntiSigmaMinus();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
G4int irn = G4int( G4UniformRand()/0.2 );
if( targetParticle->GetDefinition() == aNeutron ) {
// S-B N --> LB P, S-B N --> S0B P, S-B N --> N S-B,
// S-B N --> P LB, S-B N --> P S0B
switch( irn ) {
case 0:
resultant->SetDefinition( anAntiLambda );
// targetParticle->SetDefinition( aProton );
break;
case 1:
resultant->SetDefinition( anAntiSigmaZero );
// targetParticle->SetDefinition( aProton );
break;
case 2:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anAntiSigmaMinus );
break;
case 3:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiLambda );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiSigmaZero );
break;
}
} else { // target particle is a proton
// S-B P --> P S-B
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anAntiSigmaMinus );
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::XiZeroExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aSigmaPlus = G4SigmaPlus::SigmaPlus();
G4ParticleDefinition* aXiMinus = G4XiMinus::XiMinus();
G4ParticleDefinition* aXiZero = G4XiZero::XiZero();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
if( targetParticle->GetDefinition() == aNeutron ) {
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aLambda );
break;
case 2:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aProton );
break;
case 3:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aXiMinus );
break;
case 4:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 5:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aSigmaPlus );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aXiZero );
break;
}
} else { // target particle is a proton
G4int irn = G4int( G4UniformRand()*5.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaPlus );
break;
case 2:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aSigmaPlus );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aXiZero );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::XiMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aXiMinus = G4XiMinus::XiMinus();
G4ParticleDefinition* aXiZero = G4XiZero::XiZero();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
if( targetParticle->GetDefinition() == aNeutron ) {
G4int irn = G4int( G4UniformRand()*5.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aXiMinus );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 2:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aSigmaMinus );
break;
default:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aLambda );
break;
}
} else { // target particle is a proton
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aNeutron );
break;
case 1:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aXiZero );
break;
case 2:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aLambda );
break;
case 4:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aLambda );
break;
case 5:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aSigmaZero );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aXiMinus );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiXiZeroExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
// NOTE: The FORTRAN version of the cascade, CASAXO, simply called the
// routine for the XiZero particle. Hence, the Exchange function
// below is just a copy of the Exchange from the XiZero particle
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aSigmaPlus = G4SigmaPlus::SigmaPlus();
G4ParticleDefinition* aXiMinus = G4XiMinus::XiMinus();
G4ParticleDefinition* aXiZero = G4XiZero::XiZero();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
if( targetParticle->GetDefinition() == aNeutron ) {
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aLambda );
break;
case 2:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aProton );
break;
case 3:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aXiMinus );
break;
case 4:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 5:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aSigmaPlus );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aXiZero );
break;
}
} else { // target particle is a proton
G4int irn = G4int( G4UniformRand()*5.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaPlus );
break;
case 2:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aSigmaPlus );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aXiZero );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiXiMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
// NOTE: The FORTRAN version of the cascade, CASAXM, simply called the
// routine for the XiMinus particle. Hence, the Exchange function
// below is just a copy of the Exchange from the XiMinus particle
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aXiMinus = G4XiMinus::XiMinus();
G4ParticleDefinition* aXiZero = G4XiZero::XiZero();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
if( targetParticle->GetDefinition() == aNeutron ) {
G4int irn = G4int( G4UniformRand()*5.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aXiMinus );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 2:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aSigmaMinus );
break;
default:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aLambda );
break;
}
} else { // target particle is a proton
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aNeutron );
break;
case 1:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( aXiZero );
break;
case 2:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aLambda );
break;
case 4:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aLambda );
break;
case 5:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aSigmaZero );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( aXiMinus );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::OmegaMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aSigmaPlus = G4SigmaPlus::SigmaPlus();
G4ParticleDefinition* aXiMinus = G4XiMinus::XiMinus();
G4ParticleDefinition* aXiZero = G4XiZero::XiZero();
G4ParticleDefinition* anOmegaMinus = G4OmegaMinus::OmegaMinus();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
// introduce charge and strangeness exchange reactions
if( targetParticle->GetDefinition() == aNeutron ) {
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 1:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aXiZero );
break;
case 2:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aXiMinus );
break;
case 4:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 5:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aXiMinus );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anOmegaMinus );
break;
}
} else { // target particle is a proton
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aXiZero );
break;
case 2:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aXiZero );
break;
case 4:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aSigmaPlus );
break;
case 5:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aXiMinus );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anOmegaMinus );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
G4DynamicParticle *
G4LightMedia::AntiOmegaMinusExchange(
const G4DynamicParticle* incidentParticle,
const G4Nucleus& targetNucleus )
{
// NOTE: The FORTRAN version of the cascade, CASAOM, simply called the
// routine for the OmegaMinus particle. Hence, the Exchange function
// below is just a copy of the Exchange from the OmegaMinus particle.
G4ParticleDefinition* aNeutron = G4Neutron::Neutron();
G4ParticleDefinition* aProton = G4Proton::Proton();
G4ParticleDefinition* aLambda = G4Lambda::Lambda();
G4ParticleDefinition* aSigmaZero = G4SigmaZero::SigmaZero();
G4ParticleDefinition* aSigmaMinus = G4SigmaMinus::SigmaMinus();
G4ParticleDefinition* aSigmaPlus = G4SigmaPlus::SigmaPlus();
G4ParticleDefinition* aXiMinus = G4XiMinus::XiMinus();
G4ParticleDefinition* aXiZero = G4XiZero::XiZero();
G4ParticleDefinition* anOmegaMinus = G4OmegaMinus::OmegaMinus();
const G4double atomicWeight = targetNucleus.GetN();
const G4double atomicNumber = targetNucleus.GetZ();
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
G4int iplab = G4int( G4std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
if( G4UniformRand() <= cech[iplab]/pow(atomicNumber,0.42) ) {
G4DynamicParticle* resultant = new G4DynamicParticle;
// introduce charge and strangeness exchange reactions
if( targetParticle->GetDefinition() == aNeutron ) {
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aSigmaMinus );
break;
case 1:
resultant->SetDefinition( aSigmaMinus );
// targetParticle->SetDefinition( aXiZero );
break;
case 2:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aXiMinus );
break;
case 4:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 5:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aXiMinus );
break;
default:
resultant->SetDefinition( aNeutron );
// targetParticle->SetDefinition( anOmegaMinus );
break;
}
} else { // target particle is a proton
G4int irn = G4int( G4UniformRand()*7.0 );
switch( irn ) {
case 0:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aSigmaZero );
break;
case 1:
resultant->SetDefinition( aSigmaZero );
// targetParticle->SetDefinition( aXiZero );
break;
case 2:
resultant->SetDefinition( aXiZero );
// targetParticle->SetDefinition( aLambda );
break;
case 3:
resultant->SetDefinition( aLambda );
// targetParticle->SetDefinition( aXiZero );
break;
case 4:
resultant->SetDefinition( aXiMinus );
// targetParticle->SetDefinition( aSigmaPlus );
break;
case 5:
resultant->SetDefinition( aSigmaPlus );
// targetParticle->SetDefinition( aXiMinus );
break;
default:
resultant->SetDefinition( aProton );
// targetParticle->SetDefinition( anOmegaMinus );
break;
}
}
delete targetParticle;
return resultant;
}
delete targetParticle;
return (G4DynamicParticle*)NULL;
}
/* end of file */