Import Geant4 10.2.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-10 14:11:04 +02:00
parent c9b32a6c0a
commit d4af681f38
4886 changed files with 420149 additions and 1023309 deletions
@@ -1,4 +1,4 @@
$Id: History 87254 2014-11-28 07:49:23Z gcosmo $
$Id: History 92048 2015-08-14 07:24:57Z gcosmo $
-------------------------------------------------------------------
==========================================================
@@ -14,6 +14,77 @@ code and to keep track of all tags.
---------------------------------------------------------------
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
13-Aug-2015 A. Ribon (hadr-string-diff-V10-01-14)
- G4FTFModel and G4DiffractiveExcitation : Coverity fixes.
10-Aug-2015 A. Ribon (hadr-string-diff-V10-01-13)
- G4FTFModel, G4FTFParticipants, G4FTFAnnihilation, G4ElasticHNScattering,
G4DiffractiveExcitation and G4DiffractiveSplitableHadron : checking of
'while' loops.
05-Aug-2015 A. Ribon (hadr-string-diff-V10-01-12)
- G4FTFParameters, G4FTFModel, G4FTFAnnihilation, G4DiffractiveExcitation
and G4ElasticHNScattering: replaced std::exp, std::log and std::pow
with the faster G4Exp, G4Log and G4Pow, respectively.
This changes the random number sequence.
13-Jul-2015 A. Dotti (hadr-string-diff-V10-01-11)
- Fixing coverity issues #14434, 20328
25-Jun-2015 A. Ribon (hadr-string-diff-V10-01-10)
- G4FTFParameters : fixed Valgrind error of uninitialized variables.
29-May-2015 V. Uzhinsky (hadr-string-diff-V10-01-09)
- G4FTFModel : Elastic hN scattering is protected.
28-May-2015 A. Ribon (hadr-string-diff-V10-01-08)
- G4FTFModel : fixed energy non-conservation in nucleus-nucleus interactions
in the method SamplingNucleonKinematics.
25-May-2015 V. Uzhinsky (hadr-string-diff-V10-01-07)
A correct coupling of FTF and BIC is created. Energy-momentum is conserved.
24-May-2015 V. Uzhinsky (hadr-string-diff-V10-01-06)
Bug is fixed in G4FTFModel::SamplingNucleonKinematics for
hadron-nucleon interactions.
22-May-2015 V. Uzhinsky (hadr-string-diff-V10-01-05)
Sampling of nucleon momenta after the reggeon cascading is improved in
G4bool G4FTFModel::SamplingNucleonKinematics.
20-May-2015 V. Uzhinsky (hadr-string-diff-V10-01-04)
G4FTFModel.cc A model description was added.
18-May-2015 V. Uzhinsky (hadr-string-diff-V10-01-03)
G4FTFModel.cc
LowEnergyLimit = 2000.0*MeV -> LowEnergyLimit = 1000.0*MeV;
G4FTFParameters.cc
A bug at Xnn calculations found by Alberto is fixed. The bug gives Xin=0 for projectile
nucleons in Nucl-Nucl interactions.
New methods - Set/Get CofNuclearDestructionPr(), for projectile nucleus were introduced,
according to last studies that Reggeon cascading depends on nuclear mass number.
22-Apr-2015 A. Ribon (hadr-string-diff-V10-01-02)
- G4FTFParticipants : added a new method to clean up the member vector.
- G4FTFModel : using the above new method to release the memory allocated
in GetStrings().
7-April-2015 V. Uzhinsky (hadr-string-diff-V10-01-01)
G4FTFModel.cc
LowEnergyLimit = 2000.0*MeV -> LowEnergyLimit = 1000.0*MeV;
A smearing of the excitation energy associated with an involved nucleon is introduced.
Look for // Uzhi April 2015
G4FTFParameters.cc
Evarage e* per wounded nucleon was to set 40 MeV for all interactions after analysis of
ITEP and Leray exp. data.
27-Mar-2015 A. Ribon (hadr-string-diff-V10-01-00)
- G4FTFParameters : tuning to improve the description of evaporated neutrons
27-Nov-2014 V. Uzhinsky (hadr-string-diff-V10-00-15)
- Charge non-conservation is erased for meson-nucleus interactions
in G4Diffractive Excitation. It was caused by quark exchange.
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFModel.hh 83402 2014-08-21 15:05:10Z gcosmo $
// $Id: G4FTFModel.hh 90331 2015-05-26 08:24:09Z gcosmo $
// GEANT4 tag $Name: $
//
// Class Description
@@ -103,12 +103,13 @@ class G4FTFModel : public G4VPartonStringModel {
G4Nucleon* involvedNucleons[], G4double& sumMasses );
// Utility method used by PutOnMassShell.
G4bool SamplingNucleonKinematics( const G4double averagePt2, const G4double maxPt2,
const G4double dCor, G4V3DNucleus* nucleus,
G4bool SamplingNucleonKinematics( G4double averagePt2, const G4double maxPt2, // Uzhi
G4double dCor, G4V3DNucleus* nucleus, // Uzhi
const G4LorentzVector& pResidual,
const G4double residualMass, const G4int residualMassNumber,
const G4int numberOfInvolvedNucleons,
G4Nucleon* involvedNucleons[], G4double& mass2 );
// Utility method used by PutOnMassShell.
G4bool CheckKinematics( const G4double sValue, const G4double sqrtS,
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFParameters.hh 86646 2014-11-14 13:29:39Z gcosmo $
// $Id: G4FTFParameters.hh 91775 2015-08-05 14:42:39Z gcosmo $
// GEANT4 tag $Name: $
//
#ifndef G4FTFParameters_h
@@ -36,6 +36,8 @@
#include "G4Neutron.hh"
#include "G4ChipsComponentXS.hh"
#include "G4Exp.hh"
class G4FTFParameters {
@@ -71,7 +73,7 @@ class G4FTFParameters {
void SetProjMinDiffMass( const G4double aValue );
void SetProjMinNonDiffMass( const G4double aValue );
// void SetProbabilityOfProjDiff( const G4double aValue ); // Uzhi Oct 2014
void SetProbLogDistrPrD( const G4double aValue ); // Uzhi Oct 2014
void SetProbLogDistrPrD( const G4double aValue );
void SetTarMinDiffMass( const G4double aValue );
void SetTarMinNonDiffMass( const G4double aValue );
@@ -89,6 +91,7 @@ class G4FTFParameters {
void SetMaxNumberOfCollisions( const G4double aValue, const G4double bValue );
void SetProbOfInteraction( const G4double aValue );
void SetCofNuclearDestructionPr( const G4double aValue ); // Uzhi May 2015
void SetCofNuclearDestruction( const G4double aValue );
void SetR2ofNuclearDestruction( const G4double aValue );
@@ -120,7 +123,7 @@ class G4FTFParameters {
G4double GetProjMinDiffMass();
G4double GetProjMinNonDiffMass();
G4double GetProbLogDistrPrD(); // Uzhi Oct 2014
G4double GetProbLogDistrPrD();
G4double GetTarMinDiffMass();
G4double GetTarMinNonDiffMass();
@@ -136,6 +139,7 @@ class G4FTFParameters {
G4double GetMaxNumberOfCollisions();
G4double GetProbOfInteraction();
G4double GetCofNuclearDestructionPr(); // Uzhi May 2015
G4double GetCofNuclearDestruction();
G4double GetR2ofNuclearDestruction();
@@ -189,6 +193,7 @@ class G4FTFParameters {
G4double MaxNumberOfCollisions;
G4double ProbOfInelInteraction;
G4double CofNuclearDestructionPr; // Cnd of nuclear destruction of projectile nucleus, May 2015.
G4double CofNuclearDestruction; // Cnd of nuclear destruction
G4double R2ofNuclearDestruction; // R2nd
@@ -207,7 +212,7 @@ class G4FTFParameters {
inline G4double G4FTFParameters::GammaElastic( const G4double impactsquare ) {
return ( FTFGamma0 * std::exp( -FTFSlope * impactsquare ) );
return ( FTFGamma0 * G4Exp( -FTFSlope * impactsquare ) );
}
inline void G4FTFParameters::SethNcmsEnergy( const G4double S ) {
@@ -332,7 +337,7 @@ inline void G4FTFParameters::SetMaxNumberOfCollisions( const G4double Plab,
SetProbOfInteraction( -1.0 );
} else {
//MaxNumberOfCollisions = -1.0;
//SetProbOfInteraction( std::exp( 0.25*(Plab-Pbound) ) );
//SetProbOfInteraction( G4Exp( 0.25*(Plab-Pbound) ) );
MaxNumberOfCollisions = 1;
SetProbOfInteraction( -1.0 );
}
@@ -342,6 +347,10 @@ inline void G4FTFParameters::SetProbOfInteraction( const G4double aValue ) {
ProbOfInelInteraction = aValue;
}
inline void G4FTFParameters::SetCofNuclearDestructionPr( const G4double aValue ) { // Uzhi May 2015
CofNuclearDestructionPr = aValue;
}
inline void G4FTFParameters::SetCofNuclearDestruction( const G4double aValue ) {
CofNuclearDestruction = aValue;
}
@@ -467,6 +476,10 @@ inline G4double G4FTFParameters::GetProbOfInteraction() {
return ProbOfInelInteraction;
}
inline G4double G4FTFParameters::GetCofNuclearDestructionPr() { // Uzhi May 2015
return CofNuclearDestructionPr;
}
inline G4double G4FTFParameters::GetCofNuclearDestruction() {
return CofNuclearDestruction;
}
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFParticipants.hh 74627 2013-10-17 07:04:38Z gcosmo $
// $Id: G4FTFParticipants.hh 89632 2015-04-23 12:19:33Z gcosmo $
//
#ifndef G4FTFParticipants_h
@@ -63,6 +63,7 @@ class G4FTFParticipants : public G4VParticipants {
void SortInteractionsIncT();
void ShiftInteractionTime();
G4InteractionContent& GetInteraction();
void Clean();
std::vector< G4InteractionContent* > theInteractions;
private:
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveExcitation.cc 87254 2014-11-28 07:49:23Z gcosmo $
// $Id: G4DiffractiveExcitation.cc 92048 2015-08-14 07:24:57Z gcosmo $
//
// ------------------------------------------------------------
@@ -66,6 +66,9 @@
#include "G4ExcitedString.hh"
#include "G4Neutron.hh"
#include "G4Exp.hh"
#include "G4Log.hh"
#include "G4Pow.hh"
//#include "G4ios.hh"
//#include "UZHI_diffraction.hh"
@@ -175,7 +178,7 @@ G4bool G4DiffractiveExcitation::ExciteParticipants( G4VSplitableHadron* proje
#endif
G4double AveragePt2 = theParameters->GetAveragePt2();
// G4double ProbLogDistrPrD = theParameters->GetProbLogDistrPrD(); // Uzhi Oct 2014
// G4double ProbLogDistrPrD = theParameters->GetProbLogDistrPrD(); // Uzhi Oct 2014 ***
G4double ProbLogDistr = theParameters->GetProbLogDistr();
G4double SumMasses = M0projectile + M0target; // + 220.0*MeV; // Uzhi Nov. 2014
@@ -395,7 +398,7 @@ G4bool G4DiffractiveExcitation::ExciteParticipants( G4VSplitableHadron* proje
G4bool ProjExcited = false; // Uzhi Oct 2014
G4int attempts=0; // Uzhi Oct 2014 start
while(attempts < 50)
while(attempts < 50) /* Loop checking, 10.08.2015, A.Ribon */
{// Determination of a new projectile ID which garanty energy-momentum conservation
attempts++;
@@ -639,7 +642,7 @@ M0target = MtestTr;
NewTargCode = NewNucleonId( TargQ1, TargQ2, TargQ3 );
G4int attempts=0; // Uzhi Oct 2014 start
while(attempts < 50)
while(attempts < 50) /* Loop checking, 10.08.2015, A.Ribon */
{// Determination of a new projectile ID which garanty energy-momentum conservation
attempts++;
@@ -822,7 +825,6 @@ M0target = MtestTr;
if ( ProbOfDiffraction != 0.0 ) {
ProbProjectileDiffraction /= ProbOfDiffraction;
ProbTargetDiffraction /= ProbOfDiffraction;
ProbOfDiffraction=1.0;
}
//Uzhi_QEnex++;
} // End of if ( G4UniformRand() < QeExc + QeNoExc ) , i.e. of the charge exchange part
@@ -932,7 +934,7 @@ M0target = MtestTr;
Qmomentum.setPz( (Qplus - Qminus)/2 );
Qmomentum.setE( (Qplus + Qminus)/2 );
} while ( ( Pprojectile + Qmomentum ).mag2() < ProjectileDiffStateMinMass2 );
} while ( ( Pprojectile + Qmomentum ).mag2() < ProjectileDiffStateMinMass2 ); /* Loop checking, 10.08.2015, A.Ribon */
// Repeat the sampling because there was not any excitation
// projectile->SetStatus( 1*projectile->GetStatus() ); // Uzhi Oct 2014
@@ -1008,7 +1010,7 @@ M0target = MtestTr;
Qmomentum.setPz( (Qplus - Qminus)/2 );
Qmomentum.setE( (Qplus + Qminus)/2 );
} while ( ( Ptarget - Qmomentum ).mag2() < TargetDiffStateMinMass2 );
} while ( ( Ptarget - Qmomentum ).mag2() < TargetDiffStateMinMass2 ); /* Loop checking, 10.08.2015, A.Ribon */
// Repeat the sampling because there was not any excitation
// target->SetStatus( 1*target->GetStatus() ); // Uzhi Oct 2014
@@ -1113,7 +1115,7 @@ M0target = MtestTr;
} while ( ( Pprojectile + Qmomentum ).mag2() < ProjectileNonDiffStateMinMass2 || //No double Diffraction
( Ptarget - Qmomentum ).mag2() < TargetNonDiffStateMinMass2 || // ); //
( Pprojectile + Qmomentum ).pz() < 0.);
( Pprojectile + Qmomentum ).pz() < 0.); /* Loop checking, 10.08.2015, A.Ribon */
projectile->SetStatus( 0*projectile->GetStatus() );
target->SetStatus( 0*target->GetStatus() );
@@ -1233,19 +1235,19 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
if ( W > Wmin ) { // Kink is possible
if ( hadron->GetStatus() == 0 ) { // VU 10.04.2012
G4double Pt2kink = theParameters->GetPt2Kink(); // For non-diffractive
// Pt = std::sqrt( Pt2kink * ( std::pow( W2/16.0/Pt2kink + 1.0, G4UniformRand() ) - 1.0 ) ); // Uzhi 18 Sept. 2014
// Pt = std::sqrt( Pt2kink * ( G4Pow::GetInstance()->powA( W2/16.0/Pt2kink + 1.0, G4UniformRand() ) - 1.0 ) ); // Uzhi 18 Sept. 2014
if(Pt2kink) // Uzhi 18 Sept. 2014
{Pt = std::sqrt( Pt2kink * ( std::pow( W2/16.0/Pt2kink + 1.0, G4UniformRand() ) - 1.0 ) );} // Uzhi 18 Sept. 2014
{Pt = std::sqrt( Pt2kink * ( G4Pow::GetInstance()->powA( W2/16.0/Pt2kink + 1.0, G4UniformRand() ) - 1.0 ) );} // Uzhi 18 Sept. 2014
else {Pt=0.;} // Uzhi 18 Sept. 2014
} else {
Pt = 0.0;
}
if ( Pt > 500.0*MeV ) {
G4double Ymax = std::log( W/2.0/Pt + std::sqrt( W2/4.0/Pt/Pt - 1.0 ) );
G4double Ymax = G4Log( W/2.0/Pt + std::sqrt( W2/4.0/Pt/Pt - 1.0 ) );
G4double Y = Ymax*( 1.0 - 2.0*G4UniformRand() );
x1 = 1.0 - Pt/W * std::exp( Y );
x3 = 1.0 - Pt/W * std::exp(-Y );
x1 = 1.0 - Pt/W * G4Exp( Y );
x3 = 1.0 - Pt/W * G4Exp(-Y );
//x2 = 2.0 - x1 - x3;
G4double Mass_startQ = 650.0*MeV;
@@ -1525,7 +1527,7 @@ G4double G4DiffractiveExcitation::ChooseP( G4double Pmin, G4double Pmax ) const
throw G4HadronicException( __FILE__, __LINE__,
"G4DiffractiveExcitation::ChooseP : Invalid arguments " );
}
G4double P = Pmin * std::pow( Pmax/Pmin, G4UniformRand() );
G4double P = Pmin * G4Pow::GetInstance()->powA( Pmax/Pmin, G4UniformRand() );
//G4double P = (Pmax - Pmin) * G4UniformRand() + Pmin;
return P;
}
@@ -1539,8 +1541,8 @@ G4ThreeVector G4DiffractiveExcitation::GaussianPt( G4double AveragePt2, G4double
if ( AveragePt2 <= 0.0 ) {
Pt2 = 0.0;
} else {
Pt2 = -AveragePt2 * std::log( 1.0 + G4UniformRand() *
( std::exp( -maxPtSquare/AveragePt2 ) - 1.0 ) );
Pt2 = -AveragePt2 * G4Log( 1.0 + G4UniformRand() *
( G4Exp( -maxPtSquare/AveragePt2 ) - 1.0 ) );
}
G4double Pt = std::sqrt( Pt2 );
G4double phi = G4UniformRand() * twopi;
@@ -1552,10 +1554,16 @@ G4ThreeVector G4DiffractiveExcitation::GaussianPt( G4double AveragePt2, G4double
G4double G4DiffractiveExcitation::GetQuarkFractionOfKink( G4double zmin, G4double zmax ) const {
G4double z, yf;
const G4int maxNumberOfLoops = 10000;
G4int loopCounter = 0;
do {
z = zmin + G4UniformRand() * (zmax - zmin);
yf = z*z + sqr(1.0 - z);
} while ( G4UniformRand() > yf );
} while ( ( G4UniformRand() > yf ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
z = 0.5*(zmin + zmax); // Just something acceptable, without any physics consideration.
}
return z;
}
@@ -43,7 +43,11 @@ G4DiffractiveHHScatterer::G4DiffractiveHHScatterer() :
//============================================================================
G4DiffractiveHHScatterer::~G4DiffractiveHHScatterer() {}
G4DiffractiveHHScatterer::~G4DiffractiveHHScatterer()
{
delete theExcitation;
delete theStringFragmentation;
}
//============================================================================
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveSplitableHadron.cc 86646 2014-11-14 13:29:39Z gcosmo $
// $Id: G4DiffractiveSplitableHadron.cc 91914 2015-08-11 07:00:39Z gcosmo $
// GEANT4 tag $Name: $
//
@@ -196,6 +196,8 @@ void G4DiffractiveSplitableHadron::ChooseStringEnds( G4int PDGcode, G4int* aEnd,
if((j1000 == j100) && (j1000 == j10)) SuppresUUDDSS=1.;
//
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do
{
G4double random = G4UniformRand();
@@ -230,7 +232,12 @@ void G4DiffractiveSplitableHadron::ChooseStringEnds( G4int PDGcode, G4int* aEnd,
else {*bEnd = Diquark( j1000, j100, 1 );}
break;
}
} while(true);
} while ( (true) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
*aEnd = j10; *bEnd = Diquark( j1000, j100, 1 ); // Just something acceptable, without any physics consideration.
}
//
/*
if ( std::abs( j100 ) >= std::abs( j10 ) ) {
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4ElasticHNScattering.cc 86646 2014-11-14 13:29:39Z gcosmo $
// $Id: G4ElasticHNScattering.cc 91914 2015-08-11 07:00:39Z gcosmo $
//
// ------------------------------------------------------------
@@ -51,6 +51,9 @@
#include "G4SampleResonance.hh" // Uzhi Oct 2014
#include "G4Exp.hh"
#include "G4Log.hh"
//============================================================================
G4ElasticHNScattering::G4ElasticHNScattering() {}
@@ -157,6 +160,8 @@ G4bool G4ElasticHNScattering::ElasticScattering( G4VSplitableHadron* projectile,
G4double TargMassT2, TargMassT;
G4LorentzVector Qmomentum;
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do {
Qmomentum = G4LorentzVector( GaussianPt( AveragePt2, maxPtSquare ), 0.0 );
Pt2 = G4ThreeVector( Qmomentum.vect() ).mag2();
@@ -164,7 +169,11 @@ G4bool G4ElasticHNScattering::ElasticScattering( G4VSplitableHadron* projectile,
ProjMassT = std::sqrt( ProjMassT2 );
TargMassT2 = M0target2 + Pt2;
TargMassT = std::sqrt( TargMassT2 );
} while ( SqrtS < ProjMassT + TargMassT );
} while ( ( SqrtS < ProjMassT + TargMassT ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
PZcms2 = ( S*S + sqr( ProjMassT2 ) + sqr( TargMassT2 )
- 2.0*S*ProjMassT2 - 2.0*S*TargMassT2 - 2.0*ProjMassT2*TargMassT2 ) / 4.0 / S;
@@ -206,8 +215,8 @@ G4ThreeVector G4ElasticHNScattering::GaussianPt( G4double AveragePt2,
if ( AveragePt2 <= 0.0 ) {
Pt2 = 0.0;
} else {
Pt2 = -AveragePt2 * std::log( 1.0 + G4UniformRand() *
( std::exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
Pt2 = -AveragePt2 * G4Log( 1.0 + G4UniformRand() *
( G4Exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
}
G4double Pt = std::sqrt( Pt2 );
G4double phi = G4UniformRand() * twopi;
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFAnnihilation.cc 86646 2014-11-14 13:29:39Z gcosmo $
// $Id: G4FTFAnnihilation.cc 91914 2015-08-11 07:00:39Z gcosmo $
//
// ------------------------------------------------------------
@@ -59,13 +59,17 @@
#include "G4Neutron.hh"
#include "G4ParticleDefinition.hh"
#include "G4Exp.hh"
#include "G4Log.hh"
#include "G4Pow.hh"
//#include "G4ios.hh"
//#include "UZHI_diffraction.hh"
//============================================================================
//efine debugFTFannih
//define debugFTFannih
//============================================================================
@@ -163,7 +167,7 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
// Process cross sections
X_a = 25.0*FlowF; // mb 3-shirt diagram
if ( SqrtS < MesonProdThreshold ) {
X_b = 3.13 + 140.0*std::pow( ( MesonProdThreshold - SqrtS )/GeV, 2.5 );
X_b = 3.13 + 140.0*G4Pow::GetInstance()->powA( ( MesonProdThreshold - SqrtS )/GeV, 2.5 );
} else {
X_b = 6.8*GeV / SqrtS; // mb anti-quark-quark annihilation
}
@@ -302,7 +306,9 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
G4int NumberOfTries( 0 );
G4double ScaleFactor( 1.0 );
do { // while ( SumMt > SqrtS );
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do {
NumberOfTries++;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
// At large number of tries it would be better to reduce the values of <Pt^2>
@@ -322,7 +328,11 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
ModMom2[i] = Quark_Mom[i].mag2();
SumMt += std::sqrt( ModMom2[i] + MassQ2 );
}
} while ( SumMt > SqrtS );
} while ( ( SumMt > SqrtS ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
G4double WminusTarget( 0.0 ), WplusProjectile( 0.0 );
@@ -349,7 +359,8 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
ScaleFactor = 1.0;
G4bool Succes( true );
do { // while ( ! Succes )
loopCounter = 0;
do {
Succes = true;
NumberOfTries++;
@@ -412,7 +423,11 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
WminusTarget = ( S - Alfa + Beta + std::sqrt( DecayMomentum2 ) ) / 2.0 / SqrtS;
WplusProjectile = SqrtS - Beta/WminusTarget;
} while ( ! Succes );
} while ( ( ! Succes ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
G4double SqrtScaleF = std::sqrt( ScaleFactor );
for ( G4int i = 0; i < 3; i++ ) {
@@ -672,6 +687,8 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
G4int NumberOfTries( 0 );
G4double ScaleFactor( 1.0 );
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do {
NumberOfTries++;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
@@ -692,7 +709,11 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
ModMom2[i] = Quark_Mom[i].mag2();
SumMt += std::sqrt( ModMom2[i] + MassQ2 );
}
} while ( SumMt > SqrtS );
} while ( ( SumMt > SqrtS ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
G4double WminusTarget( 0.0 ), WplusProjectile( 0.0 );
@@ -702,6 +723,7 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
ScaleFactor = 1.0;
G4bool Succes( true );
loopCounter = 0;
do {
Succes = true;
@@ -760,7 +782,11 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
WminusTarget = ( S - Alfa + Beta + std::sqrt( DecayMomentum2 ) ) / 2.0 / SqrtS;
WplusProjectile = SqrtS - Beta/WminusTarget;
} while ( ! Succes );
} while ( ( ! Succes ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
G4double SqrtScaleF = std::sqrt( ScaleFactor );
@@ -942,8 +968,8 @@ G4ThreeVector G4FTFAnnihilation::GaussianPt( G4double AveragePt2, G4double maxPt
if ( AveragePt2 <= 0.0 ) {
Pt2 = 0.0;
} else {
Pt2 = -AveragePt2 * std::log( 1.0 + G4UniformRand() *
( std::exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
Pt2 = -AveragePt2 * G4Log( 1.0 + G4UniformRand() *
( G4Exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
}
G4double Pt = std::sqrt( Pt2 );
G4double phi = G4UniformRand() * twopi;
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFModel.cc 87183 2014-11-26 15:23:34Z gcosmo $
// $Id: G4FTFModel.cc 94688 2015-12-02 17:15:08Z gunter $
// GEANT4 tag $Name: $
//
@@ -53,7 +53,10 @@
#include "G4ParticleDefinition.hh"
#include "G4ParticleTable.hh"
#include "G4IonTable.hh"
#include "G4KineticTrack.hh" // Uzhi Oct 2014
#include "G4KineticTrack.hh"
#include "G4Exp.hh"
#include "G4Log.hh"
//============================================================================
@@ -76,8 +79,14 @@ G4FTFModel::G4FTFModel( const G4String& modelName ) :
theParameters = 0;
NumberOfInvolvedNucleonsOfTarget = 0;
NumberOfInvolvedNucleonsOfProjectile= 0;
for ( G4int i = 0; i < 250; i++ ) {
TheInvolvedNucleonsOfTarget[i] = 0;
TheInvolvedNucleonsOfProjectile[i] = 0;
}
// LowEnergyLimit = 2000.0*MeV; // Uzhi March 2015
LowEnergyLimit = 1000.0*MeV; // Uzhi May 2015
LowEnergyLimit = 2000.0*MeV;
HighEnergyInter = true;
G4LorentzVector tmp( 0.0, 0.0, 0.0, 0.0 );
@@ -154,6 +163,8 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj
<< " " << aNucleus.GetZ_asInt() << G4endl;
#endif
theParticipants.Clean();
theParticipants.SetProjectileNucleus( 0 );
G4LorentzVector tmp( 0.0, 0.0, 0.0, 0.0 );
@@ -206,7 +217,7 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj
std::abs( G4int( theProjectile.GetDefinition()->GetPDGCharge() ) ) );
theParticipants.theProjectileNucleus->StartLoop();
G4Nucleon* aNucleon;
while ( ( aNucleon = theParticipants.theProjectileNucleus->GetNextNucleon() ) ) {
while ( ( aNucleon = theParticipants.theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( aNucleon->GetDefinition() == G4Proton::Proton() ) {
aNucleon->SetParticleType( G4AntiProton::AntiProton() );
} else if ( aNucleon->GetDefinition() == G4Neutron::Neutron() ) {
@@ -223,6 +234,7 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj
HighEnergyInter = true;
}
}
G4ThreeVector BoostVector = theProjectile.GetMomentum() / theProjectile.GetTotalEnergy();
theParticipants.theProjectileNucleus->DoLorentzBoost( BoostVector );
theParticipants.theProjectileNucleus->DoLorentzContraction( BoostVector );
@@ -249,6 +261,9 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj
G4cout << "FTF end of Init" << G4endl << G4endl;
#endif
if ( (std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 ) && // Uzhi 29.05.2015
(aNucleus.GetA_asInt() < 2) ) theParameters->SetProbabilityOfElasticScatt(0.);
}
@@ -314,7 +329,7 @@ G4ExcitedStringVector* G4FTFModel::GetStrings() {
// Erase the hadron projectile
std::vector< G4VSplitableHadron* > primaries;
theParticipants.StartLoop();
while ( theParticipants.Next() ) {
while ( theParticipants.Next() ) { /* Loop checking, 10.08.2015, A.Ribon */
const G4InteractionContent& interaction = theParticipants.GetInteraction();
// Do not allow for duplicates
if ( primaries.end() ==
@@ -346,9 +361,11 @@ G4ExcitedStringVector* G4FTFModel::GetStrings() {
#ifdef debugFTFmodel
G4cout << "End of FTF. Go to fragmentation" << G4endl
<< "To continue - enter 1, to stop - ^C" << G4endl;
G4int Uzhi; G4cin >> Uzhi;
//G4int Uzhi; G4cin >> Uzhi;
#endif
theParticipants.Clean();
return theStrings;
}
@@ -364,7 +381,7 @@ void G4FTFModel::StoreInvolvedNucleon() {
theTargetNucleus->StartLoop();
G4Nucleon* aNucleon;
while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) {
while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( aNucleon->AreYouHit() ) {
TheInvolvedNucleonsOfTarget[NumberOfInvolvedNucleonsOfTarget] = aNucleon;
NumberOfInvolvedNucleonsOfTarget++;
@@ -387,7 +404,7 @@ void G4FTFModel::StoreInvolvedNucleon() {
theProjectileNucleus->StartLoop();
G4Nucleon* aProjectileNucleon;
while ( ( aProjectileNucleon = theProjectileNucleus->GetNextNucleon() ) ) {
while ( ( aProjectileNucleon = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( aProjectileNucleon->AreYouHit() ) {
// Projectile nucleon was involved in the interaction.
TheInvolvedNucleonsOfProjectile[NumberOfInvolvedNucleonsOfProjectile] = aProjectileNucleon;
@@ -399,7 +416,6 @@ void G4FTFModel::StoreInvolvedNucleon() {
G4cout << "NumberOfInvolvedNucleonsOfProjectile " << NumberOfInvolvedNucleonsOfProjectile
<< G4endl << G4endl;
#endif
return;
}
@@ -409,13 +425,13 @@ void G4FTFModel::StoreInvolvedNucleon() {
void G4FTFModel::ReggeonCascade() {
// Implementation of the reggeon theory inspired model
G4double ExcitationE = theParameters->GetExcitationEnergyPerWoundedNucleon();
// G4double ExcitationE = theParameters->GetExcitationEnergyPerWoundedNucleon(); // Uzhi May 2015
#ifdef debugReggeonCascade
G4cout << "G4FTFModel::ReggeonCascade -----------" << G4endl
<< "theProjectile.GetTotalMomentum() " << theProjectile.GetTotalMomentum() << G4endl
<< "theProjectile.GetTotalEnergy() " << theProjectile.GetTotalEnergy() << G4endl
<< "ExcitationE/WN " << ExcitationE << G4endl;
<< "ExcitationE/WN " << theParameters->GetExcitationEnergyPerWoundedNucleon() << G4endl;
#endif
G4int InitNINt = NumberOfInvolvedNucleonsOfTarget;
@@ -423,7 +439,7 @@ void G4FTFModel::ReggeonCascade() {
// Reggeon cascading in target nucleus
for ( G4int InvTN = 0; InvTN < InitNINt; InvTN++ ) {
G4Nucleon* aTargetNucleon = TheInvolvedNucleonsOfTarget[ InvTN ];
aTargetNucleon->SetBindingEnergy( ExcitationE );
// aTargetNucleon->SetBindingEnergy( ExcitationE ); // Uzhi April 2015
G4double CreationTime = aTargetNucleon->GetSplitableHadron()->GetTimeOfCreation();
@@ -434,13 +450,13 @@ void G4FTFModel::ReggeonCascade() {
theTargetNucleus->StartLoop();
G4Nucleon* Neighbour(0);
while ( ( Neighbour = theTargetNucleus->GetNextNucleon() ) ) {
while ( ( Neighbour = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( ! Neighbour->AreYouHit() ) {
G4double impact2 = sqr( XofWoundedNucleon - Neighbour->GetPosition().x() ) +
sqr( YofWoundedNucleon - Neighbour->GetPosition().y() );
if ( G4UniformRand() < theParameters->GetCofNuclearDestruction() *
std::exp( -impact2 / theParameters->GetR2ofNuclearDestruction() )
G4Exp( -impact2 / theParameters->GetR2ofNuclearDestruction() )
) {
// The neighbour nucleon is involved in the reggeon cascade
TheInvolvedNucleonsOfTarget[ NumberOfInvolvedNucleonsOfTarget ] = Neighbour;
@@ -465,9 +481,12 @@ void G4FTFModel::ReggeonCascade() {
if ( ! GetProjectileNucleus() ) return;
// Nucleus-Nucleus Interaction : Destruction of Projectile
for ( G4int InvPN = 0; InvPN < NumberOfInvolvedNucleonsOfProjectile; InvPN++ ) {
G4int InitNINp = NumberOfInvolvedNucleonsOfProjectile;
// for ( G4int InvPN = 0; InvPN < NumberOfInvolvedNucleonsOfProjectile; InvPN++ ) {
for ( G4int InvPN = 0; InvPN < InitNINp; InvPN++ ) {
G4Nucleon* aProjectileNucleon = TheInvolvedNucleonsOfProjectile[ InvPN ];
aProjectileNucleon->SetBindingEnergy( ExcitationE );
// aProjectileNucleon->SetBindingEnergy( ExcitationE ); // Uzhi May 2015
G4double CreationTime = aProjectileNucleon->GetSplitableHadron()->GetTimeOfCreation();
@@ -478,13 +497,13 @@ void G4FTFModel::ReggeonCascade() {
theProjectileNucleus->StartLoop();
G4Nucleon* Neighbour( 0 );
while ( ( Neighbour = theProjectileNucleus->GetNextNucleon() ) ) {
while ( ( Neighbour = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( ! Neighbour->AreYouHit() ) {
G4double impact2= sqr( XofWoundedNucleon - Neighbour->GetPosition().x() ) +
sqr( YofWoundedNucleon - Neighbour->GetPosition().y() );
if ( G4UniformRand() < theParameters->GetCofNuclearDestruction() *
std::exp( -impact2 / theParameters->GetR2ofNuclearDestruction() )
if ( G4UniformRand() < theParameters->GetCofNuclearDestructionPr() * // Uzhi May 2015
G4Exp( -impact2 / theParameters->GetR2ofNuclearDestruction() )
) {
// The neighbour nucleon is involved in the reggeon cascade
TheInvolvedNucleonsOfProjectile[ NumberOfInvolvedNucleonsOfProjectile ] = Neighbour;
@@ -676,8 +695,11 @@ G4bool G4FTFModel::PutOnMassShell() {
G4double ScaleFactor = 1.0;
G4bool OuterSuccess = true;
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do { // while ( ! OuterSuccess )
OuterSuccess = true;
const G4int maxNumberOfInnerLoops = 10000;
do { // while ( SqrtS < Mprojectile + std::sqrt( M2target ) )
NumberOfTries++;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
@@ -713,7 +735,14 @@ G4bool G4FTFModel::PutOnMassShell() {
#endif
if ( ! isOk ) return false;
} while ( SqrtS < std::sqrt( M2proj ) + std::sqrt( M2target ) );
} while ( ( SqrtS < std::sqrt( M2proj ) + std::sqrt( M2target ) ) &&
NumberOfTries < maxNumberOfInnerLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( NumberOfTries >= maxNumberOfInnerLoops ) {
#ifdef debugPutOnMassShell
G4cout << "BAD situation: forced exit of the inner while loop!" << G4endl;
#endif
return false;
}
if ( isProjectileNucleus ) {
isOk = CheckKinematics( S, SqrtS, M2proj, M2target, YprojectileNucleus, true,
NumberOfInvolvedNucleonsOfProjectile,
@@ -725,7 +754,14 @@ G4bool G4FTFModel::PutOnMassShell() {
NumberOfInvolvedNucleonsOfTarget, TheInvolvedNucleonsOfTarget,
WminusTarget, WplusProjectile, OuterSuccess );
if ( ! isOk ) return false;
} while ( ! OuterSuccess );
} while ( ( ! OuterSuccess ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugPutOnMassShell
G4cout << "BAD situation: forced exit of the while loop!" << G4endl;
#endif
return false;
}
// Now the sampling is completed, and we can determine the kinematics of the
// whole system. This is done first in the center-of-mass frame, and then it is boosted
@@ -823,7 +859,7 @@ G4bool G4FTFModel::ExciteParticipants() {
G4int CurrentInteraction( 0 );
theParticipants.StartLoop();
while ( theParticipants.Next() ) {
while ( theParticipants.Next() ) { /* Loop checking, 10.08.2015, A.Ribon */
CurrentInteraction++;
const G4InteractionContent& collision = theParticipants.GetInteraction();
@@ -921,7 +957,7 @@ G4bool G4FTFModel::ExciteParticipants() {
#endif
// Skipping possible interactions of the annihilated nucleons
while ( theParticipants.Next() ) {
while ( theParticipants.Next() ) { /* Loop checking, 10.08.2015, A.Ribon */
G4InteractionContent& acollision = theParticipants.GetInteraction();
G4VSplitableHadron* NextProjectileNucleon = acollision.GetProjectile();
G4VSplitableHadron* NextTargetNucleon = acollision.GetTarget();
@@ -1065,8 +1101,10 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4int TResidualMassNumber = TargetResidualMassNumber - 1;
G4int TResidualCharge = TargetResidualCharge -
G4int( TargetNucleon->GetDefinition()->GetPDGCharge() );
G4double TResidualExcitationEnergy = TargetResidualExcitationEnergy +
ExcitationEnergyPerWoundedNucleon;
//Uzhi G4double TResidualExcitationEnergy = TargetResidualExcitationEnergy +
// ExcitationEnergyPerWoundedNucleon;
G4double TResidualExcitationEnergy = TargetResidualExcitationEnergy - // Uzhi April 2015
ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand());
if ( TResidualMassNumber <= 1 ) {
TResidualExcitationEnergy = 0.0;
}
@@ -1212,9 +1250,12 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double ScaleFactor( 1.0 );
G4bool OuterSuccess( true );
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do { // while ( ! OuterSuccess )
OuterSuccess = true;
const G4int maxNumberOfTries = 10000;
do { // while ( SqrtS < Mprojectile + std::sqrt( M2target) )
NumberOfTries++;
@@ -1235,6 +1276,8 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4bool InerSuccess = true;
if ( TargetResidualMassNumber > 1 ) {
const G4int maxNumberOfInnerLoops = 1000;
G4int innerLoopCounter = 0;
do {
InerSuccess = true;
@@ -1257,7 +1300,15 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
}
XminusResidual = 1.0 - XminusNucleon;
} while ( ! InerSuccess );
} while ( ( ! InerSuccess ) &&
++innerLoopCounter < maxNumberOfInnerLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( innerLoopCounter >= maxNumberOfInnerLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the inner while loop!" << G4endl;
#endif
return false;
}
} else {
XminusNucleon = 1.0;
XminusResidual = 1.0; // It must be 0, but in the case calculation of Pz,
@@ -1267,7 +1318,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
M2target = ( sqr( TNucleonMass ) + PtNucleon.mag2() ) / XminusNucleon +
( sqr( TResidualMass ) + PtResidual.mag2() ) / XminusResidual;
} while ( SqrtS < Mprojectile + std::sqrt( M2target) );
} while ( ( SqrtS < Mprojectile + std::sqrt( M2target) ) &&
++NumberOfTries < maxNumberOfTries ); /* Loop checking, 10.08.2015, A.Ribon */
if ( NumberOfTries >= maxNumberOfTries ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the intermediate while loop!" << G4endl;
#endif
return false;
}
G4double DecayMomentum2 = sqr( S ) + sqr( M2projectile ) + sqr( M2target )
- 2.0*S*M2projectile - 2.0*S*M2target - 2.0*M2projectile*M2target;
@@ -1277,8 +1335,8 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double Pzprojectile = WplusProjectile/2.0 - M2projectile/2.0/WplusProjectile;
G4double Eprojectile = WplusProjectile/2.0 + M2projectile/2.0/WplusProjectile;
G4double Yprojectile = 0.5 * std::log( (Eprojectile + Pzprojectile) /
(Eprojectile - Pzprojectile) );
G4double Yprojectile = 0.5 * G4Log( (Eprojectile + Pzprojectile) /
(Eprojectile - Pzprojectile) );
#ifdef debugAdjust
G4cout << "DecayMomentum2 " << DecayMomentum2 << G4endl
@@ -1289,7 +1347,7 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double Mt2 = sqr( TNucleonMass ) + PtNucleon.mag2();
G4double Pz = -WminusTarget*XminusNucleon/2.0 + Mt2/(2.0*WminusTarget*XminusNucleon);
G4double E = WminusTarget*XminusNucleon/2.0 + Mt2/(2.0*WminusTarget*XminusNucleon);
G4double YtargetNucleon = 0.5 * std::log( (E + Pz)/(E - Pz) );
G4double YtargetNucleon = 0.5 * G4Log( (E + Pz)/(E - Pz) );
#ifdef debugAdjust
G4cout << "YtN Ytr YtN-Ytr " << " " << YtargetNucleon << " " << YtargetNucleus << " "
@@ -1303,7 +1361,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
continue;
}
} while ( ! OuterSuccess );
} while ( ( ! OuterSuccess ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the while loop!" << G4endl;
#endif
return false;
}
G4double Pzprojectile = WplusProjectile/2.0 - M2projectile/2.0/WplusProjectile;
G4double Eprojectile = WplusProjectile/2.0 + M2projectile/2.0/WplusProjectile;
@@ -1412,8 +1477,10 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4int TResidualMassNumber = ProjectileResidualMassNumber - 1;
G4int TResidualCharge = ProjectileResidualCharge
- std::abs( G4int(ProjectileNucleon->GetDefinition()->GetPDGCharge()) );
G4double TResidualExcitationEnergy = ProjectileResidualExcitationEnergy +
ExcitationEnergyPerWoundedNucleon;
//Uzhi G4double TResidualExcitationEnergy = ProjectileResidualExcitationEnergy +
// ExcitationEnergyPerWoundedNucleon;
G4double TResidualExcitationEnergy = ProjectileResidualExcitationEnergy - // Uzhi April 2015
ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand());
if ( TResidualMassNumber <= 1 ) {
TResidualExcitationEnergy = 0.0;
}
@@ -1513,10 +1580,12 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double ScaleFactor( 1.0 );
G4bool OuterSuccess( true );
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do { // while ( ! OuterSuccess )
OuterSuccess = true;
const G4int maxNumberOfTries = 10000;
do { // while ( SqrtS < Mtarget + std::sqrt( M2projectile ) )
NumberOfTries++;
@@ -1557,6 +1626,8 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4bool InerSuccess = true;
if ( ProjectileResidualMassNumber > 1 ) {
const G4int maxNumberOfInnerLoops = 1000;
G4int innerLoopCounter = 0;
do {
InerSuccess = true;
G4ThreeVector tmpX = GaussianPt( DcorP*DcorP, 1.0 );
@@ -1566,7 +1637,15 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
continue;
}
XplusResidual = 1.0 - XplusNucleon;
} while ( ! InerSuccess );
} while ( ( ! InerSuccess ) &&
++innerLoopCounter < maxNumberOfInnerLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( innerLoopCounter >= maxNumberOfInnerLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the inner while loop!" << G4endl;
#endif
return false;
}
} else {
XplusNucleon = 1.0;
XplusResidual = 1.0; // It must be 0, but in the case determination
@@ -1589,7 +1668,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
<< G4endl;
#endif
} while ( SqrtS < Mtarget + std::sqrt( M2projectile ) );
} while ( ( SqrtS < Mtarget + std::sqrt( M2projectile ) ) &&
++NumberOfTries < maxNumberOfTries ); /* Loop checking, 10.08.2015, A.Ribon */
if ( NumberOfTries >= maxNumberOfTries ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the intermediate while loop!" << G4endl;
#endif
return false;
}
G4double DecayMomentum2 = sqr( S ) + sqr( M2projectile ) + sqr( M2target )
- 2.0*S*M2projectile - 2.0*S*M2target - 2.0*M2projectile*M2target;
@@ -1599,7 +1685,7 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double Pztarget = -WminusTarget/2.0 + M2target/2.0/WminusTarget;
G4double Etarget = WminusTarget/2.0 + M2target/2.0/WminusTarget;
G4double Ytarget = 0.5 * std::log( (Etarget + Pztarget)/(Etarget - Pztarget) );
G4double Ytarget = 0.5 * G4Log( (Etarget + Pztarget)/(Etarget - Pztarget) );
#ifdef debugAdjust
G4cout << "DecayMomentum2 " << DecayMomentum2 << G4endl
@@ -1610,7 +1696,7 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double Mt2 = sqr( TNucleonMass ) + PtNucleon.mag2();
G4double Pz = WplusProjectile*XplusNucleon/2.0 - Mt2/(2.0*WplusProjectile*XplusNucleon);
G4double E = WplusProjectile*XplusNucleon/2.0 + Mt2/(2.0*WplusProjectile*XplusNucleon);
G4double YprojectileNucleon = 0.5 * std::log( (E + Pz)/(E - Pz) );
G4double YprojectileNucleon = 0.5 * G4Log( (E + Pz)/(E - Pz) );
#ifdef debugAdjust
G4cout << "YpN Ypr YpN-Ypr " << " " << YprojectileNucleon << " " << YprojectileNucleus
@@ -1625,7 +1711,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
continue;
}
} while ( ! OuterSuccess );
} while ( ( ! OuterSuccess ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the while loop!" << G4endl;
#endif
return false;
}
// New target
G4double Pztarget = -WminusTarget/2.0 + M2target/2.0/WminusTarget;
@@ -1708,8 +1801,10 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4int PResidualMassNumber = ProjectileResidualMassNumber - 1;
G4int PResidualCharge = ProjectileResidualCharge -
std::abs( G4int(ProjectileNucleon->GetDefinition()->GetPDGCharge()) );
G4double PResidualExcitationEnergy = ProjectileResidualExcitationEnergy +
ExcitationEnergyPerWoundedNucleon;
//Uzhi G4double PResidualExcitationEnergy = ProjectileResidualExcitationEnergy +
// ExcitationEnergyPerWoundedNucleon;
G4double PResidualExcitationEnergy = ProjectileResidualExcitationEnergy - // Uzhi April 2015
ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand());
if ( PResidualMassNumber <= 1 ) {
PResidualExcitationEnergy = 0.0;
}
@@ -1725,8 +1820,10 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4int TResidualMassNumber = TargetResidualMassNumber - 1;
G4int TResidualCharge = TargetResidualCharge -
G4int( TargetNucleon->GetDefinition()->GetPDGCharge() );
G4double TResidualExcitationEnergy = TargetResidualExcitationEnergy +
ExcitationEnergyPerWoundedNucleon;
//Uzhi G4double TResidualExcitationEnergy = TargetResidualExcitationEnergy +
// ExcitationEnergyPerWoundedNucleon;
G4double TResidualExcitationEnergy = TargetResidualExcitationEnergy - // Uzhi April 2015
ExcitationEnergyPerWoundedNucleon*G4Log( G4UniformRand());
if ( TResidualMassNumber <= 1 ) {
TResidualExcitationEnergy = 0.0;
}
@@ -1877,10 +1974,12 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double ScaleFactor( 1.0 );
G4bool OuterSuccess( true );
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do { // while ( ! OuterSuccess )
OuterSuccess = true;
const G4int maxNumberOfTries = 10000;
do { // while ( SqrtS < std::sqrt( M2projectile ) + std::sqrt( M2target ) )
NumberOfTries++;
@@ -1927,6 +2026,8 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4bool InerSuccess = true;
if ( ProjectileResidualMassNumber > 1 ) {
const G4int maxNumberOfInnerLoops = 1000;
G4int innerLoopCounter = 0;
do {
InerSuccess = true;
G4ThreeVector tmpX = GaussianPt( DcorP*DcorP, 1.0 );
@@ -1943,7 +2044,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
continue;
}
XplusResidual = 1.0 - XplusNucleon;
} while ( ! InerSuccess );
} while ( ( ! InerSuccess ) &&
++innerLoopCounter < maxNumberOfInnerLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( innerLoopCounter >= maxNumberOfInnerLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the first inner while loop!" << G4endl;
#endif
return false;
}
#ifdef debugAdjust
//G4cout << "XplusNucleon XplusResidual 2 " << XplusNucleon
@@ -1957,6 +2065,9 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
}
if ( TargetResidualMassNumber > 1 ) {
const G4int maxNumberOfInnerLoops = 1000;
G4int innerLoopCounter = 0;
do {
InerSuccess = true;
@@ -1968,7 +2079,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
continue;
}
XminusResidual = 1.0 - XminusNucleon;
} while ( ! InerSuccess );
} while ( ( ! InerSuccess ) &&
++innerLoopCounter < maxNumberOfInnerLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( innerLoopCounter >= maxNumberOfInnerLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the second inner while loop!" << G4endl;
#endif
return false;
}
} else {
XminusNucleon = 1.0;
XminusResidual = 1.0; // It must be 0
@@ -1987,7 +2105,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
M2target = ( sqr( TNucleonMass ) + PtNucleonT.mag2() ) / XminusNucleon +
( sqr( TResidualMass ) + PtResidualT.mag2() ) / XminusResidual;
} while ( SqrtS < std::sqrt( M2projectile ) + std::sqrt( M2target ) );
} while ( ( SqrtS < std::sqrt( M2projectile ) + std::sqrt( M2target ) ) &&
++NumberOfTries < maxNumberOfTries ); /* Loop checking, 10.08.2015, A.Ribon */
if ( NumberOfTries >= maxNumberOfTries ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the intermediate while loop!" << G4endl;
#endif
return false;
}
G4double DecayMomentum2 = sqr( S ) + sqr( M2projectile ) + sqr( M2target )
- 2.0*S*M2projectile - 2.0*S*M2target - 2.0*M2projectile*M2target;
@@ -1998,12 +2123,12 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
G4double Mt2 = sqr( PNucleonMass ) + PtNucleonP.mag2();
G4double Pz = WplusProjectile*XplusNucleon/2.0 - Mt2/(2.0*WplusProjectile*XplusNucleon);
G4double E = WplusProjectile*XplusNucleon/2.0 + Mt2/(2.0*WplusProjectile*XplusNucleon);
G4double YprojectileNucleon = 0.5 * std::log( (E + Pz)/(E - Pz) );
G4double YprojectileNucleon = 0.5 * G4Log( (E + Pz)/(E - Pz) );
Mt2 = sqr( TNucleonMass ) + PtNucleonT.mag2();
Pz = -WminusTarget*XminusNucleon/2.0 + Mt2/(2.0*WminusTarget*XminusNucleon);
E = WminusTarget*XminusNucleon/2.0 + Mt2/(2.0*WminusTarget*XminusNucleon);
G4double YtargetNucleon = 0.5 * std::log( (E + Pz)/(E - Pz) );
G4double YtargetNucleon = 0.5 * G4Log( (E + Pz)/(E - Pz) );
if ( std::abs( YtargetNucleon - YtargetNucleus ) > 2 ||
std::abs( YprojectileNucleon - YprojectileNucleus ) > 2 ||
@@ -2012,7 +2137,14 @@ G4bool G4FTFModel::AdjustNucleons( G4VSplitableHadron* SelectedAntiBaryon,
continue;
}
} while ( ! OuterSuccess );
} while ( ( ! OuterSuccess ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugAdjust
G4cout << "BAD situation: forced exit of the while loop!" << G4endl;
#endif
return false;
}
#ifdef debugAdjust
G4cout << "PtNucleonP " << PtNucleonP << G4endl;
@@ -2107,7 +2239,7 @@ G4ExcitedStringVector* G4FTFModel::BuildStrings() {
std::vector< G4VSplitableHadron* > primaries;
theParticipants.StartLoop();
while ( theParticipants.Next() ) {
while ( theParticipants.Next() ) { /* Loop checking, 10.08.2015, A.Ribon */
const G4InteractionContent& interaction = theParticipants.GetInteraction();
// do not allow for duplicates ...
if ( interaction.GetStatus() ) {
@@ -2128,8 +2260,6 @@ G4ExcitedStringVector* G4FTFModel::BuildStrings() {
//G4cout << "primaries[ahadron] " << primaries[ahadron] << G4endl;
//if ( primaries[ahadron]->GetStatus() <= 1 ) isProjectile=true;
FirstString = 0; SecondString = 0;
// theExcitation->CreateStrings( primaries[ ahadron ], isProjectile, // Uzhi Oct 2014
// FirstString, SecondString, theParameters ); // Uzhi Oct 2014
if ( primaries[ahadron]->GetStatus() <= 1 ) // Uzhi Oct 2014 start
{
theExcitation->CreateStrings( primaries[ ahadron ], isProjectile,
@@ -2141,10 +2271,9 @@ G4ExcitedStringVector* G4FTFModel::BuildStrings() {
G4KineticTrack* aTrack=new G4KineticTrack(
primaries[ahadron]->GetDefinition(),
primaries[ahadron]->GetTimeOfCreation(),
primaries[ahadron]->GetPosition(), //FirstString->GetPosition(),
primaries[ahadron]->GetPosition(),
ParticleMomentum);
if (FirstString) delete FirstString;
FirstString=new G4ExcitedString(aTrack); SecondString=0;
FirstString=new G4ExcitedString(aTrack);
}
else {G4cout<<"Something wrong in FTF Model Build String" << G4endl;} // Uzhi Oct 2014 end
@@ -2451,6 +2580,86 @@ void G4FTFModel::GetResiduals() {
aNucleon->SetBindingEnergy( DeltaExcitationE );
}
//------------------------------------- Uzhi 25 May 2015
if( TargetResidualMassNumber != 0 )
{
G4ThreeVector bstToCM =TargetResidual4Momentum.findBoostToCM();
G4V3DNucleus* theTargetNucleus = GetTargetNucleus();
G4LorentzVector residualMomentum(0.,0.,0.,0.);
G4Nucleon* aNucleon = 0;
theTargetNucleus->StartLoop();
while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum(); tmp.boost(bstToCM);
aNucleon->SetMomentum(tmp);
residualMomentum +=tmp;
}
}
residualMomentum/=TargetResidualMassNumber;
G4double Mass = TargetResidual4Momentum.mag();
G4double SumMasses=0.;
aNucleon = 0;
theTargetNucleus->StartLoop();
while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum() - residualMomentum;
G4double E=std::sqrt(tmp.vect().mag2()+
sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
tmp.setE(E); aNucleon->SetMomentum(tmp);
SumMasses+=E;
}
}
G4double Chigh=Mass/SumMasses; G4double Clow=0; G4double C;
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do
{
C=(Chigh+Clow)/2.;
SumMasses=0.;
aNucleon = 0;
theTargetNucleus->StartLoop();
while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum();
G4double E=std::sqrt(tmp.vect().mag2()*sqr(C)+
sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
SumMasses+=E;
}
}
if(SumMasses > Mass) {Chigh=C;}
else {Clow =C;}
} while( (Chigh-Clow > 0.01) && // end do
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugFTFmodel
G4cout << "BAD situation: forced exit of the first while loop in G4FTFModel::GetResidual" << G4endl
<< "\t return immediately from the method!" << G4endl;
#endif
return;
}
aNucleon = 0;
theTargetNucleus->StartLoop();
while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum()*C;
G4double E=std::sqrt(tmp.vect().mag2()+
sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
tmp.setE(E); tmp.boost(-bstToCM);
aNucleon->SetMomentum(tmp);
}
}
} // End of if( TargetResidualMassNumber != 0 )
//-------------------------------------
if ( ! GetProjectileNucleus() ) return; // The projectile is a hadron
#ifdef debugFTFmodel
@@ -2477,7 +2686,86 @@ void G4FTFModel::GetResiduals() {
aNucleon->SetMomentum( tmp );
aNucleon->SetBindingEnergy( DeltaExcitationE );
}
//------------------------------------- Uzhi 25 May 2015
if( ProjectileResidualMassNumber != 0 )
{
G4ThreeVector bstToCM =ProjectileResidual4Momentum.findBoostToCM();
G4V3DNucleus* theProjectileNucleus = GetProjectileNucleus();
G4LorentzVector residualMomentum(0.,0.,0.,0.);
G4Nucleon* aNucleon = 0;
theProjectileNucleus->StartLoop();
while ( ( aNucleon = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum(); tmp.boost(bstToCM);
aNucleon->SetMomentum(tmp);
residualMomentum +=tmp;
}
}
residualMomentum/=ProjectileResidualMassNumber;
G4double Mass = ProjectileResidual4Momentum.mag();
G4double SumMasses=0.;
aNucleon = 0;
theProjectileNucleus->StartLoop();
while ( ( aNucleon = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum() - residualMomentum;
G4double E=std::sqrt(tmp.vect().mag2()+
sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
tmp.setE(E); aNucleon->SetMomentum(tmp);
SumMasses+=E;
}
}
G4double Chigh=Mass/SumMasses; G4double Clow=0; G4double C;
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do
{
C=(Chigh+Clow)/2.;
SumMasses=0.;
aNucleon = 0;
theProjectileNucleus->StartLoop();
while ( ( aNucleon = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum();
G4double E=std::sqrt(tmp.vect().mag2()*sqr(C)+
sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
SumMasses+=E;
}
}
if(SumMasses > Mass) {Chigh=C;}
else {Clow =C;}
} while( (Chigh-Clow > 0.01) && // end do
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugFTFmodel
G4cout << "BAD situation: forced exit of the second while loop in G4FTFModel::GetResidual" << G4endl
<< "\t return immediately from the method!" << G4endl;
#endif
return;
}
aNucleon = 0;
theProjectileNucleus->StartLoop();
while ( ( aNucleon = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
if ( !aNucleon->AreYouHit() ) {
G4LorentzVector tmp=aNucleon->Get4Momentum()*C;
G4double E=std::sqrt(tmp.vect().mag2()+
sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
tmp.setE(E); tmp.boost(-bstToCM);
aNucleon->SetMomentum(tmp);
}
}
} // End of if( ProjectileResidualMassNumber != 0 )
//-------------------------------------
#ifdef debugFTFmodel
G4cout << "End projectile" << G4endl;
#endif
@@ -2596,8 +2884,8 @@ G4ThreeVector G4FTFModel::GaussianPt( G4double AveragePt2, G4double maxPtSquare
if ( AveragePt2 <= 0.0 ) {
Pt2 = 0.0;
} else {
Pt2 = -AveragePt2 * std::log( 1.0 + G4UniformRand() *
( std::exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
Pt2 = -AveragePt2 * G4Log( 1.0 + G4UniformRand() *
( G4Exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
}
G4double Pt = std::sqrt( Pt2 );
G4double phi = G4UniformRand() * twopi;
@@ -2646,7 +2934,7 @@ ComputeNucleusProperties( G4V3DNucleus* nucleus, // input paramete
// nucleon) is not taken into account.
G4Nucleon* aNucleon = 0;
nucleus->StartLoop();
while ( ( aNucleon = nucleus->GetNextNucleon() ) ) {
while ( ( aNucleon = nucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
nucleusMomentum += aNucleon->Get4Momentum();
if ( aNucleon->AreYouHit() ) { // Involved nucleons
// Consider in sumMasses the nominal, i.e. on-shell, masses of the nucleons
@@ -2654,7 +2942,10 @@ ComputeNucleusProperties( G4V3DNucleus* nucleus, // input paramete
sumMasses += std::sqrt( sqr( aNucleon->GetDefinition()->GetPDGMass() )
+ aNucleon->Get4Momentum().perp2() );
sumMasses += 20.0*MeV; // Separation energy for a nucleon
residualExcitationEnergy += ExcitationEnergyPerWoundedNucleon;
// residualExcitationEnergy += ExcitationEnergyPerWoundedNucleon; // Uzhi April 2015
residualExcitationEnergy += -ExcitationEnergyPerWoundedNucleon*
G4Log( G4UniformRand()); // Uzhi April 2015
residualMassNumber--;
// The absolute value below is needed only in the case of anti-nucleus.
residualCharge -= std::abs( G4int( aNucleon->GetDefinition()->GetPDGCharge() ) );
@@ -2754,9 +3045,9 @@ GenerateDeltaIsobar( const G4double sqrtS, // input parameter
//============================================================================
G4bool G4FTFModel::
SamplingNucleonKinematics( const G4double averagePt2, // input parameter
SamplingNucleonKinematics( G4double averagePt2, // input parameter
const G4double maxPt2, // input parameter
const G4double dCor, // input parameter
G4double dCor, // input parameter
G4V3DNucleus* nucleus, // input parameter
const G4LorentzVector& pResidual, // input parameter
const G4double residualMass, // input parameter
@@ -2777,8 +3068,22 @@ SamplingNucleonKinematics( const G4double averagePt2, // input param
if ( ! nucleus ) return false;
G4bool success = true;
if ( residualMassNumber == 0 && numberOfInvolvedNucleons == 1 ) {
dCor = 0.0;
averagePt2 = 0.0;
}
G4bool success = true;
G4double SumMasses = residualMass;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
SumMasses += aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass();
}
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do { // while ( ! success )
success = true;
@@ -2791,25 +3096,33 @@ SamplingNucleonKinematics( const G4double averagePt2, // input param
G4ThreeVector tmpPt = GaussianPt( averagePt2, maxPt2 );
ptSum += tmpPt;
G4ThreeVector tmpX = GaussianPt( dCor*dCor, 1.0 );
G4double x = tmpX.x();
G4double x = tmpX.x() +
aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass()/SumMasses;
if ( x < 0.0 || x > 1.0 ) {
success = false;
break;
}
xSum += x;
//AR The energy is in the lab (instead of cms) frame but it will not be used.
G4LorentzVector tmp( tmpPt.x(), tmpPt.y(), x, aNucleon->Get4Momentum().e() );
aNucleon->SetMomentum( tmp );
}
if ( xSum < 0.0 || xSum > 1.0 ) success = false;
if ( ! success ) continue;
G4double deltaPx = ( ptSum.x() - pResidual.x() ) / numberOfInvolvedNucleons;
G4double deltaPy = ( ptSum.y() - pResidual.y() ) / numberOfInvolvedNucleons;
G4double delta = 0.0;
if ( residualMassNumber == 0 ) {
delta = ( xSum - 1.0 ) / numberOfInvolvedNucleons;
} else {
delta = -1.0 / nucleus->GetMassNumber();
delta = 0.0;
}
xSum = 1.0;
mass2 = 0.0;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
@@ -2842,7 +3155,11 @@ SamplingNucleonKinematics( const G4double averagePt2, // input param
G4cout << "success " << success << G4endl << " Mt " << std::sqrt( mass2 )/GeV << G4endl;
#endif
} while ( ! success );
} while ( ( ! success ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
return true;
}
@@ -2880,11 +3197,11 @@ CheckKinematics( const G4double sValue, // input parameter
projectileWplus = sqrtS - targetMass2/targetWminus;
G4double projectilePz = projectileWplus/2.0 - projectileMass2/2.0/projectileWplus;
G4double projectileE = projectileWplus/2.0 + projectileMass2/2.0/projectileWplus;
G4double projectileY = 0.5 * std::log( (projectileE + projectilePz)/
(projectileE - projectilePz) );
G4double projectileY = 0.5 * G4Log( (projectileE + projectilePz)/
(projectileE - projectilePz) );
G4double targetPz = -targetWminus/2.0 + targetMass2/2.0/targetWminus;
G4double targetE = targetWminus/2.0 + targetMass2/2.0/targetWminus;
G4double targetY = 0.5 * std::log( (targetE + targetPz)/(targetE - targetPz) );
G4double targetY = 0.5 * G4Log( (targetE + targetPz)/(targetE - targetPz) );
#ifdef debugPutOnMassShell
G4cout << "decayMomentum2 " << decayMomentum2 << G4endl
@@ -2905,7 +3222,7 @@ CheckKinematics( const G4double sValue, // input parameter
pz = projectileWplus*x/2.0 - mt2/(2.0*projectileWplus*x);
e = projectileWplus*x/2.0 + mt2/(2.0*projectileWplus*x);
}
G4double nucleonY = 0.5 * std::log( (e + pz)/(e - pz) );
G4double nucleonY = 0.5 * G4Log( (e + pz)/(e - pz) );
#ifdef debugPutOnMassShell
G4cout << "i nY pY nY-AY AY " << i << " " << nucleonY << " " << projectileY <<G4endl;
@@ -2998,5 +3315,43 @@ FinalizeKinematics( const G4double w, // input parame
//============================================================================
void G4FTFModel::ModelDescription( std::ostream& desc ) const {
desc << "please add description here" << G4endl;
desc << " FTF (Fritiof) Model \n"
<< "The FTF model is based on the well-known FRITIOF \n"
<< "model (B. Andersson et al., Nucl. Phys. B281, 289 \n"
<< "(1987)). Its first program implementation was given\n"
<< "by B. Nilsson-Almquist and E. Stenlund (Comp. Phys.\n"
<< "Comm. 43, 387 (1987)). The Fritiof model assumes \n"
<< "that all hadron-hadron interactions are binary \n"
<< "reactions, h_1+h_2->h_1'+h_2' where h_1' and h_2' \n"
<< "are excited states of the hadrons with continuous \n"
<< "mass spectra. The excited hadrons are considered as\n"
<< "QCD-strings, and the corresponding LUND-string \n"
<< "fragmentation model is applied for a simulation of \n"
<< "their decays. \n"
<< " The Fritiof model assumes that in the course of \n"
<< "a hadron-nucleus interaction a string originated \n"
<< "from the projectile can interact with various intra\n"
<< "nuclear nucleons and becomes into highly excited \n"
<< "states. The probability of multiple interactions is\n"
<< "calculated in the Glauber approximation. A cascading\n"
<< "of secondary particles was neglected as a rule. Due\n"
<< "to these, the original Fritiof model fails to des- \n"
<< "cribe a nuclear destruction and slow particle spectra.\n"
<< " In order to overcome the difficulties we enlarge\n"
<< "the model by the reggeon theory inspired model of \n"
<< "nuclear desctruction (Kh. Abdel-Waged and V.V. Uzhi-\n"
<< "nsky, Phys. Atom. Nucl. 60, 828 (1997); Yad. Fiz. 60, 925\n"
<< "(1997)). Momenta of the nucleons ejected from a nuc-\n"
<< "leus in the reggeon cascading are sampled according\n"
<< "to a Fermi motion algorithm presented in (EMU-01 \n"
<< "Collaboration (M.I. Adamovich et al.) Zeit. fur Phys.\n"
<< "A358, 337 (1997)). \n"
<< " New features were also added to the Fritiof model\n"
<< "implemented in Geant4: a simulation of elastic had-\n"
<< "ron-nucleon scatterings, a simulation of binary \n"
<< "reactions like NN>NN* in hadron-nucleon interactions,\n"
<< "a separate simulation of single diffractive and non-\n"
<< " diffractive events. These allowed to describe after\n"
<< "model parameter tuning a wide set of experimental \n"
<< "data. \n";
}
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFParameters.cc 86868 2014-11-19 14:46:25Z gcosmo $
// $Id: G4FTFParameters.cc 91775 2015-08-05 14:42:39Z gcosmo $
// GEANT4 tag $Name: $
//
@@ -46,6 +46,9 @@
#include "G4KaonPlus.hh"
#include "G4KaonMinus.hh"
#include "G4Exp.hh"
#include "G4Log.hh"
#include "G4Pow.hh"
//============================================================================
@@ -62,11 +65,12 @@ G4FTFParameters::G4FTFParameters() :
RadiusOfHNinteractions2( 0.0 ), FTFSlope( 0.0 ),
AvaragePt2ofElasticScattering( 0.0 ), FTFGamma0( 0.0 ),
DeltaProbAtQuarkExchange( 0.0 ), ProbOfSameQuarkExchange( 0.0 ),
ProjMinDiffMass( 0.0 ), ProjMinNonDiffMass( 0.0 ), ProbLogDistrPrD(0.0), // Uzhi Oct 2014
ProjMinDiffMass( 0.0 ), ProjMinNonDiffMass( 0.0 ), ProbLogDistrPrD(0.0),
TarMinDiffMass( 0.0 ), TarMinNonDiffMass( 0.0 ),
AveragePt2( 0.0 ), ProbLogDistr( 0.0 ),
Pt2kink( 0.0 ),
MaxNumberOfCollisions( 0.0 ), ProbOfInelInteraction( 0.0 ), CofNuclearDestruction( 0.0 ),
MaxNumberOfCollisions( 0.0 ), ProbOfInelInteraction( 0.0 ),
CofNuclearDestructionPr( 0.0 ), CofNuclearDestruction( 0.0 ),
R2ofNuclearDestruction( 0.0 ), ExcitationEnergyPerWoundedNucleon( 0.0 ),
DofNuclearDestruction( 0.0 ), Pt2ofNuclearDestruction( 0.0 ), MaxPt2ofNuclearDestruction( 0.0 )
{
@@ -92,11 +96,28 @@ G4ThreadLocal G4ChipsComponentXS* G4FTFParameters::chipsComponentXSinstance = 0;
//============================================================================
G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
G4int theA, G4int theZ, G4double PlabPerParticle ) {
FTFXannihilation = 0.0;
FTFhNcmsEnergy = 0.0;
ProbOfSameQuarkExchange = 0.0;
G4int theA, G4int theZ, G4double PlabPerParticle ) :
FTFhNcmsEnergy( 0.0 ),
FTFxsManager( 0 ),
FTFXtotal( 0.0 ), FTFXelastic( 0.0 ), FTFXinelastic( 0.0 ), FTFXannihilation( 0.0 ),
ProbabilityOfAnnihilation( 0.0 ), ProbabilityOfElasticScatt( 0.0 ),
RadiusOfHNinteractions2( 0.0 ), FTFSlope( 0.0 ),
AvaragePt2ofElasticScattering( 0.0 ), FTFGamma0( 0.0 ),
DeltaProbAtQuarkExchange( 0.0 ), ProbOfSameQuarkExchange( 0.0 ),
ProjMinDiffMass( 0.0 ), ProjMinNonDiffMass( 0.0 ), ProbLogDistrPrD(0.0),
TarMinDiffMass( 0.0 ), TarMinNonDiffMass( 0.0 ),
AveragePt2( 0.0 ), ProbLogDistr( 0.0 ),
Pt2kink( 0.0 ),
MaxNumberOfCollisions( 0.0 ), ProbOfInelInteraction( 0.0 ),
CofNuclearDestructionPr( 0.0 ), CofNuclearDestruction( 0.0 ),
R2ofNuclearDestruction( 0.0 ), ExcitationEnergyPerWoundedNucleon( 0.0 ),
DofNuclearDestruction( 0.0 ), Pt2ofNuclearDestruction( 0.0 ), MaxPt2ofNuclearDestruction( 0.0 )
{
for ( G4int i = 0; i < 4; i++ ) {
for ( G4int j = 0; j < 7; j++ ) {
ProcParams[i][j] = 0.0;
}
}
G4int ProjectilePDGcode = particle->GetPDGEncoding();
G4int ProjectileabsPDGcode = std::abs( ProjectilePDGcode );
@@ -138,7 +159,7 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
G4double Ylab, Xtotal, Xelastic, Xannihilation;
G4int NumberOfTargetNucleons;
Ylab = 0.5 * std::log( (Elab + Plab)/(Elab - Plab) );
Ylab = 0.5 * G4Log( (Elab + Plab)/(Elab - Plab) );
G4double ECMSsqr = S/GeV/GeV;
G4double SqrtS = std::sqrt( S )/GeV;
@@ -163,19 +184,18 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
Plab /= GeV;
G4double Xftf = 0.0;
//G4double LogPlab = std::log( Plab );
//G4double sqrLogPlab = LogPlab * LogPlab;
G4int NumberOfTargetProtons = theZ;
G4int NumberOfTargetNeutrons = theA - theZ;
NumberOfTargetNucleons = NumberOfTargetProtons + NumberOfTargetNeutrons;
if ( ProjectilePDGcode == 2212 || ProjectilePDGcode == 2112 ) { // Projectile is nucleon
G4double XtotPP = FTFxsManager->GetTotalElementCrossSection( particle, KineticEnergy, 1, 0 );
G4ParticleDefinition* Proton = G4Proton::Proton(); //ALB
G4double XtotPP = FTFxsManager->GetTotalElementCrossSection( Proton, KineticEnergy, 1, 0 ); //ALB
G4ParticleDefinition* Neutron = G4Neutron::Neutron();
G4double XtotPN = FTFxsManager->GetTotalElementCrossSection( Neutron, KineticEnergy, 1, 0 );
G4double XelPP = FTFxsManager->GetElasticElementCrossSection( particle, KineticEnergy, 1, 0 );
G4double XtotPN = FTFxsManager->GetTotalElementCrossSection( Neutron, KineticEnergy, 1, 0 ); //ALB
G4double XelPP = FTFxsManager->GetElasticElementCrossSection( Proton, KineticEnergy, 1, 0 );
G4double XelPN = FTFxsManager->GetElasticElementCrossSection( Neutron, KineticEnergy, 1, 0 );
#ifdef debugFTFparams
@@ -227,9 +247,9 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
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 LogS = G4Log( ECMSsqr / 33.0625 );
G4double Xasmpt = 36.04 + 0.304*LogS*LogS; // mb
LogS = std::log( SqrtS / 20.74 );
LogS = G4Log( SqrtS / 20.74 );
G4double Basmpt = 11.92 + 0.3036*LogS*LogS; // GeV^(-2)
G4double R0 = std::sqrt( 0.40874044*Xasmpt - Basmpt ); // GeV^(-1)
@@ -253,7 +273,7 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
X_a = 25.0*FlowF; // mb, 3-shirts diagram
if ( SqrtS < MesonProdThreshold ) {
X_b = 3.13 + 140.0*std::pow( MesonProdThreshold - SqrtS, 2.5 ); // mb anti-quark-quark annihilation
X_b = 3.13 + 140.0*G4Pow::GetInstance()->powA( MesonProdThreshold - SqrtS, 2.5 ); // mb anti-quark-quark annihilation
Xelastic -= 3.0*X_b; // Xel-X(PbarP->NNbar)
} else {
X_b = 6.8/SqrtS; // mb anti-quark-quark annihilation
@@ -262,8 +282,6 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
X_c = 2.0*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
}
@@ -505,12 +523,19 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
if ( ProjectilePDGcode > 1000 ) { // Projectile is baryon
// Proc# A1 B1 A2 B2 A3 Atop Ymin
SetParams( 0, 13.71, 1.75, -214.5, 4.25, 0.0, 0.5 , 1.1 ); // Qexchange without Exc.
SetParams( 1, 25.0, 1.0, -50.34, 1.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc.
SetParams( 2, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Projectile diffraction
SetParams( 3, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Target diffraction
SetParams( 4, 1.0, 0.0 , -2.01 , 0.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc. Additional multiply
SetParams( 1, 25.0, 1.0, -50.34, 1.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc.
if( Xinel > 0.) {
SetParams( 2, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93);// Projectile diffraction
SetParams( 3, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93);// Target diffraction
SetParams( 4, 1.0, 0.0 , -2.01 , 0.5 , 0.0, 0.0 , 1.4 );// Qexchange with Exc. Additional multiply
} else {
SetParams( 2, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
SetParams( 3, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
SetParams( 4, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
}
//
if ( AbsProjectileBaryonNumber > 1 || NumberOfTargetNucleons > 1 ) {
// It is not decided what to do with diffraction dissociation in Had-Nucl and Nucl-Nucl interactions
SetParams( 2, 0.0, 0.0 , 0.0 , 0.0 , 0.0, 0.0 , -100.0 ); // Projectile diffraction
// SetParams( 3, 0.0, 0.0 , 0.0 , 0.0 , 0.0, 0.0 , -100.0 ); // Target diffraction
}
@@ -534,13 +559,20 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
// Proc# A1 B1 A2 B2 A3 Atop Ymin
SetParams( 0, 0.0 , 0.0 , 0.0 , 0.0 , 0.0, 0.0 , 1000.0 ); // Qexchange without Exc.
SetParams( 1, 0.0 , 0.0 , 0.0 , 0.0 , 0.0, 0.0 , 1000.0 ); // Qexchange with Exc.
SetParams( 2, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Projectile diffraction
SetParams( 3, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Target diffraction
SetParams( 4, 1.0, 0.0 , 0.0 , 0.0 , 0.0, 0.0 , 0.93 ); // Qexchange with Exc. Additional multiply
if( Xinel > 0.) {
SetParams( 2, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Projectile diffraction
SetParams( 3, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Target diffraction
SetParams( 4, 1.0, 0.0 , 0.0, 0.0 , 0.0, 0.0 , 0.93 ); // Qexchange with Exc. Additional multiply
} else {
SetParams( 2, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
SetParams( 3, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
SetParams( 4, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
}
if ( AbsProjectileBaryonNumber > 1 || NumberOfTargetNucleons > 1 ) {
SetParams( 2, 0.0 , 0.0 , 0.0 , 0.0 , 0.0, 0.0 , -100.0 ); // Projectile diffraction
// SetParams( 3, 0.0 , 0.0 , 0.0 , 0.0 , 0.0, 0.0 , -100.0 ); // Target diffraction
}
SetDeltaProbAtQuarkExchange( 0.0 );
SetProbOfSameQuarkExchange( 0.0 );
@@ -602,11 +634,16 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
// Proc# A1 B1 A2 B2 A3 Atop Ymin
SetParams( 0, 13.71, 1.75, -214.5, 4.25, 0.0, 0.5 , 1.1 ); // Qexchange without Exc.
SetParams( 1, 25.0, 1.0, -50.34, 1.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc.
SetParams( 2, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Projectile diffraction
SetParams( 3, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Target diffraction
SetParams( 4, 1.0, 0.0 , -2.01 , 0.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc. Additional multiply
SetParams( 1, 25.0, 1.0, -50.34, 1.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc.
if( Xinel > 0.) {
SetParams( 2, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Projectile diffraction
SetParams( 3, 6.0/Xinel, 0.0 ,-6.0/Xinel*16.28, 3.0 , 0.0, 0.0 , 0.93); // Target diffraction
SetParams( 4, 1.0, 0.0 , -2.01 , 0.5 , 0.0, 0.0 , 1.4 ); // Qexchange with Exc. Additional multiply
} else {
SetParams( 2, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
SetParams( 3, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
SetParams( 4, 0.0, 0.0 ,0.0, 0.0 , 0.0, 0.0 , 0.0);
}
if ( AbsProjectileBaryonNumber > 1 || NumberOfTargetNucleons > 1 ) {
SetParams( 2, 0.0 , 0.0 , 0.0 , 0.0 , 0.0, 0.0 , -100.0 ); // Projectile diffraction
// SetParams( 3, 0.0 , 0.0 , 0.0 , 0.0 , 0.0, 0.0 , -100.0 ); // Target diffraction
@@ -633,25 +670,24 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
// Set parameters of nuclear destruction
if ( ProjectileabsPDGcode < 1000 ) { // Meson projectile
SetMaxNumberOfCollisions( Plab, 2.0 ); // 3.0 )
SetCofNuclearDestruction( 1.0*std::exp( 4.0*(Ylab - 2.1) )/
( 1.0 + std::exp( 4.0*(Ylab - 2.1) ) ) ); // 0.62 1.0
SetCofNuclearDestruction( 0.00481*G4double(NumberOfTargetNucleons)* // Uzhi 3.05.2015
G4Exp( 4.0*(Ylab - 2.1) )/( 1.0 + G4Exp( 4.0*(Ylab - 2.1) ) ) );
SetR2ofNuclearDestruction( 1.5*fermi*fermi );
SetDofNuclearDestruction( 0.3 );
SetPt2ofNuclearDestruction( ( 0.035 + 0.04*std::exp( 4.0*(Ylab - 2.5) )/
( 1.0 + std::exp( 4.0*(Ylab - 2.5) ) ) )*GeV*GeV ); // 0.09
SetPt2ofNuclearDestruction( ( 0.035 + 0.04*G4Exp( 4.0*(Ylab - 2.5) )/
( 1.0 + G4Exp( 4.0*(Ylab - 2.5) ) ) )*GeV*GeV );
SetMaxPt2ofNuclearDestruction( 1.0*GeV*GeV );
SetExcitationEnergyPerWoundedNucleon( 100.0*MeV );
SetExcitationEnergyPerWoundedNucleon( 40.0*MeV ); // Uzhi March 2015: 100 -> 40
} else if ( ProjectilePDGcode < -1000 ) { // for anti-baryon projectile
//G4cout << "Nucl destruct Anti Bar" << G4endl;
SetMaxNumberOfCollisions( Plab, 2.0 ); // 3.0 )
SetCofNuclearDestruction( 1.0*std::exp( 4.0*(Ylab - 2.1) )/
( 1.0 + std::exp( 4.0*(Ylab - 2.1) ) ) ); // 0.62 1.0
SetCofNuclearDestruction( 0.00481*G4double(NumberOfTargetNucleons)* // Uzhi 3.05.2015
G4Exp( 4.0*(Ylab - 2.1) )/( 1.0 + G4Exp( 4.0*(Ylab - 2.1) ) ) );
SetR2ofNuclearDestruction( 1.5*fermi*fermi );
SetDofNuclearDestruction( 0.3 );
SetPt2ofNuclearDestruction( ( 0.035 + 0.04*std::exp( 4.0*(Ylab - 2.5) )/
( 1.0 + std::exp( 4.0*(Ylab - 2.5) ) ) )*GeV*GeV ); // 0.09
SetPt2ofNuclearDestruction( ( 0.035 + 0.04*G4Exp( 4.0*(Ylab - 2.5) )/
( 1.0 + G4Exp( 4.0*(Ylab - 2.5) ) ) )*GeV*GeV );
SetMaxPt2ofNuclearDestruction( 1.0*GeV*GeV );
SetExcitationEnergyPerWoundedNucleon( 100.0*MeV );
SetExcitationEnergyPerWoundedNucleon( 40.0*MeV ); // Uzhi March 2015: 100 -> 20
if ( Plab < 2.0 ) { // 2 GeV/c
// For slow anti-baryon we have to garanty putting on mass-shell
SetCofNuclearDestruction( 0.0 );
@@ -663,46 +699,52 @@ G4FTFParameters::G4FTFParameters( const G4ParticleDefinition* particle,
}
} else { // Projectile baryon assumed
SetMaxNumberOfCollisions( Plab, 2.0 ); // 3.0 )
SetCofNuclearDestruction( 1.0*std::exp( 4.0*(Ylab - 2.1) )/
( 1.0 + std::exp( 4.0*(Ylab - 2.1) ) ) ); // 0.62 1.0
SetCofNuclearDestructionPr( 0.00481*G4double(AbsProjectileBaryonNumber)* // Uzhi 3.05.2015
G4Exp( 4.0*(Ylab - 2.1) )/( 1.0 + G4Exp( 4.0*(Ylab - 2.1) ) ) );
SetCofNuclearDestruction( 0.00481*G4double(NumberOfTargetNucleons)* // Uzhi 3.05.2015
G4Exp( 4.0*(Ylab - 2.1) )/( 1.0 + G4Exp( 4.0*(Ylab - 2.1) ) ) );
SetR2ofNuclearDestruction( 1.5*fermi*fermi );
SetDofNuclearDestruction( 0.3 );
SetPt2ofNuclearDestruction( ( 0.035 + 0.04*std::exp( 4.0*(Ylab - 2.5) )/
( 1.0 + std::exp( 4.0*(Ylab - 2.5) ) ) )*GeV*GeV ); // 0.09
SetPt2ofNuclearDestruction( ( 0.035 + 0.04*G4Exp( 4.0*(Ylab - 2.5) )/
( 1.0 + G4Exp( 4.0*(Ylab - 2.5) ) ) )*GeV*GeV );
SetMaxPt2ofNuclearDestruction( 1.0*GeV*GeV );
SetExcitationEnergyPerWoundedNucleon( 100.0*MeV );
SetExcitationEnergyPerWoundedNucleon( 40.0*MeV ); // Uzhi March 2015: 100 -> 40
}
//SetCofNuclearDestruction( 0.47*std::exp( 2.0*(Ylab - 2.5) )/( 1.0 + std::exp( 2.0*(Ylab - 2.5) ) ) );
//SetPt2ofNuclearDestruction( ( 0.035 + 0.1*std::exp( 4.0*(Ylab - 3.0) )/( 1.0 + std::exp( 4.0*(Ylab - 3.0) ) ) )*GeV*GeV );
//SetCofNuclearDestruction( 0.47*G4Exp( 2.0*(Ylab - 2.5) )/( 1.0 + G4Exp( 2.0*(Ylab - 2.5) ) ) );
//SetPt2ofNuclearDestruction( ( 0.035 + 0.1*G4Exp( 4.0*(Ylab - 3.0) )/( 1.0 + G4Exp( 4.0*(Ylab - 3.0) ) ) )*GeV*GeV );
//SetMagQuarkExchange( 120.0 ); // 210.0 PipP
//SetSlopeQuarkExchange( 2.0 );
//SetDeltaProbAtQuarkExchange( 0.6 );
//SetProjMinDiffMass( 0.7 ); // GeV 1.1
//SetProjMinNonDiffMass( 0.7 ); // GeV
//SetProbabilityOfProjDiff( 0.0); // 0.85*std::pow( s/GeV/GeV, -0.5 ) ); // 40/32 X-dif/X-inel
//SetProbabilityOfProjDiff( 0.0); // 0.85*G4Pow::GetInstance()->powA( s/GeV/GeV, -0.5 ) ); // 40/32 X-dif/X-inel
//SetTarMinDiffMass( 1.1 ); // GeV
//SetTarMinNonDiffMass( 1.1 ); // GeV
//SetProbabilityOfTarDiff( 0.0 ); // 0.85*std::pow( s/GeV/GeV, -0.5 ) ); // 40/32 X-dif/X-inel
//SetProbabilityOfTarDiff( 0.0 ); // 0.85*G4Pow::GetInstance()->powA( s/GeV/GeV, -0.5 ) ); // 40/32 X-dif/X-inel
//SetAveragePt2( 0.0 ); // GeV^2 0.3
//------------------------------------
//SetProbabilityOfElasticScatt( 1.0, 1.0); //(Xtotal, Xelastic);
//SetProbabilityOfProjDiff( 1.0*0.62*std::pow( s/GeV/GeV, -0.51 ) ); // 0->1
//SetProbabilityOfTarDiff( 4.0*0.62*std::pow( s/GeV/GeV, -0.51 ) ); // 2->4
//SetAveragePt2( 0.3 ); // (0.15)
//SetProbabilityOfProjDiff( 1.0*0.62*G4Pow::GetInstance()->powA( s/GeV/GeV, -0.51 ) ); // 0->1
//SetProbabilityOfTarDiff( 4.0*0.62*G4Pow::GetInstance()->powA( s/GeV/GeV, -0.51 ) ); // 2->4
//SetAveragePt2( 0.3 ); // (0.15)
//SetAvaragePt2ofElasticScattering( 0.0 );
//SetMaxNumberOfCollisions( Plab, 6.0 ); //(4.0*(Plab + 0.01), Plab); // 6.0 );
//SetAveragePt2( 0.15 );
// G4cout << "Cnd " << GetCofNuclearDestruction() << G4endl;
//SetCofNuclearDestruction( 0.0 ); // (0.2) // (0.4) 0.5
//SetExcitationEnergyPerWoundedNucleon( 0.0*MeV ); // (75.0*MeV)
//SetDofNuclearDestruction( 0.0 ); // 0.3 0.5
//SetPt2ofNuclearDestruction( 0.0*GeV*GeV ); // (0.168*GeV*GeV)
//G4cout << "Pt2 " << GetPt2ofNuclearDestruction()/GeV/GeV << G4endl;
//G4int Uzhi; G4cin >> Uzhi;
//SetMaxNumberOfCollisions( Plab, 6.0 ); //(4.0*(Plab + 0.01), Plab); // 6.0 );
//SetAveragePt2( 0.15 );
//SetCofNuclearDestruction(-1.);//( 0.75 ); // (0.25)
//SetExcitationEnergyPerWoundedNucleon(0.);//( 30.0*MeV ); // (75.0*MeV)
//SetDofNuclearDestruction(0.);//( 0.2 ); //0.4 // 0.3 0.5
//SetPt2ofNuclearDestruction(0.);//(2.*0.075*GeV*GeV); //( 0.3*GeV*GeV ); // (0.168*GeV*GeV)
//SetMaxNumberOfCollisions( Plab, 78.0 ); // 3.0 )
//G4cout << "Cnd " << GetCofNuclearDestruction() << G4endl;
//G4cout << "Dnd " << GetDofNuclearDestruction() << G4endl;
//G4cout << "Pt2 " << GetPt2ofNuclearDestruction()/GeV/GeV << G4endl;
//G4int Uzhi; G4cin >> Uzhi;
}
@@ -716,8 +758,8 @@ G4double G4FTFParameters::GetProcProb( const G4int ProcN, const G4double y ) {
if(Prob < 0.) Prob=0.; // Uzhi Oct 2014
return Prob;
}
Prob = ProcParams[ProcN][0] * std::exp( -ProcParams[ProcN][1]*y ) +
ProcParams[ProcN][2] * std::exp( -ProcParams[ProcN][3]*y ) +
Prob = ProcParams[ProcN][0] * G4Exp( -ProcParams[ProcN][1]*y ) +
ProcParams[ProcN][2] * G4Exp( -ProcParams[ProcN][3]*y ) +
ProcParams[ProcN][4];
if(Prob < 0.) Prob=0.; // Uzhi Oct 2014
return Prob;
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4FTFParticipants.cc 87254 2014-11-28 07:49:23Z gcosmo $
// $Id: G4FTFParticipants.cc 91914 2015-08-11 07:00:39Z gcosmo $
// GEANT4 tag $Name: $
//
@@ -110,8 +110,10 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
G4double xyradius;
xyradius = theNucleus->GetOuterRadius() + deltaxy; // Range of impact parameter sampling
do { // while ( theInteractions.size() == 0 )
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do {
std::pair< G4double, G4double > theImpactParameter;
theImpactParameter = theNucleus->ChooseImpactXandY( xyradius );
@@ -133,7 +135,7 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
G4int TrN( 0 );
#endif
while ( ( nucleon = theNucleus->GetNextNucleon() ) ) {
while ( ( nucleon = theNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
G4double impact2 = sqr( impactX - nucleon->GetPosition().x() ) +
sqr( impactY - nucleon->GetPosition().y() );
@@ -170,7 +172,14 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
}
} while ( theInteractions.size() == 0 );
} while ( ( theInteractions.size() == 0 ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugFTFparticipant
G4cout << "BAD situation: forced exit from the while loop!" << G4endl;
#endif
return;
}
#ifdef debugFTFparticipant
G4cout << "Number of Hit nucleons " << theInteractions.size() << "\t Bx " << impactX/fermi
@@ -190,13 +199,17 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
G4cout << "Projectile and target are nuclei" << G4endl;
#endif
//G4cout<<theProjectileNucleus->GetOuterRadius()/fermi<<" "<<theNucleus->GetOuterRadius()/fermi<<" "<<deltaxy/fermi<<G4endl;
G4double xyradius;
xyradius = theProjectileNucleus->GetOuterRadius() + // Range of impact parameter sampling
theNucleus->GetOuterRadius() + deltaxy;
G4double impactX( 0.0 ), impactY( 0.0 );
do { // while ( theInteractions.size() == 0 )
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do {
std::pair< G4double, G4double > theImpactParameter;
theImpactParameter = theNucleus->ChooseImpactXandY( xyradius );
@@ -217,7 +230,7 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
G4int PrNuclN( 0 );
#endif
while ( ( ProjectileNucleon = theProjectileNucleus->GetNextNucleon() ) ) {
while ( ( ProjectileNucleon = theProjectileNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
G4VSplitableHadron* ProjectileSplitable = 0;
theNucleus->StartLoop();
@@ -227,7 +240,7 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
G4int TrNuclN( 0 );
#endif
while ( ( TargetNucleon = theNucleus->GetNextNucleon() ) ) {
while ( ( TargetNucleon = theNucleus->GetNextNucleon() ) ) { /* Loop checking, 10.08.2015, A.Ribon */
G4double impact2 = sqr( impactX + ProjectileNucleon->GetPosition().x() -
TargetNucleon->GetPosition().x() ) +
@@ -297,7 +310,14 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
if ( theInteractions.size() != 0 ) theProjectileNucleus->DoTranslation( theBeamPosition );
} while ( theInteractions.size() == 0 );
} while ( ( theInteractions.size() == 0 ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
#ifdef debugFTFparticipant
G4cout << "BAD situation: forced exit from the while loop!" << G4endl;
#endif
return;
}
SortInteractionsIncT();
ShiftInteractionTime();
@@ -308,7 +328,6 @@ void G4FTFParticipants::GetList( const G4ReactionProduct& thePrimary,
<< "\t B " << std::sqrt( sqr( impactX ) + sqr( impactY ) )/fermi << G4endl
<< "FTF participant End. #######################" << G4endl << G4endl;
#endif
return;
}
@@ -347,3 +366,18 @@ void G4FTFParticipants::ShiftInteractionTime() {
}
return;
}
//============================================================================
void G4FTFParticipants::Clean() {
for ( size_t i = 0; i < theInteractions.size(); i++ ) {
if ( theInteractions[ i ] ) {
delete theInteractions[ i ];
theInteractions[ i ] = 0;
}
}
theInteractions.clear();
currentInteraction = -1;
}