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
@@ -167,7 +167,7 @@ G4KineticTrackVector *G4ExcitedStringDecay::FragmentStrings(const G4ExcitedStrin
generatedKineticTracks->push_back(aTrack);
}
if (generatedKineticTracks->size() == 0)
if (generatedKineticTracks == nullptr || generatedKineticTracks->size() == 0)
{
// G4cerr << "G4VPartonStringModel:No KineticTracks produced" << G4endl;
// continue;
@@ -89,9 +89,6 @@ G4FragmentingString::G4FragmentingString(const G4ExcitedString &excited)
Ptleft.setZ(0.);
Ptright=excited.GetRightParton()->Get4Momentum().vect();
Ptright.setZ(0.);
G4LorentzVector P=excited.Get4Momentum();
Pplus =P.e() + P.pz();
Pminus=P.e() - P.pz();
theStableParton=0;
theDecayParton=0;
@@ -101,6 +98,9 @@ G4FragmentingString::G4FragmentingString(const G4ExcitedString &excited)
Pleft = excited.GetLeftParton()->Get4Momentum();
Pright = excited.GetRightParton()->Get4Momentum();
Pstring= Pleft + Pright;
Pplus = Pstring.plus();
Pminus = Pstring.minus();
}
//---------------------------------------------------------------------------------
@@ -110,63 +110,50 @@ G4FragmentingString::G4FragmentingString(const G4FragmentingString &old,
const G4LorentzVector *momentum)
{
decaying=None;
// Momentum of produced hadron
G4LorentzVector Momentum = G4LorentzVector(momentum->vect(),momentum->e());
// Momentum of produced hadron
//G4cout<<"Had Mom "<<Momentum<<G4endl;
//G4cout<<"Str Mom "<<old.Pstring<<G4endl;
Pstring = old.Pstring - Momentum;
//G4cout<<"New Str Mom "<<Pstring<<" "<<Pstring.mag()<<G4endl;
if ( old.decaying == Left )
{
RightParton= old.RightParton;
Ptright = old.Ptright;
Pright = old.Pright;
G4double StringMass = Pstring.mag();
LeftParton = newdecay;
Ptleft = old.Ptleft - momentum->vect();
Ptleft.setZ(0.);
Pleft = old.Pleft - Momentum;
G4LorentzRotation toLAB(Pstring.boostVector());
Pstring = Pleft + Pright;
Pplus = Pstring.plus();
Pminus = Pstring.minus();
Pleft = toLAB*G4LorentzVector(0.,0., StringMass/2.,StringMass/2.);
Pright = toLAB*G4LorentzVector(0.,0.,-StringMass/2.,StringMass/2.);
theDecayParton=GetLeftParton();
theStableParton=GetRightParton();
decaying = Left;
} else if ( old.decaying == Right )
{
RightParton = newdecay;
Ptright = old.Ptright - momentum->vect();
Ptright.setZ(0.);
Pright = old.Pright - Momentum;
Ptleft =Pleft.vect(); Ptleft.setZ(0.);
Ptright=Pright.vect(); Ptright.setZ(0.);
LeftParton = old.LeftParton;
Ptleft = old.Ptleft;
Pleft = old.Pleft;
//G4cout<<"Pleft "<<Pleft<<G4endl;
//G4cout<<"Pright "<<Pright<<G4endl;
//G4cout<<"Pstring "<<Pstring<<G4endl;
if ( old.decaying == Left )
{
RightParton= old.RightParton;
// Ptright = old.Ptright;
// Pright = old.Pright;
Pstring = Pleft + Pright;
Pplus = Pstring.plus();
Pminus = Pstring.minus();
LeftParton = newdecay;
// Ptleft = old.Ptleft - momentum->vect();
// Ptleft.setZ(0.);
// Pleft = old.Pleft - Momentum;
// Pstring=Pleft + Pright;
theDecayParton=GetLeftParton();
theStableParton=GetRightParton();
decaying=Left;
} else if ( old.decaying == Right )
{
RightParton = newdecay;
// Ptright = old.Ptright - momentum->vect();
// Ptright.setZ(0.);
// Pright = old.Pright + Momentum;
LeftParton = old.LeftParton;
// Ptleft = old.Ptleft;
// Pleft = old.Pleft;
// Pstring=Pleft + Pright;
theDecayParton=GetRightParton();
theStableParton=GetLeftParton();
decaying=Right;
} else
theDecayParton=GetRightParton();
theStableParton=GetLeftParton();
decaying = Right;
} else
{
throw G4HadronicException(__FILE__, __LINE__,
"G4FragmentingString::G4FragmentingString: no decay Direction defined");
}
Pplus = Pstring.plus(); //old.Pplus - (momentum->e() + momentum->pz());
Pminus = Pstring.minus(); //old.Pminus - (momentum->e() - momentum->pz());
}
@@ -209,7 +196,6 @@ G4FragmentingString::G4FragmentingString(const G4FragmentingString &old,
G4FragmentingString::~G4FragmentingString()
{}
//---------------------------------------------------------------------------------
void G4FragmentingString::SetLeftPartonStable()
@@ -300,21 +286,16 @@ G4double G4FragmentingString::LightConeDecay()
G4LorentzVector G4FragmentingString::Get4Momentum() const
{
G4LorentzVector momentum(Ptleft+Ptright,0);
momentum.setPz(0.5*(Pplus-Pminus));
momentum.setE(0.5*(Pplus+Pminus));
return momentum;
return Pstring;
}
G4double G4FragmentingString::Mass2() const
{
// return Pplus*Pminus - (Ptleft+Ptright).mag2();
return Pstring.mag2();
}
G4double G4FragmentingString::Mass() const
{
// return std::sqrt(this->Mass2());
return Pstring.mag();
}
@@ -338,3 +319,24 @@ G4LorentzVector G4FragmentingString::GetPright()
return Pright;
}
G4LorentzRotation G4FragmentingString::TransformToAlignedCms()
{
G4LorentzVector momentum = Pstring;
G4LorentzRotation toAlignedCms(-1*momentum.boostVector());
momentum = toAlignedCms * Pleft;
toAlignedCms.rotateZ(-1*momentum.phi());
toAlignedCms.rotateY(-1*momentum.theta());
Pleft *= toAlignedCms;
Pright *= toAlignedCms;
Pstring *= toAlignedCms;
Ptleft = G4ThreeVector(Pleft.vect());
Ptleft.setZ(0.);
Ptright = G4ThreeVector(Pright.vect());
Pplus = Pstring.plus();
Pminus = Pstring.minus();
return toAlignedCms;
}
@@ -40,6 +40,7 @@
#include "G4ParticleTable.hh"
//#define debug_Hbuilder
//#define debug_heavyHadrons
G4HadronBuilder::G4HadronBuilder(G4double mesonMix, G4double barionMix,
std::vector<double> scalarMesonMix,
@@ -168,6 +169,133 @@ G4ParticleDefinition * G4HadronBuilder::Meson(G4ParticleDefinition * black,
if ( (IsUp && IsAnti ) || (!IsUp && !IsAnti ) ) PDGEncoding = - PDGEncoding;
}
// ---------------------------------------------------------------------
// Special treatment for charmed and bottom mesons : in Geant4 there are
// no excited charmed or bottom mesons, therefore we need to transform these
// into existing charmed and bottom mesons in Geant4. Whenever possible,
// we use the corresponding ground state mesons with the same quantum numbers;
// else, we prefer to conserve the electric charge rather than other flavor numbers.
#ifdef debug_heavyHadrons
G4int initialPDGEncoding = PDGEncoding;
#endif
if ( std::abs( PDGEncoding ) == 10411 ) // D*0(2400)+ -> D+
( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
else if ( std::abs( PDGEncoding ) == 10421 ) // D*0(2400)0 -> D0
( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
else if ( std::abs( PDGEncoding ) == 413 ) // D*(2010)+ -> D+
( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
else if ( std::abs( PDGEncoding ) == 423 ) // D*(2007)0 -> D0
( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
else if ( std::abs( PDGEncoding ) == 10413 ) // D1(2420)+ -> D+
( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
else if ( std::abs( PDGEncoding ) == 10423 ) // D1(2420)0 -> D0
( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
else if ( std::abs( PDGEncoding ) == 20413 ) // D1(H)+ -> D+
( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
else if ( std::abs( PDGEncoding ) == 20423 ) // D1(2430)0 -> D0
( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
else if ( std::abs( PDGEncoding ) == 415 ) // D2*(2460)+ -> D+
( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
else if ( std::abs( PDGEncoding ) == 425 ) // D2*(2460)0 -> D0
( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
else if ( std::abs( PDGEncoding ) == 10431 ) // Ds0*(2317)+ -> Ds+
( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
else if ( std::abs( PDGEncoding ) == 433 ) // Ds*+ -> Ds+
( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
else if ( std::abs( PDGEncoding ) == 10433 ) // Ds1(2536)+ -> Ds+
( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
else if ( std::abs( PDGEncoding ) == 20433 ) // Ds1(2460)+ -> Ds+
( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
else if ( std::abs( PDGEncoding ) == 435 ) // Ds2*(2573)+ -> Ds+
( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
else if ( std::abs( PDGEncoding ) == 10441 ) PDGEncoding = 441; // chi_c0(1P) -> eta_c
else if ( std::abs( PDGEncoding ) == 100441 ) PDGEncoding = 441; // eta_c(2S) -> eta_c
else if ( std::abs( PDGEncoding ) == 10443 ) PDGEncoding = 443; // h_c(1P) -> J/psi
else if ( std::abs( PDGEncoding ) == 20443 ) PDGEncoding = 443; // chi_c1(1P) -> J/psi
else if ( std::abs( PDGEncoding ) == 100443 ) PDGEncoding = 443; // psi(2S) -> J/psi
else if ( std::abs( PDGEncoding ) == 30443 ) PDGEncoding = 443; // psi(3770) -> J/psi
else if ( std::abs( PDGEncoding ) == 9000443 ) PDGEncoding = 443; // psi(4040) -> J/psi
else if ( std::abs( PDGEncoding ) == 9010443 ) PDGEncoding = 443; // psi(4160) -> J/psi
else if ( std::abs( PDGEncoding ) == 9020443 ) PDGEncoding = 443; // psi(4415) -> J/psi
else if ( std::abs( PDGEncoding ) == 445 ) PDGEncoding = 443; // chi_c2(1P) -> J/psi
else if ( std::abs( PDGEncoding ) == 100445 ) PDGEncoding = 443; // chi_c2(2P) -> J/psi
// Bottom mesons
else if ( std::abs( PDGEncoding ) == 10511 ) // B0*0 -> B0
( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
else if ( std::abs( PDGEncoding ) == 10521 ) // B0*+ -> B+
( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
else if ( std::abs( PDGEncoding ) == 513 ) // B*0 -> B0
( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
else if ( std::abs( PDGEncoding ) == 523 ) // B*+ -> B+
( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
else if ( std::abs( PDGEncoding ) == 10513 ) // B1(L)0 -> B0
( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
else if ( std::abs( PDGEncoding ) == 10523 ) // B1(L)+ -> B+
( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
else if ( std::abs( PDGEncoding ) == 20513 ) // B1(H)0 -> B0
( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
else if ( std::abs( PDGEncoding ) == 20523 ) // B1(H)+ -> B+
( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
else if ( std::abs( PDGEncoding ) == 515 ) // B2*0 -> B0
( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
else if ( std::abs( PDGEncoding ) == 525 ) // B2*+ -> B+
( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
else if ( std::abs( PDGEncoding ) == 10531 ) // Bs0*0 -> Bs0
( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
else if ( std::abs( PDGEncoding ) == 533 ) // Bs*0 -> Bs0
( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
else if ( std::abs( PDGEncoding ) == 10533 ) // Bs1(L)0 -> Bs0
( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
else if ( std::abs( PDGEncoding ) == 20533 ) // Bs1(H)0 -> Bs0
( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
else if ( std::abs( PDGEncoding ) == 535 ) // Bs2*0 -> Bs0
( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
else if ( std::abs( PDGEncoding ) == 10541 ) // Bc0*+ -> Bc+
( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
else if ( std::abs( PDGEncoding ) == 543 ) // Bc*+ -> Bc+
( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
else if ( std::abs( PDGEncoding ) == 10543 ) // Bc1(L)+ -> Bc+
( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
else if ( std::abs( PDGEncoding ) == 20543 ) // Bc1(H)+ -> Bc+
( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
else if ( std::abs( PDGEncoding ) == 545 ) // Bc2*+ -> Bc+
( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
else if ( std::abs( PDGEncoding ) == 551 ) PDGEncoding = 553; // eta_b(1S) -> Upsilon
else if ( std::abs( PDGEncoding ) == 10551 ) PDGEncoding = 553; // chi_b0(1P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 100551 ) PDGEncoding = 553; // eta_b(2S) -> Upsilon
else if ( std::abs( PDGEncoding ) == 110551 ) PDGEncoding = 553; // chi_b0(2P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 200551 ) PDGEncoding = 553; // eta_b(3S) -> Upsilon
else if ( std::abs( PDGEncoding ) == 210551 ) PDGEncoding = 553; // chi_b0(3P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 10553 ) PDGEncoding = 553; // h_b(1P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 20553 ) PDGEncoding = 553; // chi_b1(1P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 30553 ) PDGEncoding = 553; // Upsilon_1(1D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 100553 ) PDGEncoding = 553; // Upsilon(2S) -> Upsilon
else if ( std::abs( PDGEncoding ) == 110553 ) PDGEncoding = 553; // h_b(2P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 120553 ) PDGEncoding = 553; // chi_b1(2P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 130553 ) PDGEncoding = 553; // Upsilon_1(2D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 200553 ) PDGEncoding = 553; // Upsilon(3S) -> Upsilon
else if ( std::abs( PDGEncoding ) == 210553 ) PDGEncoding = 553; // h_b(3P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 220553 ) PDGEncoding = 553; // chi_b1(3P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 300553 ) PDGEncoding = 553; // Upsilon(4S) -> Upsilon
else if ( std::abs( PDGEncoding ) == 9000553 ) PDGEncoding = 553; // Upsilon(10860) -> Upsilon
else if ( std::abs( PDGEncoding ) == 9010553 ) PDGEncoding = 553; // Upsilon(11020) -> Upsilon
else if ( std::abs( PDGEncoding ) == 555 ) PDGEncoding = 553; // chi_b2(1P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 10555 ) PDGEncoding = 553; // eta_b2(1D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 20555 ) PDGEncoding = 553; // Upsilon_2(1D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 100555 ) PDGEncoding = 553; // chi_b2(2P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 110555 ) PDGEncoding = 553; // eta_b2(2D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 120555 ) PDGEncoding = 553; // Upsilon_2(2D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 200555 ) PDGEncoding = 553; // chi_b2(3P) -> Upsilon
else if ( std::abs( PDGEncoding ) == 557 ) PDGEncoding = 553; // Upsilon_3(1D) -> Upsilon
else if ( std::abs( PDGEncoding ) == 100557 ) PDGEncoding = 553; // Upsilon_3(2D) -> Upsilon
#ifdef debug_heavyHadrons
if ( initialPDGEncoding != PDGEncoding ) {
G4cout << "G4HadronBuilder::Meson : forcing (inexisting in G4) heavy meson with pdgCode="
<< initialPDGEncoding << " into pdgCode=" << PDGEncoding << G4endl;
}
#endif
// ---------------------------------------------------------------------
G4ParticleDefinition * MesonDef=
G4ParticleTable::GetParticleTable()->FindParticle(PDGEncoding);
@@ -247,7 +375,7 @@ G4ParticleDefinition * G4HadronBuilder::Barion(G4ParticleDefinition * black,
theSpin = (kfla == kflb && kflb == kflc)? SpinThreeHalf : theSpin;
G4int kfll = 0;
if (kfld < 4) {
if (kfld < 6) {
if (theSpin == SpinHalf && kfld > kfle && kfle > kflf) {
// Spin J=1/2 and all three quarks different
// Two states exist: (uds -> lambda or sigma0)
@@ -274,6 +402,206 @@ G4ParticleDefinition * G4HadronBuilder::Barion(G4ParticleDefinition * black,
if (id1 < 0)
PDGEncoding = -PDGEncoding;
// ---------------------------------------------------------------------
// Special treatment for charmed and bottom baryons : in Geant4 there are
// neither excited charmed or bottom baryons, nor baryons with two or three
// heavy (c, b) constitutent quarks:
// Sigma_c* , Xi_c' , Xi_c* , Omega_c* ,
// Xi_cc , Xi_cc* , Omega_cc , Omega_cc* , Omega_ccc ;
// Sigma_b* , Xi_b' , Xi_b* , Omega_b*,
// Xi_bc , Xi_bc' , Xi_bc* , Omega_bc , Omega_bc' , Omega_bc* ,
// Omega_bcc , Omega_bcc* , Xi_bb, Xi_bb* , Omega_bb, Omega_bb* ,
// Omega_bbc , Omega_bbc* , Omega_bbb
// therefore we need to transform these into existing charmed and bottom
// baryons in Geant4. Whenever possible, we use the corresponding ground state
// baryons with the same quantum numbers; else, we prefer to conserve the
// electric charge rather than other flavor numbers.
#ifdef debug_heavyHadrons
G4int charmViolation = 0, bottomViolation = 0; // Only positive
G4int initialPDGEncoding = PDGEncoding;
#endif
if ( std::abs( PDGEncoding ) == 4224 ) { // Sigma_c*++ -> Sigma_c++
( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
} else if ( std::abs( PDGEncoding ) == 4214 ) { // Sigma_c*+ -> Sigma_c+
( PDGEncoding > 0 ? PDGEncoding = 4212 : PDGEncoding = -4212 );
} else if ( std::abs( PDGEncoding ) == 4114 ) { // Sigma_c*0 -> Sigma_c0
( PDGEncoding > 0 ? PDGEncoding = 4112 : PDGEncoding = -4112 );
} else if ( std::abs( PDGEncoding ) == 4322 ) { // Xi_c'+ -> Xi_c+
( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
} else if ( std::abs( PDGEncoding ) == 4312 ) { // Xi_c'0 -> Xi_c0
( PDGEncoding > 0 ? PDGEncoding = 4132 : PDGEncoding = -4132 );
} else if ( std::abs( PDGEncoding ) == 4324 ) { // Xi_c*+ -> Xi_c+
( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
} else if ( std::abs( PDGEncoding ) == 4314 ) { // Xi_c*0 -> Xi_c0
( PDGEncoding > 0 ? PDGEncoding = 4132 : PDGEncoding = -4132 );
} else if ( std::abs( PDGEncoding ) == 4334 ) { // Omega_c*0 -> Omega_c0
( PDGEncoding > 0 ? PDGEncoding = 4332 : PDGEncoding = -4332 );
} else if ( std::abs( PDGEncoding ) == 4412 ) { // Xi_cc+ -> Xi_c+
( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 4422 ) { // Xi_cc++ -> Sigma_c++ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 4414 ) { // Xi_cc*+ -> Xi_c+
( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 4424 ) { // Xi_cc*++ -> Sigma_c++ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 4432 ) { // Omega_cc+ -> Xi_c+ (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 4434 ) { // Omega_cc*+ -> Xi_c+ (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 4444 ) { // Omega_ccc++ -> Sigma_c++ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
#ifdef debug_heavyHadrons
charmViolation = 2;
#endif
// Bottom baryons
} else if ( std::abs( PDGEncoding ) == 5114 ) { // Sigma_b*- -> Sigma_b-
( PDGEncoding > 0 ? PDGEncoding = 5112 : PDGEncoding = -5112 );
} else if ( std::abs( PDGEncoding ) == 5214 ) { // Sigma_b*0 -> Sigma_b0
( PDGEncoding > 0 ? PDGEncoding = 5212 : PDGEncoding = -5212 );
} else if ( std::abs( PDGEncoding ) == 5224 ) { // Sigma_b*+ -> Sigma_b+
( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
} else if ( std::abs( PDGEncoding ) == 5312 ) { // Xi_b'- -> Xi_b-
( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
} else if ( std::abs( PDGEncoding ) == 5322 ) { // Xi_b'0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
} else if ( std::abs( PDGEncoding ) == 5314 ) { // Xi_b*- -> Xi_b-
( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
} else if ( std::abs( PDGEncoding ) == 5324 ) { // Xi_b*0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
} else if ( std::abs( PDGEncoding ) == 5334 ) { // Omega_b*- -> Omega_b-
( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
} else if ( std::abs( PDGEncoding ) == 5142 ) { // Xi_bc0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5242 ) { // Xi_bc+ -> Sigma_b+ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5412 ) { // Xi_bc'0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5422 ) { // Xi_bc'+ -> Sigma_b+ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5414 ) { // Xi_bc*0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5424 ) { // Xi_bc*+ -> Sigma_b+ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5342 ) { // Omega_bc0 -> Xi_b0 (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5432 ) { // Omega_bc'0 -> Xi_b0 (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5434 ) { // Omega_bc*0 -> Xi_b0 (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5442 ) { // Omega_bcc+ -> Sigma_b+ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
#ifdef debug_heavyHadrons
charmViolation = 2;
#endif
} else if ( std::abs( PDGEncoding ) == 5444 ) { // Omega_bcc*+ -> Sigma_b+ (use Sigma to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
#ifdef debug_heavyHadrons
charmViolation = 2;
#endif
} else if ( std::abs( PDGEncoding ) == 5512 ) { // Xi_bb- -> Xi_b-
( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
#ifdef debug_heavyHadrons
bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5522 ) { // Xi_bb0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5514 ) { // Xi_bb*- -> Xi_b-
( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
#ifdef debug_heavyHadrons
bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5524 ) { // Xi_bb*0 -> Xi_b0
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5532 ) { // Omega_bb- -> Omega_b-
( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
#ifdef debug_heavyHadrons
bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5534 ) { // Omega_bb*- -> Omega_b-
( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
#ifdef debug_heavyHadrons
bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5542 ) { // Omega_bbc0 -> Xi_b0 (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1; bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5544 ) { // Omega_bbc*0 -> Xi_b0 (use Xi to conserve charge)
( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
#ifdef debug_heavyHadrons
charmViolation = 1; bottomViolation = 1;
#endif
} else if ( std::abs( PDGEncoding ) == 5554 ) { // Omega_bbb- -> Omega_b-
( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
#ifdef debug_heavyHadrons
bottomViolation = 2;
#endif
}
#ifdef debug_heavyHadrons
if ( initialPDGEncoding != PDGEncoding ) {
G4cout << "G4HadronBuilder::Barion : forcing (inexisting in G4) heavy baryon with pdgCode="
<< initialPDGEncoding << " into pdgCode=" << PDGEncoding << G4endl;
if ( charmViolation != 0 || bottomViolation != 0 ) {
G4cout << "\t --> VIOLATION of " << ( charmViolation != 0 ? " CHARM " : " " )
<< ( charmViolation != 0 && bottomViolation != 0 ? " and " : " " )
<< ( bottomViolation != 0 ? " BOTTOM " : " " ) << " quantum number ! " << G4endl;
}
}
#endif
// ---------------------------------------------------------------------
G4ParticleDefinition * BarionDef=
G4ParticleTable::GetParticleTable()->FindParticle(PDGEncoding);
@@ -37,7 +37,7 @@
#include "G4FragmentingString.hh"
#include "G4DiQuarks.hh"
#include "G4Quarks.hh"
#include "G4HadronicParameters.hh"
#include "G4Exp.hh"
#include "G4Pow.hh"
@@ -52,19 +52,26 @@ G4LundStringFragmentation::G4LundStringFragmentation()
SetMassCut(210.*MeV); // Mpi + Delta
// For ProduceOneHadron it is required
// that no one pi-meson can be produced.
SigmaQT = 0.435 * GeV;
Tmt = 190.0 * MeV;
SetStringTensionParameter(1.*GeV/fermi);
SetDiquarkBreakProbability(0.5);
SetStrangenessSuppression((1.0 - 0.13)/2.0);
SetStrangenessSuppression((1.0 - 0.12)/2.0);
SetDiquarkSuppression(0.15);
// For the time being, set to 0.0 the probabilities for c-cbar and b-bbar creation.
SetProbCCbar(0.0); //(0.005); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
SetProbBBbar(0.0); //(5.0e-5); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
// Check if charmed and bottom hadrons are enabled: if this is the case, then
// set the non-zero probabilities for c-cbar and b-bbar creation from the vacuum,
// else set them to 0.0. If these probabilities are/aren't zero then charmed or bottom
// hadrons can't/can be created during the string fragmentation of ordinary
// (i.e. not heavy) projectile hadron nuclear reactions.
if ( G4HadronicParameters::Instance()->EnableBCParticles() ) {
SetProbCCbar(0.005); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
SetProbBBbar(5.0e-5); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
} else {
SetProbCCbar(0.0);
SetProbBBbar(0.0);
}
SetMinMasses(); // For treating of small string decays
}
@@ -108,15 +115,20 @@ G4KineticTrackVector* G4LundStringFragmentation::FragmentString(const G4ExcitedS
LeftVector=ProduceOneHadron(&theString);
SetMassCut(Mcut);
LeftVector->operator[](0)->SetFormationTime(theString.GetTimeOfCreation());
LeftVector->operator[](0)->SetPosition(theString.GetPosition());
if (LeftVector->size() > 1)
{
if ( LeftVector )
{
if ( LeftVector->size() > 0)
{
LeftVector->operator[](0)->SetFormationTime(theString.GetTimeOfCreation());
LeftVector->operator[](0)->SetPosition(theString.GetPosition());
}
if (LeftVector->size() > 1)
{
// 2 hadrons created from qq-qqbar are stored
LeftVector->operator[](1)->SetFormationTime(theString.GetTimeOfCreation());
LeftVector->operator[](1)->SetPosition(theString.GetPosition());
}
}
}
return LeftVector;
}
@@ -176,6 +188,8 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
<<"Direction "<<theString.GetDirection()<< G4endl;
#endif
G4LorentzRotation toCmsI, toObserverFrameI;
G4bool final_success=false;
G4bool inner_success=true;
@@ -185,7 +199,10 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
{ // If the string fragmentation does not be happend,
// repeat the fragmentation.
G4FragmentingString *currentString=new G4FragmentingString(theString);
G4FragmentingString *currentString = new G4FragmentingString(theString);
toCmsI = currentString->TransformToAlignedCms();
toObserverFrameI = toCmsI.inverse();
G4LorentzRotation toCms, toObserverFrame;
//G4cout<<"Main loop start whilecounter "<<attempt<<G4endl;
@@ -200,7 +217,7 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
inner_success=true; // set false on failure.
const G4int maxNumberOfLoops = 1000;
G4int loopCounter = -1;
while ( (! StopFragmenting(currentString)) && ++loopCounter < maxNumberOfLoops )
{ // Split current string into hadron + new string
#ifdef debug_LUNDfragmentation
@@ -211,6 +228,7 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
toCms=currentString->TransformToAlignedCms();
toObserverFrame= toCms.inverse();
#ifdef debug_LUNDfragmentation
//G4cout<<"CMS Left mom "<<currentString->GetPleft()<<G4endl;
//G4cout<<"CMS Right mom "<<currentString->GetPright()<<G4endl;
@@ -251,7 +269,7 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
if ( newString ) delete newString;
}
currentString->LorentzRotate(toObserverFrame);
currentString->LorentzRotate(toObserverFrame);
};
if ( loopCounter >= maxNumberOfLoops ) {
@@ -262,6 +280,7 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
#ifdef debug_LUNDfragmentation
if (inner_success) G4cout<<"Split remaining string into 2 final hadrons."<<G4endl;
#endif
if ( inner_success && SplitLast(currentString, LeftVector, RightVector) ) // Close to protect Last Str. Decay
{
final_success = true;
@@ -269,6 +288,22 @@ G4bool G4LundStringFragmentation::Loop_toFragmentString( const G4ExcitedString
delete currentString;
} // End of the loop where we try to fragment the string.
G4int sign = +1;
if ( theString.GetDirection() < 0 ) sign = -1;
for ( unsigned int hadronI = 0; hadronI < LeftVector->size(); ++hadronI ) {
G4LorentzVector Tmp = LeftVector->operator[](hadronI)->Get4Momentum();
Tmp.setZ(sign*Tmp.getZ());
Tmp *= toObserverFrameI;
LeftVector->operator[](hadronI)->Set4Momentum(Tmp);
}
for ( unsigned int hadronI = 0; hadronI < RightVector->size(); ++hadronI ) {
G4LorentzVector Tmp = RightVector->operator[](hadronI)->Get4Momentum();
Tmp.setZ(sign*Tmp.getZ());
Tmp *= toObserverFrameI;
RightVector->operator[](hadronI)->Set4Momentum(Tmp);
}
return final_success;
}
@@ -397,7 +432,7 @@ G4KineticTrack * G4LundStringFragmentation::Splitup(G4FragmentingString *string,
#endif
G4ThreeVector Pos;
Hadron = new G4KineticTrack(HadronDefinition, 0,Pos, *HadronMomentum);
if ( newString ) delete newString;
newString=new G4FragmentingString(*string,newStringEnd,
@@ -439,7 +474,7 @@ G4ParticleDefinition * G4LundStringFragmentation::DiQuarkSplitup(G4ParticleDefin
decayQuarkEncoding = Swap;
}
G4int IsParticle=(decayQuarkEncoding>0) ? -1 : +1; // if we have a quark, we need antiquark)
G4int IsParticle=(decayQuarkEncoding>0) ? -1 : +1; // if we have a quark, we need antiquark
pDefPair QuarkPair = CreatePartonPair(IsParticle,false); // no diquarks wanted
@@ -507,26 +542,39 @@ G4LorentzVector * G4LundStringFragmentation::SplitEandP(G4ParticleDefinition * p
String4Momentum.setPz(0.);
G4ThreeVector StringPt=String4Momentum.vect();
StringPt.setZ(0.);
// calculate and assign hadron transverse momentum component HadronPx and HadronPy
G4ThreeVector HadronPt , RemSysPt;
G4double HadronMassT2, ResidualMassT2;
G4double HadronMt, Pt, Pt2, phi;
G4double TmtCur = Tmt;
if ( (string->GetDecayParton()->GetParticleSubType()== "quark") &&
(pHadron->GetBaryonNumber() != 0) ) {
TmtCur = Tmt*0.37; // q->B
} else if ( (string->GetDecayParton()->GetParticleSubType()== "quark") &&
(pHadron->GetBaryonNumber() == 0) ) {
//TmtCur = Tmt; // q->M
} else if ( (string->GetDecayParton()->GetParticleSubType()== "di_quark") &&
(pHadron->GetBaryonNumber() == 0) ) {
//TmtCur = Tmt*0.89; // qq -> M
} else if ( (string->GetDecayParton()->GetParticleSubType()== "di_quark") &&
(pHadron->GetBaryonNumber() != 0) ) {
TmtCur = Tmt*1.35; // qq -> B
}
//... sample Pt of the hadron
G4int attempt=0;
do
{
attempt++; if (attempt > StringLoopInterrupt) {return 0;}
HadronMt = HadronMass - 300.0*G4Log(G4UniformRand());
HadronMt = HadronMass - TmtCur*G4Log(G4UniformRand());
Pt2 = sqr(HadronMt)-sqr(HadronMass); Pt=std::sqrt(Pt2);
phi = 2.*pi*G4UniformRand();
G4ThreeVector SampleQuarkPtw= G4ThreeVector(Pt * std::cos(phi),Pt * std::sin(phi),0);
HadronPt =SampleQuarkPtw + string->DecayPt();
HadronPt.setZ(0);
HadronPt = G4ThreeVector( Pt*std::cos(phi), Pt*std::sin(phi), 0. );
RemSysPt = StringPt - HadronPt;
HadronMassT2 = sqr(HadronMass) + HadronPt.mag2();
ResidualMassT2=sqr(MinimalStringMass) + RemSysPt.mag2();
@@ -623,9 +671,9 @@ G4double G4LundStringFragmentation::GetLightConeZ(G4double zmin, G4double zmax,
if (std::abs(PDGEncodingOfDecayParton) > 1000)
{
G4double an = 2.5;
an +=(sqr(Px)+sqr(Py))/sqr(GeV)-0.5;
z=zmin + (zmax-zmin)*G4Pow::GetInstance()->powA(G4UniformRand(),1./an);
G4double an = 2.5;
an +=(sqr(Px)+sqr(Py))/sqr(GeV)-0.5;
z=zmin + (zmax-zmin)*G4Pow::GetInstance()->powA(G4UniformRand(),1./an);
}
return z;
@@ -648,10 +696,13 @@ G4bool G4LundStringFragmentation::SplitLast(G4FragmentingString * string,
G4cout<<"String4mom "<<string->GetPstring()<<" "<<string->GetPstring().mag()<<G4endl;
#endif
G4LorentzVector Str4Mom=string->Get4Momentum();
G4LorentzRotation toCms=string->TransformToAlignedCms();
G4LorentzRotation toObserverFrame= toCms.inverse();
G4LorentzVector Str4Mom=string->Get4Momentum();
G4LorentzRotation toCms(-1*Str4Mom.boostVector());
G4LorentzVector Pleft = toCms * string->GetPleft();
toCms.rotateZ(-1*Pleft.phi());
toCms.rotateY(-1*Pleft.theta());
G4LorentzRotation toObserverFrame= toCms.inverse();
G4double StringMass=string->Mass();
@@ -703,6 +754,7 @@ G4bool G4LundStringFragmentation::SplitLast(G4FragmentingString * string,
#ifdef debug_LUNDfragmentation
G4cout<<"Q Q string LastSplit"<<G4endl;
#endif
Quark_AntiQuark_lastSplitting(string, LeftHadron, RightHadron);
if (NumberOf_FS == 0) return false;
@@ -759,7 +811,7 @@ G4bool G4LundStringFragmentation::SplitLast(G4FragmentingString * string,
if (!(string->DecayIsQuark() && string->StableIsQuark() ))
{ // Only for qq - q, q - qq, and qq - qqbar -------------------
if (std::abs(string->GetLeftParton()->GetPDGEncoding()) > 1000)
if ( G4UniformRand() <= 0.5 )
{
if (P_left.z() <= 0.) {G4LorentzVector tmp = LeftMom; LeftMom=RightMom; RightMom=tmp;}
}
@@ -955,25 +1007,29 @@ G4bool G4LundStringFragmentation::Quark_Diquark_lastSplitting(G4FragmentingStrin
G4int AbsIDdi_quark=std::abs(IDdi_quark);
G4int Di_q1=AbsIDdi_quark/1000;
G4int Di_q2=(AbsIDdi_quark-Di_q1*1000)/100;
G4int SignDiQ= 1;
G4int SignDiQ= 1;
if (IDdi_quark < 0) SignDiQ=-1;
NumberOf_FS=0;
for (G4int ProdQ=1; ProdQ < 4; ProdQ++)
{
for (G4int ProdQ=1; ProdQ < 4; ProdQ++) // Loop over quark-antiquark cases: u-ubar, d-dbar, s-sbar
{ // (as last splitting, do not consider c-cbar and b-bbar cases)
G4int SignQ;
if (IDquark > 0)
{ SignQ=-1;
if (IDquark == 2) SignQ= 1;
{
SignQ=-1;
if (IDquark == 2) SignQ= 1;
if ((IDquark == 1) && (ProdQ == 3)) SignQ= 1; // K0
if ((IDquark == 3) && (ProdQ == 1)) SignQ=-1; // K0bar
if (IDquark == 4) SignQ= 1; // D+, D0, Ds+
if (IDquark == 5) SignQ=-1; // B-, anti_B0, anti_Bs0
} else
{
SignQ= 1;
if (IDquark == -2) SignQ=-1;
if ((IDquark ==-1) && (ProdQ == 3)) SignQ=-1; // K0bar
if ((IDquark ==-3) && (ProdQ == 1)) SignQ= 1; // K0
if (IDquark == -4) SignQ=-1; // D-, anti_D0, anti_Ds+
if (IDquark == -5) SignQ= 1; // B+, B0, Bs0
}
if (AbsIDquark == ProdQ) SignQ= 1;
@@ -1076,19 +1132,25 @@ G4bool G4LundStringFragmentation::Quark_AntiQuark_lastSplitting(G4FragmentingStr
//G4cout<<"Q Qbar "<<IDquark<<" "<<IDanti_quark<<G4endl;
NumberOf_FS=0;
for (G4int ProdQ=1; ProdQ < 4; ProdQ++)
{
for (G4int ProdQ=1; ProdQ < 4; ProdQ++) // Loop over quark-antiquark cases: u-ubar, d-dbar, s-sbar
{ // (as last splitting, do not consider c-cbar and b-bbar cases)
LeftHadronCharge = QuarkCharge - Qcharge[ProdQ-1];
G4int SignQ = LeftHadronCharge/3; if (SignQ == 0) SignQ = 1;
if ((IDquark == 1) && (ProdQ == 3)) SignQ= 1; // K0
if ((IDquark == 3) && (ProdQ == 1)) SignQ=-1; // K0bar
if ((IDquark == 1) && (ProdQ == 3)) SignQ= 1; // K0 (d,sbar)
if ((IDquark == 3) && (ProdQ == 1)) SignQ=-1; // K0bar (s,dbar)
if ((IDquark == 4) && (ProdQ == 2)) SignQ= 1; // D0 (c,ubar)
if ((IDquark == 5) && (ProdQ == 1)) SignQ=-1; // anti_B0 (b,dbar)
if ((IDquark == 5) && (ProdQ == 3)) SignQ=-1; // anti_Bs0 (b,sbar)
RightHadronCharge = AntiQuarkCharge + Qcharge[ProdQ-1];
G4int SignAQ = RightHadronCharge/3; if (SignAQ == 0) SignAQ = 1;
if ((IDanti_quark ==-1) && (ProdQ == 3)) SignAQ=-1; // K0bar
if ((IDanti_quark ==-3) && (ProdQ == 1)) SignAQ= 1; // K0
if ((IDanti_quark ==-1) && (ProdQ == 3)) SignAQ=-1; // K0bar (dbar,s)
if ((IDanti_quark ==-3) && (ProdQ == 1)) SignAQ= 1; // K0 (sbar,d)
if ((IDanti_quark ==-4) && (ProdQ == 2)) SignAQ=-1; // anti_D0 (cbar,u)
if ((IDanti_quark ==-5) && (ProdQ == 1)) SignAQ= 1; // B0 (bbar,d)
if ((IDanti_quark ==-5) && (ProdQ == 3)) SignAQ= 1; // Bs0 (bbar,s)
//G4cout<<"ProQ signs "<<ProdQ<<" "<<SignQ<<" "<<SignAQ<<G4endl;
@@ -1223,8 +1285,18 @@ void G4LundStringFragmentation::Sample4Momentum(G4LorentzVector* Mom, G4doub
G4double Pabs = (r_val > 0.)? std::sqrt(r_val)/(2.*InitialMass) : 0;
const G4int maxNumberOfLoops = 1000;
G4double SigmaQTw=SigmaQT;
if (Mass > 930. || AntiMass > 930.) SigmaQT *=(1.0-0.55*sqr((Mass+AntiMass)/InitialMass));
G4double SigmaQTw = SigmaQT;
if ( Mass > 930. || AntiMass > 930. ) {
SigmaQT *= ( 1.0 - 0.55*sqr( (Mass+AntiMass)/InitialMass ) );
}
if ( Mass < 930. && AntiMass < 930. ) {} // q-qbar string
if ( ( Mass < 930. && AntiMass > 930. ) ||
( Mass > 930. && AntiMass < 930. ) ) { // q-di_q string
//SigmaQT = -1.; // isotropical decay
}
if ( Mass > 930. && AntiMass > 930. ) { // qq-qqbar string
SigmaQT *= ( 1.0 - 0.55*sqr( (Mass+AntiMass)/InitialMass ) );
}
G4int loopCounter = 0;
do
@@ -1235,7 +1307,7 @@ void G4LundStringFragmentation::Sample4Momentum(G4LorentzVector* Mom, G4doub
}
while ( (InitialMass < MassMt + AntiMassMt) && ++loopCounter < maxNumberOfLoops );
if (Mass > 930. || AntiMass > 930.) SigmaQT=SigmaQTw;
SigmaQT = SigmaQTw;
if ( loopCounter >= maxNumberOfLoops ) {
AvailablePz2 = 0.0;
@@ -38,7 +38,7 @@
#include "G4FragmentingString.hh"
#include "G4DiQuarks.hh"
#include "G4Quarks.hh"
#include "G4HadronicParameters.hh"
#include "G4Pow.hh"
//#define debug_QGSMfragmentation
@@ -54,10 +54,19 @@ G4QGSMFragmentation::G4QGSMFragmentation()
SetStrangenessSuppression((1.0 - 0.12)/2.); // Uzhi June 2020 0.16 -> 0.12
// For the time being, set to 0.0 the probabilities for c-cbar and b-bbar creation.
SetProbCCbar(0.0); //(0.0033); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
SetProbBBbar(0.0); //(5.0e-5); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
// Check if charmed and bottom hadrons are enabled: if this is the case, then
// set the non-zero probabilities for c-cbar and b-bbar creation from the vacuum,
// else set them to 0.0. If these probabilities are/aren't zero then charmed or bottom
// hadrons can't/can be created during the string fragmentation of ordinary
// (i.e. not heavy) projectile hadron nuclear reactions.
if ( G4HadronicParameters::Instance()->EnableBCParticles() ) {
SetProbCCbar(0.005); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
SetProbBBbar(5.0e-5); // According to O.I. Piskunova Yad. Fiz. 56 (1993) 1094
} else {
SetProbCCbar(0.0);
SetProbBBbar(0.0);
}
SetDiquarkSuppression(0.195); // Uzhi June 2020 0.32 -> 0.195
SetDiquarkBreakProbability(0.0); // Uzhi June 2020 0.7 -> 0.0
@@ -136,7 +145,8 @@ G4KineticTrackVector* G4QGSMFragmentation::FragmentString(const G4ExcitedString&
if ( LeftVector != 0 ) G4cout<<"Non fragmentable - the string is converted to one hadron "<<G4endl;
#endif
if ( LeftVector != 0 ) return LeftVector;
if ( LeftVector == nullptr ) LeftVector = new G4KineticTrackVector;
return LeftVector;
}
#ifdef debug_QGSMfragmentation
@@ -265,7 +275,7 @@ G4KineticTrackVector* G4QGSMFragmentation::FragmentString(const G4ExcitedString&
//----------------------------------------------------------------------------------------------------------
G4bool G4QGSMFragmentation::IsItFragmentable(const G4FragmentingString * const string)
G4bool G4QGSMFragmentation::IsItFragmentable(const G4FragmentingString * string)
{
//Uzhi June 2020 return sqr( PossibleHadronMass(string) + MassCut ) < string->Mass2();
return sqr( MinimalStringMass + MassCut ) < string->Mass2(); // Uzhi June 2020
@@ -273,25 +283,20 @@ G4bool G4QGSMFragmentation::IsItFragmentable(const G4FragmentingString * const s
//----------------------------------------------------------------------------------------------------------
G4bool G4QGSMFragmentation::StopFragmenting(const G4FragmentingString * const string)
G4bool G4QGSMFragmentation::StopFragmenting(const G4FragmentingString * string)
{
SetMinimalStringMass(string);
if ( MinimalStringMass < 0.0 ) return true;
if (string->IsAFourQuarkString())
{
return G4UniformRand() < G4Exp(-0.005*(string->Mass() - MinimalStringMass));
} else {
G4bool Result = G4UniformRand() <
G4Exp(-0.66e-6*(string->Mass()*string->Mass() - MinimalStringMass*MinimalStringMass));
// G4bool Result = string->Mass() < MinimalStringMass + 150.*MeV*G4UniformRand(); // a'la LUND
G4double smass = string->Mass();
G4double x = (string->IsAFourQuarkString()) ? 0.005*(smass - MinimalStringMass)
: 0.66e-6*(smass - MinimalStringMass)*(smass + MinimalStringMass);
#ifdef debug_QGSMfragmentation
G4cout<<"StopFragmenting MinimalStringMass string->Mass() "<<MinimalStringMass<<" "<<string->Mass()<<G4endl;
G4cout<<"StopFragmenting - Yes/No "<<Result<<G4endl;
#endif
return Result;
G4bool res = true;
if(x > 0.0) {
res = (x < 200.) ? (G4UniformRand() < G4Exp(-x)) : false;
}
return res;
}
//-----------------------------------------------------------------------------
@@ -59,6 +59,7 @@
//------------------------debug switches
//#define debug_VStringDecay
//#define debug_heavyHadrons
//******************************************************************************
// Constructors
@@ -74,7 +75,7 @@ G4VLongitudinalStringDecay::G4VLongitudinalStringDecay(const G4String& name)
// Changable Parameters below.
SigmaQT = 0.5 * GeV;
StrangeSuppress = 0.44; // =0.27/2.27 suppresion of strange quark pait prodution, ie. u:d:s=1:1:0.27
StrangeSuppress = 0.44; // =0.27/2.27 suppression of strange quark pair production, ie. u:d:s=1:1:0.27
DiquarkSuppress = 0.07; // Probability of qq-qqbar pair production
DiquarkBreakProb = 0.1; // Probability of (qq)->h+(qq)'
@@ -102,12 +103,10 @@ G4VLongitudinalStringDecay::G4VLongitudinalStringDecay(const G4String& name)
scalarMesonMix[4] = 1.0;
scalarMesonMix[5] = 0.5;
// For the time being, set to 0.0 the probabilities for c-cbar and b-bbar creation.
SetProbCCbar(0.0); //SetProbCCbar(0.43e-11); // Probability of CCbar pair creation
//Pythia8 and Pythia 6.4 Comp. Phys. Commun. 191 (2015) 159; arXiv:1410.3012
SetProbCCbar(0.0); // Probability of CCbar pair creation
SetProbEta_c(0.1); // Mixing of Eta_c and J/Psi
SetProbBBbar(0.0); // Probability of BBbar pair creation,
SetProbEta_b(0.0); // Mixing of Eta_b and Ipsilon_b
SetProbBBbar(0.0); // Probability of BBbar pair creation
SetProbEta_b(0.0); // Mixing of Eta_b and Upsilon_b
// Parameters may be changed until the first fragmentation starts
PastInitPhase=false;
@@ -146,67 +145,56 @@ G4double G4VLongitudinalStringDecay::GetMassCut() { return MassCut; }
G4KineticTrackVector* G4VLongitudinalStringDecay::ProduceOneHadron(const G4ExcitedString * const string)
{
// Check string decay threshold
G4KineticTrackVector * result=0; // return 0 when string exceeds the mass cut
pDefPair hadrons((G4ParticleDefinition *)0,(G4ParticleDefinition *)0);
G4FragmentingString aString(*string);
G4KineticTrackVector* result = nullptr;
pDefPair hadrons( nullptr, nullptr );
G4FragmentingString aString( *string );
#ifdef debug_VStringDecay
G4cout<<"G4VLongitudinalStringDecay::ProduceOneHadron: PossibleHmass StrMass "
<<aString.Mass()<<" MassCut "<<MassCut<<G4endl;
#endif
SetMinimalStringMass(&aString); // Uzhi June 2020
if ( sqr(PossibleHadronMass(&aString,0,&hadrons)+MassCut) < aString.Mass2()) {
return 0;
}
// The string mass has low value
result=new G4KineticTrackVector;
if ( hadrons.second ==0 )
{
SetMinimalStringMass( &aString );
PossibleHadronMass( &aString, 0, &hadrons );
result = new G4KineticTrackVector;
if ( hadrons.first != nullptr ) {
if ( hadrons.second == nullptr ) {
// Substitute string by light hadron, Note that Energy is not conserved here!
#ifdef debug_VStringDecay
G4cout << "VlongSD Warning replacing string by single hadron (G4VLongitudinalStringDecay)" <<G4endl;
G4cout << hadrons.first->GetParticleName()<<G4endl
<< "string .. " << string->Get4Momentum() << " "
<< string->Get4Momentum().m() << G4endl;
#endif
G4cout << "VlongSD Warning replacing string by single hadron (G4VLongitudinalStringDecay)" <<G4endl;
G4cout << hadrons.first->GetParticleName()<<G4endl
<< "string .. " << string->Get4Momentum() << " "
<< string->Get4Momentum().m() << G4endl;
#endif
G4ThreeVector Mom3 = string->Get4Momentum().vect();
G4LorentzVector Mom( Mom3, std::sqrt( Mom3.mag2() + sqr(hadrons.first->GetPDGMass())) );
G4LorentzVector Mom( Mom3, std::sqrt( Mom3.mag2() + sqr( hadrons.first->GetPDGMass() ) ) );
result->push_back( new G4KineticTrack( hadrons.first, 0, string->GetPosition(), Mom ) );
} else
{
} else {
//... string was qq--qqbar type: Build two stable hadrons,
#ifdef debug_VStringDecay
G4cout << "VlongSD Warning replacing qq-qqbar string by TWO hadrons (G4VLongitudinalStringDecay)"
<< hadrons.first->GetParticleName() << " / "
<< hadrons.second->GetParticleName()
<< "string .. " << string->Get4Momentum() << " "
<< string->Get4Momentum().m() << G4endl;
G4cout << "VlongSD Warning replacing qq-qqbar string by TWO hadrons (G4VLongitudinalStringDecay)"
<< hadrons.first->GetParticleName() << " / "
<< hadrons.second->GetParticleName()
<< "string .. " << string->Get4Momentum() << " "
<< string->Get4Momentum().m() << G4endl;
#endif
G4LorentzVector Mom1, Mom2;
Sample4Momentum(&Mom1, hadrons.first->GetPDGMass(),
&Mom2,hadrons.second->GetPDGMass(),
string->Get4Momentum().mag());
G4LorentzVector Mom1, Mom2;
Sample4Momentum( &Mom1, hadrons.first->GetPDGMass(),
&Mom2, hadrons.second->GetPDGMass(),
string->Get4Momentum().mag() );
result->push_back( new G4KineticTrack( hadrons.first, 0, string->GetPosition(), Mom1 ) );
result->push_back( new G4KineticTrack( hadrons.second, 0, string->GetPosition(), Mom2) );
result->push_back( new G4KineticTrack( hadrons.first, 0, string->GetPosition(), Mom1 ) );
result->push_back( new G4KineticTrack( hadrons.second, 0, string->GetPosition(), Mom2 ) );
G4ThreeVector Velocity = string->Get4Momentum().boostVector();
result->Boost(Velocity);
}
return result;
}
}
return result;
}
//----------------------------------------------------------------------------------------
@@ -214,7 +202,7 @@ G4KineticTrackVector* G4VLongitudinalStringDecay::ProduceOneHadron(const G4Excit
G4double G4VLongitudinalStringDecay::PossibleHadronMass( const G4FragmentingString * const string,
Pcreate build, pDefPair * pdefs )
{
G4double mass;
G4double mass = 0.0;
if ( build==0 ) build=&G4HadronBuilder::BuildLowSpin;
@@ -246,19 +234,6 @@ G4double G4VLongitudinalStringDecay::PossibleHadronMass( const G4FragmentingStri
G4cout<<"VlongSD string is qq--qqbar: Build two stable hadrons"<<G4endl;
#endif
/* // Uzhi June 2020
G4int iflc = (G4UniformRand() < 0.5)? 1 : 2;
if (string->GetLeftParton()->GetPDGEncoding() < 0) iflc = -iflc;
//... theSpin = 4; spin 3/2 baryons will be built
Hadron1 = (hadronizer->*build)(string->GetLeftParton(), FindParticle(iflc));
Hadron2 = (hadronizer->*build)(string->GetRightParton(), FindParticle(-iflc));
if ( (Hadron1 != nullptr) && (Hadron2 != nullptr) ) { mass = (Hadron1)->GetPDGMass() + (Hadron2)->GetPDGMass();}
else { mass = MaxMass;}
return mass;
*/ // Uzhi June 2020
//+++++++++++++++++++++++++++++++ // Uzhi June 2020 Start
G4double StringMass = string->Mass();
G4int cClusterInterrupt = 0;
do
@@ -278,15 +253,13 @@ G4double G4VLongitudinalStringDecay::PossibleHadronMass( const G4FragmentingStri
Hadron1 =hadronizer->Build(FindParticle(LeftQuark1), FindParticle(RightQuark2));
Hadron2 =hadronizer->Build(FindParticle(LeftQuark2), FindParticle(RightQuark1));
}
if ( (Hadron1 == nullptr) || (Hadron2 == nullptr) ) continue;
//... repeat procedure, if mass of cluster is too low to produce hadrons
//... ClusterMassCut = 0.15*GeV model parameter
}
while ((StringMass <= Hadron1->GetPDGMass() + Hadron2->GetPDGMass()));
while ( Hadron1 == nullptr || Hadron2 == nullptr ||
( StringMass <= Hadron1->GetPDGMass() + Hadron2->GetPDGMass() ) );
mass = (Hadron1)->GetPDGMass() + (Hadron2)->GetPDGMass();
//+++++++++++++++++++++++++++++++ // Uzhi June 2020 End
}
#ifdef debug_VStringDecay
@@ -365,7 +338,7 @@ G4ParticleDefinition * G4VLongitudinalStringDecay::QuarkSplitup( G4ParticleDefin
#ifdef debug_VStringDecay
G4cout<<"VlongSD QuarkSplitup: quark ID "<<decay->GetPDGEncoding()<<G4endl;
#endif
G4int IsParticle=(decay->GetPDGEncoding()>0) ? -1 : +1; // if we have a quark, we need antiquark (or diquark)
pDefPair QuarkPair = CreatePartonPair(IsParticle);
@@ -378,6 +351,7 @@ G4ParticleDefinition * G4VLongitudinalStringDecay::QuarkSplitup( G4ParticleDefin
G4cout<<"VlongSD QuarkSplitup: "<<decay->GetPDGEncoding()<<" -> "<<QuarkPair.second->GetPDGEncoding()<<G4endl;
G4cout<<"hadronizer->Build(QuarkPair.first, decay)"<<G4endl;
#endif
return hadronizer->Build(QuarkPair.first, decay);
}
@@ -423,6 +397,10 @@ G4int G4VLongitudinalStringDecay::SampleQuarkFlavor(void)
if ( ksi < ProbCB ) {
if ( ksi < ProbCCbar ) {quark = 4;} // c quark
else {quark = 5;} // b quark
#ifdef debug_heavyHadrons
G4cout << "G4VLongitudinalStringDecay::SampleQuarkFlavor : sampled from the vacuum HEAVY quark = "
<< quark << G4endl;
#endif
} else {
quark = 1 + (int)(G4UniformRand()/StrangeSuppress);
}
@@ -443,7 +421,9 @@ G4ThreeVector G4VLongitudinalStringDecay::SampleQuarkPt(G4double ptMax)
Pt = -G4Log(G4UniformRand());
} else {
// sample in limited range
Pt = -G4Log(G4RandFlat::shoot(G4Exp(-sqr(ptMax)/sqr(SigmaQT)), 1.));
G4double q = ptMax/SigmaQT;
G4double ymin = (q > 20.) ? 0.0 : G4Exp(-q*q);
Pt = -G4Log(G4RandFlat::shoot(ymin, 1.));
}
Pt = SigmaQT * std::sqrt(Pt);
G4double phi = 2.*pi*G4UniformRand();
@@ -631,8 +611,8 @@ void G4VLongitudinalStringDecay::SetMinMasses()
// ------ For estimation of a minimal string mass ---------------
Mass_of_light_quark =140.*MeV;
Mass_of_s_quark =500.*MeV;
Mass_of_c_quark = 0.*MeV; // ???
Mass_of_b_quark = 0.*MeV; // ???
Mass_of_c_quark =1600.*MeV;
Mass_of_b_quark =4500.*MeV;
Mass_of_string_junction=720.*MeV;
// ---------------- Determination of minimal mass of q-qbar strings -------------------
@@ -725,11 +705,11 @@ void G4VLongitudinalStringDecay::SetMinMasses()
Meson[0][0][3] = 331; MesonWeight[0][0][4] = ( pspin_meson) * ( scalarMesonMix[1]); // Eta'
//dd3 -> vectorMesonMix[0] * 113 + (1-vectorMesonMix[0]-vectorMesonMix[1]) * 223 + vectorMesonMix[1] * 333 (001)
//dd3 -> rho_0 omega fi
//dd3 -> rho_0 omega phi
Meson[0][0][1] = 113; MesonWeight[0][0][1] = (1.-pspin_meson) * ( vectorMesonMix[0] ); // Rho
Meson[0][0][4] = 223; MesonWeight[0][0][4] = (1.-pspin_meson) * (1-vectorMesonMix[0]-vectorMesonMix[1]); // omega
Meson[0][0][5] = 333; MesonWeight[0][0][5] = (1.-pspin_meson) * ( vectorMesonMix[1]); // fi
Meson[0][0][5] = 333; MesonWeight[0][0][5] = (1.-pspin_meson) * ( vectorMesonMix[1]); // phi
//uu1 -> scalarMesonMix[0] * 111 + (1-scalarMesonMix[0]-scalarMesonMix[1]) * 221 + scalarMesonMix[1] * 331 (110)
//uu1 -> Pi0 Eta Eta'
@@ -739,11 +719,11 @@ void G4VLongitudinalStringDecay::SetMinMasses()
Meson[1][1][3] = 331; MesonWeight[1][1][3] = ( pspin_meson) * ( scalarMesonMix[1]); // Eta'
//uu3 -> vectorMesonMix[0] * 113 + (1-vectorMesonMix[0]-vectorMesonMix[1]) * 223 + vectorMesonMix[1] * 333 (111)
//uu3 -> rho_0 omega fi
//uu3 -> rho_0 omega phi
Meson[1][1][1] = 113; MesonWeight[1][1][1] = (1.-pspin_meson) * ( vectorMesonMix[0] ); // Rho
Meson[1][1][4] = 223; MesonWeight[1][1][4] = (1.-pspin_meson) * (1-vectorMesonMix[0]-vectorMesonMix[1]); // omega
Meson[1][1][5] = 333; MesonWeight[1][1][5] = (1.-pspin_meson) * ( vectorMesonMix[1]); // fi
Meson[1][1][5] = 333; MesonWeight[1][1][5] = (1.-pspin_meson) * ( vectorMesonMix[1]); // phi
//ss1 -> (1-scalarMesonMix[5]) * 221 + scalarMesonMix[5] * 331 (220)
//ss1 -> Eta Eta'
@@ -752,23 +732,23 @@ void G4VLongitudinalStringDecay::SetMinMasses()
Meson[2][2][2] = 331; MesonWeight[2][2][2] = ( pspin_meson) * ( scalarMesonMix[5]); // Eta'
//ss3 -> (1-vectorMesonMix[5]) * 223 + vectorMesonMix[5] * 333 (221)
//ss3 -> omega fi
//ss3 -> omega phi
Meson[2][2][1] = 223; MesonWeight[2][2][1] = (1.-pspin_meson) * (1-vectorMesonMix[5] ); // omega
Meson[2][2][3] = 333; MesonWeight[2][2][3] = (1.-pspin_meson) * ( vectorMesonMix[5]); // fi
Meson[2][2][3] = 333; MesonWeight[2][2][3] = (1.-pspin_meson) * ( vectorMesonMix[5]); // phi
//cc1 -> ProbEta_c /(1-pspin_meson) 441 (330) Probability of Eta_c
//cc3 -> (1-ProbEta_c)/( pspin_meson) 443 (331) Probability of J/Psi
//bb1 -> ProbEta_b /pspin_meson 551 (440) Probability of Eta_b
//bb3 -> (1-ProbEta_b)/pspin_meson 553 (441) Probability of ipsilon
//bb3 -> (1-ProbEta_b)/pspin_meson 553 (441) Probability of Upsilon
if ( pspin_meson != 0. ) {
Meson[3][3][0] *= ( ProbEta_c)/( pspin_meson); // Eta_c
Meson[3][3][1] *= (1.0-ProbEta_c)/(1.-pspin_meson); // J/Psi
Meson[4][4][0] *= ( ProbEta_b)/( pspin_meson); // Eta_b
Meson[4][4][1] *= (1.0-ProbEta_b)/(1.-pspin_meson); // ipsilon
Meson[4][4][1] *= (1.0-ProbEta_b)/(1.-pspin_meson); // Upsilon
}
//--------------------------
@@ -821,7 +801,7 @@ void G4VLongitudinalStringDecay::SetMinMasses()
Baryon[3][3][3][0] = 4444; BaryonWeight[3][3][3][0] = 1.0;
Baryon[3][3][3][1] = 0; BaryonWeight[3][3][3][1] = 0.0;
// Omega_bb- bbb - only 5454
// Omega_bb- bbb - only 5554
Baryon[4][4][4][0] = 5554; BaryonWeight[4][4][4][0] = 1.0;
Baryon[4][4][4][1] = 0; BaryonWeight[4][4][4][1] = 0.0;
@@ -870,7 +850,7 @@ void G4VLongitudinalStringDecay::SetMinMasses()
Baryon[3][1][2][2] = 4322; BaryonWeight[3][1][2][2] = 0.5 * pspin_barion;
Baryon[3][2][1][2] = 4322; BaryonWeight[3][2][1][2] = 0.5 * pspin_barion;
// Xi_c0/Xi_c0' cus - 4232/4322
// Xi_c0/Xi_c0' cus - 4132/4312
Baryon[0][2][3][0] = 4132; BaryonWeight[0][2][3][0] *= 0.5; // Xi_c0
Baryon[0][3][2][0] = 4132; BaryonWeight[0][3][2][0] *= 0.5;
Baryon[2][0][3][0] = 4132; BaryonWeight[2][0][3][0] *= 0.5;
@@ -900,30 +880,30 @@ void G4VLongitudinalStringDecay::SetMinMasses()
Baryon[4][0][1][2] = 5212; BaryonWeight[4][0][1][2] = 0.5 * pspin_barion;
Baryon[4][1][0][2] = 5212; BaryonWeight[4][1][0][2] = 0.5 * pspin_barion;
// Xi_b-/Xi_b-' bus - 5232/5322
Baryon[1][2][4][0] = 5232; BaryonWeight[1][2][4][0] *= 0.5; // Xi_b-
// Xi_b0/Xi_b0' bus - 5232/5322
Baryon[1][2][4][0] = 5232; BaryonWeight[1][2][4][0] *= 0.5; // Xi_b0
Baryon[1][4][2][0] = 5232; BaryonWeight[1][4][2][0] *= 0.5;
Baryon[2][1][4][0] = 5232; BaryonWeight[2][1][4][0] *= 0.5;
Baryon[2][4][1][0] = 5232; BaryonWeight[2][4][1][0] *= 0.5;
Baryon[4][1][2][0] = 5232; BaryonWeight[4][1][2][0] *= 0.5;
Baryon[4][2][1][0] = 5232; BaryonWeight[4][2][1][0] *= 0.5;
Baryon[1][2][4][2] = 5322; BaryonWeight[1][2][4][2] = 0.5 * pspin_barion; // Xi_b-'
Baryon[1][2][4][2] = 5322; BaryonWeight[1][2][4][2] = 0.5 * pspin_barion; // Xi_b0'
Baryon[1][4][2][2] = 5322; BaryonWeight[1][4][2][2] = 0.5 * pspin_barion;
Baryon[2][1][4][2] = 5322; BaryonWeight[2][1][4][2] = 0.5 * pspin_barion;
Baryon[2][4][1][2] = 5322; BaryonWeight[2][4][1][2] = 0.5 * pspin_barion;
Baryon[4][1][2][2] = 5322; BaryonWeight[4][1][2][2] = 0.5 * pspin_barion;
Baryon[4][2][1][2] = 5322; BaryonWeight[4][2][1][2] = 0.5 * pspin_barion;
// Xi_b0/Xi_b0' bus - 5232/5322
Baryon[0][2][4][0] = 5132; BaryonWeight[0][2][4][0] *= 0.5; // Xi_b0
// Xi_b-/Xi_b-' bus - 5132/5312
Baryon[0][2][4][0] = 5132; BaryonWeight[0][2][4][0] *= 0.5; // Xi_b-
Baryon[0][4][2][0] = 5132; BaryonWeight[0][4][2][0] *= 0.5;
Baryon[2][0][4][0] = 5132; BaryonWeight[2][0][4][0] *= 0.5;
Baryon[2][4][0][0] = 5132; BaryonWeight[2][4][0][0] *= 0.5;
Baryon[4][0][2][0] = 5132; BaryonWeight[4][0][2][0] *= 0.5;
Baryon[4][2][0][0] = 5132; BaryonWeight[4][2][0][0] *= 0.5;
Baryon[0][2][4][2] = 5312; BaryonWeight[0][2][4][2] = 0.5 * pspin_barion; // Xi_b0'
Baryon[0][2][4][2] = 5312; BaryonWeight[0][2][4][2] = 0.5 * pspin_barion; // Xi_b-'
Baryon[0][4][2][2] = 5312; BaryonWeight[0][4][2][2] = 0.5 * pspin_barion;
Baryon[2][0][4][2] = 5312; BaryonWeight[2][0][4][2] = 0.5 * pspin_barion;
Baryon[2][4][0][2] = 5312; BaryonWeight[2][4][0][2] = 0.5 * pspin_barion;
@@ -972,9 +952,8 @@ void G4VLongitudinalStringDecay::SetMinMasses()
void G4VLongitudinalStringDecay::SetMinimalStringMass(const G4FragmentingString * const string)
{
//MaxMass = -350.0*GeV;
G4double EstimatedMass=MaxMass; // Uzhi June 2020 0.->MaxMass;
G4double EstimatedMass=MaxMass;
// Uzhi June 2020 Start
G4ParticleDefinition* LeftParton = string->GetLeftParton();
G4ParticleDefinition* RightParton = string->GetRightParton();
if( LeftParton->GetParticleSubType() == RightParton->GetParticleSubType() ) { // q qbar, qq qqbar
@@ -991,7 +970,6 @@ void G4VLongitudinalStringDecay::SetMinimalStringMass(const G4FragmentingString
"G4VLongitudinalStringDecay::SetMinimalStringMass: Illegal quark content as input");
}
}
// Uzhi June 2020 End
G4int Qleft =std::abs(string->GetLeftParton()->GetPDGEncoding());
G4int Qright=std::abs(string->GetRightParton()->GetPDGEncoding());
@@ -1069,7 +1047,7 @@ void G4VLongitudinalStringDecay::SetMinimalStringMass(const G4FragmentingString
EstimatedMass=std::min(minMassQQbarStr[q1-1][q3-1] + minMassQQbarStr[q2-1][q4-1],
minMassQQbarStr[q1-1][q4-1] + minMassQQbarStr[q2-1][q3-1]);
// In principle, re-orangement and 2 baryon production can compite.
// In principle, re-arrangement and 2 baryon production can compete.
// More physics consideration is needed.
MinimalStringMass=EstimatedMass;