Import Geant4 10.2.0 source tree
This commit is contained in:
@@ -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,
|
||||
|
||||
+18
-5
@@ -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;
|
||||
}
|
||||
|
||||
+2
-1
@@ -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:
|
||||
|
||||
+25
-17
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+5
-1
@@ -43,7 +43,11 @@ G4DiffractiveHHScatterer::G4DiffractiveHHScatterer() :
|
||||
|
||||
//============================================================================
|
||||
|
||||
G4DiffractiveHHScatterer::~G4DiffractiveHHScatterer() {}
|
||||
G4DiffractiveHHScatterer::~G4DiffractiveHHScatterer()
|
||||
{
|
||||
delete theExcitation;
|
||||
delete theStringFragmentation;
|
||||
}
|
||||
|
||||
|
||||
//============================================================================
|
||||
|
||||
+9
-2
@@ -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 ) ) {
|
||||
|
||||
+13
-4
@@ -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;
|
||||
|
||||
+37
-11
@@ -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";
|
||||
}
|
||||
|
||||
+108
-66
@@ -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;
|
||||
|
||||
+44
-10
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user