Import Geant4 10.7.0 source tree

This commit is contained in:
Gabriele Cosmo
2020-12-04 12:30:43 +01:00
parent 67ba86d073
commit dab42d2018
3770 changed files with 226369 additions and 286486 deletions
@@ -72,7 +72,7 @@
//============================================================================
//#define debugFTFexictation
//#define debug_heavyHadrons
//============================================================================
@@ -292,13 +292,13 @@ G4bool G4DiffractiveExcitation::ExciteParticipants( G4VSplitableHadron* proje
common.TargetNonDiffStateMinMass2 = sqr( common.TargetNonDiffStateMinMass );
// Choose between diffraction and non-diffraction process
if ( G4UniformRand() < common.ProbOfDiffraction ) {
returnResult = ExciteParticipants_doDiffraction( projectile, target, theParameters, common );
} else {
returnResult = ExciteParticipants_doNonDiffraction( projectile, target, theParameters, common );
}
if ( returnResult ) {
common.Pprojectile += common.Qmomentum;
@@ -343,6 +343,17 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
#ifdef debugFTFexictation
G4cout << "Q exchange --------------------------" << G4endl;
#endif
// The target hadron is always a nucleon (i.e. either a proton or a neutron,
// never an antinucleon), therefore only a quark (not an antiquark) can be
// exchanged between the projectile hadron and the target hadron (otherwise
// we could get a quark-quark-antiquark system which cannot be a bound state).
// This implies that any projectile meson or anti-meson - given that it has
// a constituent quark in all cases - can have charge exchange with a target
// hadron. Instead, any projectile anti-baryon can never have charge exchange
// with a target hadron (because it has only constituent anti-quarks);
// projectile baryons, instead can have charge exchange with a target hadron.
G4int NewProjCode = 0, NewTargCode = 0, ProjQ1 = 0, ProjQ2 = 0, ProjQ3 = 0;
// Projectile unpacking
if ( common.absProjectilePDGcode < 1000 ) { // projectile is meson
@@ -357,7 +368,7 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
G4cout << "Proj Quarks " << ProjQ1 << " " << ProjQ2 << " " << ProjQ3 << G4endl
<< "Targ Quarks " << TargQ1 << " " << TargQ2 << " " << TargQ3 << G4endl;
#endif
// Sampling of exchanged quarks
G4int ProjExchangeQ = 0, TargExchangeQ = 0;
if ( common.absProjectilePDGcode < 1000 ) { // projectile is meson
@@ -406,20 +417,24 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
// Determination of a new projectile ID which satisfies energy-momentum conservation
G4double Ksi = G4UniformRand();
if ( aProjQ1 == aProjQ2 ) {
if ( aProjQ1 != 3 ) {
if ( aProjQ1 < 3 ) {
NewProjCode = 111; // Pi0-meson
if ( Ksi < 0.5 ) {
NewProjCode = 221; // Eta -meson
NewProjCode = 221; // Eta-meson
if ( Ksi < 0.25 ) {
NewProjCode = 331; // Eta'-meson
}
}
} else {
NewProjCode = 221; // Eta -meson
} else if ( aProjQ1 == 3 ) {
NewProjCode = 221; // Eta-meson
if ( Ksi < 0.5 ) {
NewProjCode = 331; // Eta'-meson
}
}
} else if ( aProjQ1 == 4 ) {
NewProjCode = 441; // Eta_c
} else if ( aProjQ1 == 5 ) {
NewProjCode = 553; // Upsilon
}
} else {
if ( aProjQ1 > aProjQ2 ) {
NewProjCode = aProjQ1*100 + aProjQ2*10 + 1;
@@ -430,25 +445,47 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
#ifdef debugFTFexictation
G4cout << "NewProjCode " << NewProjCode << G4endl;
#endif
// Decide (with 50% probability) whether the projectile hadrons is excited,
// but not in the case of charmed and bottom hadrons (because in Geant4
// there are no excited charmed and bottom states).
ProjExcited = false;
if ( G4UniformRand() < 0.5 ) {
if ( aProjQ1 <= 3 && aProjQ2 <= 3 && G4UniformRand() < 0.5 ) {
NewProjCode += 2; // Excited meson (J=1 -> 2*J+1=2+1=3, last digit of the PDG code)
ProjExcited = true;
}
// So far we have used the absolute values of the PDG codes of the two constituent quarks:
// now look at their signed values to set properly the signed of the meson's PDG code.
G4int value = ProjQ1, absValue = aProjQ1, Qquarks = 0;
for ( G4int iQuark = 0; iQuark < 2; iQuark++ ) {
if ( iQuark == 1 ) {
G4int value = ProjQ1, absValue = aProjQ1, Qquarks = 0;
for ( G4int iQ = 0; iQ < 2; ++iQ ) { // 0 : first quark; 1 : second quark
if ( iQ == 1 ) {
value = ProjQ2; absValue = aProjQ2;
}
if ( absValue == 2 ) {
Qquarks += value; // u or ubar : u-quark is positively charged +2 (e/3 unit)
if ( absValue == 2 || absValue == 4 ) { // u or c
Qquarks += 2*value/absValue; // u, c : positively charged +2 (e/3 unit)
} else {
Qquarks -= value/absValue; // d or dbar or s or sbar : d- or s-quark is negatively charged -1 (e/3 unit)
Qquarks -= value/absValue; // d, s, b : negatively charged -1 (e/3 unit)
}
}
if ( Qquarks < 0 ) NewProjCode *= -1;
// If Qquarks is positive, the sign of NewProjCode is fine.
// If Qquarks is negative, then the sign of NewProjCode needs to be reversed.
// If Qquarks is zero, then we need to distinguish between 3 cases:
// 1. If aProjQ1 and aProjQ2 are the same, then the sign of NewProjCode is fine
// (because the antiparticle is the same as the particle, e.g. eta, eta').
// 2. If aProjQ1 and aProjQ2 are not the same, given that Qquarks is zero,
// we have only two possibilities:
// a. aProjQ1 and aProjQ2 are two different down-type quarks, i.e.
// (s,d) or (b,d), or (b,s). In this case, the sign of NewProjCode
// is fine (because the heaviest of the two down-type quarks has
// to be anti-quark belonging to the initial projectile, which
// implies a meson with positive PDG code, e.g. B0 (bbar,d), Bs (bbar,s).
// b. aProjQ1 and aProjQ2 are two different up-type quarks, i.e. (u,c).
// The heaviest of the two (c) has to be an anti-quark (cbar) left
// in the projectile, therefore the sign of NewProjCode needs to be
// reverse: 421 -> -421 anti_D0 (cbar,u)
if ( Qquarks < 0 || ( Qquarks == 0 && aProjQ1 != aProjQ2 && aProjQ1%2 == 0 ) ) {
NewProjCode *= -1;
}
#ifdef debugFTFexictation
G4cout << "NewProjCode +2 or 0 " << NewProjCode << G4endl;
G4cout<<"+++++++++++++++++++++++++++++++++++++++"<<G4endl;
@@ -477,24 +514,62 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
G4cout << "New TrQ " << TargQ1 << " " << TargQ2 << " " << TargQ3 << G4endl
<< "NewTargCode " << NewTargCode << G4endl;
#endif
if ( TargQ1 != TargQ2 && TargQ1 != TargQ3 && TargQ2 != TargQ3 ) { // Lambda or Sigma0 ?
if ( G4UniformRand() < 0.5 ) {
NewTargCode += 2;
} else if ( G4UniformRand() < 0.75 ) {
NewTargCode = 3122;
// If the target has not heavy (charm or bottom) constituent quark,
// see whether a Delta isobar can be created.
if ( TargQ1 <= 3 && TargQ2 <= 3 && TargQ3 <= 3 ) {
if ( TargQ1 != TargQ2 && TargQ1 != TargQ3 && TargQ2 != TargQ3 ) { // Lambda or Sigma0 ?
if ( G4UniformRand() < 0.5 ) {
NewTargCode += 2;
} else if ( G4UniformRand() < 0.75 ) {
NewTargCode = 3122; // Lambda
}
} else if ( TargQ1 == TargQ2 && TargQ1 == TargQ3 ) {
NewTargCode += 2; ProjExcited = true; // Create Delta isobar
} else if ( target->GetDefinition()->GetPDGiIsospin() == 3 ) { // Delta was the target
if ( G4UniformRand() > DeltaProbAtQuarkExchange ) {
NewTargCode += 2; ProjExcited = true;
}
} else if ( ! ProjExcited &&
G4UniformRand() < DeltaProbAtQuarkExchange && // Nucleon was the target
common.SqrtS > common.M0projectile + // Delta mass
G4ParticleTable::GetParticleTable()->FindParticle( 2224 )->GetPDGMass() ) {
NewTargCode += 2; // Create Delta isobar
}
} else if ( TargQ1 == TargQ2 && TargQ1 == TargQ3 ) {
NewTargCode += 2; ProjExcited = true; // Create Delta isobar
} else if ( target->GetDefinition()->GetPDGiIsospin() == 3 ) { // Delta was the target
if ( G4UniformRand() > DeltaProbAtQuarkExchange ) {
NewTargCode += 2; ProjExcited = true;
}
} else if ( ! ProjExcited &&
G4UniformRand() < DeltaProbAtQuarkExchange && // Nucleon was the target
common.SqrtS > common.M0projectile + // Delta mass
G4ParticleTable::GetParticleTable()->FindParticle( 2224 )->GetPDGMass() ) {
NewTargCode += 2; // Create Delta isobar
}
// Protection against:
// - Lambda* (i.e. excited Lambda state) NOT existing in PDG , -> Lambda
// - Sigma* (i.e. excited Sigma hyperon states) NOT existing in Geant4 -> Sigma
// - Xi* (i.e. excited Xi hyperon states) NOT existing in Geant4 -> Xi
if ( NewTargCode == 3124 || // Lambda* NOT existing in PDG !
NewTargCode == 3224 || // Sigma*+ NOT existing in Geant4
NewTargCode == 3214 || // Sigma*0 NOT existing in Geant4
NewTargCode == 3114 || // Sigma*- NOT existing in Geant4
NewTargCode == 3324 || // Xi*0 NOT existing in Geant4
NewTargCode == 3314 ) { // Xi*- NOT existing in Geant4
//G4cout << "G4DiffractiveExcitation::ExciteParticipants_doChargeExchange INEXISTING TARGET PDGcode="
// << NewTargCode << G4endl;
NewTargCode -= 2; // Corresponding ground-state hyperon
}
// Special treatment for charmed and bottom baryons : in Geant4 there are no Xi_c' and Xi_b'
// so we need to transform them by hand to Xi_c and Xi_b, respectively.
#ifdef debug_heavyHadrons
G4int initialNewTargCode = NewTargCode;
#endif
if ( NewTargCode == 4322 ) NewTargCode = 4232; // Xi_c'+ -> Xi_c+
else if ( NewTargCode == 4312 ) NewTargCode = 4132; // Xi_c'0 -> Xi_c0
else if ( NewTargCode == 5312 ) NewTargCode = 5132; // Xi_b'- -> Xi_b-
else if ( NewTargCode == 5322 ) NewTargCode = 5232; // Xi_b'0 -> Xi_b0
#ifdef debug_heavyHadrons
if ( NewTargCode != initialNewTargCode ) {
G4cout << "G4DiffractiveExcitation::ExciteParticipants_doChargeExchange : forcing (inexisting in G4)" << G4endl
<< "\t target heavy baryon with pdgCode=" << initialNewTargCode
<< " into pdgCode=" << NewTargCode << G4endl;
}
#endif
TestParticle = G4ParticleTable::GetParticleTable()->FindParticle( NewTargCode );
if ( ! TestParticle ) continue;
#ifdef debugFTFexictation
@@ -530,6 +605,11 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
} else { // of the if ( common.absProjectilePDGcode < 1000 ) ; the projectile is baryon now
// If it is a projectile anti-baryon, no quark exchange is possible with a target hadron,
// therefore returns immediately 1 (which means "successfully completed, but the work
// needs to be continued").
if ( common.ProjectilePDGcode < 0 ) return 1;
// Choose randomly, with equal probability, whether to consider the quarks of the
// projectile or target hadron for selecting the flavour of the exchanged quark.
G4bool isProjectileExchangedQ = false;
@@ -567,9 +647,9 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
if ( exchangedQ != otherSecondQ || G4UniformRand() < probSame ) {
otherExchangedQ = otherSecondQ; otherSecondQ = exchangedQ; exchangedQ = otherExchangedQ;
} else {
//ALB if ( exchangedQ != otherThirdQ || G4UniformRand() < probSame ) {
otherExchangedQ = otherThirdQ; otherThirdQ = exchangedQ; exchangedQ = otherExchangedQ;
//ALB }
if ( exchangedQ != otherThirdQ || G4UniformRand() < probSame ) {
otherExchangedQ = otherThirdQ; otherThirdQ = exchangedQ; exchangedQ = otherExchangedQ;
}
}
}
} while ( otherExchangedQ == 0 && ++count < MaxCount );
@@ -601,6 +681,9 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
// then decide whether the new target hadron is a Delta particle.
// Notice that a Delta particle has the last PDG digit "4" (because its spin is 3/2),
// whereas a nucleon has "2" (because its spin is 1/2).
// If the new projectile hadron or the new target hadron has a heavy (c or b)
// constituent quark, then skip this part (because Geant4 does not have
// excited charm and bottom hadrons).
for ( G4int iHadron = 0; iHadron < 2; iHadron++ ) {
// First projectile hadron, then target hadron
G4int codeQ1 = ProjQ1, codeQ2 = ProjQ2, codeQ3 = ProjQ3, newHadCode = NewProjCode;
@@ -611,6 +694,7 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
massConstraint = common.M0projectile;
isHadronADelta = ( target->GetDefinition()->GetPDGiIsospin() == 3 );
}
if ( codeQ1 > 3 || codeQ2 > 3 || codeQ3 > 3 ) continue; // No excited charm or bottom states in Geant4
if ( codeQ1 == codeQ2 && codeQ1 == codeQ3 ) { // The three quarks are the same
newHadCode += 2; // Delta++ (uuu) or Delta- (ddd) : spin 3/2, last PDG digit = 4 (so +2 wrt p or n)
} else if ( isHadronADelta ) { // Hadron (projectile or target) was Delta
@@ -627,7 +711,7 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
} else {
newHadCode += 0; // No delta (so the last PDG digit remains 2)
}
}
}
if ( iHadron == 0 ) { // Projectile hadron
NewProjCode = newHadCode;
} else { // Target hadron
@@ -638,8 +722,58 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
G4cout << "NewProjCode NewTargCode " << NewProjCode << " " << NewTargCode << G4endl;
#endif
if ( common.absProjectilePDGcode == NewProjCode && common.absTargetPDGcode == NewTargCode ) {
} // Nothing was changed! It is not right!?
// Protection against:
// - Lambda* (i.e. excited Lambda state) NOT existing in PDG , -> Lambda
// - Sigma* (i.e. excited Sigma hyperon states) NOT existing in Geant4 -> Sigma
// - Xi* (i.e. excited Xi hyperon states) NOT existing in Geant4 -> Xi
if ( NewProjCode == 3124 || // Lambda* NOT existing in PDG !
NewProjCode == 3224 || // Sigma*+ NOT existing in Geant4
NewProjCode == 3214 || // Sigma*0 NOT existing in Geant4
NewProjCode == 3114 || // Sigma*- NOT existing in Geant4
NewProjCode == 3324 || // Xi*0 NOT existing in Geant4
NewProjCode == 3314 ) { // Xi*- NOT existing in Geant4
//G4cout << "G4DiffractiveExcitation::ExciteParticipants_doChargeExchange INEXISTING PROJECTILE PDGcode="
// << NewProjCode << G4endl;
NewProjCode -= 2; // Corresponding ground-state hyperon
}
if ( NewTargCode == 3124 || // Lambda* NOT existing in PDG !
NewTargCode == 3224 || // Sigma*+ NOT existing in Geant4
NewTargCode == 3214 || // Sigma*0 NOT existing in Geant4
NewTargCode == 3114 || // Sigma*- NOT existing in Geant4
NewTargCode == 3324 || // Xi*0 NOT existing in Geant4
NewTargCode == 3314 ) { // Xi*- NOT existing in Geant4
//G4cout << "G4DiffractiveExcitation::ExciteParticipants_doChargeExchange INEXISTING TARGET PDGcode="
// << NewTargCode << G4endl;
NewTargCode -= 2; // Corresponding ground-state hyperon
}
// Special treatment for charmed and bottom baryons : in Geant4 there are no Xi_c' and Xi_b'
// so we need to transform them by hand to the, respectively, Xi_c and Xi_b.
#ifdef debug_heavyHadrons
G4int initialNewProjCode = NewProjCode, initialNewTargCode = NewTargCode;
#endif
if ( NewProjCode == 4322 ) NewProjCode = 4232; // Xi_c'+ -> Xi_c+
else if ( NewProjCode == 4312 ) NewProjCode = 4132; // Xi_c'0 -> Xi_c0
else if ( NewProjCode == 5312 ) NewProjCode = 5132; // Xi_b'- -> Xi_b-
else if ( NewProjCode == 5322 ) NewProjCode = 5232; // Xi_b'0 -> Xi_b0
if ( NewTargCode == 4322 ) NewTargCode = 4232; // Xi_c'+ -> Xi_c+
else if ( NewTargCode == 4312 ) NewTargCode = 4132; // Xi_c'0 -> Xi_c0
else if ( NewTargCode == 5312 ) NewTargCode = 5132; // Xi_b'- -> Xi_b-
else if ( NewTargCode == 5322 ) NewTargCode = 5232; // Xi_b'0 -> Xi_b0
#ifdef debug_heavyHadrons
if ( NewProjCode != initialNewProjCode || NewTargCode != initialNewTargCode ) {
G4cout << "G4DiffractiveExcitation::ExciteParticipants_doChargeExchange : forcing (inexisting in G4)" << G4endl
<< "\t heavy baryon into an existing one:" << G4endl;
if ( NewProjCode != initialNewProjCode ) {
G4cout << "\t \t projectile baryon with pdgCode=" << initialNewProjCode
<< " into pdgCode=" << NewProjCode << G4endl;
}
if ( NewTargCode != initialNewTargCode ) {
G4cout << "\t \t target baryon with pdgCode=" << initialNewTargCode
<< " into pdgCode=" << NewTargCode << G4endl;
}
}
#endif
// Sampling of the masses of the projectile and target nucleons.
// Because of energy conservation, the ordering of the sampling matters:
@@ -734,7 +868,7 @@ ExciteParticipants_doChargeExchange( G4VSplitableHadron* projectile,
<< common.SqrtS << G4endl
<< "PZcms2 after the change " << common.PZcms2 << G4endl << G4endl;
#endif
if ( common.PZcms2 < 0.0 ) return returnCode; // It can be if energy is not sufficient for Delta
if ( common.PZcms2 < 0.0 ) return returnCode; // It can be if energy is not sufficient for Delta;
// unsuccessfully ended, nothing else can be done
projectile->SetDefinition( G4ParticleTable::GetParticleTable()->FindParticle( NewProjCode ) );
target->SetDefinition( G4ParticleTable::GetParticleTable()->FindParticle( NewTargCode ) );
@@ -818,6 +952,15 @@ ExciteParticipants_doDiffraction( G4VSplitableHadron* projectile, G4VSplitableHa
common.TargMassT = common.TargetDiffStateMinMass;
}
// Check whether the interaction is possible
if ( common.SqrtS < common.ProjMassT + common.TargMassT ) return false;
common.PZcms2 = ( sqr( common.S ) + sqr( common.ProjMassT2 ) + sqr( common.TargMassT2 )
- 2.0 * ( common.S * ( common.ProjMassT2 + common.TargMassT2 )
+ common.ProjMassT2 * common.TargMassT2 ) ) / 4.0 / common.S;
if ( common.PZcms2 < 0.0 ) return false;
common.maxPtSquare = common.PZcms2;
G4double DiffrAveragePt2 = theParameters->GetAvaragePt2ofElasticScattering()*1.2;
G4bool loopCondition = true;
G4int whilecount = 0;
@@ -829,15 +972,6 @@ ExciteParticipants_doDiffraction( G4VSplitableHadron* projectile, G4VSplitableHa
return false; // Ignore this interaction
};
// Check that the interaction is possible
if ( common.SqrtS < common.ProjMassT + common.TargMassT ) return false;
common.PZcms2 = ( sqr( common.S ) + sqr( common.ProjMassT2 ) + sqr( common.TargMassT2 )
- 2.0 * ( common.S * ( common.ProjMassT2 + common.TargMassT2 )
+ common.ProjMassT2 * common.TargMassT2 ) ) / 4.0 / common.S;
if ( common.PZcms2 < 0.0 ) return false;
common.maxPtSquare = common.PZcms2;
common.Qmomentum = G4LorentzVector( GaussianPt( DiffrAveragePt2, common.maxPtSquare ), 0 );
common.Pt2 = G4ThreeVector( common.Qmomentum.vect() ).mag2();
if ( isProjectileDiffraction ) { // projectile diffraction
@@ -910,6 +1044,19 @@ ExciteParticipants_doNonDiffraction( G4VSplitableHadron* projectile,
#ifdef debugFTFexictation
G4cout << "Non-diffraction process" << G4endl;
#endif
// Check whether the interaction is possible
common.ProjMassT2 = common.ProjectileNonDiffStateMinMass2;
common.ProjMassT = common.ProjectileNonDiffStateMinMass;
common.TargMassT2 = common.TargetNonDiffStateMinMass2;
common.TargMassT = common.TargetNonDiffStateMinMass;
if ( common.SqrtS < common.ProjMassT + common.TargMassT ) return false;
common.PZcms2 = ( sqr( common.S ) + sqr( common.ProjMassT2 ) + sqr( common.TargMassT2 )
- 2.0 * ( common.S * ( common.ProjMassT2 + common.TargMassT2 )
+ common.ProjMassT2 * common.TargMassT2 ) ) / 4.0 / common.S;
common.maxPtSquare = common.PZcms2;
G4int whilecount = 0;
do { // Generate pt and masses
@@ -919,19 +1066,6 @@ ExciteParticipants_doNonDiffraction( G4VSplitableHadron* projectile,
return false; // Ignore this interaction
};
// Check that the interaction is possible
common.ProjMassT2 = common.ProjectileNonDiffStateMinMass2;
common.ProjMassT = common.ProjectileNonDiffStateMinMass;
common.TargMassT2 = common.TargetNonDiffStateMinMass2;
common.TargMassT = common.TargetNonDiffStateMinMass;
if ( common.SqrtS < common.ProjMassT + common.TargMassT ) return false;
common.PZcms2 = ( sqr( common.S ) + sqr( common.ProjMassT2 ) + sqr( common.TargMassT2 )
- 2.0 * ( common.S * ( common.ProjMassT2 + common.TargMassT2 )
+ common.ProjMassT2 * common.TargMassT2 ) ) / 4.0 / common.S;
if ( common.PZcms2 < 0.0 ) return false;
common.maxPtSquare = common.PZcms2;
common.Qmomentum = G4LorentzVector( GaussianPt( theParameters->GetAveragePt2(),
common.maxPtSquare ), 0 );
common.Pt2 = G4ThreeVector( common.Qmomentum.vect() ).mag2();
@@ -951,16 +1085,31 @@ ExciteParticipants_doNonDiffraction( G4VSplitableHadron* projectile,
common.PMinusMax = common.SqrtS - common.TargMassT;
common.TPlusMin = std::sqrt( common.TargMassT2 + common.PZcms2 ) - common.PZcms;
common.TPlusMax = common.SqrtS - common.ProjMassT;
if ( G4UniformRand() < theParameters->GetProbLogDistrPrD() ) {
common.PMinusNew = ChooseP( common.PMinusMin, common.PMinusMax );
if ( G4UniformRand() <= 0.5 ) { // Random choice projectile or target sampling
if ( G4UniformRand() < theParameters->GetProbLogDistrPrD() ) {
common.PMinusNew = ChooseP( common.PMinusMin, common.PMinusMax );
} else {
common.PMinusNew = ( common.PMinusMax - common.PMinusMin )*G4UniformRand() + common.PMinusMin;
}
if ( G4UniformRand() < theParameters->GetProbLogDistr() ) {
common.TPlusNew = ChooseP( common.TPlusMin, common.TPlusMax );
} else {
common.TPlusNew = ( common.TPlusMax - common.TPlusMin )*G4UniformRand() + common.TPlusMin;
}
} else {
common.PMinusNew = ( common.PMinusMax - common.PMinusMin )*G4UniformRand() + common.PMinusMin;
if ( G4UniformRand() < theParameters->GetProbLogDistr() ) {
common.TPlusNew = ChooseP( common.TPlusMin, common.TPlusMax );
} else {
common.TPlusNew = ( common.TPlusMax - common.TPlusMin )*G4UniformRand() + common.TPlusMin;
}
if ( G4UniformRand() < theParameters->GetProbLogDistrPrD() ) {
common.PMinusNew = ChooseP( common.PMinusMin, common.PMinusMax );
} else {
common.PMinusNew = ( common.PMinusMax - common.PMinusMin )*G4UniformRand() + common.PMinusMin;
}
}
if ( G4UniformRand() < theParameters->GetProbLogDistr() ) {
common.TPlusNew = ChooseP( common.TPlusMin, common.TPlusMax );
} else {
common.TPlusNew = ( common.TPlusMax - common.TPlusMin )*G4UniformRand() + common.TPlusMin;
}
common.Qminus = common.PMinusNew - common.Pprojectile.minus();
common.Qplus = -( common.TPlusNew - common.Ptarget.plus() );
common.Qmomentum.setPz( (common.Qplus - common.Qminus)/2.0 );
@@ -1068,13 +1217,15 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
//x2 = 2.0 - x1 - x3;
G4double Mass_startQ = 650.0*MeV;
if ( PDGcode_startQ < 3 ) Mass_startQ = 325.0*MeV;
if ( PDGcode_startQ == 3 ) Mass_startQ = 500.0*MeV;
if ( PDGcode_startQ == 4 ) Mass_startQ = 1600.0*MeV;
if ( PDGcode_startQ < 3 ) Mass_startQ = 325.0*MeV; // For constituent up or down quark
if ( PDGcode_startQ == 3 ) Mass_startQ = 500.0*MeV; // For constituent strange quark
if ( PDGcode_startQ == 4 ) Mass_startQ = 1600.0*MeV; // For constituent charm quark
if ( PDGcode_startQ == 5 ) Mass_startQ = 4500.0*MeV; // For constituent bottom quark
G4double Mass_endQ = 650.0*MeV;
if ( PDGcode_endQ < 3 ) Mass_endQ = 325.0*MeV;
if ( PDGcode_endQ == 3 ) Mass_endQ = 500.0*MeV;
if ( PDGcode_endQ == 4 ) Mass_endQ = 1600.0*MeV;
if ( PDGcode_endQ < 3 ) Mass_endQ = 325.0*MeV; // For constituent up or down quark
if ( PDGcode_endQ == 3 ) Mass_endQ = 500.0*MeV; // For constituent strange quark
if ( PDGcode_endQ == 4 ) Mass_endQ = 1600.0*MeV; // For constituent charm quark
if ( PDGcode_endQ == 5 ) Mass_endQ = 4500.0*MeV; // For constituent bottom quark
G4double P2_1 = W2*x1*x1/4.0 - Mass_endQ*Mass_endQ;
G4double P2_3 = W2*x3*x3/4.0 - Mass_startQ*Mass_startQ;
@@ -1173,7 +1324,7 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
//G4cout << "Defin " << hadron->GetDefinition()->GetPDGEncoding()<< G4endl;
//G4int absPDGcode = std::abs( hadron->GetDefinition()->GetPDGEncoding() );
G4int absPDGcode = 1500; // 23 Dec
G4int absPDGcode = 1500;
if ( start->GetDefinition()->GetParticleSubType() == "quark" &&
end->GetDefinition()->GetParticleSubType() == "quark" ) {
absPDGcode = 110;
@@ -1183,13 +1334,11 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
if ( absPDGcode < 1000 ) { // meson
if ( isProjectile ) { // Projectile
if ( end->GetDefinition()->GetPDGEncoding() > 0 ) { // A quark on the end
FirstString = new G4ExcitedString( end , Ganti_quark, +1 );
SecondString = new G4ExcitedString( Gquark, start , +1 );
Ganti_quark->Set4Momentum( PkinkQ1 );
Gquark->Set4Momentum( PkinkQ2 );
} else { // Anti_Quark on the end
FirstString = new G4ExcitedString( end , Gquark, +1 );
SecondString = new G4ExcitedString( Ganti_quark, start , +1 );
Gquark->Set4Momentum( PkinkQ1 );
@@ -1209,7 +1358,6 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
}
}
} else { // Baryon/AntiBaryon
if ( isProjectile ) { // Projectile
if ( end->GetDefinition()->GetParticleType() == "diquarks" &&
end->GetDefinition()->GetPDGEncoding() > 0 ) { // DiQuark on the end
@@ -1217,7 +1365,6 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
SecondString = new G4ExcitedString( Ganti_quark, start , +1 );
Gquark->Set4Momentum( PkinkQ1 );
Ganti_quark->Set4Momentum( PkinkQ2 );
} else { // Anti_DiQuark on the end or quark
FirstString = new G4ExcitedString( end , Ganti_quark, +1 );
SecondString = new G4ExcitedString( Gquark, start , +1 );
@@ -1227,13 +1374,10 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
} else { // Target
if ( end->GetDefinition()->GetParticleType() == "diquarks" &&
end->GetDefinition()->GetPDGEncoding() > 0 ) { // DiQuark on the end
Gquark->Set4Momentum( PkinkQ1 );
Ganti_quark->Set4Momentum( PkinkQ2 );
FirstString = new G4ExcitedString( end, Gquark, -1 );
SecondString = new G4ExcitedString( Ganti_quark, start, -1 );
} else { // Anti_DiQuark on the end or Q
FirstString = new G4ExcitedString( Ganti_quark, end , -1 );
SecondString = new G4ExcitedString( start , Gquark, -1 );
@@ -1248,50 +1392,34 @@ void G4DiffractiveExcitation::CreateStrings( G4VSplitableHadron* hadron,
SecondString->SetTimeOfCreation( hadron->GetTimeOfCreation() );
SecondString->SetPosition( hadron->GetPosition() );
} else { // End of kink is possible: Kink is impossible
FirstString = new G4ExcitedString( end, start, +1 );
} else { // Kink is impossible
if ( isProjectile ) {
FirstString = new G4ExcitedString( end, start, +1 );
} else {
FirstString = new G4ExcitedString( end, start, -1 );
}
FirstString->SetTimeOfCreation( hadron->GetTimeOfCreation() );
FirstString->SetPosition( hadron->GetPosition() );
SecondString = 0;
// momenta of string ends
G4LorentzVector HadronMom = hadron->Get4Momentum();
G4LorentzVector Pstart1 = G4LorentzVector( HadronMom.px()/2.0, HadronMom.py()/2.0, 0.0, 0.0 ); // Quark momentum
G4LorentzVector Pend1 = G4LorentzVector( HadronMom.px()/2.0, HadronMom.py()/2.0, 0.0, 0.0 ); // Di-quark momentum
G4double Pz = HadronMom.pz();
G4double Eh = HadronMom.e();
G4double Pt2 = sqr( HadronMom.px() ) + sqr( HadronMom.py() );
G4double Mt2 = HadronMom.mt2();
G4double Exp = std::sqrt( sqr(Pz) + ( sqr(Mt2) - 4.0*sqr(Eh)*Pt2/4.0 )/Mt2 )/2.0;
G4double Pzq = Pz/2.0 - Exp; Pstart1.setZ( Pzq );
G4double Eq = std::sqrt( sqr(Pzq) + Pt2/4.0 ); Pstart1.setE( Eq );
G4double Pzqq = Pz/2.0 + Exp; Pend1.setZ(Pzqq);
G4double Eqq = std::sqrt( sqr(Pzqq) + Pt2/4.0 ); Pend1.setE(Eqq);
start->Set4Momentum( Pstart1 );
end->Set4Momentum( Pend1 );
Pstart = Pstart1; Pend = Pend1;
if ( ! (end->Get4Momentum().e() != 0.) ) {
// momenta of string ends
G4double Momentum = hadron->Get4Momentum().vect().mag();
G4double Plus = hadron->Get4Momentum().e() + Momentum;
G4double Minus = hadron->Get4Momentum().e() - Momentum;
G4ThreeVector tmp;
if ( Momentum > 0.0 ) {
tmp.set( hadron->Get4Momentum().px(),
hadron->Get4Momentum().py(),
hadron->Get4Momentum().pz() );
tmp /= Momentum;
} else {
tmp.set( 0.0, 0.0, 1.0 );
}
G4LorentzVector Pstart1( tmp, 0.0 );
G4LorentzVector Pend1( tmp, 0.0 );
if ( isProjectile ) {
Pstart1 *= (-1.0)*Minus/2.0;
Pend1 *= (+1.0)*Plus /2.0;
} else {
Pstart1 *= (+1.0)*Plus/ 2.0;
Pend1 *= (-1.0)*Minus/2.0;
}
Momentum = Pstart1.vect().mag();
Pstart1.setT( Momentum ); // It is assumed that quark has m=0.
Momentum = Pend1.vect().mag();
Pend1.setT( Momentum ); // It is assumed that di-quark has m=0.
start->Set4Momentum( Pstart1 );
end->Set4Momentum( Pend1 );
SecondString = 0;
}
} // End of kink is impossible
} // End of "if (Kink)"
//G4cout << "Quarks in the string at creation" << FirstString->GetRightParton()->GetPDGcode()
// << " " << FirstString->GetLeftParton()->GetPDGcode() << G4endl
@@ -1367,18 +1495,27 @@ G4double G4DiffractiveExcitation::GetQuarkFractionOfKink( G4double zmin, G4doubl
void G4DiffractiveExcitation::UnpackMeson( const G4int IdPDG, G4int& Q1, G4int& Q2 ) const {
G4int absIdPDG = std::abs( IdPDG );
if ( ! ( absIdPDG == 111 || absIdPDG == 221 || absIdPDG == 331 ) ) {
// Ordinary mesons
if ( ! ( absIdPDG == 111 || absIdPDG == 221 || absIdPDG == 331 || // Pi0 , Eta , Eta'
absIdPDG == 441 || absIdPDG == 443 || absIdPDG == 553 ) ) { // Etac , J/psi , Upsilon
// All other projectile mesons (including charmed and bottom ones)
Q1 = absIdPDG / 100;
Q2 = (absIdPDG % 100) / 10;
G4int anti = 1 - 2 * ( std::max( Q1, Q2 ) % 2 );
if ( IdPDG < 0 ) anti *= -1;
Q1 *= anti;
Q2 *= -1 * anti;
} else {
// Pi0, Eta, Eta'
if ( G4UniformRand() < 0.5 ) { Q1 = 1; Q2 = -1; }
else { Q1 = 2; Q2 = -2; }
} else {
if ( absIdPDG == 441 || absIdPDG == 443 ) { // Etac , J/psi
Q1 = 4; Q2 = -4;
} else if ( absIdPDG == 553 ) { // Upsilon
Q1 = 5; Q2 = -5;
} else { // Pi0 , Eta , Eta'
if ( G4UniformRand() < 0.5 ) {
Q1 = 1; Q2 = -1;
} else {
Q1 = 2; Q2 = -2;
}
}
}
return;
}
@@ -1398,6 +1535,7 @@ void G4DiffractiveExcitation::UnpackBaryon( G4int IdPDG,
//============================================================================
G4int G4DiffractiveExcitation::NewNucleonId( G4int Q1, G4int Q2, G4int Q3 ) const {
// Order the three integers in such a way that Q1 >= Q2 >= Q3
G4int TmpQ( 0 );
if ( Q3 > Q2 ) {
TmpQ = Q2;
@@ -1413,7 +1551,8 @@ G4int G4DiffractiveExcitation::NewNucleonId( G4int Q1, G4int Q2, G4int Q3 ) cons
Q1 = Q2;
Q2 = TmpQ;
}
G4int NewCode = Q1*1000 + Q2*100 + Q3*10 + 2;
// By now Q1 >= Q2 >= Q3
G4int NewCode = Q1*1000 + Q2*100 + Q3*10 + 2;
return NewCode;
}
@@ -182,45 +182,45 @@ G4bool G4FTFAnnihilation::Annihilate( G4VSplitableHadron* projectile,
G4bool isUnknown = false;
if ( TargetPDGcode == 2212 || TargetPDGcode == 2214 ) { // Target proton or Delta+
if ( ProjectilePDGcode == -2212 || ProjectilePDGcode == -2214 ) {
if ( ProjectilePDGcode == -2212 || ProjectilePDGcode == -2214 ) { // anti_proton or anti_Delta+
X_b *= 5.0; X_c *= 5.0; X_d *= 6.0; // Pbar P
} else if ( ProjectilePDGcode == -2112 || ProjectilePDGcode == -2114 ) {
} else if ( ProjectilePDGcode == -2112 || ProjectilePDGcode == -2114 ) { // anti_neutron or anti_Delta0
X_b *= 4.0; X_c *= 4.0; X_d *= 4.0; // NeutrBar P
} else if ( ProjectilePDGcode == -3122 || ProjectilePDGcode == -3124 ) {
} else if ( ProjectilePDGcode == -3122 ) { // anti_Lambda (no anti_Lambda* in PDG)
X_b *= 3.0; X_c *= 3.0; X_d *= 2.0; // LambdaBar P
} else if ( ProjectilePDGcode == -3112 || ProjectilePDGcode == -3114 ) {
} else if ( ProjectilePDGcode == -3112 ) { // anti_Sigma- (no anti_Sigma*- in G4)
X_b *= 2.0; X_c *= 2.0; X_d *= 0.0; // Sigma-Bar P
} else if ( ProjectilePDGcode == -3212 || ProjectilePDGcode == -3214 ) {
} else if ( ProjectilePDGcode == -3212 ) { // anti_Sigma0 (no anti_Sigma*0 in G4)
X_b *= 3.0; X_c *= 3.0; X_d *= 2.0; // Sigma0Bar P
} else if ( ProjectilePDGcode == -3222 || ProjectilePDGcode == -3224 ) {
} else if ( ProjectilePDGcode == -3222 ) { // anti_Sigma+ (no anti_Sigma*+ in G4)
X_b *= 4.0; X_c *= 4.0; X_d *= 2.0; // Sigma+Bar P
} else if ( ProjectilePDGcode == -3312 || ProjectilePDGcode == -3314 ) {
} else if ( ProjectilePDGcode == -3312 ) { // anti_Xi- (no anti_Xi*- in G4)
X_b *= 1.0; X_c *= 1.0; X_d *= 0.0; // Xi-Bar P
} else if ( ProjectilePDGcode == -3322 || ProjectilePDGcode == -3324 ) {
} else if ( ProjectilePDGcode == -3322 ) { // anti_Xi0 (no anti_Xi*0 in G4)
X_b *= 2.0; X_c *= 2.0; X_d *= 0.0; // Xi0Bar P
} else if ( ProjectilePDGcode == -3334 ) {
} else if ( ProjectilePDGcode == -3334 ) { // anti_Omega- (no anti_Omega*- in PDG)
X_b *= 0.0; X_c *= 0.0; X_d *= 0.0; // Omega-Bar P
} else {
isUnknown = true;
}
} else if ( TargetPDGcode == 2112 || TargetPDGcode == 2114 ) { // Target neutron or Delta0
if ( ProjectilePDGcode == -2212 || ProjectilePDGcode == -2214 ) {
if ( ProjectilePDGcode == -2212 || ProjectilePDGcode == -2214 ) { // anti_proton or anti_Delta+
X_b *= 4.0; X_c *= 4.0; X_d *= 4.0; // Pbar N
} else if ( ProjectilePDGcode == -2112 || ProjectilePDGcode == -2114 ) {
} else if ( ProjectilePDGcode == -2112 || ProjectilePDGcode == -2114 ) { // anti_neutron or anti_Delta0
X_b *= 5.0; X_c *= 5.0; X_d *= 6.0; // NeutrBar N
} else if ( ProjectilePDGcode == -3122 || ProjectilePDGcode == -3124 ) {
} else if ( ProjectilePDGcode == -3122 ) { // anti_Lambda (no anti_Lambda* in PDG)
X_b *= 3.0; X_c *= 3.0; X_d *= 2.0; // LambdaBar N
} else if ( ProjectilePDGcode == -3112 || ProjectilePDGcode == -3114 ) {
X_b *= 4.0; X_c *= 4.0; X_d *= 2.0; // Sigma-Bar N
} else if ( ProjectilePDGcode == -3212 || ProjectilePDGcode == -3214 ) {
} else if ( ProjectilePDGcode == -3112 ) { // anti_Sigma- (no anti_Sigma*- in G4)
X_b *= 4.0; X_c *= 4.0; X_d *= 2.0; // Sigma-Bar N
} else if ( ProjectilePDGcode == -3212 ) { // anti_Sigma0 (no anti_Sigma*0 in G4)
X_b *= 3.0; X_c *= 3.0; X_d *= 2.0; // Sigma0Bar N
} else if ( ProjectilePDGcode == -3222 || ProjectilePDGcode == -3224 ) {
} else if ( ProjectilePDGcode == -3222 ) { // anti_Sigma+ (no anti_Sigma*+ in G4)
X_b *= 2.0; X_c *= 2.0; X_d *= 0.0; // Sigma+Bar N
} else if ( ProjectilePDGcode == -3312 || ProjectilePDGcode == -3314 ) {
} else if ( ProjectilePDGcode == -3312 ) { // anti_Xi- (no anti_Xi*- in G4)
X_b *= 2.0; X_c *= 2.0; X_d *= 0.0; // Xi-Bar N
} else if ( ProjectilePDGcode == -3322 || ProjectilePDGcode == -3324 ) {
} else if ( ProjectilePDGcode == -3322 ) { // anti_Xi0 (no anti_Xi*0 in G4)
X_b *= 1.0; X_c *= 1.0; X_d *= 0.0; // Xi0Bar N
} else if ( ProjectilePDGcode == -3334 ) {
} else if ( ProjectilePDGcode == -3334 ) { // anti_Omega- (no anti_Omega*- in PDG)
X_b *= 0.0; X_c *= 0.0; X_d *= 0.0; // Omega-Bar N
} else {
isUnknown = true;
@@ -310,7 +310,7 @@ Create3QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
// For simplicity only scalar is considered here.
G4int NewCode = 0, antiQuark = 0, quark = 0;
G4ParticleDefinition* TestParticle = nullptr;
for ( G4int iString = 0; iString < 3; iString++ ) { // Loop over the 3 string cases
for ( G4int iString = 0; iString < 3; ++iString ) { // Loop over the 3 string cases
if ( iString == 0 ) {
antiQuark = common.AQ[0]; quark = common.Q[0];
projectile->SplitUp();
@@ -380,20 +380,20 @@ Create3QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
G4int NumberOfTries = 0, loopCounter = 0;
const G4int maxNumberOfLoops = 1000;
do {
NumberOfTries++;
++NumberOfTries;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
// At large number of tries it would be better to reduce the values of <Pt^2>
ScaleFactor /= 2.0;
AveragePt2 *= ScaleFactor;
}
G4ThreeVector PtSum( 0.0, 0.0, 0.0 );
for ( G4int i = 0; i < 6; i++ ) {
for ( G4int i = 0; i < 6; ++i ) {
Quark_Mom [i] = GaussianPt( AveragePt2, maxPtSquare );
PtSum += Quark_Mom[i];
}
PtSum /= 6.0;
SumMt = 0.0;
for ( G4int i = 0; i < 6; i++ ) {
for ( G4int i = 0; i < 6; ++i ) {
Quark_Mom[i] -= PtSum;
ModMom2[i] = Quark_Mom[i].mag2();
SumMt += std::sqrt( ModMom2[i] + MassQ2 );
@@ -411,13 +411,13 @@ Create3QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
NumberOfTries = 0; loopCounter = 0;
do {
Success = true;
NumberOfTries++;
++NumberOfTries;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
// At large number of tries it would be better to reduce the values of Pt's
ScaleFactor /= 2.0;
}
G4double Alfa = 0.0, Beta = 0.0;
for ( G4int iCase = 0; iCase < 2; iCase++ ) { // anti-baryon (1st case), baryon (2nd case)
for ( G4int iCase = 0; iCase < 2; ++iCase ) { // anti-baryon (1st case), baryon (2nd case)
G4double x1 = 0.0, x2 = 0.0;
G4double r1 = G4UniformRand(), r2 = G4UniformRand();
if ( Alfa_R == 1.0 ) {
@@ -430,7 +430,7 @@ Create3QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
G4double x3 = 1.0 - x1 - x2;
G4int index = iCase*3; // 0 for anti-baryon, 3 for baryon
Quark_Mom[index].setZ( x1 ); Quark_Mom[index+1].setZ( x2 ); Quark_Mom[index+2].setZ( x3 );
for ( G4int i = 0; i < 3; i++ ) { // Loop over the 3 (anti-)quarks
for ( G4int i = 0; i < 3; ++i ) { // Loop over the 3 (anti-)quarks
if ( Quark_Mom[index+i].getZ() != 0.0 ) {
G4double val = ( ScaleFactor * ModMom2[index+i] + MassQ2 ) / Quark_Mom[index+i].getZ();
if ( iCase == 0 ) { // anti-baryon
@@ -459,11 +459,11 @@ Create3QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
}
G4double SqrtScaleF = std::sqrt( ScaleFactor );
for ( G4int iCase = 0; iCase < 2; iCase++ ) { // anti-baryon (1st case), baryon (2nd case)
for ( G4int iCase = 0; iCase < 2; ++iCase ) { // anti-baryon (1st case), baryon (2nd case)
G4int index = iCase*3; // 0 for anti-baryon, 3 for baryon
G4double w = WplusProjectile; // for anti-baryon
if ( iCase == 1 ) w = - WminusTarget; // for baryon
for ( G4int i = 0; i < 3; i++ ) {
for ( G4int i = 0; i < 3; ++i ) {
G4double Pz = w * Quark_Mom[index+i].getZ() / 2.0 -
( ScaleFactor * ModMom2[index+i] + MassQ2 ) /
( 2.0 * w * Quark_Mom[index+i].getZ() );
@@ -476,7 +476,7 @@ Create3QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
}
G4LorentzVector Pstring1, Pstring2, Pstring3;
G4double YstringMax = 0.0, YstringMin = 0.0;
for ( G4int i = 0; i < 3; i++ ) {
for ( G4int i = 0; i < 3; ++i ) {
G4ThreeVector tmp = Quark_Mom[i] + Quark_Mom[i+3];
G4LorentzVector Pstring( tmp, std::sqrt( Quark_Mom[i].mag2() + MassQ2 ) +
std::sqrt( Quark_Mom[i+3].mag2() + MassQ2 ) );
@@ -563,9 +563,9 @@ Create1DiquarkAntiDiquarkString( G4VSplitableHadron* projectile,
G4cout << "Process b, quark - anti-quark annihilation, di-q - anti-di-q string" << G4endl;
#endif
G4int CandidatsN = 0, CandAQ[9][2], CandQ[9][2];
for ( G4int iAQ = 0; iAQ < 3; iAQ++ ) { // index of the 3 constituent anti-quarks of the antibaryon projectile
for ( G4int iQ = 0; iQ < 3; iQ++ ) { // index of the 3 constituent quarks of the nucleon target
G4int CandidatsN = 0, CandAQ[9][2] = {}, CandQ[9][2] = {};
for ( G4int iAQ = 0; iAQ < 3; ++iAQ ) { // index of the 3 constituent anti-quarks of the antibaryon projectile
for ( G4int iQ = 0; iQ < 3; ++iQ ) { // index of the 3 constituent quarks of the nucleon target
if ( -common.AQ[iAQ] == common.Q[iQ] ) { // antiquark - quark that can annihilate
// Here "0", "1", "2" means, respectively, "first", "second" and "third" constituent
// of the (anti-baryon) projectile or (nucleon) target.
@@ -575,7 +575,7 @@ Create1DiquarkAntiDiquarkString( G4VSplitableHadron* projectile,
if ( iQ == 0 ) { CandQ[CandidatsN][0] = 1; CandQ[CandidatsN][1] = 2; }
if ( iQ == 1 ) { CandQ[CandidatsN][0] = 0; CandQ[CandidatsN][1] = 2; }
if ( iQ == 2 ) { CandQ[CandidatsN][0] = 0; CandQ[CandidatsN][1] = 1; }
CandidatsN++;
++CandidatsN;
}
}
}
@@ -658,10 +658,10 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
<< G4endl;
#endif
G4int CandidatsN = 0, CandAQ[9][2], CandQ[9][2];
G4int CandidatsN = 0, CandAQ[9][2] = {}, CandQ[9][2] = {};
G4int LeftAQ1 = 0, LeftAQ2 = 0, LeftQ1 = 0, LeftQ2 = 0;
for ( G4int iAQ = 0; iAQ < 3; iAQ++ ) { // index of the 3 constituent anti-quarks of the antibaryon projectile
for ( G4int iQ = 0; iQ < 3; iQ++ ) { // index of the 3 constituent quarks of the nucleon target
for ( G4int iAQ = 0; iAQ < 3; ++iAQ ) { // index of the 3 constituent anti-quarks of the antibaryon projectile
for ( G4int iQ = 0; iQ < 3; ++iQ ) { // index of the 3 constituent quarks of the nucleon target
if ( -common.AQ[iAQ] == common.Q[iQ] ) { // antiquark - quark that can annihilate
// Here "0", "1", "2" means, respectively, "first", "second" and "third" constituent
// of the (anti-baryon) projectile or (nucleon) target.
@@ -671,7 +671,7 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
if ( iQ == 0 ) { CandQ[CandidatsN][0] = 1; CandQ[CandidatsN][1] = 2; }
if ( iQ == 1 ) { CandQ[CandidatsN][0] = 0; CandQ[CandidatsN][1] = 2; }
if ( iQ == 2 ) { CandQ[CandidatsN][0] = 0; CandQ[CandidatsN][1] = 1; }
CandidatsN++;
++CandidatsN;
}
}
}
@@ -694,7 +694,7 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
// For simplicity only scalar is considered here.
G4int NewCode = 0, antiQuark = 0, quark = 0;
G4ParticleDefinition* TestParticle = nullptr;
for ( G4int iString = 0; iString < 2; iString++ ) { // Loop over the 2 string cases
for ( G4int iString = 0; iString < 2; ++iString ) { // Loop over the 2 string cases
if ( iString == 0 ) {
antiQuark = LeftAQ1; quark = LeftQ1;
projectile->SplitUp();
@@ -753,20 +753,20 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
G4int NumberOfTries = 0, loopCounter = 0;
const G4int maxNumberOfLoops = 1000;
do {
NumberOfTries++;
++NumberOfTries;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
// At large number of tries it would be better to reduce the values of <Pt^2>
ScaleFactor /= 2.0;
AveragePt2 *= ScaleFactor;
}
G4ThreeVector PtSum( 0.0, 0.0, 0.0 );
for( G4int i = 0; i < 4; i++ ) {
for( G4int i = 0; i < 4; ++i ) {
Quark_Mom[i] = GaussianPt( AveragePt2, maxPtSquare );
PtSum += Quark_Mom[i];
}
PtSum /= 4.0;
SumMt = 0.0;
for ( G4int i = 0; i < 4; i++ ) {
for ( G4int i = 0; i < 4; ++i ) {
Quark_Mom[i] -= PtSum;
ModMom2[i] = Quark_Mom[i].mag2();
SumMt += std::sqrt( ModMom2[i] + MassQ2 );
@@ -783,13 +783,13 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
NumberOfTries = 0, loopCounter = 0;
do {
Success = true;
NumberOfTries++;
++NumberOfTries;
if ( NumberOfTries == 100*(NumberOfTries/100) ) {
// At large number of tries it would be better to reduce the values of Pt's
ScaleFactor /= 2.0;
}
G4double Alfa = 0.0, Beta = 0.0;
for ( G4int iCase = 0; iCase < 2; iCase++ ) { // Loop over the two strings
for ( G4int iCase = 0; iCase < 2; ++iCase ) { // Loop over the two strings
G4double x = 0.0, r = G4UniformRand();
if ( Alfa_R == 1.0 ) {
if ( iCase == 0 ) { // first string
@@ -802,7 +802,7 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
}
G4int index = iCase*2; // 0 for the first string, 2 for the second string
Quark_Mom[index].setZ( x ); Quark_Mom[index+1].setZ( 1.0 - x );
for ( G4int i = 0; i < 2; i++ ) {
for ( G4int i = 0; i < 2; ++i ) {
if ( Quark_Mom[i].getZ() != 0.0 ) {
G4double val = ( ScaleFactor * ModMom2[index+i] + MassQ2 ) / Quark_Mom[index+i].getZ();
if ( iCase == 0 ) { // first string
@@ -833,9 +833,9 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
G4double SqrtScaleF = std::sqrt( ScaleFactor );
G4LorentzVector Pstring1, Pstring2;
G4double Ystring1 = 0.0, Ystring2 = 0.0;
for ( G4int iCase = 0; iCase < 2; iCase++ ) { // Loop over the two strings
for ( G4int iCase = 0; iCase < 2; ++iCase ) { // Loop over the two strings
G4int index = iCase*2; // 0 for the first string, 2 for the second string
for ( G4int i = 0; i < 2; i++ ) {
for ( G4int i = 0; i < 2; ++i ) {
G4double w = WplusProjectile; // For the first string
if ( iCase == 1 ) w = - WminusTarget; // For the second string
G4double Pz = w * Quark_Mom[index+i].getZ() / 2.0
@@ -848,7 +848,7 @@ Create2QuarkAntiQuarkStrings( G4VSplitableHadron* projectile,
}
}
}
for ( G4int iCase = 0; iCase < 2; iCase++ ) { // Loop over the two strings
for ( G4int iCase = 0; iCase < 2; ++iCase ) { // Loop over the two strings
G4ThreeVector tmp = Quark_Mom[iCase] + Quark_Mom[iCase+2];
G4LorentzVector Pstring( tmp, std::sqrt( Quark_Mom[iCase].mag2() + MassQ2 ) +
std::sqrt( Quark_Mom[iCase+2].mag2() + MassQ2 ) );
@@ -918,11 +918,11 @@ Create1QuarkAntiQuarkString( G4VSplitableHadron* projectile,
// of the (anti-baryon) projectile or (nucleon) target.
G4int CandidatsN = 0, CandAQ[36], CandQ[36];
G4int LeftAQ = 0, LeftQ = 0;
for ( G4int iAQ1 = 0; iAQ1 < 3; iAQ1++ ) {
for ( G4int iAQ2 = 0; iAQ2 < 3; iAQ2++ ) {
for ( G4int iAQ1 = 0; iAQ1 < 3; ++iAQ1 ) {
for ( G4int iAQ2 = 0; iAQ2 < 3; ++iAQ2 ) {
if ( iAQ1 != iAQ2 ) {
for ( G4int iQ1 = 0; iQ1 < 3; iQ1++ ) {
for ( G4int iQ2 = 0; iQ2 < 3; iQ2++ ) {
for ( G4int iQ1 = 0; iQ1 < 3; ++iQ1 ) {
for ( G4int iQ2 = 0; iQ2 < 3; ++iQ2 ) {
if ( iQ1 != iQ2 ) {
if ( -common.AQ[iAQ1] == common.Q[iQ1] && -common.AQ[iAQ2] == common.Q[iQ2] ) {
if ( ( iAQ1 == 0 && iAQ2 == 1 ) || ( iAQ1 == 1 && iAQ2 == 0 ) ) {
@@ -939,7 +939,7 @@ Create1QuarkAntiQuarkString( G4VSplitableHadron* projectile,
} else if ( ( iQ1 == 1 && iQ2 == 2 ) || ( iQ1 == 2 && iQ2 == 1 ) ) {
CandQ[CandidatsN] = 0;
}
CandidatsN++;
++CandidatsN;
}
}
}
@@ -78,7 +78,7 @@ G4FTFModel::G4FTFModel( const G4String& modelName ) :
//
NumberOfInvolvedNucleonsOfTarget = 0;
NumberOfInvolvedNucleonsOfProjectile= 0;
for ( G4int i = 0; i < 250; i++ ) {
for ( G4int i = 0; i < 250; ++i ) {
TheInvolvedNucleonsOfTarget[i] = 0;
TheInvolvedNucleonsOfProjectile[i] = 0;
}
@@ -132,7 +132,7 @@ G4FTFModel::~G4FTFModel() {
// Erasing of target involved nucleons.
if ( NumberOfInvolvedNucleonsOfTarget != 0 ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
G4VSplitableHadron* aNucleon = TheInvolvedNucleonsOfTarget[i]->GetSplitableHadron();
if ( aNucleon ) delete aNucleon;
}
@@ -140,7 +140,7 @@ G4FTFModel::~G4FTFModel() {
// Erasing of projectile involved nucleons.
if ( NumberOfInvolvedNucleonsOfProjectile != 0 ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
G4VSplitableHadron* aNucleon = TheInvolvedNucleonsOfProjectile[i]->GetSplitableHadron();
if ( aNucleon ) delete aNucleon;
}
@@ -273,8 +273,15 @@ void G4FTFModel::Init( const G4Nucleus& aNucleus, const G4DynamicParticle& aProj
G4cout << "FTF end of Init" << G4endl << G4endl;
#endif
//if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 &&
// aNucleus.GetA_asInt() < 2 ) theParameters->SetProbabilityOfElasticScatt( 0.0 );
// In the case of Hydrogen target, for non-ion hadron projectiles,
// do NOT simulate quasi-elastic (by forcing to 0 the probability of
// elastic scatering in theParameters - which is used only by FTF).
// This is necessary because in this case quasi-elastic on a target nucleus
// with only one nucleon would be identical to the hadron elastic scattering,
// and the latter is already included in the elastic process
// (i.e. G4HadronElasticProcess).
if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 &&
aNucleus.GetA_asInt() < 2 ) theParameters->SetProbabilityOfElasticScatt( 0.0 );
}
@@ -358,14 +365,14 @@ G4ExcitedStringVector* G4FTFModel::GetStrings() {
G4VSplitableHadron* aNucleon = 0;
// Erase the projectile nucleons
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
aNucleon = TheInvolvedNucleonsOfProjectile[i]->GetSplitableHadron();
if ( aNucleon ) delete aNucleon;
}
NumberOfInvolvedNucleonsOfProjectile = 0;
// Erase the target nucleons
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
aNucleon = TheInvolvedNucleonsOfTarget[i]->GetSplitableHadron();
if ( aNucleon ) delete aNucleon;
}
@@ -407,6 +414,7 @@ void G4FTFModel::StoreInvolvedNucleon() {
<< G4endl << G4endl;
#endif
if ( ! GetProjectileNucleus() ) return; // The projectile is a hadron
// The projectile is a nucleus or an anti-nucleus.
@@ -970,7 +978,7 @@ G4bool G4FTFModel::ExciteParticipants() {
// Return to the annihilation
theParticipants.StartLoop();
for ( G4int I = 0; I < CurrentInteraction; I++ ) theParticipants.Next();
for ( G4int I = 0; I < CurrentInteraction; ++I ) theParticipants.Next();
// At last, annihilation
if ( ! HighEnergyInter ) {
@@ -1002,7 +1010,7 @@ G4bool G4FTFModel::ExciteParticipants() {
}
}
theParticipants.StartLoop();
for ( G4int I = 0; I < CurrentInteraction; I++ ) theParticipants.Next();
for ( G4int I = 0; I < CurrentInteraction; ++I ) theParticipants.Next();
*/
}
@@ -2287,7 +2295,7 @@ void G4FTFModel::GetResiduals() {
G4LorentzVector DeltaPResidualNucleus = TargetResidual4Momentum /
G4double( NumberOfInvolvedNucleonsOfTarget );
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
#ifdef debugFTFmodel
@@ -2389,7 +2397,7 @@ void G4FTFModel::GetResiduals() {
DeltaPResidualNucleus = ProjectileResidual4Momentum /
G4double( NumberOfInvolvedNucleonsOfProjectile );
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
G4Nucleon* aNucleon = TheInvolvedNucleonsOfProjectile[i];
#ifdef debugFTFmodel
@@ -2493,7 +2501,7 @@ void G4FTFModel::GetResiduals() {
#endif
G4int NumberOfTargetParticipant( 0 );
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
G4VSplitableHadron* targetSplitable = aNucleon->GetSplitableHadron();
if ( targetSplitable->GetSoftCollisionCount() != 0 ) NumberOfTargetParticipant++;
@@ -2507,7 +2515,7 @@ void G4FTFModel::GetResiduals() {
DeltaPResidualNucleus = TargetResidual4Momentum / G4double( NumberOfTargetParticipant );
}
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
G4VSplitableHadron* targetSplitable = aNucleon->GetSplitableHadron();
if ( targetSplitable->GetSoftCollisionCount() != 0 ) {
@@ -2537,7 +2545,7 @@ void G4FTFModel::GetResiduals() {
#endif
G4int NumberOfProjectileParticipant( 0 );
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
G4Nucleon* aNucleon = TheInvolvedNucleonsOfProjectile[i];
G4VSplitableHadron* projectileSplitable = aNucleon->GetSplitableHadron();
if ( projectileSplitable->GetSoftCollisionCount() != 0 ) NumberOfProjectileParticipant++;
@@ -2556,7 +2564,7 @@ void G4FTFModel::GetResiduals() {
}
//G4cout << "DeltaExcitationE DeltaPResidualNucleus " << DeltaExcitationE
// << " " << DeltaPResidualNucleus << G4endl;
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
G4Nucleon* aNucleon = TheInvolvedNucleonsOfProjectile[i];
G4VSplitableHadron* projectileSplitable = aNucleon->GetSplitableHadron();
if ( projectileSplitable->GetSoftCollisionCount() != 0 ) {
@@ -2589,18 +2597,18 @@ void G4FTFModel::GetResiduals() {
G4ThreeVector G4FTFModel::GaussianPt( G4double AveragePt2, G4double maxPtSquare ) const {
G4double Pt2( 0.0 );
G4double Pt2( 0.0 ), Pt( 0.0 );
if (AveragePt2 > 0.0) {
if (maxPtSquare/AveragePt2 < 1.0e+9) {
Pt2 = -AveragePt2 * G4Log( 1.0 + G4UniformRand() *
( G4Exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
const G4double ymax = maxPtSquare/AveragePt2;
if ( ymax < 200. ) {
Pt2 = -AveragePt2 * G4Log( 1.0 + G4UniformRand() * ( G4Exp( -ymax ) -1.0 ) );
} else {
Pt2 = -AveragePt2 * G4Log( 1.0 - G4UniformRand() );
}
Pt = std::sqrt( Pt2 );
}
G4double Pt = std::sqrt( Pt2 );
G4double phi = G4UniformRand() * twopi;
return G4ThreeVector( Pt*std::cos(phi), Pt*std::sin(phi), 0.0 );
@@ -2718,7 +2726,7 @@ GenerateDeltaIsobar( const G4double sqrtS, // input parameter
G4int maxNumberOfDeltas = G4int( (sqrtS - sumMasses)/(400.0*MeV) );
G4int numberOfDeltas = 0;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
if ( G4UniformRand() < probDeltaIsobar && numberOfDeltas < maxNumberOfDeltas ) {
numberOfDeltas++;
@@ -2774,8 +2782,16 @@ SamplingNucleonKinematics( G4double averagePt2, // input param
// the action of this method consists in changing the properties of the nucleons
// whose pointers are in the vector involvedNucleons, as well as changing the
// variable mass2.
#ifdef debugPutOnMassShell
G4cout << "G4FTFModel::SamplingNucleonKinematics:" << G4endl;
G4cout << " averagePt2= " << averagePt2 << " maxPt2= " << maxPt2
<< " dCor= " << dCor << " resMass(GeV)= " << residualMass/GeV
<< " resMassN= " << residualMassNumber
<< " nNuc= " << numberOfInvolvedNucleons
<< " lv= " << pResidual << G4endl;
#endif
if ( ! nucleus ) return false;
if ( ! nucleus || numberOfInvolvedNucleons < 1) return false;
if ( residualMassNumber == 0 && numberOfInvolvedNucleons == 1 ) {
dCor = 0.0;
@@ -2785,14 +2801,10 @@ SamplingNucleonKinematics( G4double averagePt2, // input param
G4bool success = true;
G4double SumMasses = residualMass;
G4double invN = 1.0/(G4double)numberOfInvolvedNucleons;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
SumMasses += aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass();
}
//
// to avoid problems due to precision lost a tolerance is added
const G4double eps = 1.e-10;
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = 0;
do {
@@ -2801,21 +2813,22 @@ SamplingNucleonKinematics( G4double averagePt2, // input param
// Sampling of nucleon Pt
G4ThreeVector ptSum( 0.0, 0.0, 0.0 );
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4ThreeVector tmpPt = GaussianPt( averagePt2, maxPt2 );
ptSum += tmpPt;
G4LorentzVector tmp( tmpPt.x(), tmpPt.y(), 0.0, 0.0 );
aNucleon->SetMomentum( tmp );
if( averagePt2 > 0.0 ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4ThreeVector tmpPt = GaussianPt( averagePt2, maxPt2 );
ptSum += tmpPt;
G4LorentzVector tmp( tmpPt.x(), tmpPt.y(), 0.0, 0.0 );
aNucleon->SetMomentum( tmp );
}
}
G4double deltaPx = ( ptSum.x() - pResidual.x() ) / numberOfInvolvedNucleons;
G4double deltaPy = ( ptSum.y() - pResidual.y() ) / numberOfInvolvedNucleons;
G4double deltaPx = ( ptSum.x() - pResidual.x() )*invN;
G4double deltaPy = ( ptSum.y() - pResidual.y() )*invN;
SumMasses = residualMass;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4double px = aNucleon->Get4Momentum().px() - deltaPx;
@@ -2830,88 +2843,77 @@ SamplingNucleonKinematics( G4double averagePt2, // input param
// Sampling X of nucleon
G4double xSum = 0.0;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4ThreeVector tmpX = GaussianPt( dCor*dCor, 1.0 );
//G4double x = tmpX.x() + aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass()/SumMasses;
G4double x = tmpX.x() + aNucleon->Get4Momentum().e()/SumMasses;
if ( x < 0.0 || x > 1.0 ) {
G4double x = 0.0;
if( 0.0 != dCor ) {
G4ThreeVector tmpX = GaussianPt( dCor*dCor, 1.0 );
x = tmpX.x();
}
x += aNucleon->Get4Momentum().e()/SumMasses;
if ( x < -eps || x > 1.0 + eps ) {
success = false;
break;
}
x = std::min(1.0, std::max(x, 0.0));
xSum += x;
// The energy is in the lab (instead of cms) frame but it will not be used.
// The energy is in the lab (instead of cms) frame but it will not be used
G4LorentzVector tmp( aNucleon->Get4Momentum().x(), aNucleon->Get4Momentum().y(),
G4LorentzVector tmp( aNucleon->Get4Momentum().x(),
aNucleon->Get4Momentum().y(),
x, aNucleon->Get4Momentum().e() );
aNucleon->SetMomentum( tmp );
}
if ( xSum < 0.0 || xSum > 1.0 ) success = false;
if ( xSum < -eps || xSum > 1.0 + eps ) 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 = 0.0;
}
G4double delta = ( residualMassNumber == 0 ) ? std::min(xSum - 1.0, 0.0)*invN : 0.0;
xSum = 1.0;
mass2 = 0.0;
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4double x = aNucleon->Get4Momentum().pz() - delta;
xSum -= x;
xSum -= x;
if ( residualMassNumber == 0 ) {
if ( x <= 0.0 || x > 1.0 ) {
if ( x <= -eps || x > 1.0 + eps ) {
success = false;
break;
}
} else {
if ( x <= 0.0 || x > 1.0 || xSum <= 0.0 || xSum > 1.0 ) {
if ( x <= -eps || x > 1.0 + eps || xSum <= -eps || xSum > 1.0 + eps ) {
success = false;
break;
}
}
/*
G4double px = aNucleon->Get4Momentum().px() - deltaPx;
G4double py = aNucleon->Get4Momentum().py() - deltaPy;
mass2 += ( sqr( aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass() )
+ sqr( px ) + sqr( py ) ) / x;
G4LorentzVector tmp( px, py, x, aNucleon->Get4Momentum().e() );
*/
}
x = std::min(1.0, std::max(x, eps));
mass2 += sqr( aNucleon->Get4Momentum().e() ) / x;
G4LorentzVector tmp( aNucleon->Get4Momentum().px(), aNucleon->Get4Momentum().py(),
G4LorentzVector tmp( aNucleon->Get4Momentum().px(),
aNucleon->Get4Momentum().py(),
x, aNucleon->Get4Momentum().e() );
aNucleon->SetMomentum( tmp );
}
if ( ! success ) continue;
xSum = std::min(1.0, std::max(xSum, eps));
if ( success && residualMassNumber != 0 ) {
if ( residualMassNumber > 0 ) {
mass2 += ( sqr( residualMass ) + pResidual.perp2() ) / xSum;
//mass2 += sqr( residualMass ) / xSum;
}
#ifdef debugPutOnMassShell
G4cout << "success " << success << G4endl << " Mt " << std::sqrt( mass2 )/GeV << G4endl;
G4cout << "success: " << success << " Mt(GeV)= "
<< std::sqrt( mass2 )/GeV << G4endl;
#endif
} while ( ( ! success ) &&
++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */
if ( loopCounter >= maxNumberOfLoops ) {
return false;
}
return true;
return ( loopCounter < maxNumberOfLoops );
}
@@ -2959,7 +2961,7 @@ CheckKinematics( const G4double sValue, // input parameter
<< "\t projectileY targetY " << projectileY << " " << targetY << G4endl;
#endif
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4LorentzVector tmp = aNucleon->Get4Momentum();
@@ -3015,7 +3017,7 @@ FinalizeKinematics( const G4double w, // input parame
G4ThreeVector residual3Momentum( 0.0, 0.0, 1.0 );
for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
for ( G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
G4Nucleon* aNucleon = involvedNucleons[i];
if ( ! aNucleon ) continue;
G4LorentzVector tmp = aNucleon->Get4Momentum();
@@ -883,7 +883,8 @@ class G4FTFSettingDefaultHDP
//
// baryons
//
/* JVY, Oct. 31, 2017: Per Alberto R. & Vladimir U., keep this group of parameters FIXED
/* JVY, Oct. 31, 2017: Per Alberto R. & Vladimir U., keep this group of parameters FIXED */
/* JVY, June 11, 2020: try to open up... */
// Process=0 --> Qexchg w/o excitation
//
HDP.SetDefault( "FTF_BARYON_PROC0_A1", 13.71 );
@@ -893,6 +894,7 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_BARYON_PROC0_A3", 0.0 );
HDP.SetDefault( "FTF_BARYON_PROC0_ATOP", 1.0 );
HDP.SetDefault( "FTF_BARYON_PROC0_YMIN", 0.93 );
/* */
//
// Process=1 --> Qexchg w/excitation
//
@@ -903,7 +905,7 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_BARYON_PROC1_A3", 0. );
HDP.SetDefault( "FTF_BARYON_PROC1_ATOP", 0. );
HDP.SetDefault( "FTF_BARYON_PROC1_YMIN", 1.4 );
*/
/* */
//
// NOTE: Process #2 & 3 are projectile & target diffraction
// they have more complex definition of A1 & A2
@@ -917,7 +919,8 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_BARYON_DIFF_DISSO_PROJ", false );
HDP.SetDefault( "FTF_BARYON_DIFF_DISSO_TGT", false ); // as in hadr-string-diff-V10-03-07
//
/* JVY, Oct. 31, 2017: Per Alberto R. & Vladimir U., keep this group of parameters FIXED
/* JVY, Oct. 31, 2017: Per Alberto R. & Vladimir U., keep this group of parameters FIXED */
/* JVY, June 11, 2020: try to open up... */
// Process=4 --> Qexchg w/additional multiplier in excitation
//
HDP.SetDefault( "FTF_BARYON_PROC4_A1", 0.6 );
@@ -927,7 +930,7 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_BARYON_PROC4_A3", 0. );
HDP.SetDefault( "FTF_BARYON_PROC4_ATOP",0. );
HDP.SetDefault( "FTF_BARYON_PROC4_YMIN",1.4 );
*/
/* */
//
// Parameters of participating hadron (baryon) excitation
//
@@ -951,7 +954,7 @@ class G4FTFSettingDefaultHDP
// JVY, Aug.8, 2018 --> Feb.14, 2019 --> June 25, 2019:
// Parameters of participating hadron (pions) excitation
//
/* JVY, June 25, 2019: For now, keep this group of parameters FIXED
/* JVY, June 25, 2019: For now, keep this group of parameters FIXED */
// Process=0 --> Qexchg w/o excitation
//
HDP.SetDefault( "FTF_PION_PROC0_A1", 150.0 );
@@ -971,11 +974,18 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_PION_PROC1_A3", 0. );
HDP.SetDefault( "FTF_PION_PROC1_ATOP", 0. );
HDP.SetDefault( "FTF_PION_PROC1_YMIN", 0.0 );
/*
//
// NOTE: Process #2 & 3 are projectile & target diffraction
//
// Process=2 --> Projectile diffraction
//
// Q: Would it even make sense to make these configurable ?
// The following is hadrcoded:
// Projectile Baryon Number > 10 (AbsProjectileBaryonNumber > 10)
// ... which is "strange" because projectile is a pion !!!... so it's always OFF
// (see also lines 1007-1016)
//
HDP.SetDefault( "FTF_PION_PROC2_A1", 2.27 );
HDP.SetDefault( "FTF_PION_PROC2_B1", 0.5 );
HDP.SetDefault( "FTF_PION_PROC2_A2", -98052.0);
@@ -983,6 +993,7 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_PION_PROC2_A3", 0. );
HDP.SetDefault( "FTF_PION_PROC2_ATOP", 0. );
HDP.SetDefault( "FTF_PION_PROC2_YMIN", 3.0 );
*/
//
// Process=3 --> Target diffraction
//
@@ -993,7 +1004,6 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_PION_PROC3_A3", 0.08);
HDP.SetDefault( "FTF_PION_PROC3_ATOP", 0. );
HDP.SetDefault( "FTF_PION_PROC3_YMIN", 2.2 );
*/
//
// projectile and/or target diffraction (dissociation) may be switched ON/OFF
//
@@ -1006,7 +1016,8 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_PION_DIFF_DISSO_PROJ", false );
HDP.SetDefault( "FTF_PION_DIFF_DISSO_TGT", false );
//
/* JVY, June 25, 2019: For now keep this group of parameters FIXED
/* JVY, June 25, 2019: For now keep this group of parameters FIXED */
/* JVY, June 11, 2020: try to open up... */
// Process=4 --> Qexchg w/additional multiplier in excitation
//
HDP.SetDefault( "FTF_PION_PROC4_A1", 1.0 );
@@ -1016,7 +1027,7 @@ class G4FTFSettingDefaultHDP
HDP.SetDefault( "FTF_PION_PROC4_A3", 0. );
HDP.SetDefault( "FTF_PION_PROC4_ATOP",0. );
HDP.SetDefault( "FTF_PION_PROC4_YMIN",2.4 );
*/
/* */
//
// NOTE; As of geant4-10-05, all these settings beloe are correct
// (and are the same as they were in 10.4.ref06)
@@ -1198,7 +1209,7 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
//
// Proc=0 --> Qexchg w/o excitation
//
/* As of Oct. 31, 2017 keep these fixed
/* As of Oct. 31, 2017 keep these fixed */
HDP.DeveloperGet( "FTF_BARYON_PROC0_A1", fProc0A1 );
HDP.DeveloperGet( "FTF_BARYON_PROC0_B1", fProc0B1 );
HDP.DeveloperGet( "FTF_BARYON_PROC0_A2", fProc0A2 );
@@ -1206,8 +1217,9 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
HDP.DeveloperGet( "FTF_BARYON_PROC0_A3", fProc0A3 );
HDP.DeveloperGet( "FTF_BARYON_PROC0_ATOP", fProc0Atop );
HDP.DeveloperGet( "FTF_BARYON_PROC0_YMIN", fProc0Ymin );
*/
/* */
//
/* JVY, June 11, 2020: make configurable
fProc0A1 = 13.71;
fProc0B1 = 1.75;
fProc0A2 = -30.69; // (or -214.5 as in Doc ?)
@@ -1215,10 +1227,11 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
fProc0A3 = 0.;
fProc0Atop = 1.; // ( or 0.5 as in Doc ?)
fProc0Ymin = 0.93; // (or 1.1 as in Doc ?)
*/
//
// Proc=1 --> Qexchg w/excitation
//
/* As of Oct. 31, 2017 keep these fixed
/* As of Oct. 31, 2017 keep these fixed */
HDP.DeveloperGet( "FTF_BARYON_PROC1_A1", fProc1A1 );
HDP.DeveloperGet( "FTF_BARYON_PROC1_B1", fProc1B1 );
HDP.DeveloperGet( "FTF_BARYON_PROC1_A2", fProc1A2 );
@@ -1226,8 +1239,9 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
HDP.DeveloperGet( "FTF_BARYON_PROC1_A3", fProc1A3 );
HDP.DeveloperGet( "FTF_BARYON_PROC1_ATOP", fProc1Atop );
HDP.DeveloperGet( "FTF_BARYON_PROC1_YMIN", fProc1Ymin );
*/
/* */
//
/* JVY, June 11, 2020: make configurable
fProc1A1 = 25.;
fProc1B1 = 1.;
fProc1A2 = -50.34;
@@ -1235,6 +1249,7 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
fProc1A3 = 0.;
fProc1Atop = 0.;
fProc1Ymin = 1.4;
*/
//
// Proc=2 & Proc=3 for the case ( AbsProjectileBaryonNumber > 10 || NumberOfTargetNucleons > 10 )
// (diffraction dissociation)
@@ -1247,7 +1262,8 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
//
// Proc=4 --> Qexchg "w/additional multiplier" in excitation
//
/* As of Oct. 31, 2017 keep these fixed
/* As of Oct. 31, 2017 keep these fixed */
/* */
HDP.DeveloperGet( "FTF_BARYON_PROC4_A1", fProc4A1 );
HDP.DeveloperGet( "FTF_BARYON_PROC4_B1", fProc4B1 );
HDP.DeveloperGet( "FTF_BARYON_PROC4_A2", fProc4A2 );
@@ -1255,8 +1271,9 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
HDP.DeveloperGet( "FTF_BARYON_PROC4_A3", fProc4A3 );
HDP.DeveloperGet( "FTF_BARYON_PROC4_ATOP", fProc4Atop );
HDP.DeveloperGet( "FTF_BARYON_PROC4_YMIN", fProc4Ymin );
*/
//
/* */
//
/* JVY, June 11, 2020: make configurable
fProc4A1 = 0.6; // (or 1. as in Doc ?)
fProc4B1 = 0.;
fProc4A2 = -1.2; // (or -2.01 as in Doc ?)
@@ -1264,6 +1281,7 @@ G4FTFParamCollBaryonProj::G4FTFParamCollBaryonProj()
fProc4A3 = 0.;
fProc4Atop = 0.;
fProc4Ymin = 1.4;
*/
//
//
HDP.DeveloperGet( "FTF_BARYON_DELTA_PROB_QEXCHG", fDeltaProbAtQuarkExchange );
@@ -1356,7 +1374,7 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
//
// Proc=0 --> Qexchg w/o excitation
//
/* As of June 25, 2019 keep these fixed
/* As of June 25, 2019 keep these fixed */
HDP.DeveloperGet( "FTF_PION_PROC0_A1", fProc0A1 );
HDP.DeveloperGet( "FTF_PION_PROC0_B1", fProc0B1 );
HDP.DeveloperGet( "FTF_PION_PROC0_A2", fProc0A2 );
@@ -1364,8 +1382,9 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
HDP.DeveloperGet( "FTF_PION_PROC0_A3", fProc0A3 );
HDP.DeveloperGet( "FTF_PION_PROC0_ATOP", fProc0Atop );
HDP.DeveloperGet( "FTF_PION_PROC0_YMIN", fProc0Ymin );
*/
/* */
//
/* JVY, June 11, 2020: make configurable
fProc0A1 = 150.0;
fProc0B1 = 1.8;
fProc0A2 =-247.3;
@@ -1373,10 +1392,11 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
fProc0A3 = 0.;
fProc0Atop = 1.; // ( or 0.5 as in Doc ?)
fProc0Ymin = 2.3; // (or 1.1 as in Doc ?)
*/
//
// Proc=1 --> Qexchg w/excitation
//
/* As of Oct. 31, 2017 keep these fixed
/* As of Oct. 31, 2017 keep these fixed */
HDP.DeveloperGet( "FTF_PION_PROC1_A1", fProc1A1 );
HDP.DeveloperGet( "FTF_PION_PROC1_B1", fProc1B1 );
HDP.DeveloperGet( "FTF_PION_PROC1_A2", fProc1A2 );
@@ -1384,8 +1404,9 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
HDP.DeveloperGet( "FTF_PION_PROC1_A3", fProc1A3 );
HDP.DeveloperGet( "FTF_PION_PROC1_ATOP", fProc1Atop );
HDP.DeveloperGet( "FTF_PION_PROC1_YMIN", fProc1Ymin );
*/
//
/* */
//
/* JVY, June 11, 2020: make configurable
fProc1A1 = 5.77;
fProc1B1 = 0.6;
fProc1A2 = -5.77;
@@ -1393,10 +1414,17 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
fProc1A3 = 0.;
fProc1Atop = 0.;
fProc1Ymin = 0.0;
*/
//
// Proc=2 --> Projectile diffraction
//
/* As of Oct. 31, 2017 keep these fixed
// Q: Would it even make sense to make these configurable ?
// The following is hadrcoded:
// Projectile Baryon Number > 10 (AbsProjectileBaryonNumber > 10)
// ... which is "strange" because projectile is a pion !!!... so it's always OFF
// (see also lines 1007-1016)
//
/* As of Oct. 31, 2017 keep these fixed
HDP.DeveloperGet( "FTF_PION_PROC2_A1", fProc2A1 );
HDP.DeveloperGet( "FTF_PION_PROC2_B1", fProc2B1 );
HDP.DeveloperGet( "FTF_PION_PROC2_A2", fProc2A2 );
@@ -1405,7 +1433,7 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
HDP.DeveloperGet( "FTF_PION_PROC2_ATOP", fProc2Atop );
HDP.DeveloperGet( "FTF_PION_PROC2_YMIN", fProc2Ymin );
*/
//
// keep fixed so far; see note above
fProc2A1 = 2.27;
fProc2B1 = 0.5;
fProc2A2 =-98052.0;
@@ -1416,7 +1444,7 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
//
// Proc=3 --> Target diffraction
//
/* As of Oct. 31, 2017 keep these fixed
/* As of Oct. 31, 2017 keep these fixed */
HDP.DeveloperGet( "FTF_PION_PROC3_A1", fProc3A1 );
HDP.DeveloperGet( "FTF_PION_PROC3_B1", fProc3B1 );
HDP.DeveloperGet( "FTF_PION_PROC3_A2", fProc3A2 );
@@ -1424,8 +1452,9 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
HDP.DeveloperGet( "FTF_PION_PROC3_A3", fProc3A3 );
HDP.DeveloperGet( "FTF_PION_PROC3_ATOP", fProc3Atop );
HDP.DeveloperGet( "FTF_PION_PROC3_YMIN", fProc3Ymin );
*/
/* */
//
/* JVY, June 11, 2020: make configurable
fProc3A1 = 7.0;
fProc3B1 = 0.9;
fProc3A2 = -85.28;
@@ -1433,6 +1462,7 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
fProc3A3 = 0.08;
fProc3Atop = 0.;
fProc3Ymin = 2.2;
*/
//
// for Proc2 & Proc3, pprojectile or target diffraction can be turned ON/OFF
// if num.baryons >10 (which is strange for projectile which is pion !!!)
@@ -1442,7 +1472,7 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
//
// Proc=4 --> Qexchg "w/additional multiplier" in excitation
//
/* As of Oct. 31, 2017 keep these fixed
/* As of Oct. 31, 2017 keep these fixed */
HDP.DeveloperGet( "FTF_PION_PROC4_A1", fProc4A1 );
HDP.DeveloperGet( "FTF_PION_PROC4_B1", fProc4B1 );
HDP.DeveloperGet( "FTF_PION_PROC4_A2", fProc4A2 );
@@ -1450,8 +1480,9 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
HDP.DeveloperGet( "FTF_PION_PROC4_A3", fProc4A3 );
HDP.DeveloperGet( "FTF_PION_PROC4_ATOP", fProc4Atop );
HDP.DeveloperGet( "FTF_PION_PROC4_YMIN", fProc4Ymin );
*/
/* */
//
/* JVY, June 11, 2020: make configurable
fProc4A1 = 1.0;
fProc4B1 = 0.;
fProc4A2 = -11.02;
@@ -1459,6 +1490,7 @@ G4FTFParamCollPionProj::G4FTFParamCollPionProj()
fProc4A3 = 0.;
fProc4Atop = 0.;
fProc4Ymin = 2.4;
*/
//
//
HDP.DeveloperGet( "FTF_PION_DELTA_PROB_QEXCHG", fDeltaProbAtQuarkExchange );