Import Geant4 9.5.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 16:46:55 +02:00
parent 89a9605df1
commit b1eb5424d2
10957 changed files with 888481 additions and 160139 deletions
@@ -0,0 +1,243 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// Calculation of the total, elastic and inelastic cross-sections
// of hadron (proton, neutron, pi+, pi-, K+, K-, anti_proton, anti_neutron
// interactions with nuclei based on CHIPS model
//
// Created by V. Uzhinsky, 31.05.2011
#include "G4ComponentCHIPShadronNuclearXS.hh"
#include "G4ParticleTable.hh"
#include "G4IonTable.hh"
#include "G4ParticleDefinition.hh"
#include "G4VQCrossSection.hh"
#include "G4QProtonElasticCrossSection.hh"
#include "G4QProtonNuclearCrossSection.hh"
#include "G4QNeutronElasticCrossSection.hh"
#include "G4QNeutronNuclearCrossSection.hh"
#include "G4QAntiBaryonElasticCrossSection.hh"
#include "G4QAntiBaryonNuclearCrossSection.hh"
#include "G4QPionMinusElasticCrossSection.hh"
#include "G4QPionMinusNuclearCrossSection.hh"
#include "G4QPionPlusElasticCrossSection.hh"
#include "G4QPionPlusNuclearCrossSection.hh"
#include "G4QKaonMinusElasticCrossSection.hh"
#include "G4QKaonMinusNuclearCrossSection.hh"
#include "G4QKaonPlusElasticCrossSection.hh"
#include "G4QKaonPlusNuclearCrossSection.hh"
///////////////////////////////////////////////////////////////////////////////
G4ComponentCHIPShadronNuclearXS::G4ComponentCHIPShadronNuclearXS()
: fUpperLimit( 10000 * GeV ),
fLowerLimit( 10 * MeV )
{
PxsManagerEl = G4QProtonElasticCrossSection::GetPointer();
PxsManagerInEl = G4QProtonNuclearCrossSection::GetPointer();
NxsManagerEl = G4QNeutronElasticCrossSection::GetPointer();
NxsManagerInEl = G4QNeutronNuclearCrossSection::GetPointer();
PBARxsManagerEl = G4QAntiBaryonElasticCrossSection::GetPointer();
PBARxsManagerInEl = G4QAntiBaryonNuclearCrossSection::GetPointer();
PIPxsManagerEl = G4QPionPlusElasticCrossSection::GetPointer();
PIPxsManagerInEl = G4QPionPlusNuclearCrossSection::GetPointer();
PIMxsManagerEl = G4QPionMinusElasticCrossSection::GetPointer();
PIMxsManagerInEl = G4QPionMinusNuclearCrossSection::GetPointer();
KPxsManagerEl = G4QKaonPlusElasticCrossSection::GetPointer();
KPxsManagerInEl = G4QKaonPlusNuclearCrossSection::GetPointer();
KMxsManagerEl = G4QKaonMinusElasticCrossSection::GetPointer();
KMxsManagerInEl = G4QKaonMinusNuclearCrossSection::GetPointer();
}
///////////////////////////////////////////////////////////////////////////////////////
G4ComponentCHIPShadronNuclearXS::~G4ComponentCHIPShadronNuclearXS()
{
}
////////////////////////////////////////////////////////////////////////////////
G4double G4ComponentCHIPShadronNuclearXS::GetTotalElementCrossSection
(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double N)
{
G4double momentum = std::sqrt(kinEnergy*(kinEnergy+2.*aParticle->GetPDGMass()));
G4int PDGcode=aParticle->GetPDGEncoding();
G4VQCrossSection* CHIPSmanagerEl=0;
G4VQCrossSection* CHIPSmanagerInEl=0;
if (PDGcode == 2212) // Projectile is Proton
{
CHIPSmanagerEl=PxsManagerEl; CHIPSmanagerInEl=PxsManagerInEl;
} else if(PDGcode == 2112) // Projectile is Neutron
{
CHIPSmanagerEl=NxsManagerEl; CHIPSmanagerInEl=NxsManagerInEl;
} else if(PDGcode == -2212) // Projectile is Anti-Proton
{
CHIPSmanagerEl=PBARxsManagerEl; CHIPSmanagerInEl=PBARxsManagerInEl;
} else if(PDGcode == -2112) // Projectile is Anti-Neutron
{
CHIPSmanagerEl=PBARxsManagerEl; CHIPSmanagerInEl=PBARxsManagerInEl;
} else if(PDGcode == 211) // Projectile is Pi+
{
CHIPSmanagerEl=PIPxsManagerEl; CHIPSmanagerInEl=PIPxsManagerInEl;
} else if(PDGcode == -211) // Projectile is Pi-
{
CHIPSmanagerEl=PIMxsManagerEl; CHIPSmanagerInEl=PIMxsManagerInEl;
} else if(PDGcode == 321) // Projectile is K+
{
CHIPSmanagerEl=KPxsManagerEl; CHIPSmanagerInEl=KPxsManagerInEl;
} else if(PDGcode == -321) // Projectile is K-
{
CHIPSmanagerEl=KMxsManagerEl; CHIPSmanagerInEl=KMxsManagerInEl;
}
G4double Xelastic(0.), Xinelastic(0.);
if((CHIPSmanagerEl != 0) && (CHIPSmanagerInEl != 0))
{
Xelastic = CHIPSmanagerEl->GetCrossSection(false,momentum,Z,(G4int)N,PDGcode);
Xinelastic = CHIPSmanagerInEl->GetCrossSection(false,momentum,Z,(G4int)N,PDGcode);
}
return Xelastic+Xinelastic;
}
////////////////////////////////////////////////////////////////////////////////
G4double G4ComponentCHIPShadronNuclearXS::GetTotalIsotopeCrossSection
(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A )
{ return GetTotalElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
////////////////////////////////////////////////////////////////////////////////
G4double G4ComponentCHIPShadronNuclearXS::GetInelasticElementCrossSection
(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double N)
{
G4double momentum = std::sqrt(kinEnergy*(kinEnergy+2.*aParticle->GetPDGMass()));
G4int PDGcode=aParticle->GetPDGEncoding();
G4VQCrossSection* CHIPSmanagerInEl=0;
if (PDGcode == 2212) // Projectile is Proton
{
CHIPSmanagerInEl=PxsManagerInEl;
} else if(PDGcode == 2112) // Projectile is Neutron
{
CHIPSmanagerInEl=NxsManagerInEl;
} else if(PDGcode == -2212) // Projectile is Anti-Proton
{
CHIPSmanagerInEl=PBARxsManagerInEl;
} else if(PDGcode == -2112) // Projectile is Anti-Neutron
{
CHIPSmanagerInEl=PBARxsManagerInEl;
} else if(PDGcode == 211) // Projectile is Pi+
{
CHIPSmanagerInEl=PIPxsManagerInEl;
} else if(PDGcode == -211) // Projectile is Pi-
{
CHIPSmanagerInEl=PIMxsManagerInEl;
} else if(PDGcode == 321) // Projectile is K+
{
CHIPSmanagerInEl=KPxsManagerInEl;
} else if(PDGcode == -321) // Projectile is K-
{
CHIPSmanagerInEl=KMxsManagerInEl;
}
G4double Xinelastic(0.);
if(CHIPSmanagerInEl != 0)
{
Xinelastic = CHIPSmanagerInEl->GetCrossSection(false,momentum,Z,(G4int)N,PDGcode);
}
return Xinelastic;
}
///////////////////////////////////////////////////////////////////////////////
G4double G4ComponentCHIPShadronNuclearXS::GetInelasticIsotopeCrossSection
(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
{return GetInelasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
///////////////////////////////////////////////////////////////////////////////
G4double G4ComponentCHIPShadronNuclearXS::GetElasticElementCrossSection
(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double N)
{
G4double momentum = std::sqrt(kinEnergy*(kinEnergy+2.*aParticle->GetPDGMass()));
G4int PDGcode=aParticle->GetPDGEncoding();
G4VQCrossSection* CHIPSmanagerEl=0;
if (PDGcode == 2212) // Projectile is Proton
{
CHIPSmanagerEl=PxsManagerEl;
} else if(PDGcode == 2112) // Projectile is Neutron
{
CHIPSmanagerEl=NxsManagerEl;
} else if(PDGcode == -2212) // Projectile is Anti-Proton
{
CHIPSmanagerEl=PBARxsManagerEl;
} else if(PDGcode == -2112) // Projectile is Anti-Neutron
{
CHIPSmanagerEl=PBARxsManagerEl;
} else if(PDGcode == 211) // Projectile is Pi+
{
CHIPSmanagerEl=PIPxsManagerEl;
} else if(PDGcode == -211) // Projectile is Pi-
{
CHIPSmanagerEl=PIMxsManagerEl;
} else if(PDGcode == 321) // Projectile is K+
{
CHIPSmanagerEl=KPxsManagerEl;
} else if(PDGcode == -321) // Projectile is K-
{
CHIPSmanagerEl=KMxsManagerEl;
}
G4double Xelastic(0.);
if(CHIPSmanagerEl != 0)
{
Xelastic = CHIPSmanagerEl->GetCrossSection(false,momentum,Z,(G4int)N,PDGcode);
}
return Xelastic;
}
///////////////////////////////////////////////////////////////////////////////
G4double G4ComponentCHIPShadronNuclearXS::GetElasticIsotopeCrossSection
(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
{ return GetElasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveExcitation.cc,v 1.23 2010/11/15 10:02:38 vuzhinsk Exp $
// $Id: G4DiffractiveExcitation.cc,v 1.24 2010/12/07 10:42:40 vuzhinsk Exp $
// ------------------------------------------------------------
// GEANT 4 class implemetation file
//
@@ -74,9 +74,10 @@ G4bool G4DiffractiveExcitation::
G4FTFParameters *theParameters,
G4ElasticHNScattering *theElastic) const
{
//G4cout<<G4endl<<"ExciteParticipants --------------"<<G4endl;
// -------------------- Projectile parameters -----------------------
G4LorentzVector Pprojectile=projectile->Get4Momentum();
//G4cout<<"Pproj "<<Pprojectile<<G4endl;
if(Pprojectile.z() < 0.)
{
target->SetStatus(2);
@@ -91,6 +92,7 @@ G4bool G4DiffractiveExcitation::
G4bool PutOnMassShell(false);
// G4double M0projectile=projectile->GetDefinition()->GetPDGMass(); // With de-excitation
G4double M0projectile = Pprojectile.mag(); // Without de-excitation
//G4cout<<"M0projectile "<<M0projectile<<" "<<ProjectileRapidity<<G4endl;
if(M0projectile < projectile->GetDefinition()->GetPDGMass())
{
@@ -110,11 +112,11 @@ G4bool G4DiffractiveExcitation::
//G4cout<<"Excit "<<ProjectilePDGcode<<" "<<TargetPDGcode<<G4endl;
G4LorentzVector Ptarget=target->Get4Momentum();
//G4cout<<"Ptarget "<<Ptarget<<G4endl;
G4double M0target = Ptarget.mag();
// G4double TargetRapidity = Ptarget.rapidity();
//G4cout<<"M0target "<<M0target<<" "<<TargetRapidity<<G4endl;
if(M0target < target->GetDefinition()->GetPDGMass())
{
PutOnMassShell=true;
@@ -132,7 +134,8 @@ G4bool G4DiffractiveExcitation::
// G4double ProbOfDiffraction=ProbProjectileDiffraction +
// ProbTargetDiffraction;
G4double SumMasses=M0projectile+M0target+200.*MeV;
// G4double SumMasses=M0projectile+M0target+220.*MeV; // 200->220 7 June 2011
G4double SumMasses=M0projectile+M0target+220.*MeV; // 200->220 7 June 2011
// Kinematical properties of the interactions --------------
G4LorentzVector Psum; // 4-momentum in CMS
@@ -162,21 +165,35 @@ G4bool G4DiffractiveExcitation::
G4double PZcms2, PZcms;
G4double SqrtS=std::sqrt(S);
//G4cout<<"SqrtS < 2300*MeV "<<SqrtS<<G4endl;
if(absProjectilePDGcode > 1000 && (SqrtS < 2300*MeV || SqrtS < SumMasses))
/*
G4cout<<"Proj "<<Pprojectile<<G4endl;
G4cout<<"Targ "<<Ptarget<<G4endl;
G4cout<<"SqrtS "<<SqrtS<<G4endl;
G4cout<<"M0pr M0tr "<<M0projectile<<" "<<M0target<<" "<<SumMasses<<G4endl;
*/
//G4cout<<"SqrtS < 2300*MeV Bary "<<SqrtS<<G4endl;
// if(absProjectilePDGcode > 1000 && (SqrtS < 2300*MeV || SqrtS < SumMasses)) // 7.06.11
if(absProjectilePDGcode > 1000 && (SqrtS < SumMasses))
{target->SetStatus(2); return false;} // The model cannot work for
// p+p-interactions
// at Plab < 1.62 GeV/c.
//G4cout<<"SqrtS < 1600*MeV Pion "<<SqrtS<<G4endl;
// if(( absProjectilePDGcode == 211 || ProjectilePDGcode == 111) && // 7.06.11
// ((SqrtS < 1600*MeV) || (SqrtS < SumMasses)))
if(( absProjectilePDGcode == 211 || ProjectilePDGcode == 111) &&
((SqrtS < 1600*MeV) || (SqrtS < SumMasses)))
(SqrtS < SumMasses))
{target->SetStatus(2); return false;} // The model cannot work for
// Pi+p-interactions
// at Plab < 1. GeV/c.
//G4cout<<"SqrtS < 1600*MeV "<<SqrtS<<G4endl;
//SumMasses=M0projectile+M0target+20.*MeV;
if(( (absProjectilePDGcode == 321) || (ProjectilePDGcode == -311) ||
(absProjectilePDGcode == 311) || (absProjectilePDGcode == 130) ||
(absProjectilePDGcode == 310)) && ((SqrtS < 1600*MeV) || (SqrtS < SumMasses)))
(absProjectilePDGcode == 310)) && (SqrtS < SumMasses))
// (absProjectilePDGcode == 310)) && ((SqrtS < 1600*MeV) || (SqrtS < SumMasses)))
{target->SetStatus(2); return false;} // The model cannot work for
// K+p-interactions
// at Plab < ??? GeV/c. ???
@@ -184,7 +201,7 @@ G4bool G4DiffractiveExcitation::
PZcms2=(S*S+M0projectile2*M0projectile2+M0target2*M0target2-
2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2)
/4./S;
//G4cout<<"PZcms2 "<<PZcms2<<G4endl;
if(PZcms2 < 0)
{target->SetStatus(2); return false;} // It can be in an interaction with
// off-shell nuclear nucleon
@@ -214,6 +231,9 @@ G4bool G4DiffractiveExcitation::
PZcms2));
}
//G4cout<<"Proj "<<Pprojectile<<G4endl;
//G4cout<<"Targ "<<Ptarget<<G4endl;
G4double maxPtSquare; // = PZcms2;
/*
G4cout<<"Start --------------------"<<G4endl;
@@ -234,11 +254,12 @@ G4cout<<"Rapid "<<ProjectileRapidity<<G4endl; //" "<<TargetRapidity<<G4endl;
G4double DeltaMass=
(G4ParticleTable::GetParticleTable()->FindParticle(2224))->GetPDGMass();
//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity - TargetRapidity))<<G4endl;
//G4double TargetRapidity(0.);
//G4cout<<"Prob Q Exch "<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity - TargetRapidity))<<G4endl;
//G4cout<<"Q exc Mag Slop Wdelta"<<MagQuarkExchange<<" "<<SlopeQuarkExchange<<" "<<DeltaProbAtQuarkExchange<<G4endl;
//G4cout<<"ProjectileRapidity "<<ProjectileRapidity<<G4endl;
//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity))<<G4endl;
//G4cout<<"Prob Exc "<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity))<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
// Check for possible quark exchange -----------------------------------
@@ -275,34 +296,72 @@ G4cout<<"Rapid "<<ProjectileRapidity<<G4endl; //" "<<TargetRapidity<<G4endl;
if(ProjQ1 > 0 ) // ProjQ1 is quark
{
G4int Navailable=0;
ProjExchangeQ = ProjQ1;
if(ProjExchangeQ != TargQ1)
if(ProjExchangeQ != TargQ1) Navailable++;
if(ProjExchangeQ != TargQ2) Navailable++;
if(ProjExchangeQ != TargQ3) Navailable++;
G4int Nsampled=CLHEP::RandFlat::shootInt(G4long(Navailable))+1;
//G4cout<<"Navailable Nsampled "<<Navailable<<" "<<Nsampled<<G4endl;
Navailable=0;
if(ProjExchangeQ != TargQ1)
{
TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjQ1=TargExchangeQ;
} else
Navailable++;
if(Navailable == Nsampled)
{TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjQ1=TargExchangeQ;}
}
if(ProjExchangeQ != TargQ2)
{
TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjQ1=TargExchangeQ;
} else
Navailable++;
if(Navailable == Nsampled)
{TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjQ1=TargExchangeQ;}
}
if(ProjExchangeQ != TargQ3)
{
TargExchangeQ = TargQ3; TargQ3=ProjExchangeQ; ProjQ1=TargExchangeQ;
Navailable++;
if(Navailable == Nsampled)
{TargExchangeQ = TargQ3; TargQ3=ProjExchangeQ; ProjQ1=TargExchangeQ;}
}
} else // ProjQ2 is quark
{
G4int Navailable=0;
ProjExchangeQ = ProjQ2;
if(ProjExchangeQ != TargQ1)
if(ProjExchangeQ != TargQ1) Navailable++;
if(ProjExchangeQ != TargQ2) Navailable++;
if(ProjExchangeQ != TargQ3) Navailable++;
G4int Nsampled=CLHEP::RandFlat::shootInt(G4long(Navailable))+1;
//G4cout<<"Navailable Nsampled "<<Navailable<<" "<<Nsampled<<G4endl;
Navailable=0;
if(ProjExchangeQ != TargQ1)
{
TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjQ2=TargExchangeQ;
} else
Navailable++;
if(Navailable == Nsampled)
{TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjQ2=TargExchangeQ;}
}
if(ProjExchangeQ != TargQ2)
{
TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjQ2=TargExchangeQ;
} else
Navailable++;
if(Navailable == Nsampled)
{TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjQ2=TargExchangeQ;}
}
if(ProjExchangeQ != TargQ3)
{
TargExchangeQ = TargQ3; TargQ3=ProjExchangeQ; ProjQ2=TargExchangeQ;
Navailable++;
if(Navailable == Nsampled)
{TargExchangeQ = TargQ3; TargQ3=ProjExchangeQ; ProjQ2=TargExchangeQ;}
}
} // End of if(ProjQ1 > 0 ) // ProjQ1 is quark
//G4cout<<"Exch Pr Tr "<<ProjExchangeQ<<" "<<TargExchangeQ<<G4endl;
//G4cout<<ProjQ1<<" "<<ProjQ2<<" "<<ProjQ3<<G4endl;
//G4cout<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<G4endl;
G4int aProjQ1=std::abs(ProjQ1);
G4int aProjQ2=std::abs(ProjQ2);
if(aProjQ1 == aProjQ2) {NewProjCode = 111;} // Pi0-meson
@@ -310,19 +369,23 @@ G4cout<<"Rapid "<<ProjectileRapidity<<G4endl; //" "<<TargetRapidity<<G4endl;
{
if(aProjQ1 > aProjQ2) {NewProjCode = aProjQ1*100+aProjQ2*10+1;}
else {NewProjCode = aProjQ2*100+aProjQ1*10+1;}
NewProjCode *=(ProjectilePDGcode/absProjectilePDGcode);
// NewProjCode *=(ProjectilePDGcode/absProjectilePDGcode);
}
G4bool ProjExcited=false;
//G4cout<<"NewProjCode "<<NewProjCode<<G4endl;
if(G4UniformRand() < 0.5)
{
NewProjCode +=2; // Excited Pi0-meson
ProjExcited=true;
}
//G4cout<<G4endl<<"NewProjCode "<<NewProjCode<<G4endl;
if(aProjQ1 != aProjQ2) NewProjCode *=(ProjectilePDGcode/absProjectilePDGcode); // Uzhi
//G4cout<<"NewProjCode +2 or 0 "<<NewProjCode<<G4endl;
G4ParticleDefinition* TestParticle=0;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
//G4cout<<"TestParticle ? "<<TestParticle<<G4endl;
if(TestParticle)
{
M0projectile=
@@ -338,6 +401,10 @@ if(TestParticle)
NewTargCode = NewNucleonId(TargQ1, TargQ2, TargQ3);
//G4cout<<"NewTargCode "<<NewTargCode<<G4endl;
// if( (TargQ1 != TargQ2) && (TargQ1 != TargQ3) && (TargQ2 != TargQ3) // Lambda or Sigma0
// {if(G4UniformRand() < 0.5) NewTargCode=
if( (TargQ1 == TargQ2) && (TargQ1 == TargQ3) &&
(SqrtS > M0projectile+DeltaMass)) {NewTargCode +=2; //Create Delta isobar
ProjExcited=true;}
@@ -443,12 +510,12 @@ if(TestParticle)
//G4cout<<"ProjQ1, ProjQ2, ProjQ3 "<<ProjQ1<<" "<<ProjQ2<<" "<<ProjQ3<<" "<<NewProjCode<<G4endl;
G4int TestParticleID=NewProjCode;
G4ParticleDefinition* TestParticle=0;
G4double TestParticleMass=DBL_MAX;
//G4int TestParticleID=NewProjCode;
//G4ParticleDefinition* TestParticle=0;
//G4double TestParticleMass=DBL_MAX;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
//TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
//if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
if((ProjQ1==ProjQ2) && (ProjQ1==ProjQ3)) {NewProjCode +=2; ProjDeltaHasCreated=true;}
else if(projectile->GetDefinition()->GetPDGiIsospin() == 3)// Projectile was Delta
@@ -463,8 +530,8 @@ if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
else {NewProjCode +=0; ProjDeltaHasCreated=false;}
}
G4ParticleDefinition* NewTestParticle=
G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
//G4ParticleDefinition* NewTestParticle=
// G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
//G4cout<<"TestParticleMass NewTestParticle->GetPDGMass() "<<TestParticleMass<<" "<< NewTestParticle->GetPDGMass()<<G4endl;
//if(TestParticleMass < NewTestParticle->GetPDGMass()) {NewProjCode=TestParticleID;}
@@ -474,11 +541,11 @@ G4ParticleDefinition* NewTestParticle=
//G4cout<<"TargQ1, TargQ2, TargQ3 "<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<" "<<NewTargCode<<G4endl;
TestParticleID=NewTargCode;
TestParticleMass=DBL_MAX;
//TestParticleID=NewTargCode;
//TestParticleMass=DBL_MAX;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
//TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
//if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
if((TargQ1==TargQ2) && (TargQ1==TargQ3)) {NewTargCode +=2; TargDeltaHasCreated=true;}
else if(target->GetDefinition()->GetPDGiIsospin() == 3) // Target was Delta
@@ -493,7 +560,7 @@ if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
else {NewTargCode +=0; TargDeltaHasCreated=false;}
}
NewTestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
//NewTestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
//G4cout<<"TestParticleMass NewTestParticle->GetPDGMass() "<<TestParticleMass<<" "<< NewTestParticle->GetPDGMass()<<G4endl;
//if(TestParticleMass < NewTestParticle->GetPDGMass()) {NewTargCode=TestParticleID;}
@@ -708,10 +775,12 @@ G4int Uzhi; G4cin>>Uzhi;
TargMassT2=M0target2+Pt2;
TargMassT =std::sqrt(TargMassT2);
//G4cout<<"Masses "<<ProjMassT<<" "<<TargMassT<<" "<<SqrtS<<" "<<ProjMassT+TargMassT<<G4endl;
PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
/4./S;
//G4cout<<"PZcms2 PrD"<<PZcms2<<G4endl;
if(PZcms2 < 0 ) continue;
PZcms =std::sqrt(PZcms2);
@@ -877,15 +946,16 @@ G4cout<<Seco<<G4endl;
PMinusMin=std::sqrt(ProjMassT2+PZcms2)-PZcms;
PMinusMax=SqrtS-TargMassT;
PMinusNew=ChooseP(PMinusMin, PMinusMax);
// PMinusNew=ChooseP(PMinusMin, PMinusMax); // 12.06.11
PMinusNew=(PMinusMax-PMinusMin)*G4UniformRand() + PMinusMin;
Qminus=PMinusNew-Pprojectile.minus();
TPlusMin=std::sqrt(TargMassT2+PZcms2)-PZcms;
// TPlusMax=SqrtS-PMinusNew;
TPlusMax=SqrtS-ProjMassT;
TPlusNew=ChooseP(TPlusMin, TPlusMax);
// TPlusNew=ChooseP(TPlusMin, TPlusMax); // 12.06.11
TPlusNew=(TPlusMax-TPlusMin)*G4UniformRand() +TPlusMin;
Qplus=-(TPlusNew-Ptarget.plus());
@@ -896,7 +966,7 @@ G4cout<<(Pprojectile+Qmomentum).mag2()<<" "<<ProjectileNonDiffStateMinMass2<<G4e
G4cout<<(Ptarget -Qmomentum).mag2()<<" "<<TargetNonDiffStateMinMass2<<G4endl;
G4int Uzhi; G4cin>>Uzhi;
*/
} while (
} while (
((Pprojectile+Qmomentum).mag2() < ProjectileNonDiffStateMinMass2) || //No double Diffraction
((Ptarget -Qmomentum).mag2() < TargetNonDiffStateMinMass2 ));
}
@@ -935,8 +1005,14 @@ void G4DiffractiveExcitation::CreateStrings(G4VSplitableHadron * hadron,
G4ExcitedString * &SecondString,
G4FTFParameters *theParameters) const
{
/*
G4cout<<"Create Strings SplitUp "<<hadron<<G4endl;
G4cout<<"Defin "<<hadron->GetDefinition()<<G4endl;
G4cout<<"Defin "<<hadron->GetDefinition()->GetPDGEncoding()<<G4endl;
*/
hadron->SplitUp();
G4Parton *start= hadron->GetNextParton();
if ( start==NULL)
{ G4cout << " G4FTFModel::String() Error:No start parton found"<< G4endl;
FirstString=0; SecondString=0;
@@ -948,9 +1024,10 @@ void G4DiffractiveExcitation::CreateStrings(G4VSplitableHadron * hadron,
FirstString=0; SecondString=0;
return;
}
//G4cout<<start<<" "<<start->GetPDGcode()<<" "<<end<<" "<<end->GetPDGcode()<<G4endl;
//G4cout<<"Create string "<<start->GetPDGcode()<<" "<<end->GetPDGcode()<<G4endl;
G4LorentzVector Phadron=hadron->Get4Momentum();
//G4cout<<"String mom "<<Phadron<<G4endl;
G4LorentzVector Pstart(0.,0.,0.,0.);
G4LorentzVector Pend(0.,0.,0.,0.);
G4LorentzVector Pkink(0.,0.,0.,0.);
@@ -959,6 +1036,7 @@ void G4DiffractiveExcitation::CreateStrings(G4VSplitableHadron * hadron,
G4int PDGcode_startQ = std::abs(start->GetDefinition()->GetPDGEncoding());
G4int PDGcode_endQ = std::abs( end->GetDefinition()->GetPDGEncoding());
//G4cout<<"PDGcode_startQ "<<PDGcode_startQ<<" PDGcode_endQ "<<PDGcode_endQ <<G4endl;
//--------------------------------------------------------------------------------
G4double Wmin(0.);
@@ -971,11 +1049,20 @@ void G4DiffractiveExcitation::CreateStrings(G4VSplitableHadron * hadron,
} // end of if(isProjectile)
G4double W = hadron->Get4Momentum().mag();
//G4cout<<"Wmin W "<<Wmin<<" "<<W<<G4endl;
G4double W2=W*W;
G4double Pt(0.), x1(0.), x2(0.), x3(0.);
G4double Pt(0.), x1(0.), x3(0.); // x2(0.),
G4bool Kink=false;
if(!(((start->GetDefinition()->GetParticleSubType() == "di_quark") &&
( end->GetDefinition()->GetParticleSubType() == "di_quark") ) ||
((start->GetDefinition()->GetParticleSubType() == "quark") &&
( end->GetDefinition()->GetParticleSubType() == "quark") )))
{ // Kinky strings are allowed only for qq-q strings
// Kinky strings are impossible for other systems (qq-qqbar, q-qbar)
// according to the analysis of Pbar P interactions
//G4cout<<G4endl<<"Check for Kink!##############"<<G4endl<<G4endl;
if(W > Wmin)
{ // Kink is possible
G4double Pt2kink=theParameters->GetPt2Kink();
@@ -988,7 +1075,7 @@ void G4DiffractiveExcitation::CreateStrings(G4VSplitableHadron * hadron,
x1=1.-Pt/W*std::exp( Y);
x3=1.-Pt/W*std::exp(-Y);
x2=2.-x1-x3;
// x2=2.-x1-x3;
G4double Mass_startQ = 650.*MeV;
if(PDGcode_startQ < 3) Mass_startQ = 325.*MeV;
@@ -1060,34 +1147,59 @@ Pend*=Rotate;
} // end of if((P2_1 < 0.) || (P2_3 <0.))
} // end of if(Pt > 500.*MeV)
} // end of if(W > Wmin) Check for a kink
} // end of qq-q string selection
//--------------------------------------------------------------------------------
/*
G4cout<<"Kink "<<Kink<<" "
<<start->GetDefinition()->GetParticleSubType()<<" "
<< end->GetDefinition()->GetParticleSubType() <<G4endl;
G4cout<<"Kink "<<Kink<<" "
<<start->GetDefinition()->GetPDGEncoding()<<" "
<< end->GetDefinition()->GetPDGEncoding() <<G4endl;
G4int Uzhi; G4cin>>Uzhi;
*/
if(Kink)
{ // Kink is possible
//G4cout<<"Kink is sampled!"<<G4endl;
std::vector<G4double> QuarkProbabilitiesAtGluonSplitUp =
theParameters->GetQuarkProbabilitiesAtGluonSplitUp();
G4int QuarkInGluon(1); G4double Ksi=G4UniformRand();
for(unsigned int Iq=0; Iq <3; Iq++)
{
//G4cout<<"Iq "<<Iq<<G4endl;
if(Ksi > QuarkProbabilitiesAtGluonSplitUp[Iq]) QuarkInGluon++;}
//G4cout<<"Last Iq "<<QuarkInGluon<<G4endl;
G4Parton * Gquark = new G4Parton(QuarkInGluon);
G4Parton * Ganti_quark = new G4Parton(-QuarkInGluon);
//G4cout<<"Lorentz "<<G4endl;
//-------------------------------------------------------------------------------
G4LorentzRotation toCMS(-1*Phadron.boostVector());
G4LorentzRotation toLab(toCMS.inverse());
//G4cout<<"Pstart "<<Pstart<<G4endl;
//G4cout<<"Pend "<<Pend<<G4endl;
Pstart.transform(toLab); start->Set4Momentum(Pstart);
PkinkQ1.transform(toLab);
PkinkQ2.transform(toLab);
Pend.transform(toLab); end->Set4Momentum(Pend);
//G4cout<<"Pstart "<<Pstart<<G4endl;
//G4cout<<"Pend "<<Pend<<G4endl;
//G4cout<<"Defin "<<hadron->GetDefinition()<<G4endl;
//G4cout<<"Defin "<<hadron->GetDefinition()->GetPDGEncoding()<<G4endl;
G4int absPDGcode=std::abs(hadron->GetDefinition()->GetPDGEncoding());
// G4int absPDGcode=std::abs(hadron->GetDefinition()->GetPDGEncoding());
G4int absPDGcode=1500; // 23 Dec
if((start->GetDefinition()->GetParticleSubType() == "quark") &&
( end->GetDefinition()->GetParticleSubType() == "quark") )
absPDGcode=110;
//G4cout<<"absPDGcode "<<absPDGcode<<G4endl;
if(absPDGcode < 1000)
{ // meson
@@ -1176,6 +1288,7 @@ if(Ksi > QuarkProbabilitiesAtGluonSplitUp[Iq]) QuarkInGluon++;}
// -------------------------------------------------------------------------
} else // End of kink is possible
{ // Kink is impossible
//G4cout<<start<<" "<<start->GetPDGcode()<<" "<<end<<" "<<end->GetPDGcode()<<G4endl;
if ( isProjectile )
{
FirstString= new G4ExcitedString(end,start, +1);
@@ -1232,6 +1345,9 @@ if(Ksi > QuarkProbabilitiesAtGluonSplitUp[Iq]) QuarkInGluon++;}
SecondString=0;
} // End of kink is impossible
//G4cout<<"Quarks in the string at creation"<<FirstString->GetRightParton()->GetPDGcode()<<" "<<FirstString->GetLeftParton()->GetPDGcode()<<G4endl;
//G4cout<<FirstString<<" "<<SecondString<<G4endl;
#ifdef G4_FTFDEBUG
G4cout << " generated string flavors "
<< start->GetPDGcode() << " / "
@@ -1268,6 +1384,7 @@ G4double G4DiffractiveExcitation::ChooseP(G4double Pmin, G4double Pmax) const
}
G4double P=Pmin * std::pow(Pmax/Pmin,G4UniformRand());
// G4double P=(Pmax-Pmin)*G4UniformRand()+Pmin;
return P;
}
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveSplitableHadron.cc,v 1.9 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
// $Id: G4DiffractiveSplitableHadron.cc,v 1.10 2010/12/07 10:42:40 vuzhinsk Exp $
// GEANT4 tag $Name: $
//
// ------------------------------------------------------------
@@ -44,6 +44,9 @@
G4DiffractiveSplitableHadron::G4DiffractiveSplitableHadron()
{
PartonIndex=-1;
Parton[0] = new G4Parton(1);
Parton[1] = new G4Parton(-1);
}
G4DiffractiveSplitableHadron::G4DiffractiveSplitableHadron(const G4ReactionProduct & aPrimary)
@@ -68,7 +71,10 @@ G4DiffractiveSplitableHadron::G4DiffractiveSplitableHadron(const G4VKineticNucle
}
G4DiffractiveSplitableHadron::~G4DiffractiveSplitableHadron()
{}
{
//G4cout<<"Destruct G4DiffractiveSplitableHadron"<<Parton[0]<<" "<<Parton[1]<<G4endl;
// if(Parton[0] != NULL){delete Parton[0]; delete Parton[1];}
}
const G4DiffractiveSplitableHadron & G4DiffractiveSplitableHadron::operator=(const G4DiffractiveSplitableHadron &)
{
@@ -78,6 +84,7 @@ const G4DiffractiveSplitableHadron & G4DiffractiveSplitableHadron::operator=(con
void G4DiffractiveSplitableHadron::SplitUp()
{
//G4cout<<"SplitUp() IsSplit() Parton[0] "<<IsSplit()<<" "<<Parton[0]<<G4endl;
if (IsSplit()) return;
Splitting();
// Split once only...
@@ -99,19 +106,36 @@ G4Parton * G4DiffractiveSplitableHadron::GetNextParton()
{
++PartonIndex;
if ( PartonIndex > 1 || PartonIndex < 0 ) return NULL;
return Parton[PartonIndex];
G4int PartonInd(PartonIndex); // Vova
if(PartonIndex == 1) PartonIndex=-1; // Vova
return Parton[PartonInd];
// return Parton[PartonIndex];
}
G4Parton * G4DiffractiveSplitableHadron::GetNextAntiParton()
{
return NULL; // to be looked at @@
++PartonIndex; // Uzhi 22.11.10
if ( PartonIndex > 1 || PartonIndex < 0 ) return NULL;
G4int PartonInd(PartonIndex);
if(PartonIndex == 1) PartonIndex=-1;
return Parton[PartonInd];
// return NULL; // to be looked at @@
}
void G4DiffractiveSplitableHadron::SetFirstParton(G4int PDGcode)// Uzhi 24.11.10
{
delete Parton[0];
Parton[0]=new G4Parton(PDGcode);
}
void G4DiffractiveSplitableHadron::SetSecondParton(G4int PDGcode)// Uzhi 24.11.10
{
delete Parton[1];
Parton[1]=new G4Parton(PDGcode);
}
//
//----------------------- Implementation--------------------------
//
void G4DiffractiveSplitableHadron::ChooseStringEnds(G4int PDGcode,G4int * aEnd, G4int * bEnd) const
{
const G4double udspin1= 1./6.;
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4ElasticHNScattering.cc,v 1.14 2009/12/16 17:51:13 gunter Exp $
// $Id: G4ElasticHNScattering.cc,v 1.14 2009-12-16 17:51:13 gunter Exp $
// ------------------------------------------------------------
// GEANT 4 class implemetation file
//
@@ -177,8 +177,8 @@ G4bool G4ElasticHNScattering::
// ------ Now we can calculate the transfered Pt --------------------------
G4double Pt2;
G4double ProjMassT2, ProjMassT;
G4double TargMassT2, TargMassT;
G4double ProjMassT2; //, ProjMassT;
G4double TargMassT2; //, TargMassT;
G4LorentzVector Qmomentum;
@@ -187,10 +187,10 @@ G4bool G4ElasticHNScattering::
Pt2=G4ThreeVector(Qmomentum.vect()).mag2();
ProjMassT2=Mprojectile2+Pt2;
ProjMassT =std::sqrt(ProjMassT2);
// ProjMassT =std::sqrt(ProjMassT2);
TargMassT2=Mtarget2+Pt2;
TargMassT =std::sqrt(TargMassT2);
// TargMassT =std::sqrt(TargMassT2);
PZcms2=(S*S+ProjMassT2*ProjMassT2+
TargMassT2*TargMassT2-
File diff suppressed because it is too large Load Diff
@@ -24,225 +24,469 @@
// ********************************************************************
//
//
// $Id: G4FTFParameters.cc,v 1.15 2010/11/15 10:02:38 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
// $Id: G4FTFParameters.cc,v 1.16 2010/12/07 10:42:40 vuzhinsk Exp $
// GEANT4 tag $Name: $
//
#include "G4FTFParameters.hh"
#include "G4ios.hh"
#include <utility>
#include "G4VComponentCrossSection.hh" // 31 May 2011
#include "G4ComponentCHIPShadronNuclearXS.hh" // 31 May 2011
#include "G4ParticleDefinition.hh" // 31 May 2011
#include "G4Proton.hh" // 31 May 2011
#include "G4Neutron.hh" // 31 May 2011
#include "G4PionPlus.hh" // 31 May 2011
#include "G4PionMinus.hh" // 31 May 2011
#include "G4KaonPlus.hh" // 31 May 2011
#include "G4KaonMinus.hh" // 31 May 2011
G4FTFParameters::G4FTFParameters()
{;}
{FTFxsManager=0;}
G4FTFParameters::~G4FTFParameters()
{;}
{delete FTFxsManager;}
//**********************************************************************************************
//G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
// G4double theA,
// G4double theZ,
// G4double s)
G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
G4int theA,
G4int theZ,
G4double s)
G4int theA,
G4int theZ,
G4double PlabPerParticle)
{
G4int PDGcode = particle->GetPDGEncoding();
G4int absPDGcode = std::abs(PDGcode);
G4double ProjectileMass = particle->GetPDGMass();
G4int ProjectilePDGcode = particle->GetPDGEncoding();
G4int ProjectileabsPDGcode = std::abs(ProjectilePDGcode);
G4double ProjectileMass = particle->GetPDGMass();
G4double ProjectileMass2 =ProjectileMass*ProjectileMass;
G4int ProjectileBaryonNumber(0), AbsProjectileBaryonNumber(0);
G4int AbsProjectileCharge(0);
G4bool ProjectileIsNucleus=false;
if(std::abs(particle->GetBaryonNumber()) > 1)
{ // The projectile is a nucleus
ProjectileIsNucleus =true;
ProjectileBaryonNumber =particle->GetBaryonNumber();
AbsProjectileBaryonNumber=std::abs(ProjectileBaryonNumber);
AbsProjectileCharge =(G4int) particle->GetPDGCharge();
if(ProjectileBaryonNumber > 1)
{ ProjectilePDGcode= 2212; ProjectileabsPDGcode=2212;} // Proton
else { ProjectilePDGcode=-2212; ProjectileabsPDGcode=2212;} // Anti-Proton
ProjectileMass =G4Proton::Proton()->GetPDGMass();
ProjectileMass2=sqr(ProjectileMass);
}
G4double TargetMass = G4Proton::Proton()->GetPDGMass();
G4double TargetMass2 = TargetMass*TargetMass;
G4double Elab = (s - ProjectileMass*ProjectileMass - TargetMass*TargetMass)/
(2*TargetMass);
G4double Plab = std::sqrt(Elab * Elab - ProjectileMass*ProjectileMass);
G4double Plab = PlabPerParticle;
G4double Elab = std::sqrt(Plab*Plab+ProjectileMass2);
G4double KineticEnergy = Elab-ProjectileMass; // 31 May 2011
G4double Ylab=0.5*std::log((Elab+Plab)/(Elab-Plab));
G4double s=ProjectileMass2 + TargetMass2 + 2.*TargetMass*Elab;
Plab/=GeV; // Uzhi 8.07.10
G4double LogPlab = std::log( Plab );
G4double sqrLogPlab = LogPlab * LogPlab;
//G4cout<<"Proj Plab "<<ProjectilePDGcode<<" "<<Plab<<G4endl;
//G4cout<<"Mass KinE "<<ProjectileMass<<" "<<KineticEnergy<<G4endl;
//G4cout<<" A Z "<<theA<<" "<<theZ<<G4endl;
G4double Ylab,Xtotal,Xelastic,Xannihilation;
G4int NumberOfTargetNucleons;
Ylab=0.5*std::log((Elab+Plab)/(Elab-Plab));
G4double ECMSsqr=s/GeV/GeV;
G4double SqrtS =std::sqrt(s)/GeV;
//G4cout<<"Sqrt(s) "<<SqrtS<<G4endl;
TargetMass /=GeV; TargetMass2 /=(GeV*GeV);
ProjectileMass /=GeV; ProjectileMass2 /=(GeV*GeV);
// ------------------- Cross section calculation from CHIPS -------------
FTFxsManager = new G4ComponentCHIPShadronNuclearXS(); // 31 May 2011
Plab/=GeV;
// G4double LogPlab = std::log( Plab );
// G4double sqrLogPlab = LogPlab * LogPlab;
G4int NumberOfTargetProtons = theZ;
G4int NumberOfTargetNeutrons = theA-theZ;
// G4int NumberOfTargetProtons = (G4int) theZ;
// G4int NumberOfTargetNeutrons = (G4int) theA- (G4int) theZ;
G4int NumberOfTargetNucleons = NumberOfTargetProtons + NumberOfTargetNeutrons;
G4double Xtotal, Xelastic;
NumberOfTargetNucleons = NumberOfTargetProtons + NumberOfTargetNeutrons;
if( PDGcode > 1000 ) //------Projectile is baryon --------
if( (ProjectilePDGcode == 2212) ||
(ProjectilePDGcode == 2112) ) //------Projectile is nucleon --------
{
G4double XtotPP = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
G4double XtotPN = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
G4double XtotPP = FTFxsManager->
GetTotalElementCrossSection( particle,KineticEnergy,1,0);
G4ParticleDefinition* Neutron=G4Neutron::Neutron();
G4double XtotPN = FTFxsManager->
GetTotalElementCrossSection( Neutron,KineticEnergy,1,0);
G4double XelPP = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
G4double XelPN = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
Xtotal = ( NumberOfTargetProtons * XtotPP +
NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPP +
NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
G4double XelPP = FTFxsManager->
GetElasticElementCrossSection(particle,KineticEnergy,1,0);
G4double XelPN = FTFxsManager->
GetElasticElementCrossSection( Neutron,KineticEnergy,1,0);
//G4cout<<"Xs "<<XtotPP/millibarn<<" "<<XelPP/millibarn<<G4endl;
//G4cout<<"Xs "<<XtotPN/millibarn<<" "<<XelPN/millibarn<<G4endl;
if(!ProjectileIsNucleus)
{ // Projectile is hadron
Xtotal = ( NumberOfTargetProtons * XtotPP +
NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPP +
NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
} else
{ // Projectile is a nucleus
Xtotal = (
AbsProjectileCharge *NumberOfTargetProtons *XtotPP +
(AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetNeutrons*XtotPP +
( AbsProjectileCharge *NumberOfTargetNeutrons +
(AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetProtons)*XtotPN
)/(AbsProjectileBaryonNumber*NumberOfTargetNucleons);
Xelastic= (
AbsProjectileCharge *NumberOfTargetProtons *XelPP +
(AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetNeutrons*XelPP +
( AbsProjectileCharge *NumberOfTargetNeutrons +
(AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetProtons)*XelPN
)/(AbsProjectileBaryonNumber*NumberOfTargetNucleons);
}
else if( PDGcode < -1000 ) //------Projectile is anti_baryon --------
Xannihilation = 0.;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else if( ProjectilePDGcode < -1000 ) //------Projectile is anti_baryon --------
{
G4double XtotPP = 38.4 + 77.6*std::pow(Plab,-0.64) + 0.26*sqrLogPlab - 1.2*LogPlab;
G4double XtotPN = 0. + 133.6*std::pow(Plab,-0.70) + 1.22*sqrLogPlab +13.7*LogPlab;
G4double XelPP = 10.2 + 52.7*std::pow(Plab,-1.16) + 0.125*sqrLogPlab - 1.28*LogPlab;
G4double XelPN = 36.5 + 0. *std::pow(Plab, 0. ) + 0. *sqrLogPlab -11.9 *LogPlab;
G4double X_a(0.), X_b(0.), X_c(0.), X_d(0.);
G4double MesonProdThreshold=ProjectileMass+TargetMass+(2.*0.14+0.016); // 2 Mpi +DeltaE;
Xtotal = ( NumberOfTargetProtons * XtotPP +
NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPP +
NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
if(PlabPerParticle < 40.*MeV)
{ // Low energy limits. Projectile at rest.
Xtotal= 1512.9; // mb
Xelastic= 473.2; // mb
X_a= 625.1; // mb
X_b= 9.780; // mb
X_c= 49.989; // mb
X_d= 6.614; // mb
}
else
{ // Total and elastic cross section of PbarP interactions a'la Arkhipov
G4double LogS=std::log(ECMSsqr/33.0625);
G4double Xasmpt=36.04+0.304*LogS*LogS; // mb
LogS=std::log(SqrtS/20.74);
G4double Basmpt=11.92+0.3036*LogS*LogS; // GeV^(-2)
G4double R0=std::sqrt(0.40874044*Xasmpt-Basmpt); // GeV^(-1)
G4double FlowF=SqrtS/
std::sqrt(ECMSsqr*ECMSsqr+ProjectileMass2*ProjectileMass2+TargetMass2*TargetMass2-
2.*ECMSsqr*ProjectileMass2 -2.*ECMSsqr*TargetMass2 -2.*ProjectileMass2*TargetMass2);
Xtotal=Xasmpt*(1.+13.55*FlowF/R0/R0/R0*
(1.-4.47/SqrtS+12.38/ECMSsqr-12.43/SqrtS/ECMSsqr)); // mb
Xasmpt=4.4+0.101*LogS*LogS; // mb
Xelastic=Xasmpt*(1.+59.27*FlowF/R0/R0/R0*
(1.-6.95/SqrtS+23.54/ECMSsqr-25.34/SqrtS/ECMSsqr)); // mb
//G4cout<<"Param Xtotal Xelastic "<<Xtotal<<" "<<Xelastic<<G4endl;
//G4cout<<"FlowF "<<FlowF<<" SqrtS "<<SqrtS<<G4endl;
//G4cout<<"Param Xelastic-NaN "<<Xelastic<<" "<<1.5*16.654/pow(ECMSsqr/2.176/2.176,2.2)<<" "<<ECMSsqr<<G4endl;
X_a=25.*FlowF; // mb, 3-shirts diagram
if(SqrtS < MesonProdThreshold)
{
X_b=3.13+140.*std::pow(MesonProdThreshold-SqrtS,2.5);// mb anti-quark-quark annihilation
Xelastic-=3.*X_b; // Xel-X(PbarP->NNbar)
} else
{
X_b=6.8/SqrtS; // mb anti-quark-quark annihilation
Xelastic-=3.*X_b; // Xel-X(PbarP->NNbar)
}
X_c=2.*FlowF*sqr(ProjectileMass+TargetMass)/ECMSsqr; // mb rearrangement
//G4cout<<"Old new Xa "<<35.*FlowF<<" "<<25.*FlowF<<G4endl;
X_d=23.3/ECMSsqr; // mb anti-quark-quark string creation
}
//---------------------------------------------------------------
//G4cout<<"Param Xtotal Xelastic "<<Xtotal<<" "<<Xelastic<<G4endl;
//G4cout<<"Para a b c d "<<X_a<<" "<<X_b<<" "<<X_c<<" "<<X_d<<G4endl;
//G4cout<<"Para a b c d "<<X_a<<" "<<5.*X_b<<" "<<5.*X_c<<" "<<6.*X_d<<G4endl;
G4double Xann_on_P(0.), Xann_on_N(0.);
if(ProjectilePDGcode == -2212) // Pbar+P/N
{Xann_on_P=X_a + X_b*5. + X_c*5. + X_d*6.; Xann_on_N=X_a + X_b*4. + X_c*4. + X_d*4.;}
else if(ProjectilePDGcode == -2112) // NeutrBar+P/N
{Xann_on_P=X_a + X_b*4. + X_c*4. + X_d*4.; Xann_on_N=X_a + X_b*5. + X_c*5. + X_d*6.;}
else if(ProjectilePDGcode == -3122) // LambdaBar+P/N
{Xann_on_P=X_a + X_b*3. + X_c*3. + X_d*2.; Xann_on_N=X_a + X_b*3. + X_c*3. + X_d*2.;}
else if(ProjectilePDGcode == -3112) // Sigma-Bar+P/N
{Xann_on_P=X_a + X_b*2. + X_c*2. + X_d*0.; Xann_on_N=X_a + X_b*4. + X_c*4. + X_d*2.;}
else if(ProjectilePDGcode == -3212) // Sigma0Bar+P/N
{Xann_on_P=X_a + X_b*3. + X_c*3. + X_d*2.; Xann_on_N=X_a + X_b*3. + X_c*3. + X_d*2.;}
else if(ProjectilePDGcode == -3222) // Sigma+Bar+P/N
{Xann_on_P=X_a + X_b*4. + X_c*4. + X_d*2.; Xann_on_N=X_a + X_b*2. + X_c*2. + X_d*0.;}
else if(ProjectilePDGcode == -3312) // Xi-Bar+P/N
{Xann_on_P=X_a + X_b*1. + X_c*1. + X_d*0.; Xann_on_N=X_a + X_b*2. + X_c*2. + X_d*0.;}
else if(ProjectilePDGcode == -3322) // Xi0Bar+P/N
{Xann_on_P=X_a + X_b*2. + X_c*2. + X_d*0.; Xann_on_N=X_a + X_b*1. + X_c*1. + X_d*0.;}
else if(ProjectilePDGcode == -3334) // Omega-Bar+P/N
{Xann_on_P=X_a + X_b*0. + X_c*0. + X_d*0.; Xann_on_N=X_a + X_b*0. + X_c*0. + X_d*0.;}
else {G4cout<<"Unknown anti-baryon for FTF annihilation"<<G4endl;}
//---------------------------------------------------------------
//G4cout<<"Sum "<<Xann_on_P<<G4endl;
if(!ProjectileIsNucleus)
{ // Projectile is anti-baryon
Xannihilation = ( NumberOfTargetProtons * Xann_on_P +
NumberOfTargetNeutrons * Xann_on_N ) / NumberOfTargetNucleons;
} else
{ // Projectile is a nucleus
Xannihilation=(
( AbsProjectileCharge *NumberOfTargetProtons+
(AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetNeutrons )*Xann_on_P +
( AbsProjectileCharge *NumberOfTargetNeutrons+
(AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetProtons )*Xann_on_N
)/(AbsProjectileBaryonNumber*NumberOfTargetNucleons);
}
G4double Xftf=0.;
MesonProdThreshold=ProjectileMass+TargetMass+(0.14+0.08); // Mpi +DeltaE
if(SqrtS > MesonProdThreshold) {Xftf=36.*(1.-MesonProdThreshold/SqrtS);}
Xtotal = Xelastic + Xannihilation + Xftf;
/*
G4cout<<"Plab Xtotal, Xelastic Xinel Xftf "<<Plab<<" "<<Xtotal<<" "<<Xelastic<<" "<<Xtotal-Xelastic<<" "<<Xtotal-Xelastic-Xannihilation<<G4endl;
G4cout<<"Plab Xelastic/Xtotal, Xann/Xin "<<Plab<<" "<<Xelastic/Xtotal<<" "<<Xannihilation/(Xtotal-Xelastic)<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
*/
//---------------------------------------------------------------
}
else if( PDGcode == 211 ) //------Projectile is PionPlus -------
else if( ProjectilePDGcode == 211 ) //------Projectile is PionPlus -------
{
G4double XtotPiP = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
G4double XtotPiN = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
G4double XtotPiP = FTFxsManager->
GetTotalElementCrossSection( particle,KineticEnergy,1,0);
G4ParticleDefinition* PionMinus=G4PionMinus::PionMinus();
G4double XtotPiN = FTFxsManager->
GetTotalElementCrossSection( PionMinus,KineticEnergy,1,0);
G4double XelPiP = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
G4double XelPiN = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
G4double XelPiP = FTFxsManager->
GetElasticElementCrossSection(particle,KineticEnergy,1,0);
G4double XelPiN = FTFxsManager->
GetElasticElementCrossSection( PionMinus,KineticEnergy,1,0);
Xtotal = ( NumberOfTargetProtons * XtotPiP +
NumberOfTargetNeutrons * XtotPiN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPiP +
NumberOfTargetNeutrons * XelPiN ) / NumberOfTargetNucleons;
Xannihilation = 0.;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else if( PDGcode == -211 ) //------Projectile is PionMinus -------
else if( ProjectilePDGcode == -211 ) //------Projectile is PionMinus -------
{
G4double XtotPiP = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
G4double XtotPiN = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
G4double XtotPiP = FTFxsManager->
GetTotalElementCrossSection( particle,KineticEnergy,1,0);
G4ParticleDefinition* PionPlus=G4PionPlus::PionPlus();
G4double XtotPiN = FTFxsManager->
GetTotalElementCrossSection( PionPlus,KineticEnergy,1,0);
G4double XelPiP = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
G4double XelPiN = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
G4double XelPiP = FTFxsManager->
GetElasticElementCrossSection(particle,KineticEnergy,1,0);
G4double XelPiN = FTFxsManager->
GetElasticElementCrossSection( PionPlus,KineticEnergy,1,0);
Xtotal = ( NumberOfTargetProtons * XtotPiP +
NumberOfTargetNeutrons * XtotPiN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPiP +
NumberOfTargetNeutrons * XelPiN ) / NumberOfTargetNucleons;
Xannihilation = 0.;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else if( PDGcode == 111 ) //------Projectile is PionZero -------
else if( ProjectilePDGcode == 111 ) //------Projectile is PionZero -------
{
G4double XtotPiP =(16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab + //Pi+
33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab)/2; //Pi-
G4ParticleDefinition* PionPlus=G4PionPlus::PionPlus();
G4double XtotPipP= FTFxsManager->
GetTotalElementCrossSection( PionPlus,KineticEnergy,1,0);
G4double XtotPiN =(33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab + //Pi+
16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
G4ParticleDefinition* PionMinus=G4PionMinus::PionMinus();
G4double XtotPimP= FTFxsManager->
GetTotalElementCrossSection( PionMinus,KineticEnergy,1,0);
G4double XelPiP =( 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab + //Pi+
1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
G4double XelPiN =( 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab + //Pi+
0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
G4double XelPipP = FTFxsManager->
GetElasticElementCrossSection( PionPlus,KineticEnergy,1,0);
G4double XelPimP = FTFxsManager->
GetElasticElementCrossSection( PionMinus,KineticEnergy,1,0);
G4double XtotPiP= (XtotPipP + XtotPimP)/2.;
G4double XtotPiN=XtotPiP;
G4double XelPiP = (XelPipP + XelPimP )/2.;
G4double XelPiN = XelPiP;
Xtotal = ( NumberOfTargetProtons * XtotPiP +
NumberOfTargetNeutrons * XtotPiN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPiP +
NumberOfTargetNeutrons * XelPiN ) / NumberOfTargetNucleons;
}
else if( PDGcode == 321 ) //------Projectile is KaonPlus -------
{
G4double XtotKP = 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab;
G4double XtotKN = 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab;
Xannihilation = 0.;
G4double XelKP = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab;
G4double XelKN = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else if( ProjectilePDGcode == 321 ) //------Projectile is KaonPlus -------
{
G4double XtotKP = FTFxsManager->
GetTotalElementCrossSection( particle,KineticEnergy,1,0);
G4ParticleDefinition* KaonMinus=G4KaonMinus::KaonMinus();
G4double XtotKN = FTFxsManager->
GetTotalElementCrossSection( KaonMinus,KineticEnergy,1,0);
G4double XelKP = FTFxsManager->
GetElasticElementCrossSection(particle,KineticEnergy,1,0);
G4double XelKN = FTFxsManager->
GetElasticElementCrossSection( KaonMinus,KineticEnergy,1,0);
Xtotal = ( NumberOfTargetProtons * XtotKP +
NumberOfTargetNeutrons * XtotKN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelKP +
NumberOfTargetNeutrons * XelKN ) / NumberOfTargetNucleons;
}
else if( PDGcode ==-321 ) //------Projectile is KaonMinus ------
{
G4double XtotKP = 32.1 + 0. *std::pow(Plab, 0. ) + 0.66 *sqrLogPlab - 5.6 *LogPlab;
G4double XtotKN = 25.2 + 0. *std::pow(Plab, 0. ) + 0.38 *sqrLogPlab - 2.9 *LogPlab;
Xannihilation = 0.;
G4double XelKP = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab;
G4double XelKN = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else if( ProjectilePDGcode ==-321 ) //------Projectile is KaonMinus ------
{
G4double XtotKP = FTFxsManager->
GetTotalElementCrossSection( particle,KineticEnergy,1,0);
G4ParticleDefinition* KaonPlus=G4KaonPlus::KaonPlus();
G4double XtotKN = FTFxsManager->
GetTotalElementCrossSection( KaonPlus,KineticEnergy,1,0);
G4double XelKP = FTFxsManager->
GetElasticElementCrossSection(particle,KineticEnergy,1,0);
G4double XelKN = FTFxsManager->
GetElasticElementCrossSection(KaonPlus,KineticEnergy,1,0);
Xtotal = ( NumberOfTargetProtons * XtotKP +
NumberOfTargetNeutrons * XtotKN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelKP +
NumberOfTargetNeutrons * XelKN ) / NumberOfTargetNucleons;
Xannihilation = 0.;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else if((PDGcode == 311) || (PDGcode == 130) || (PDGcode == 310))//Projectile is KaonZero
else if((ProjectilePDGcode == 311) ||
(ProjectilePDGcode == 130) ||
(ProjectilePDGcode == 310)) //Projectile is KaonZero
{
G4double XtotKP =( 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab + //K+
32.1 + 0. *std::pow(Plab, 0. ) + 0.66 *sqrLogPlab - 5.6 *LogPlab)/2; //K-
G4double XtotKN =( 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab + //K+
25.2 + 0. *std::pow(Plab, 0. ) + 0.38 *sqrLogPlab - 2.9 *LogPlab)/2; //K-
G4ParticleDefinition* KaonPlus=G4KaonPlus::KaonPlus();
G4double XtotKpP= FTFxsManager->
GetTotalElementCrossSection( KaonPlus,KineticEnergy,1,0);
G4ParticleDefinition* KaonMinus=G4KaonMinus::KaonMinus();
G4double XtotKmP= FTFxsManager->
GetTotalElementCrossSection( KaonMinus,KineticEnergy,1,0);
G4double XelKpP = FTFxsManager->
GetElasticElementCrossSection( KaonPlus,KineticEnergy,1,0);
G4double XelKmP = FTFxsManager->
GetElasticElementCrossSection( KaonMinus,KineticEnergy,1,0);
G4double XtotKP=(XtotKpP+XtotKmP)/2.;
G4double XtotKN=XtotKP;
G4double XelKP =(XelKpP +XelKmP )/2.;
G4double XelKN =XelKP;
G4double XelKP =( 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab + //K+
7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab)/2; //K-
G4double XelKN =( 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab + //K+
5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab)/2; //K-
Xtotal = ( NumberOfTargetProtons * XtotKP +
NumberOfTargetNeutrons * XtotKN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelKP +
NumberOfTargetNeutrons * XelKN ) / NumberOfTargetNucleons;
Xannihilation = 0.;
Xtotal/=millibarn;
Xelastic/=millibarn;
}
else //------Projectile is undefined, Nucleon assumed
{
G4double XtotPP = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
G4double XtotPN = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
G4ParticleDefinition* Proton=G4Proton::Proton();
G4double XtotPP = FTFxsManager->
GetTotalElementCrossSection( Proton,KineticEnergy,1,0);
G4double XelPP = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
G4double XelPN = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
G4ParticleDefinition* Neutron=G4Neutron::Neutron();
G4double XtotPN = FTFxsManager->
GetTotalElementCrossSection( Neutron,KineticEnergy,1,0);
G4double XelPP = FTFxsManager->
GetElasticElementCrossSection(Proton,KineticEnergy,1,0);
G4double XelPN = FTFxsManager->
GetElasticElementCrossSection( Neutron,KineticEnergy,1,0);
Xtotal = ( NumberOfTargetProtons * XtotPP +
NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPP +
NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
Xannihilation = 0.;
Xtotal/=millibarn;
Xelastic/=millibarn;
};
// Xtotal and Xelastic in mb
// For Pi- P interactions only!
if(std::abs(Plab-1.4) < 0.05) {Xtotal=3.500599e+01; Xelastic= 1.150032e+01;}
if(std::abs(Plab-1.5) < 0.05) {Xtotal=3.450591e+01; Xelastic= 1.050038e+01;}
if(std::abs(Plab-1.6) < 0.05) {Xtotal=3.430576e+01; Xelastic= 9.800433e+00;}
if(std::abs(Plab-1.7) < 0.05) {Xtotal=3.455560e+01; Xelastic= 9.300436e+00;}
if(std::abs(Plab-1.8) < 0.05) {Xtotal=3.480545e+01; Xelastic= 8.800438e+00;}
if(std::abs(Plab-2.0) < 0.05) {Xtotal=3.570503e+01; Xelastic= 8.200370e+00;}
if(std::abs(Plab-2.2) < 0.05) {Xtotal=3.530495e+01; Xelastic= 7.800362e+00;}
if(std::abs(Plab-2.5) < 0.05) {Xtotal=3.410484e+01; Xelastic= 7.350320e+00;}
if(std::abs(Plab-2.75) < 0.05){Xtotal=3.280479e+01; Xelastic= 7.050273e+00;}
if(std::abs(Plab-3.0) < 0.05) {Xtotal=3.180473e+01; Xelastic= 6.800258e+00;}
if(std::abs(Plab-4.0) < 0.05) {Xtotal=2.910441e+01; Xelastic= 6.100229e+00;}
if(std::abs(Plab-5.0) < 0.05) {Xtotal=2.820372e+01; Xelastic= 5.700275e+00;}
if(std::abs(Plab-6.0) < 0.05) {Xtotal=2.760367e+01; Xelastic= 5.400255e+00;}
if(std::abs(Plab-7.0) < 0.05) {Xtotal=2.725366e+01; Xelastic= 5.150256e+00;}
if(std::abs(Plab-8.0) < 0.05) {Xtotal=2.690365e+01; Xelastic= 4.900258e+00;}
if(std::abs(Plab-10.0) < 0.05){Xtotal=2.660342e+01; Xelastic= 4.600237e+00;}
if(std::abs(Plab-12.0) < 0.05){Xtotal=2.632341e+01; Xelastic= 4.480229e+00;}
if(std::abs(Plab-14.0) < 0.05){Xtotal=2.604340e+01; Xelastic= 4.360221e+00;}
if(std::abs(Plab-20.0) < 0.05){Xtotal=2.520337e+01; Xelastic= 4.000197e+00;}
if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
//
//----------- Geometrical parameters ------------------------------------------------
SetTotalCrossSection(Xtotal);
SetElastisCrossSection(Xelastic);
SetInelasticCrossSection(Xtotal-Xelastic);
//G4cout<<"Plab Xtotal, Xelastic Xinel "<<Plab<<" "<<Xtotal<<" "<<Xelastic<<Xtotal-Xelastic)<<G4endl;
/*
G4cout<<"Plab Xtotal, Xelastic Xinel Xftf "<<Plab<<" "<<Xtotal<<" "<<Xelastic<<" "<<Xtotal-Xelastic<<" "<<Xtotal-Xelastic-Xannihilation<<G4endl;
if(Xtotal-Xelastic != 0.)
{
G4cout<<"Plab Xelastic/Xtotal, Xann/Xin "<<Plab<<" "<<Xelastic/Xtotal<<" "<<Xannihilation/
(Xtotal-Xelastic)<<G4endl;
} else
{
G4cout<<"Plab Xelastic/Xtotal, Xann "<<Plab<<" "<<Xelastic/Xtotal<<" "<<
Xannihilation<<G4endl;
}
//G4int Uzhi; G4cin>>Uzhi;
*/
// // Interactions with elastic and inelastic collisions
SetProbabilityOfElasticScatt(Xtotal, Xelastic);
SetRadiusOfHNinteractions2(Xtotal/pi/10.);
if(Xtotal-Xelastic == 0.)
{
SetProbabilityOfAnnihilation(0.);
} else
{SetProbabilityOfAnnihilation(Xannihilation/(Xtotal-Xelastic));}
//
/* //==== No elastic scattering ============================
SetProbabilityOfElasticScatt(Xtotal, 0.);
SetRadiusOfHNinteractions2((Xtotal-Xelastic)/pi/10.);
*/ //=======================================================
//SetProbabilityOfElasticScatt(Xtotal, 0.);
// //==== No elastic scattering ============================
// SetProbabilityOfElasticScatt(Xtotal, 0.);
// SetRadiusOfHNinteractions2((Xtotal-Xelastic)/pi/10.);
// SetProbabilityOfAnnihilation(1.);
// SetProbabilityOfAnnihilation(0.);
// //=======================================================
//-----------------------------------------------------------------------------------
SetSlope( Xtotal*Xtotal/16./pi/Xelastic/0.3894 ); // Slope parameter of elastic scattering
// (GeV/c)^(-2))
//G4cout<<"Slope "<<GetSlope()<<G4endl;
//-----------------------------------------------------------------------------------
SetGamma0( GetSlope()*Xtotal/10./2./pi );
@@ -250,9 +494,11 @@ if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
// Gaussian parametrization of
// elastic scattering amplitude assumed
SetAvaragePt2ofElasticScattering(1./(Xtotal*Xtotal/16./pi/Xelastic/0.3894)*GeV*GeV);
//G4cout<<"AvaragePt2ofElasticScattering "<<GetAvaragePt2ofElasticScattering()<<G4endl;
//----------- Parameters of excitations ---------------------------------------------
if( PDGcode > 1000 ) //------Projectile is baryon --------
//G4cout<<"Param ProjectilePDGcode "<<ProjectilePDGcode<<G4endl;
if( ProjectilePDGcode > 1000 ) //------Projectile is baryon --------
{
SetMagQuarkExchange(1.84);//(3.63);
SetSlopeQuarkExchange(0.7);//(1.2);
@@ -262,7 +508,8 @@ if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
SetProjMinDiffMass(1.16); // GeV
SetProjMinNonDiffMass(1.16); // GeV
SetProbabilityOfProjDiff(0.805*std::exp(-0.35*Ylab));// 0.5
//G4cout<<"Param Get Min Dif "<<GetProjMinNonDiffMass()<<G4endl;
SetProbabilityOfProjDiff(0.805*std::exp(-0.35*Ylab));// 0.5 0.805
SetTarMinDiffMass(1.16); // GeV
SetTarMinNonDiffMass(1.16); // GeV
@@ -270,27 +517,30 @@ if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
SetAveragePt2(0.15); // 0.15 GeV^2
}
if( PDGcode < -1000 ) //------Projectile is anti_baryon --------
else if( ProjectilePDGcode < -1000 ) //------Projectile is anti_baryon --------
{
SetMagQuarkExchange(0.);
SetSlopeQuarkExchange(0.);
SetDeltaProbAtQuarkExchange(0.);
SetProbOfSameQuarkExchange(0.);
SetProjMinDiffMass(1.16); // GeV
SetProjMinNonDiffMass(1.16); // GeV
SetProjMinDiffMass(ProjectileMass+0.22); // GeV
SetProjMinNonDiffMass(ProjectileMass+0.22); // GeV
SetProbabilityOfProjDiff(0.805*std::exp(-0.35*Ylab));// 0.5
SetTarMinDiffMass(1.16); // GeV
SetTarMinNonDiffMass(1.16); // GeV
SetProbabilityOfTarDiff(0.805*std::exp(-0.35*Ylab));// 0.5
//SetProbabilityOfProjDiff(0.5);
//G4cout<<"PrDif "<<GetProbabilityOfProjDiff()<<" "<<1.-2.*GetProbabilityOfProjDiff()<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
SetTarMinDiffMass(TargetMass+0.22); // GeV
SetTarMinNonDiffMass(TargetMass+0.22); // GeV
SetProbabilityOfTarDiff(0.805*std::exp(-0.35*Ylab)); // 0.5
//SetProbabilityOfTarDiff(0.5);
SetAveragePt2(0.15); // 0.15 GeV^2
}
else if( absPDGcode == 211 || PDGcode == 111) //------Projectile is Pion -----------
else if( ProjectileabsPDGcode == 211 ||
ProjectilePDGcode == 111) //------Projectile is Pion -----------
{
SetMagQuarkExchange(240.);
SetSlopeQuarkExchange(2.);
SetSlopeQuarkExchange(2.); // 2.
SetDeltaProbAtQuarkExchange(0.56); //(0.35);
SetProjMinDiffMass(0.5); // GeV
@@ -303,44 +553,49 @@ if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
// SetProbabilityOfTarDiff(2.6*std::exp(-0.46*Ylab));
SetProbabilityOfTarDiff(0.8*std::exp(-0.6*(Ylab-3.)));
SetAveragePt2(0.3); // GeV^2
SetAveragePt2(0.15); // GeV^2 7 June 2011
}
else if( (absPDGcode == 321) || (PDGcode == 311) ||
(PDGcode == 130) || (PDGcode == 310)) //Projectile is Kaon
else if( (ProjectileabsPDGcode == 321) ||
(ProjectileabsPDGcode == 311) ||
(ProjectilePDGcode == 130) ||
(ProjectilePDGcode == 310)) //Projectile is Kaon
{
// Must be corrected, taken from PiN
SetMagQuarkExchange(120.);
SetSlopeQuarkExchange(2.0);
SetMagQuarkExchange(40.);
SetSlopeQuarkExchange(2.25);
SetDeltaProbAtQuarkExchange(0.6);
//SetMagQuarkExchange(0.);
//SetSlopeQuarkExchange(0.);
//SetDeltaProbAtQuarkExchange(0.);
SetProjMinDiffMass(0.7); // GeV 1.1
SetProjMinNonDiffMass(0.7); // GeV
SetProjMinDiffMass(0.6); // GeV 0.7
SetProjMinNonDiffMass(0.6); // GeV 0.7
SetProbabilityOfProjDiff(0.85*std::pow(s/GeV/GeV,-0.5)); // 40/32 X-dif/X-inel
SetProbabilityOfProjDiff(0.);
SetTarMinDiffMass(1.1); // GeV
SetTarMinNonDiffMass(1.1); // GeV
SetProbabilityOfTarDiff(0.85*std::pow(s/GeV/GeV,-0.5)); // 40/32 X-dif/X-inel
SetProbabilityOfTarDiff(0.45*std::pow(s/GeV/GeV,-0.5)); // 40/32 X-dif/X-inel
SetAveragePt2(0.3); // GeV^2
SetAveragePt2(0.15); // GeV^2 7 June 2011
}
else //------Projectile is undefined,
//------Nucleon assumed
{
SetMagQuarkExchange(3.5);
SetSlopeQuarkExchange(1.0);
SetDeltaProbAtQuarkExchange(0.1);
SetMagQuarkExchange(1.85); // 7 June 2011
SetSlopeQuarkExchange(0.7); // 7 June 2011
SetDeltaProbAtQuarkExchange(0.); // 7 June 2011
SetProjMinDiffMass((particle->GetPDGMass()+160.*MeV)/GeV);
SetProjMinNonDiffMass((particle->GetPDGMass()+160.*MeV)/GeV);
SetProbabilityOfProjDiff(0.95*std::pow(s/GeV/GeV,-0.35)); // 40/32 X-dif/X-inel
SetProjMinDiffMass((940.+160.*MeV)/GeV); // particle->GetPDGMass()
SetProjMinNonDiffMass((940.+160.*MeV)/GeV); // particle->GetPDGMass()
SetProbabilityOfProjDiff(0.805*std::pow(s/GeV/GeV,-0.35)); // 40/32 X-dif/X-inel
SetTarMinDiffMass(1.1); // GeV
SetTarMinNonDiffMass(1.1); // GeV
SetProbabilityOfTarDiff(0.95*std::pow(s/GeV/GeV,-0.35)); // 40/32 X-dif/X-inel
SetTarMinDiffMass(1.16); // GeV
SetTarMinNonDiffMass(1.16); // GeV
SetProbabilityOfTarDiff(0.805*std::pow(s/GeV/GeV,-0.35)); // 40/32 X-dif/X-inel
SetAveragePt2(0.3); // GeV^2
SetAveragePt2(0.15); // GeV^2
}
//G4cout<<"Param Get Min Dif "<<GetProjMinNonDiffMass()<<G4endl;
// ---------- Set parameters of a string kink -------------------------------
SetPt2Kink(6.*GeV*GeV);
G4double Puubar(1./3.), Pddbar(1./3.), Pssbar(1./3.); // SU(3) symmetry
@@ -349,48 +604,63 @@ if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
// --------- Set parameters of nuclear destruction--------------------
if( absPDGcode < 1000 )
if( ProjectileabsPDGcode < 1000 ) // Meson projectile
{
SetMaxNumberOfCollisions(1000.,1.); //(Plab,2.); //3.); ##############################
SetMaxNumberOfCollisions(Plab,2.); //3.); ##############################
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/
(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
// SetCofNuclearDestruction(0.); //1.0); // for meson projectile
// SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1))));
//G4cout<<Ylab<<" "<<0.62*std::exp(4.*(Ylab-4.5))/(1.+std::exp(4.*(Ylab-4.5)))<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
SetR2ofNuclearDestruction(1.5*fermi*fermi);
// SetMaxNumberOfCollisions(Plab,2.); //4.); // ##############################
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
//------------------------------------------
// SetDofNuclearDestruction(0.4);
// SetPt2ofNuclearDestruction(0.17*GeV*GeV);
// SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
// SetExcitationEnergyPerWoundedNucleon(100*MeV);
SetDofNuclearDestruction(0.4);
SetPt2ofNuclearDestruction((0.035+
0.04*std::exp(4.*(Ylab-2.5))/(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
SetPt2ofNuclearDestruction((0.035+0.04*std::exp(4.*(Ylab-2.5))/
(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
//G4cout<<"Parm Pt2 Y "<<(0.035+0.04*std::exp(4.*(Ylab-2.5))/(1.+std::exp(4.*(Ylab-2.5))))<<" "<<Ylab<<G4endl;
SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
SetExcitationEnergyPerWoundedNucleon(75.*MeV);
} else // for baryon projectile
} else if( ProjectilePDGcode < -1000 ) // for anti-baryon projectile
{
SetMaxNumberOfCollisions(Plab,2.); //4.); // ##############################
//G4cout<<"Nucl destruct Anti Bar"<<G4endl;
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
//G4cout<<Ylab<<" "<<0.62*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1)))<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
SetMaxNumberOfCollisions(Plab,2.); //3.); ##############################
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/
(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
SetR2ofNuclearDestruction(1.5*fermi*fermi);
SetDofNuclearDestruction(0.4);
SetPt2ofNuclearDestruction((0.035+
0.04*std::exp(4.*(Ylab-2.5))/(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
SetPt2ofNuclearDestruction((0.035+0.04*std::exp(4.*(Ylab-2.5))/
(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
SetExcitationEnergyPerWoundedNucleon(75.*MeV);
if(Plab < 2.) // 2 GeV/c
{ // For slow anti-baryon we have to garanty putting on mass-shell
SetCofNuclearDestruction(0.);
SetR2ofNuclearDestruction(1.5*fermi*fermi);
SetDofNuclearDestruction(0.01);
SetPt2ofNuclearDestruction(0.035*GeV*GeV);
SetMaxPt2ofNuclearDestruction(0.04*GeV*GeV);
// SetExcitationEnergyPerWoundedNucleon(0.); // ?????
}
} else // Projectile baryon assumed
{
SetMaxNumberOfCollisions(Plab,2.); //3.); ##############################
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/
(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
SetR2ofNuclearDestruction(1.5*fermi*fermi);
SetDofNuclearDestruction(0.4);
SetPt2ofNuclearDestruction((0.035+0.04*std::exp(4.*(Ylab-2.5))/
(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
SetExcitationEnergyPerWoundedNucleon(75.*MeV);
}
SetR2ofNuclearDestruction(1.5*fermi*fermi);
//SetCofNuclearDestruction(0.47*std::exp(2.*(Ylab-2.5))/(1.+std::exp(2.*(Ylab-2.5))));
//SetPt2ofNuclearDestruction((0.035+0.1*std::exp(4.*(Ylab-3.))/(1.+std::exp(4.*(Ylab-3.))))*GeV*GeV);
@@ -412,11 +682,14 @@ if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
//SetAveragePt2(0.3); //(0.15);
//SetAvaragePt2ofElasticScattering(0.);
//SetMaxNumberOfCollisions(4.*(Plab+0.01),Plab); //6.); // ##############################
//SetCofNuclearDestruction(0.2); //(0.4);
//SetMaxNumberOfCollisions(Plab,6.); //(4.*(Plab+0.01),Plab); //6.); // ##########
//SetAveragePt2(0.15);
//G4cout<<"Cnd "<<GetCofNuclearDestruction()<<G4endl;
//SetCofNuclearDestruction(0.4);// (0.2); //(0.4);
//SetExcitationEnergyPerWoundedNucleon(0.*MeV); //(75.*MeV);
//SetDofNuclearDestruction(0.4); //(0.4);
//SetPt2ofNuclearDestruction(0.1*GeV*GeV); //(0.168*GeV*GeV);
//SetDofNuclearDestruction(0.);
//SetPt2ofNuclearDestruction(0.*GeV*GeV); //(0.168*GeV*GeV);
//G4cout<<"Pt2 "<<GetPt2ofNuclearDestruction()/GeV/GeV<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
}
//**********************************************************************************************
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FTFParticipants.cc,v 1.17 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
// $Id: G4FTFParticipants.cc,v 1.18 2010/12/07 10:42:40 vuzhinsk Exp $
// GEANT4 tag $Name: $
//
// ------------------------------------------------------------
// GEANT 4 class implementation file
@@ -35,6 +35,8 @@
// class finding colliding particles in FTFPartonStringModel
// Changed in a part by V. Uzhinsky in oder to put in correcpondence
// with original FRITIOF mode. November - December 2006.
// Ajusted for (anti) nucleus - nucleus interactions by V. Uzhinsky.
// (February 2011)
// ------------------------------------------------------------
#include "G4FTFParameters.hh" // Uzhi 29.03.08
@@ -43,66 +45,90 @@
#include "G4VSplitableHadron.hh"
#include "Randomize.hh"
#include <utility> // Uzhi 29.03.08
#include "G4ios.hh"
#include <vector>
#include <algorithm>
// Class G4FTFParticipants
G4FTFParticipants::G4FTFParticipants()
{
theProjectileNucleus=0;
}
G4FTFParticipants::G4FTFParticipants(const G4FTFParticipants &): G4VParticipants()
{
G4Exception("G4FTFParticipants::G4FTFParticipants()","HAD_FTF_001",
FatalException," Must not use copy ctor()");
}
G4FTFParticipants::~G4FTFParticipants()
{
if ( theProjectileNucleus != NULL ) delete theProjectileNucleus;
}
//-------------------------------------------------------------------------
//const G4FTFParticipants & G4FTFParticipants::operator=(const G4FTFParticipants &right)
//{}
void G4FTFParticipants::SetProjectileNucleus(G4V3DNucleus * aNucleus)
{
if (theProjectileNucleus) delete theProjectileNucleus;
theProjectileNucleus = aNucleus;
}
G4V3DNucleus * G4FTFParticipants::GetProjectileNucleus()
{
return theProjectileNucleus;
}
//int G4FTFParticipants::operator==(const G4FTFParticipants &right) const
//{}
//int G4FTFParticipants::operator!=(const G4FTFParticipants &right) const
//{}
void G4FTFParticipants::InitProjectileNucleus(G4int theA, G4int theZ)
{
if ( theProjectileNucleus == NULL ) theProjectileNucleus = new G4Fancy3DNucleus();
theProjectileNucleus->Init(theA, theZ);
theProjectileNucleus->SortNucleonsDecZ();
}
//-------------------------------------------------------------------------
void G4FTFParticipants::GetList(const G4ReactionProduct &thePrimary,
G4FTFParameters *theParameters)
{
{
//G4cout<<"Participants::GetList"<<G4endl;
//G4cout<<"thePrimary "<<thePrimary.GetMomentum()<<G4endl;
StartLoop(); // reset Loop over Interactions
for(unsigned int i=0; i<theInteractions.size(); i++) delete theInteractions[i];
theInteractions.clear();
G4double deltaxy=2 * fermi; // Extra nuclear radius
//G4cout<<"theProjectileNucleus "<<theProjectileNucleus<<G4endl;
if(theProjectileNucleus == 0)
{ // Hadron-nucleus or anti-baryon-nucleus interactions
//G4cout<<"Hadron-nucleus or anti-baryon-nucleus interactions"<<G4endl;
G4VSplitableHadron * primarySplitable=new G4DiffractiveSplitableHadron(thePrimary);
G4double impactX(0.), impactY(0.);
G4double xyradius;
xyradius =theNucleus->GetOuterRadius() + deltaxy; // Impact parameter sampling
// radius
G4VSplitableHadron * primarySplitable=new G4DiffractiveSplitableHadron(thePrimary);
//G4cout<<"Prim in Part "<<primarySplitable->Get4Momentum()<<G4endl;
G4double xyradius;
xyradius =theNucleus->GetOuterRadius() + deltaxy; // Impact parameter sampling
// G4bool nucleusNeedsShift = true; // Uzhi 20 July 2009
while ( theInteractions.size() == 0 )
{
std::pair<G4double, G4double> theImpactParameter;
theImpactParameter = theNucleus->ChooseImpactXandY(xyradius);
G4double impactX = theImpactParameter.first;
G4double impactY = theImpactParameter.second;
while ( theInteractions.size() == 0 )
{
std::pair<G4double, G4double> theImpactParameter;
theImpactParameter = theNucleus->ChooseImpactXandY(xyradius);
impactX = theImpactParameter.first;
impactY = theImpactParameter.second;
G4ThreeVector thePosition(impactX, impactY, -DBL_MAX);
primarySplitable->SetPosition(thePosition);
G4ThreeVector thePosition(impactX, impactY, -DBL_MAX);
primarySplitable->SetPosition(thePosition);
theNucleus->StartLoop();
G4Nucleon * nucleon;
theNucleus->StartLoop();
G4Nucleon * nucleon;
while ( (nucleon=theNucleus->GetNextNucleon()) )
{
G4int TrN(0);
while ( (nucleon=theNucleus->GetNextNucleon()) )
{
G4double impact2= sqr(impactX - nucleon->GetPosition().x()) +
sqr(impactY - nucleon->GetPosition().y());
@@ -117,23 +143,132 @@ void G4FTFParticipants::GetList(const G4ReactionProduct &thePrimary,
targetSplitable= new G4DiffractiveSplitableHadron(*nucleon);
nucleon->Hit(targetSplitable);
nucleon->SetBindingEnergy(3.*nucleon->GetBindingEnergy());
//G4cout<<" Part nucl "<<TrN<<" "<<nucleon->Get4Momentum()<<G4endl;
//G4cout<<" Part nucl "<<G4endl;
targetSplitable->SetStatus(1); // It takes part in the interaction
}
G4InteractionContent * aInteraction =
new G4InteractionContent(primarySplitable);
aInteraction->SetTarget(targetSplitable);
aInteraction->SetTargetNucleon(nucleon); // Uzhi 16.07.09
aInteraction->SetStatus(1); // Uzhi Feb26
theInteractions.push_back(aInteraction);
}
}
TrN++;
}
} // end of while ( theInteractions.size() == 0 )
// G4cout << "Number of Hit nucleons " << theInteractions.size()<<G4endl; // entries()
// G4cout << "Number of Hit nucleons " << theInteractions.size()
// << "\t" << impactX/fermi << "\t"<<impactY/fermi
// << "\t" << std::sqrt(sqr(impactX)+sqr(impactY))/fermi <<G4endl;
}
}
return;
} // end of if(theProjectileNucleus == 0)
//-------------------------------------------------------------------
// Projectile and target are nuclei
//-------------------------------------------------------------------
//VU G4VSplitableHadron * primarySplitable=new G4DiffractiveSplitableHadron(thePrimary);
//G4cout<<"Prim in Part "<<primarySplitable->Get4Momentum()<<G4endl;
//G4cout<<"Projectile and target are nuclei"<<G4endl;
//G4cout<<thePrimary.GetMomentum()<<G4endl;
//G4cout<<"Part Pr Tr "<<theProjectileNucleus<<" "<<theNucleus<<G4endl;
G4double xyradius;
xyradius =theProjectileNucleus->GetOuterRadius() + // Impact parameter sampling
theNucleus->GetOuterRadius() + deltaxy;
G4double impactX(0.), impactY(0.);
while ( theInteractions.size() == 0 )
{
//G4cout<<"New interaction list"<<G4endl;
std::pair<G4double, G4double> theImpactParameter;
theImpactParameter = theNucleus->ChooseImpactXandY(xyradius);
impactX = theImpactParameter.first;
impactY = theImpactParameter.second;
//G4cout<<"B "<<std::sqrt(sqr(impactX)+sqr(impactY))/fermi<<G4endl;
G4ThreeVector thePosition(impactX, impactY, -DBL_MAX);
//VU primarySplitable->SetPosition(thePosition);
theProjectileNucleus->StartLoop();
G4Nucleon * ProjectileNucleon;
G4int PrNuclN(0);
while ( (ProjectileNucleon=theProjectileNucleus->GetNextNucleon()) )
{
G4VSplitableHadron * ProjectileSplitable=0;
//G4cout<<G4endl<<"Prj N mom "<<ProjectileNucleon->Get4Momentum()<<"-------------"<<G4endl;
theNucleus->StartLoop();
G4Nucleon * TargetNucleon;
G4int TrNuclN(0);
while ( (TargetNucleon=theNucleus->GetNextNucleon()) )
{
//G4cout<<"Trg N mom "<<TargetNucleon->Get4Momentum()<<G4endl;
G4double impact2=
sqr(impactX+ProjectileNucleon->GetPosition().x()-TargetNucleon->GetPosition().x())+
sqr(impactY+ProjectileNucleon->GetPosition().y()-TargetNucleon->GetPosition().y());
G4VSplitableHadron * TargetSplitable=0;
if ( theParameters->GetProbabilityOfInteraction(impact2/fermi/fermi)
> G4UniformRand() )
{ // An Interaction has happend!
//G4cout<<"An Interaction has happend"<<G4endl;
//G4cout<<"PrN TrN "<<PrNuclN<<" "<<TrNuclN<<" "<<ProjectileNucleon->GetPosition().z()/fermi<<" "<<TargetNucleon->GetPosition().z()/fermi<<" "<<ProjectileNucleon->GetPosition().z()/fermi + TargetNucleon->GetPosition().z()/fermi <<G4endl;
if ( ! ProjectileNucleon->AreYouHit() )
{ // Projectile nucleon was not involved until now.
ProjectileSplitable= new G4DiffractiveSplitableHadron(*ProjectileNucleon);
ProjectileNucleon->Hit(ProjectileSplitable);
ProjectileNucleon->SetBindingEnergy(3.*ProjectileNucleon->GetBindingEnergy());
ProjectileSplitable->SetStatus(1); // It takes part in the interaction
}
else
{ // Projectile nucleon was involved before.
ProjectileSplitable=ProjectileNucleon->GetSplitableHadron();
} // End of if ( ! Projectileucleon->AreYouHit() )
if ( ! TargetNucleon->AreYouHit() )
{ // Target nucleon was not involved until now
TargetSplitable= new G4DiffractiveSplitableHadron(*TargetNucleon);
TargetNucleon->Hit(TargetSplitable);
TargetNucleon->SetBindingEnergy(3.*ProjectileNucleon->GetBindingEnergy());
TargetSplitable->SetStatus(1); // It takes part in the interaction
}
else
{ // Target nucleon was involved before.
TargetSplitable=TargetNucleon->GetSplitableHadron();
} // End of if ( ! TargetNeucleon->AreYouHit() )
G4InteractionContent * anInteraction =
new G4InteractionContent(ProjectileSplitable);
anInteraction->SetTarget(TargetSplitable);
anInteraction->SetTargetNucleon(TargetNucleon);
anInteraction->SetStatus(1); // Uzhi Feb26
// anInteraction->SetInteractionTime(ProjectileNucleon->GetPosition().z()+
// TargetNucleon->GetPosition().z());
//G4cout<<"Z's pr tr "<<ProjectileNucleon->GetPosition().z()/fermi<<" "<<TargetNucleon->GetPosition().z()/fermi<<" "<<ProjectileNucleon->GetPosition().z()/fermi + TargetNucleon->GetPosition().z()/fermi <<G4endl;
theInteractions.push_back(anInteraction);
//G4cout<<"Ppr tr "<<ProjectileSplitable<<" "<<TargetSplitable<<G4endl;
} // End of An Interaction has happend!
TrNuclN++;
} // End of while ( (TargetNucleon=theNucleus->GetNextNucleon()) )
PrNuclN++;
} // End of while ( (ProjectileNucleon=theProjectileNucleus->GetNextNucleon()) )
} // end of while ( theInteractions.size() == 0 )
//std::sort(theInteractions.begin(),theInteractions.end()); // ????
// G4cout << "Number of primary collisions " << theInteractions.size()
// << "\t" << impactX/fermi << "\t"<<impactY/fermi
// << "\t" << std::sqrt(sqr(impactX)+sqr(impactY))/fermi <<G4endl;
//G4int Uzhi; G4cin >> Uzhi;
return;
}
//--------------------------------------------------------------
// Implementation (private) methods