49 Mass_of_light_quark =140.*MeV;
50 Mass_of_heavy_quark =500.*MeV;
51 Mass_of_string_junction=720.*MeV;
53 MinimalStringMass = 0.;
54 MinimalStringMass2 = 0.;
68 for(
G4int i=0; i<3; i++)
69 {
for(
G4int j=0; j<3; j++)
70 {
for(
G4int k=0; k<6; k++)
71 { Meson[i][j][k]=0; MesonWeight[i][j][k]=0.;
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++)
165 { Baryon[i][j][k][l]=0; BaryonWeight[i][j][k][l]=0.;}
173 Baryon[0][0][0][0]=1114;
174 BaryonWeight[0][0][0][0]=1.;
177 Baryon[0][0][1][0]=2112;
180 Baryon[0][0][1][1]=2114;
184 Baryon[0][0][2][0]=3112;
187 Baryon[0][0][2][1]=3114;
191 Baryon[0][1][0][0]=2112;
194 Baryon[0][1][0][1]=2114;
198 Baryon[0][1][1][0]=2212;
201 Baryon[0][1][1][1]=2214;
205 Baryon[0][1][2][0]=3122;
208 Baryon[0][1][2][1]=3212;
211 Baryon[0][1][2][2]=3214;
215 Baryon[0][2][0][0]=3112;
218 Baryon[0][2][0][1]=3114;
222 Baryon[0][2][1][0]=3122;
225 Baryon[0][2][1][1]=3212;
228 Baryon[0][2][1][2]=3214;
232 Baryon[0][2][2][0]=3312;
235 Baryon[0][2][2][1]=3314;
240 Baryon[1][0][0][0]=2112;
243 Baryon[1][0][0][1]=2114;
247 Baryon[1][0][1][0]=2212;
250 Baryon[1][0][1][1]=2214;
254 Baryon[1][0][2][0]=3122;
257 Baryon[1][0][2][1]=3212;
260 Baryon[1][0][2][2]=3214;
264 Baryon[1][1][0][0]=2212;
267 Baryon[1][1][0][1]=2214;
271 Baryon[1][1][1][0]=2224;
272 BaryonWeight[1][1][1][0]=1.;
275 Baryon[1][1][2][0]=3222;
278 Baryon[1][1][2][1]=3224;
282 Baryon[1][2][0][0]=3122;
285 Baryon[1][2][0][1]=3212;
288 Baryon[1][2][0][2]=3214;
292 Baryon[1][2][1][0]=3222;
295 Baryon[1][2][1][1]=3224;
299 Baryon[1][2][2][0]=3322;
302 Baryon[1][2][2][1]=3324;
307 Baryon[2][0][0][0]=3112;
310 Baryon[2][0][0][1]=3114;
314 Baryon[2][0][1][0]=3122;
317 Baryon[2][0][1][1]=3212;
320 Baryon[2][0][1][2]=3214;
324 Baryon[2][0][2][0]=3312;
327 Baryon[2][0][2][1]=3314;
331 Baryon[2][1][0][0]=3122;
334 Baryon[2][1][0][1]=3212;
337 Baryon[2][1][0][2]=3214;
341 Baryon[2][1][1][0]=3222;
344 Baryon[2][1][1][1]=3224;
348 Baryon[2][1][2][0]=3322;
351 Baryon[2][1][2][1]=3324;
355 Baryon[2][2][0][0]=3312;
358 Baryon[2][2][0][1]=3314;
362 Baryon[2][2][1][0]=3322;
365 Baryon[2][2][1][1]=3324;
369 Baryon[2][2][2][0]=3334;
370 BaryonWeight[2][2][2][0]=1.;
392 for (
G4int i=0 ; i<35 ; i++ ) {
393 FS_LeftHadron[i] = 0;
394 FS_RightHadron[i] = 0;
407void G4LundStringFragmentation::SetMinimalStringMass(
const G4FragmentingString *
const string)
410 G4int Number_of_quarks=0;
412 G4double StringM=
string->Get4Momentum().mag();
422 if( q1 < 3) {EstimatedMass +=Mass_of_light_quark;}
423 if( q1 > 2) {EstimatedMass +=Mass_of_heavy_quark;}
425 G4int q2=(Qleft/100)%10;
426 if( q2 < 3) {EstimatedMass +=Mass_of_light_quark;}
427 if( q2 > 2) {EstimatedMass +=Mass_of_heavy_quark;}
428 EstimatedMass +=Mass_of_string_junction;
433 if( Qleft < 3) {EstimatedMass +=Mass_of_light_quark;}
434 if( Qleft > 2) {EstimatedMass +=Mass_of_heavy_quark;}
444 G4int q1=Qright/1000;
445 if( q1 < 3) {EstimatedMass +=Mass_of_light_quark;}
446 if( q1 > 2) {EstimatedMass +=Mass_of_heavy_quark;}
448 G4int q2=(Qright/100)%10;
449 if( q2 < 3) {EstimatedMass +=Mass_of_light_quark;}
450 if( q2 > 2) {EstimatedMass +=Mass_of_heavy_quark;}
451 EstimatedMass +=Mass_of_string_junction;
456 if( Qright < 3) {EstimatedMass +=Mass_of_light_quark;}
457 if( Qright > 2) {EstimatedMass +=Mass_of_heavy_quark;}
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.;}
472 EstimatedMass -=2.*Mass_of_string_junction;
473 if(EstimatedMass <= 1600.*MeV){EstimatedMass-=200.*MeV;}
474 else {EstimatedMass+=100.*MeV;}
480 MinimalStringMass=EstimatedMass;
481 SetMinimalStringMass2(EstimatedMass);
485void G4LundStringFragmentation::SetMinimalStringMass2(
488 MinimalStringMass2=aValue * aValue;
502 SetMinimalStringMass(&aString);
506 if(!IsFragmentable(&aString))
514 if ( LeftVector != 0 ) {
517 LeftVector->operator[](0)->SetPosition(theString.
GetPosition());
518 if(LeftVector->size() > 1)
522 LeftVector->operator[](1)->SetPosition(theString.
GetPosition());
534 G4bool success = Loop_toFragmentString(theStringInCMS, LeftVector, RightVector);
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;
573 Hadron->
SetFormationTime(TimeOftheStringCreation + Momentum.
e() - fermi/c_light);
575 Hadron->
SetPosition(PositionOftheStringCreation+aPosition);
584 SetMinimalStringMass(
string);
586 return MinimalStringMass <
string->Get4Momentum().mag();
592 SetMinimalStringMass(
string);
599 MinimalStringMass*MinimalStringMass));
611 G4ThreeVector ClusterVel=
string->Get4Momentum().boostVector();
617 for(
G4int i=0; i<35; i++) {FS_Weight[i]=0.;}
621 string->SetLeftPartonStable();
628 if(StringMass-MinimalStringMass < 0.)
630 if (! Diquark_AntiDiquark_belowThreshold_lastSplitting(
string, LeftHadron, RightHadron) )
636 Diquark_AntiDiquark_aboveThreshold_lastSplitting(
string, LeftHadron, RightHadron);
638 if(NumberOf_FS == 0)
return false;
640 G4int sampledState = SampleState();
644 LeftHadron =FS_LeftHadron[sampledState];
645 RightHadron=FS_RightHadron[sampledState];
648 LeftHadron =FS_RightHadron[sampledState];
649 RightHadron=FS_LeftHadron[sampledState];
658 Quark_AntiQuark_lastSplitting(
string, LeftHadron, RightHadron);
662 Quark_Diquark_lastSplitting(
string, LeftHadron, RightHadron);
665 if(NumberOf_FS == 0)
return false;
667 G4int sampledState = SampleState();
669 LeftHadron =FS_LeftHadron[sampledState];
670 RightHadron=FS_RightHadron[sampledState];
679 Sample4Momentum(&LeftMom, LeftHadron->GetPDGMass(),
680 &RightMom, RightHadron->GetPDGMass(),
683 LeftMom.
boost(ClusterVel);
684 RightMom.
boost(ClusterVel);
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;
721 Mom->
setE(std::sqrt(Pabs*Pabs + Mass*Mass));
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);
757 Mom->
setE(std::sqrt(MassMt2+AvailablePz2));
759 AntiMom->
setPx(-Px); AntiMom->
setPy(-Py); AntiMom->
setPz(-AvailablePz);
760 AntiMom->
setE (std::sqrt(AntiMassMt2+AvailablePz2));
774 SetMinimalStringMass(newString);
777 if(HadronMass + MinimalStringMass > String4Momentum.
mag()) {
return 0;}
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;
810 G4double z = GetLightConeZ(zMin, zMax,
812 HadronPt.x(), HadronPt.y());
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();
902 while (! StopFragmenting(currentString) )
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;
931G4bool G4LundStringFragmentation::
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()));
975G4bool G4LundStringFragmentation::
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]);
1042 if(StringMass >= LeftHadronMass + RightHadronMass)
1044 G4double FS_Psqr=lambda(StringMassSqr,
sqr(LeftHadronMass),
1045 sqr(RightHadronMass));
1047 FS_Weight[NumberOf_FS]=std::sqrt(FS_Psqr)*FS_Psqr*
1048 BaryonWeight[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]*
1049 BaryonWeight[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]*
1050 Prob_QQbar[ProdQ-1];
1052 FS_LeftHadron[NumberOf_FS] = LeftHadron;
1053 FS_RightHadron[NumberOf_FS]= RightHadron;
1059 if(NumberOf_FS > 34)
1060 {
G4int Uzhi;
G4cout<<
"QQ_QQbar string #_FS "<<NumberOf_FS<<G4endl; G4cin>>Uzhi;}
1065 }
while(Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]!=0);
1068 }
while(Baryon[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]!=0);
1075G4bool G4LundStringFragmentation::
1080 G4double StringMass =
string->Mass();
1088 Quark =
string->GetLeftParton();
1089 Di_Quark=
string->GetRightParton();
1092 Quark =
string->GetRightParton();
1093 Di_Quark=
string->GetLeftParton();
1097 G4int AbsIDquark =std::abs(IDquark);
1099 G4int AbsIDdi_quark=std::abs(IDdi_quark);
1100 G4int Di_q1=AbsIDdi_quark/1000;
1101 G4int Di_q2=(AbsIDdi_quark-Di_q1*1000)/100;
1105 if(IDdi_quark < 0) SignDiQ=-1;
1108 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1113 if(IDquark == 2) SignQ= 1;
1114 if((IDquark == 1) && (ProdQ == 3)) SignQ= 1;
1115 if((IDquark == 3) && (ProdQ == 1)) SignQ=-1;
1119 if(IDquark == -2) SignQ=-1;
1120 if((IDquark ==-1) && (ProdQ == 3)) SignQ=-1;
1121 if((IDquark ==-3) && (ProdQ == 1)) SignQ= 1;
1124 if(AbsIDquark == ProdQ) SignQ= 1;
1135 Meson[AbsIDquark-1][ProdQ-1][StateQ]);
1145 Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]);
1152 if(StringMass >= LeftHadronMass + RightHadronMass)
1154 G4double FS_Psqr=lambda(StringMassSqr,
sqr(LeftHadronMass),
1155 sqr(RightHadronMass));
1156 FS_Weight[NumberOf_FS]=std::sqrt(FS_Psqr)*
1157 MesonWeight[AbsIDquark-1][ProdQ-1][StateQ]*
1158 BaryonWeight[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]*
1159 Prob_QQbar[ProdQ-1];
1161 FS_LeftHadron[NumberOf_FS] = LeftHadron;
1162 FS_RightHadron[NumberOf_FS]= RightHadron;
1168 if(NumberOf_FS > 34)
1169 {
G4int Uzhi;
G4cout<<
"QQbar string #_FS "<<NumberOf_FS<<G4endl; G4cin>>Uzhi;}
1174 }
while(Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]!=0);
1177 }
while(Meson[AbsIDquark-1][ProdQ-1][StateQ]!=0);
1184G4bool G4LundStringFragmentation::
1189 G4double StringMass =
string->Mass();
1197 Quark =
string->GetLeftParton();
1198 Anti_Quark=
string->GetRightParton();
1201 Quark =
string->GetRightParton();
1202 Anti_Quark=
string->GetLeftParton();
1207 G4int AbsIDquark =std::abs(IDquark);
1209 G4int AbsIDanti_quark=std::abs(IDanti_quark);
1212 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1216 if(IDquark == 2) SignQ= 1;
1217 if((IDquark == 1) && (ProdQ == 3)) SignQ= 1;
1218 if((IDquark == 3) && (ProdQ == 1)) SignQ=-1;
1219 if(IDquark == ProdQ) SignQ= 1;
1222 if(IDanti_quark == -2) SignAQ=-1;
1223 if((IDanti_quark ==-1) && (ProdQ == 3)) SignAQ=-1;
1224 if((IDanti_quark ==-3) && (ProdQ == 1)) SignAQ= 1;
1225 if(AbsIDanti_quark == ProdQ) SignAQ= 1;
1231 Meson[AbsIDquark-1][ProdQ-1][StateQ]);
1239 Meson[AbsIDanti_quark-1][ProdQ-1][StateAQ]);
1243 if(StringMass >= LeftHadronMass + RightHadronMass)
1245 G4double FS_Psqr=lambda(StringMassSqr,
sqr(LeftHadronMass),
1246 sqr(RightHadronMass));
1248 FS_Weight[NumberOf_FS]=std::sqrt(FS_Psqr)*
1249 MesonWeight[AbsIDquark-1][ProdQ-1][StateQ]*
1250 MesonWeight[AbsIDanti_quark-1][ProdQ-1][StateAQ]*
1251 Prob_QQbar[ProdQ-1];
1255 FS_LeftHadron[NumberOf_FS] = RightHadron;
1256 FS_RightHadron[NumberOf_FS]= LeftHadron;
1259 FS_LeftHadron[NumberOf_FS] = LeftHadron;
1260 FS_RightHadron[NumberOf_FS]= RightHadron;
1266 if(NumberOf_FS > 34)
1267 {
G4int Uzhi;
G4cout<<
"QQbar string #_FS "<<NumberOf_FS<<G4endl; G4cin>>Uzhi;}
1269 }
while(Meson[AbsIDanti_quark-1][ProdQ-1][StateAQ]!=0);
1270 }
while(Meson[AbsIDquark-1][ProdQ-1][StateQ]!=0);
1277G4int G4LundStringFragmentation::SampleState(
void)
1280 for(
G4int i=0; i<NumberOf_FS; i++) {SumWeights+=FS_Weight[i];}
1284 G4int indexPosition = 0;
1286 for(
G4int i=0; i<NumberOf_FS; i++)
1288 Sum+=(FS_Weight[i]/SumWeights);
1290 if(Sum >= ksi)
break;
1292 return indexPosition;
CLHEP::HepLorentzVector G4LorentzVector
G4DLLIMPORT std::ostream G4cout
HepLorentzRotation inverse() const
HepLorentzVector & boost(double, double, double)
G4double GetTimeOfCreation() const
const G4ThreeVector & GetPosition() const
G4LorentzRotation TransformToAlignedCms()
G4LorentzVector Get4Momentum() const
G4double LightConeDecay()
G4ParticleDefinition * GetLeftParton(void) const
G4ParticleDefinition * GetRightParton(void) const
G4ParticleDefinition * GetDecayParton() const
G4int GetDecayDirection() const
G4bool FourQuarkString(void) const
G4ParticleDefinition * Build(G4ParticleDefinition *black, G4ParticleDefinition *white)
G4double GetFormationTime() const
void SetPosition(const G4ThreeVector aPosition)
void Set4Momentum(const G4LorentzVector &a4Momentum)
const G4ThreeVector & GetPosition() const
void SetFormationTime(G4double aFormationTime)
const G4LorentzVector & Get4Momentum() const
virtual G4KineticTrackVector * FragmentString(const G4ExcitedString &theString)
G4LundStringFragmentation()
virtual ~G4LundStringFragmentation()
G4double GetPDGMass() const
G4int GetPDGEncoding() const
const G4String & GetParticleSubType() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
std::vector< G4double > scalarMesonMix
G4ThreeVector SampleQuarkPt(G4double ptMax=-1.)
G4KineticTrack * Splitup(G4FragmentingString *string, G4FragmentingString *&newString)
G4HadronBuilder * hadronizer
G4ParticleDefinition * FindParticle(G4int Encoding)
std::vector< G4double > vectorMesonMix
G4int ClusterLoopInterrupt
virtual void SetMassCut(G4double aValue)
void SetDiquarkSuppression(G4double aValue)
void SetStrangenessSuppression(G4double aValue)
G4int StringLoopInterrupt
void SetDiquarkBreakProbability(G4double aValue)
void SetStringTensionParameter(G4double aValue)
void CalculateHadronTimePosition(G4double theInitialStringMass, G4KineticTrackVector *)
G4ExcitedString * CPExcited(const G4ExcitedString &string)
G4KineticTrackVector * LightFragmentationTest(const G4ExcitedString *const theString)