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
@@ -14,6 +14,68 @@ code and to keep track of all tags.
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
19-Oct-2020 A. Ribon (had-hadronization-V10-06-08)
- G4VLongitudinalStringDecay : fix by Vladimir Uzhinsky in the method
ProduceOneHadron to remove an inconsistency in the treatment of
low-mass strings with respect to the method
G4QGSMFragmentation::FragmentString .
(As consequence of this inconsistency, interactions with fewer
intra-nuclear collisions were favored, therefore producing
fewer secondary hadrons.)
17-Oct-2020 V. Ivanchenko (had-hadronization-V10-06-07)
- G4VLongitudinalStringDecay, G4QGSMFragmentation - added protections
for arguments of G4Exp to avoid precision lost in same cases
29-Sep-2020 A. Ribon (had-hadronization-V10-06-06)
Changes made by Vladimir Uzhinsky in order to improve the agreement
of FTF simulations with NA49 experimental data (on Pt-Xf correlations
for various particles produced in pp interactions at 158 GeV/c):
- G4LundStringFragmentation : introduced a new parameter (as a class
data member), a kind of "temperature", for sampling the Pt of
produced hadrons; this parameter has been tuned for different
fragmentation processes.
Moreover, the string direction (one of string's properties,
whose value can be either +1 for projectile-like strings or
-1 for target-like strings) is now treated correctly and used
to invert the results of the string fragmentation (in the string
rest frame) when the string direction is -1.
- G4FragmentingString : erased some inconsistencies.
- G4VLongitudinalStringDecay : clean-up.
08-Sep-2020 A. Ribon (had-hadronization-V10-06-05)
- G4VLongitudinalStringDecay : made the logic clearer for Coverity,
but without any effect on the results.
28-Jul-2020 A. Ribon (had-hadronization-V10-06-04)
- G4QGSMFragmentation : proper exit in the method FragmentString
when the string mass is below the threshold.
24-Jul-2020 A. Ribon (had-hadronization-V10-06-03)
- G4LundStringFragmentation, G4QGSMFragmentation : if the flag for
heavy (charmed and bottom) hadrons is enabled, then non-zero
probabilities for c-cbar and b-bbar creation from the vacuum are set,
allowing charmed and bottom hadrons to be created during the string
fragmentation of ordinary (i.e. not heavy) projectile hadron nuclear
reactions.
- G4VLongitudinalStringDecay : in the method SetMinMasses, set the
constituent masses of charm and bottom quarks; introduced also a new
pre-processor option for debugging heavy hadrons, switched off by
default; improved comments.
- G4LundStringFragmentation : extension to charm and bottom quarks of the
methods Quark_AntiQuark_lastSplitting and Quark_Diquark_lastSplitting;
added protections in the method FragmentString to avoid rare crashes
seen with heavy hadrons.
- G4HadronBuilder : fixed condition in the method Barion to take into
account the extension to charm and bottom quarks; moreover, for both
Meson and Barion methods, we have to force by hand that the heavy
hadron produced by the string fragmentation is one of the few available
in Geant4 (in particular, all heavy hadron resonances are transformed
into close heavy hadron ground states). Introduced also a new
pre-processor option for debugging heavy hadrons, switched off by default.
- G4ExcitedStringDecay : add protection in the FragmentStrings method
to avoid rare crashes seen with heavy hadrons.
10-Jun-2020 A. Ribon (had-hadronization-V10-06-02)
- Improved treatment of antibaryon interactions in QGS
(made by Vladimir Uzhinsky):
@@ -105,7 +105,7 @@ class G4FragmentingString
private:
G4ParticleDefinition *LeftParton, *RightParton;
G4ThreeVector Ptleft,Ptright; // Pt (px,py) for partons (pz ignored!)
G4double Pplus, Pminus; // p-, p+ of string, Plus ass. to Left!
G4double Pplus, Pminus; // p-, p+ of string, Plus associated to Left!
G4ParticleDefinition * theStableParton, * theDecayParton;
@@ -180,38 +180,24 @@ G4LorentzRotation G4FragmentingString::TransformToCenterOfMass()
return toCMS;
}
inline
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(0.,0.,0.);
Ptright = G4ThreeVector(0.,0.,0.);
Pplus = Pstring.plus();
Pminus = Pstring.minus();
return toAlignedCms;
}
inline
void G4FragmentingString::SetPleft(G4LorentzVector a4momentum)
{
Pleft = a4momentum;
Pleft = a4momentum;
Ptleft = Pleft.vect(); Ptleft.setZ(0.);
Pstring = Pleft + Pright;
Pplus = Pstring.plus();
Pminus = Pstring.minus();
}
inline
void G4FragmentingString::SetPright(G4LorentzVector a4momentum)
{
Pright = a4momentum;
Pright = a4momentum;
Ptright = Pright.vect(); Ptright.setZ(0.);
Pstring = Pleft + Pright;
Pplus = Pstring.plus();
Pminus = Pstring.minus();
}
#endif
@@ -107,6 +107,9 @@ class G4LundStringFragmentation: public G4VLongitudinalStringDecay
G4ParticleDefinition * & RightHadron );
G4int SampleState(void);
G4double Tmt; // "Temperature" for sampling Pt of hadrons
};
//******************************************************************************
@@ -51,8 +51,8 @@ class G4QGSMFragmentation:public G4VLongitudinalStringDecay
G4bool operator!=(const G4QGSMFragmentation &right) const;
private:
virtual G4bool StopFragmenting(const G4FragmentingString * const string);
virtual G4bool IsItFragmentable(const G4FragmentingString * const string);
virtual G4bool StopFragmenting(const G4FragmentingString * string);
virtual G4bool IsItFragmentable(const G4FragmentingString * string);
virtual G4bool SplitLast(G4FragmentingString * string,
G4KineticTrackVector * LeftVector,
@@ -4,7 +4,7 @@
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_frag
#
# Sources description for a library.
# Lists the sources and headers of the code explicitely.
# Lists the sources and headers of the code explicitly.
# Lists include paths needed.
# Lists the internal granular and global dependencies of the library.
# Source specific properties should be added at the end.
@@ -14,38 +14,9 @@
#
#------------------------------------------------------------------------------
# List external includes needed.
include_directories(${CLHEP_INCLUDE_DIRS})
# List internal includes needed.
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/volumes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPGeometry/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPNumerics/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPRandom/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/materials/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/bosons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/barions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/ions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/mesons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/leptons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/shortlived/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/cross_sections/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/parton_string/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/processes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/track/include)
#
# Define the Geant4 Module.
#
include(Geant4MacroDefineModule)
GEANT4_DEFINE_MODULE(NAME G4had_string_frag
HEADERS
G4ExcitedStringDecay.hh
@@ -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;