68 for(
G4int i=0; i<3; i++)
69 {
for(
G4int j=0; j<3; j++)
70 {
for(
G4int k=0; k<6; k++)
161 for(
G4int i=0; i<3; i++)
162 {
for(
G4int j=0; j<3; j++)
163 {
for(
G4int k=0; k<3; k++)
164 {
for(
G4int l=0; l<4; l++)
392 for (
G4int i=0 ; i<35 ; i++ ) {
410 G4int Number_of_quarks=0;
412 G4double StringM=
string->Get4Momentum().mag();
425 G4int q2=(Qleft/100)%10;
444 G4int q1=Qright/1000;
448 G4int q2=(Qright/100)%10;
462 if(Number_of_quarks==2){EstimatedMass +=100.*
MeV;}
463 if(Number_of_quarks==3){EstimatedMass += 20.*
MeV;}
464 if(Number_of_quarks==4)
466 if((StringM > 1880.) && ( EstimatedMass < 2100)) {EstimatedMass = 2020.;}
468 else if((StringM > 2232.) && ( EstimatedMass < 2730)){EstimatedMass = 2570.;}
469 else if((StringM > 5130.) && ( EstimatedMass < 3450)){EstimatedMass = 5130.;}
473 if(EstimatedMass <= 1600.*
MeV){EstimatedMass-=200.*
MeV;}
474 else {EstimatedMass+=100.*
MeV;}
514 if ( LeftVector != 0 ) {
517 LeftVector->operator[](0)->SetPosition(theString.
GetPosition());
518 if(LeftVector->size() > 1)
522 LeftVector->operator[](1)->SetPosition(theString.
GetPosition());
536 delete theStringInCMS;
548 while(!RightVector->empty())
550 LeftVector->push_back(RightVector->back());
551 RightVector->erase(RightVector->end()-1);
563 for(
size_t C1 = 0;
C1 < LeftVector->size();
C1++)
568 Momentum = toObserverFrame*Momentum;
572 Momentum = toObserverFrame*Coordinate;
575 Hadron->
SetPosition(PositionOftheStringCreation+aPosition);
611 G4ThreeVector ClusterVel=
string->Get4Momentum().boostVector();
621 string->SetLeftPartonStable();
683 LeftMom.boost(ClusterVel);
684 RightMom.boost(ClusterVel);
686 LeftVector->push_back(
new G4KineticTrack(LeftHadron, 0, Pos, LeftMom));
687 RightVector->push_back(
new G4KineticTrack(RightHadron, 0, Pos, RightMom));
704 if((Mass > 930. || AntiMass > 930.))
707 G4double r_val =
sqr(InitialMass*InitialMass - Mass*Mass - AntiMass*AntiMass) -
708 sqr(2.*Mass*AntiMass);
709 G4double Pabs = (r_val > 0.)? std::sqrt(r_val)/(2.*InitialMass) : 0;
714 G4double st = std::sqrt(1. - pz * pz)*Pabs;
720 Mom->setPx(px); Mom->setPy(py); Mom->setPz(pz);
721 Mom->setE(std::sqrt(Pabs*Pabs + Mass*Mass));
723 AntiMom->setPx(-px); AntiMom->setPy(-py); AntiMom->setPz(-pz);
724 AntiMom->setE (std::sqrt(Pabs*Pabs + AntiMass*AntiMass));
734 G4double termD = InitialMass*InitialMass -Mass*Mass - AntiMass*AntiMass;
736 G4double termN = 2*termD + 4*Mass*Mass + 4*AntiMass*AntiMass;
737 G4double pt2max=(termD*termD - termab )/ termN ;
742 MassMt2 = Mass * Mass + Pt2;
743 AntiMassMt2= AntiMass * AntiMass + Pt2;
745 AvailablePz2=
sqr(InitialMass*InitialMass - MassMt2 - AntiMassMt2) -
746 4.*MassMt2*AntiMassMt2;
748 while(AvailablePz2 < 0.);
750 AvailablePz2 /=(4.*InitialMass*InitialMass);
751 AvailablePz = std::sqrt(AvailablePz2);
756 Mom->setPx(Px); Mom->setPy(Py); Mom->setPz(AvailablePz);
757 Mom->setE(std::sqrt(MassMt2+AvailablePz2));
759 AntiMom->setPx(-Px); AntiMom->setPy(-Py); AntiMom->setPz(-AvailablePz);
760 AntiMom->setE (std::sqrt(AntiMassMt2+AvailablePz2));
770 G4double StringMT2=
string->Get4Momentum().mt2();
778 String4Momentum.setPz(0.);
793 G4double HadronMassT2 =
sqr(HadronMass) + HadronPt.mag2();
796 G4double Pz2 = (
sqr(StringMT2 - HadronMassT2 - ResidualMassT2) -
797 4*HadronMassT2 * ResidualMassT2)/4./StringMT2;
799 if(Pz2 < 0 ) {
return 0;}
804 G4double zMin = (std::sqrt(HadronMassT2+Pz2) - Pz)/std::sqrt(StringMT2);
805 G4double zMax = (std::sqrt(HadronMassT2+Pz2) + Pz)/std::sqrt(StringMT2);
808 if (zMin >= zMax)
return 0;
812 HadronPt.x(), HadronPt.y());
818 (z *
string->LightConeDecay() -
819 HadronMassT2/(z *
string->LightConeDecay())));
821 G4double HadronE = 0.5* (z *
string->LightConeDecay() +
822 HadronMassT2/(z *
string->LightConeDecay()));
831 G4int PDGEncodingOfDecayParton,
842 G4double Mt2 = Px*Px + Py*Py + Mass*Mass;
845 if(std::abs(PDGEncodingOfDecayParton) < 1000)
853 G4double zOfMaxyf=alund*Mt2/(alund*Mt2 + 1.);
854 G4double maxYf=(1-zOfMaxyf)/zOfMaxyf * std::exp(-alund*Mt2/zOfMaxyf);
860 yf = (1-
z)/z * std::exp(-alund*Mt2/z);
887 G4bool final_success=
false;
888 G4bool inner_success=
true;
898 RightVector->clear();
911 LeftVector->push_back(Hadron);
914 RightVector->push_back(Hadron);
916 delete currentString;
917 currentString=newString;
921 if ( inner_success &&
SplitLast(currentString, LeftVector, RightVector) )
925 delete currentString;
927 return final_success;
936 G4double StringMass =
string->Mass();
937 G4int cClusterInterrupt = 0;
946 G4int LeftQuark1=
string->GetLeftParton()->GetPDGEncoding()/1000;
947 G4int LeftQuark2=(
string->GetLeftParton()->GetPDGEncoding()/100)%10;
949 G4int RightQuark1=
string->GetRightParton()->GetPDGEncoding()/1000;
950 G4int RightQuark2=(
string->GetRightParton()->GetPDGEncoding()/100)%10;
969 while ((StringMass <= LeftHadron->GetPDGMass() + RightHadron->
GetPDGMass()));
985 G4double StringMass =
string->Mass();
992 Anti_Di_Quark =
string->GetLeftParton();
993 Di_Quark=
string->GetRightParton();
996 Anti_Di_Quark =
string->GetRightParton();
997 Di_Quark=
string->GetLeftParton();
1001 G4int AbsIDAnti_di_quark =std::abs(IDAnti_di_quark);
1003 G4int AbsIDdi_quark =std::abs(IDdi_quark);
1005 G4int ADi_q1=AbsIDAnti_di_quark/1000;
1006 G4int ADi_q2=(AbsIDAnti_di_quark-ADi_q1*1000)/100;
1008 G4int Di_q1=AbsIDdi_quark/1000;
1009 G4int Di_q2=(AbsIDdi_quark-Di_q1*1000)/100;
1015 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1025 -
Baryon[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]);
1035 +
Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]);
1045 if(StringMass > LeftHadronMass + RightHadronMass)
1050 G4Exception(
"G4LundStringFragmentation::Diquark_AntiDiquark_aboveThreshold_lastSplitting ",
1056 sqr(RightHadronMass));
1073 }
while(
Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]!=0);
1076 }
while(
Baryon[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]!=0);
1088 G4double StringMass =
string->Mass();
1096 Quark =
string->GetLeftParton();
1097 Di_Quark=
string->GetRightParton();
1100 Quark =
string->GetRightParton();
1101 Di_Quark=
string->GetLeftParton();
1105 G4int AbsIDquark =std::abs(IDquark);
1107 G4int AbsIDdi_quark=std::abs(IDdi_quark);
1108 G4int Di_q1=AbsIDdi_quark/1000;
1109 G4int Di_q2=(AbsIDdi_quark-Di_q1*1000)/100;
1113 if(IDdi_quark < 0) SignDiQ=-1;
1116 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1121 if(IDquark == 2) SignQ= 1;
1122 if((IDquark == 1) && (ProdQ == 3)) SignQ= 1;
1123 if((IDquark == 3) && (ProdQ == 1)) SignQ=-1;
1127 if(IDquark == -2) SignQ=-1;
1128 if((IDquark ==-1) && (ProdQ == 3)) SignQ=-1;
1129 if((IDquark ==-3) && (ProdQ == 1)) SignQ= 1;
1132 if(AbsIDquark == ProdQ) SignQ= 1;
1143 Meson[AbsIDquark-1][ProdQ-1][StateQ]);
1153 Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]);
1163 if(StringMass > LeftHadronMass + RightHadronMass)
1168 G4Exception(
"G4LundStringFragmentation::Quark_Diquark_lastSplitting ",
1174 sqr(RightHadronMass));
1190 }
while(
Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]!=0);
1193 }
while(
Meson[AbsIDquark-1][ProdQ-1][StateQ]!=0);
1205 G4double StringMass =
string->Mass();
1213 Quark =
string->GetLeftParton();
1214 Anti_Quark=
string->GetRightParton();
1217 Quark =
string->GetRightParton();
1218 Anti_Quark=
string->GetLeftParton();
1223 G4int AbsIDquark =std::abs(IDquark);
1225 G4int AbsIDanti_quark=std::abs(IDanti_quark);
1228 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1232 if(IDquark == 2) SignQ= 1;
1233 if((IDquark == 1) && (ProdQ == 3)) SignQ= 1;
1234 if((IDquark == 3) && (ProdQ == 1)) SignQ=-1;
1235 if(IDquark == ProdQ) SignQ= 1;
1238 if(IDanti_quark == -2) SignAQ=-1;
1239 if((IDanti_quark ==-1) && (ProdQ == 3)) SignAQ=-1;
1240 if((IDanti_quark ==-3) && (ProdQ == 1)) SignAQ= 1;
1241 if(AbsIDanti_quark == ProdQ) SignAQ= 1;
1247 Meson[AbsIDquark-1][ProdQ-1][StateQ]);
1255 Meson[AbsIDanti_quark-1][ProdQ-1][StateAQ]);
1262 if(StringMass > LeftHadronMass + RightHadronMass)
1267 G4Exception(
"G4LundStringFragmentation::Quark_AntiQuark_lastSplitting ",
1273 sqr(RightHadronMass));
1293 }
while(
Meson[AbsIDanti_quark-1][ProdQ-1][StateAQ]!=0);
1294 }
while(
Meson[AbsIDquark-1][ProdQ-1][StateQ]!=0);
1315 G4int indexPosition = 0;
1321 if(Sum >= ksi)
break;
1323 return indexPosition;
virtual G4KineticTrackVector * FragmentString(const G4ExcitedString &theString)
G4double Mass_of_heavy_quark
G4ParticleDefinition * GetRightParton(void) const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
G4bool Quark_AntiQuark_lastSplitting(G4FragmentingString *&string, G4ParticleDefinition *&LeftHadron, G4ParticleDefinition *&RightHadron)
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
virtual G4LorentzVector * SplitEandP(G4ParticleDefinition *pHadron, G4FragmentingString *string, G4FragmentingString *newString)
CLHEP::HepLorentzRotation G4LorentzRotation
G4double Mass_of_string_junction
const G4ThreeVector & GetPosition() const
G4ExcitedString * CPExcited(const G4ExcitedString &string)
virtual G4bool IsFragmentable(const G4FragmentingString *const string)
void SetFormationTime(G4double aFormationTime)
void SetStrangenessSuppression(G4double aValue)
G4double MesonWeight[3][3][6]
G4ParticleDefinition * Build(G4ParticleDefinition *black, G4ParticleDefinition *white)
G4bool Quark_Diquark_lastSplitting(G4FragmentingString *&string, G4ParticleDefinition *&LeftHadron, G4ParticleDefinition *&RightHadron)
G4int StringLoopInterrupt
G4int ClusterLoopInterrupt
G4int GetPDGEncoding() const
G4ThreeVector SampleQuarkPt(G4double ptMax=-1.)
std::vector< G4double > vectorMesonMix
const G4String & GetParticleSubType() const
virtual void SetMassCut(G4double aValue)
G4ParticleDefinition * GetDecayParton() const
virtual G4double GetLightConeZ(G4double zmin, G4double zmax, G4int PartonEncoding, G4ParticleDefinition *pHadron, G4double Px, G4double Py)
void SetStringTensionParameter(G4double aValue)
const G4ThreeVector & GetPosition() const
virtual void Sample4Momentum(G4LorentzVector *Mom, G4double Mass, G4LorentzVector *AntiMom, G4double AntiMass, G4double InitialMass)
G4ParticleDefinition * GetLeftParton(void) const
void SetDiquarkBreakProbability(G4double aValue)
void SetMinimalStringMass2(const G4double aValue)
G4KineticTrackVector * LightFragmentationTest(const G4ExcitedString *const theString)
G4LorentzVector Get4Momentum() const
G4bool Loop_toFragmentString(G4ExcitedString *&theStringInCMS, G4KineticTrackVector *&LeftVector, G4KineticTrackVector *&RightVector)
G4double GetFormationTime() const
void SetMinimalStringMass(const G4FragmentingString *const string)
G4LorentzRotation TransformToAlignedCms()
G4ParticleDefinition * FindParticle(G4int Encoding)
void SetPosition(const G4ThreeVector aPosition)
virtual G4bool StopFragmenting(const G4FragmentingString *const string)
G4int GetDecayDirection() const
void Set4Momentum(const G4LorentzVector &a4Momentum)
G4LundStringFragmentation()
G4double lambda(G4double s, G4double m1_Sqr, G4double m2_Sqr)
G4bool FourQuarkString(void) const
std::vector< G4double > scalarMesonMix
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual ~G4LundStringFragmentation()
G4HadronBuilder * hadronizer
G4double GetPDGMass() const
G4bool Diquark_AntiDiquark_aboveThreshold_lastSplitting(G4FragmentingString *&string, G4ParticleDefinition *&LeftHadron, G4ParticleDefinition *&RightHadron)
static G4ParticleTable * GetParticleTable()
G4double MinimalStringMass
G4double Mass_of_light_quark
G4double GetTimeOfCreation() const
G4ParticleDefinition * FS_LeftHadron[35]
G4bool Diquark_AntiDiquark_belowThreshold_lastSplitting(G4FragmentingString *&string, G4ParticleDefinition *&LeftHadron, G4ParticleDefinition *&RightHadron)
virtual G4bool SplitLast(G4FragmentingString *string, G4KineticTrackVector *LeftVector, G4KineticTrackVector *RightVector)
const G4LorentzVector & Get4Momentum() const
void CalculateHadronTimePosition(G4double theInitialStringMass, G4KineticTrackVector *)
G4double MinimalStringMass2
static const double fermi
G4double BaryonWeight[3][3][3][4]
G4KineticTrack * Splitup(G4FragmentingString *string, G4FragmentingString *&newString)
G4ParticleDefinition * FS_RightHadron[35]
void SetDiquarkSuppression(G4double aValue)
CLHEP::HepLorentzVector G4LorentzVector