54 Mass_of_light_quark =140.*
MeV;
55 Mass_of_heavy_quark =500.*
MeV;
56 Mass_of_string_junction=720.*
MeV;
58 MinimalStringMass = 0.;
59 MinimalStringMass2 = 0.;
72 for(
G4int i=0; i<3; i++)
73 {
for(
G4int j=0; j<3; j++)
74 {
for(
G4int k=0; k<6; k++)
76 Meson[i][j][k]=0; MesonWeight[i][j][k]=0.;
166 for(
G4int i=0; i<3; i++)
167 {
for(
G4int j=0; j<3; j++)
168 {
for(
G4int k=0; k<3; k++)
169 {
for(
G4int l=0; l<4; l++)
170 { Baryon[i][j][k][l]=0; BaryonWeight[i][j][k][l]=0.;}
179 Baryon[0][0][0][0]=1114;
180 BaryonWeight[0][0][0][0]=1.;
183 Baryon[0][0][1][0]=2112;
186 Baryon[0][0][1][1]=2114;
190 Baryon[0][0][2][0]=3112;
193 Baryon[0][0][2][1]=3114;
197 Baryon[0][1][0][0]=2112;
200 Baryon[0][1][0][1]=2114;
204 Baryon[0][1][1][0]=2212;
207 Baryon[0][1][1][1]=2214;
211 Baryon[0][1][2][0]=3122;
214 Baryon[0][1][2][1]=3212;
217 Baryon[0][1][2][2]=3214;
221 Baryon[0][2][0][0]=3112;
224 Baryon[0][2][0][1]=3114;
228 Baryon[0][2][1][0]=3122;
231 Baryon[0][2][1][1]=3212;
234 Baryon[0][2][1][2]=3214;
238 Baryon[0][2][2][0]=3312;
241 Baryon[0][2][2][1]=3314;
245 Baryon[1][0][0][0]=2112;
248 Baryon[1][0][0][1]=2114;
252 Baryon[1][0][1][0]=2212;
255 Baryon[1][0][1][1]=2214;
259 Baryon[1][0][2][0]=3122;
262 Baryon[1][0][2][1]=3212;
265 Baryon[1][0][2][2]=3214;
269 Baryon[1][1][0][0]=2212;
272 Baryon[1][1][0][1]=2214;
276 Baryon[1][1][1][0]=2224;
277 BaryonWeight[1][1][1][0]=1.;
280 Baryon[1][1][2][0]=3222;
283 Baryon[1][1][2][1]=3224;
287 Baryon[1][2][0][0]=3122;
290 Baryon[1][2][0][1]=3212;
293 Baryon[1][2][0][2]=3214;
297 Baryon[1][2][1][0]=3222;
300 Baryon[1][2][1][1]=3224;
304 Baryon[1][2][2][0]=3322;
307 Baryon[1][2][2][1]=3324;
311 Baryon[2][0][0][0]=3112;
314 Baryon[2][0][0][1]=3114;
318 Baryon[2][0][1][0]=3122;
321 Baryon[2][0][1][1]=3212;
324 Baryon[2][0][1][2]=3214;
328 Baryon[2][0][2][0]=3312;
331 Baryon[2][0][2][1]=3314;
335 Baryon[2][1][0][0]=3122;
338 Baryon[2][1][0][1]=3212;
341 Baryon[2][1][0][2]=3214;
345 Baryon[2][1][1][0]=3222;
348 Baryon[2][1][1][1]=3224;
352 Baryon[2][1][2][0]=3322;
355 Baryon[2][1][2][1]=3324;
359 Baryon[2][2][0][0]=3312;
362 Baryon[2][2][0][1]=3314;
366 Baryon[2][2][1][0]=3322;
369 Baryon[2][2][1][1]=3324;
373 Baryon[2][2][2][0]=3334;
374 BaryonWeight[2][2][2][0]=1.;
398 for (
G4int i=0 ; i<35 ; i++ ) {
399 FS_LeftHadron[i] = 0;
400 FS_RightHadron[i] = 0;
413 void G4LundStringFragmentation::SetMinimalStringMass(
const G4FragmentingString *
const string)
416 G4int Number_of_quarks=0;
417 G4int Number_of_squarks=0;
419 G4double StringM=
string->Get4Momentum().mag();
423 #ifdef debug_LUNDfragmentation
431 if( q1 < 3) {EstimatedMass +=Mass_of_light_quark;}
432 if( q1 > 2) {EstimatedMass +=Mass_of_heavy_quark; Number_of_squarks++;}
434 G4int q2=(Qleft/100)%10;
435 if( q2 < 3) {EstimatedMass +=Mass_of_light_quark;}
436 if( q2 > 2) {EstimatedMass +=Mass_of_heavy_quark; Number_of_squarks++;}
443 if( Qleft < 3) {EstimatedMass +=Mass_of_light_quark;}
444 if( Qleft > 2) {EstimatedMass +=Mass_of_heavy_quark; Number_of_squarks++;}
447 #ifdef debug_LUNDfragmentation
454 G4int q1=Qright/1000;
455 if( q1 < 3) {EstimatedMass +=Mass_of_light_quark;}
456 if( q1 > 2) {EstimatedMass +=Mass_of_heavy_quark; Number_of_squarks++;}
458 G4int q2=(Qright/100)%10;
459 if( q2 < 3) {EstimatedMass +=Mass_of_light_quark;}
460 if( q2 > 2) {EstimatedMass +=Mass_of_heavy_quark; Number_of_squarks++;}
467 if( Qright < 3) {EstimatedMass +=Mass_of_light_quark;}
468 if( Qright > 2) {EstimatedMass +=Mass_of_heavy_quark; Number_of_squarks++;}
471 #ifdef debug_LUNDfragmentation
476 if(Number_of_quarks==2){EstimatedMass += 70.*
MeV;}
478 if(Number_of_quarks==3)
480 if(Number_of_squarks==0) {EstimatedMass += 740.*
MeV;}
481 if(Number_of_squarks==1) {EstimatedMass += 740.*
MeV;}
482 if(Number_of_squarks==2) {EstimatedMass += 400.*
MeV;}
483 if(Number_of_squarks==3) {EstimatedMass += 382.*
MeV;}
485 if(Number_of_quarks==4)
487 if((StringM > 1880.) && ( EstimatedMass < 2100)) {EstimatedMass = 2020.;}
489 else if((StringM > 2232.) && ( EstimatedMass < 2730)){EstimatedMass = 2570.;}
490 else if((StringM > 5130.) && ( EstimatedMass < 3450)){EstimatedMass = 5130.;}
493 if(EstimatedMass <= 1600.*
MeV){EstimatedMass-=200.*
MeV;}
494 else {EstimatedMass+=100.*
MeV;}
498 #ifdef debug_LUNDfragmentation
501 MinimalStringMass=EstimatedMass;
502 SetMinimalStringMass2(EstimatedMass);
506 void G4LundStringFragmentation::SetMinimalStringMass2(
const G4double aValue)
508 MinimalStringMass2=aValue * aValue;
520 SetMinimalStringMass(&aString);
522 #ifdef debug_LUNDfragmentation
525 <<
"------------------------------------"<<
G4endl;
539 #ifdef debug_LUNDfragmentation
540 G4cout<<
"Non fragmentable - the string is converted to one hadron "<<
G4endl;
548 LeftVector->operator[](0)->SetPosition(theString.
GetPosition());
550 if(LeftVector->size() > 1)
554 LeftVector->operator[](1)->SetPosition(theString.
GetPosition());
559 #ifdef debug_LUNDfragmentation
569 #ifdef debug_LUNDfragmentation
576 #ifdef debug_LUNDfragmentation
581 <<
"------------------------------------"<<
G4endl;
587 G4bool success = Loop_toFragmentString(theStringInCMS, LeftVector, RightVector);
589 delete theStringInCMS;
601 while(!RightVector->empty())
603 LeftVector->push_back(RightVector->back());
604 RightVector->erase(RightVector->end()-1);
615 for(
size_t C1 = 0;
C1 < LeftVector->size();
C1++)
620 Momentum = toObserverFrame*Momentum;
624 Momentum = toObserverFrame*Coordinate;
627 Hadron->
SetPosition(PositionOftheStringCreation+aPosition);
636 SetMinimalStringMass(
string);
639 return MinimalStringMass <
string->Get4Momentum().mag();
645 SetMinimalStringMass(
string);
653 MinimalStringMass*MinimalStringMass));
664 #ifdef debug_LUNDfragmentation
665 G4cout<<
"Split last-----------------------------------------"<<
G4endl;
669 G4ThreeVector ClusterVel=
string->Get4Momentum().boostVector();
675 for(
G4int i=0; i<35; i++) {FS_Weight[i]=0.;}
677 #ifdef debug_LUNDfragmentation
678 G4cout<<
"StrMass "<<StringMass<<
" q "
679 <<
string->GetLeftParton()->GetParticleName()<<
" "
680 <<
string->GetRightParton()->GetParticleName()<<
G4endl;
683 string->SetLeftPartonStable();
690 if(StringMass-MinimalStringMass < 0.)
692 if (! Diquark_AntiDiquark_belowThreshold_lastSplitting(
string, LeftHadron, RightHadron) )
697 Diquark_AntiDiquark_aboveThreshold_lastSplitting(
string, LeftHadron, RightHadron);
699 if(NumberOf_FS == 0)
return false;
701 G4int sampledState = SampleState();
704 LeftHadron =FS_LeftHadron[sampledState];
705 RightHadron=FS_RightHadron[sampledState];
707 LeftHadron =FS_RightHadron[sampledState];
708 RightHadron=FS_LeftHadron[sampledState];
713 if (string->
DecayIsQuark() &&
string->StableIsQuark() ) {
715 #ifdef debug_LUNDfragmentation
719 Quark_AntiQuark_lastSplitting(
string, LeftHadron, RightHadron);
722 #ifdef debug_LUNDfragmentation
726 Quark_Diquark_lastSplitting(
string, LeftHadron, RightHadron);
729 if(NumberOf_FS == 0)
return false;
730 G4int sampledState = SampleState();
731 LeftHadron =FS_LeftHadron[sampledState];
732 RightHadron=FS_RightHadron[sampledState];
734 #ifdef debug_LUNDfragmentation
735 G4cout<<
"Selected LeftHad RightHad "<<sampledState<<
" "
736 <<LeftHadron->GetParticleName()<<
" "<<RightHadron->GetParticleName()<<
G4endl;
744 Sample4Momentum(&LeftMom, LeftHadron->GetPDGMass(), &RightMom, RightHadron->GetPDGMass(), StringMass);
746 LeftMom.
boost(ClusterVel);
747 RightMom.
boost(ClusterVel);
749 LeftVector->push_back(
new G4KineticTrack(LeftHadron, 0, Pos, LeftMom));
750 RightVector->push_back(
new G4KineticTrack(RightHadron, 0, Pos, RightMom));
766 #ifdef debug_LUNDfragmentation
767 G4cout<<
"Sampling of momenta of 2 last produced hadrons ----------------"<<
G4endl;
768 G4cout<<
"Masses "<<InitialMass<<
" "<<Mass<<
" "<<AntiMass<<
G4endl;
771 if((Mass > 930. || AntiMass > 930.) && (
G4UniformRand() < ProbIsotropy)) {
773 G4double r_val =
sqr(InitialMass*InitialMass - Mass*Mass - AntiMass*AntiMass) -
774 sqr(2.*Mass*AntiMass);
775 G4double Pabs = (r_val > 0.)? std::sqrt(r_val)/(2.*InitialMass) : 0;
780 G4double st = std::sqrt(1. - pz * pz)*Pabs;
787 Mom->
setE(std::sqrt(Pabs*Pabs + Mass*Mass));
790 AntiMom->
setE (std::sqrt(Pabs*Pabs + AntiMass*AntiMass));
793 const G4int maxNumberOfLoops = 1000;
794 G4int loopCounter = 0;
799 G4double termD = InitialMass*InitialMass -Mass*Mass - AntiMass*AntiMass;
801 G4double termN = 2*termD + 4*Mass*Mass + 4*AntiMass*AntiMass;
802 G4double pt2max=(termD*termD - termab )/ termN ;
807 MassMt2 = Mass * Mass + Pt2;
808 AntiMassMt2= AntiMass * AntiMass + Pt2;
810 AvailablePz2=
sqr(InitialMass*InitialMass - MassMt2 - AntiMassMt2) -
811 4.*MassMt2*AntiMassMt2;
813 }
while( (AvailablePz2 < 0.) &&
814 ++loopCounter < maxNumberOfLoops );
816 if ( loopCounter >= maxNumberOfLoops ) {
820 AvailablePz2 /=(4.*InitialMass*InitialMass);
821 AvailablePz = std::sqrt(AvailablePz2);
827 Mom->
setE(std::sqrt(MassMt2+AvailablePz2));
829 AntiMom->
setPx(-Px); AntiMom->
setPy(-Py); AntiMom->
setPz(-AvailablePz);
830 AntiMom->
setE (std::sqrt(AntiMassMt2+AvailablePz2));
840 G4double StringMT2=
string->MassT2();
841 G4double StringMT =std::sqrt(StringMT2);
845 SetMinimalStringMass(newString);
847 #ifdef debug_LUNDfragmentation
849 G4cout<<
"String 4 mom, String M and Mt "<<String4Momentum<<
" "<<String4Momentum.
mag()<<
" "<<std::sqrt(StringMT2)<<
G4endl;
851 G4cout<<
"HadM MinimalStringMassLeft StringM hM+sM "<<HadronMass<<
" "<<MinimalStringMass<<
" "
852 <<String4Momentum.
mag()<<
" "<<HadronMass+MinimalStringMass<<
G4endl;
855 if(HadronMass + MinimalStringMass > string->
Mass())
857 #ifdef debug_LUNDfragmentation
858 G4cout<<
"Mass of the string is not sufficient to produce the hadron!"<<
G4endl;
864 String4Momentum.
setPz(0.);
869 G4double HadronMassT2, ResidualMassT2;
879 RemSysPt = StringPt - HadronPt;
881 HadronMassT2 =
sqr(HadronMass) + HadronPt.mag2();
882 ResidualMassT2=
sqr(MinimalStringMass) + RemSysPt.
mag2();
884 }
while(std::sqrt(HadronMassT2) + std::sqrt(ResidualMassT2) > StringMT);
889 G4double Pz2 = (
sqr(StringMT2 - HadronMassT2 - ResidualMassT2) -
890 4*HadronMassT2 * ResidualMassT2)/4./StringMT2;
892 if(Pz2 < 0 ) {
return 0;}
897 G4double zMin = (std::sqrt(HadronMassT2+Pz2) - Pz)/std::sqrt(StringMT2);
899 G4double zMax = (std::sqrt(HadronMassT2+Pz2) + Pz)/std::sqrt(StringMT2);
901 if (zMin >= zMax)
return 0;
904 pHadron, HadronPt.x(), HadronPt.y());
910 (z *
string->LightConeDecay() - HadronMassT2/(z *
string->LightConeDecay())));
911 G4double HadronE = 0.5* (z *
string->LightConeDecay() +
912 HadronMassT2/(z *
string->LightConeDecay()));
916 #ifdef debug_LUNDfragmentation
917 G4cout<<
"string->LightConeDecay() "<<
string->LightConeDecay()<<
G4endl;
918 G4cout<<
"HadronPt,HadronE "<<HadronPt<<
" "<<HadronE<<
G4endl;
928 G4double G4LundStringFragmentation::
935 G4double Mt2 = Px*Px + Py*Py + Mass*Mass;
938 G4double zOfMaxyf(0.), maxYf(1.), z(0.), yf(1.);
939 if(std::abs(PDGEncodingOfDecayParton) < 1000)
945 zOfMaxyf=alund*Mt2/(alund*Mt2 + 1.);
946 maxYf=(1-zOfMaxyf)/zOfMaxyf *
G4Exp(-alund*Mt2/zOfMaxyf);
948 const G4int maxNumberOfLoops = 1000;
949 G4int loopCounter = 0;
953 yf = (1-z)/z *
G4Exp(-alund*Mt2/z);
955 }
while ( (
G4UniformRand()*maxYf > yf) && ++loopCounter < maxNumberOfLoops );
956 if ( loopCounter >= maxNumberOfLoops ) {
957 z = 0.5*(zmin + zmax);
962 if(std::abs(PDGEncodingOfDecayParton) > 1000)
1002 #ifdef debug_LUNDfragmentation
1008 G4bool final_success=
false;
1009 G4bool inner_success=
true;
1018 LeftVector->clear();
1020 RightVector->clear();
1024 const G4int maxNumberOfLoops = 1000;
1025 G4int loopCounter = -1;
1026 while ( (! StopFragmenting(currentString)) && ++loopCounter < maxNumberOfLoops )
1028 #ifdef debug_LUNDfragmentation
1036 #ifdef debug_LUNDfragmentation
1042 LeftVector->push_back(Hadron);
1044 RightVector->push_back(Hadron);
1046 delete currentString;
1047 currentString=newString;
1050 if ( loopCounter >= maxNumberOfLoops ) {
1051 inner_success=
false;
1055 #ifdef debug_LUNDfragmentation
1056 G4cout<<
"Split remaining string into 2 final hadrons."<<
G4endl;
1059 if ( inner_success && SplitLast(currentString, LeftVector, RightVector) )
1065 delete currentString;
1067 return final_success;
1071 G4bool G4LundStringFragmentation::
1077 G4int cClusterInterrupt = 0;
1083 G4int LeftQuark1=
string->GetLeftParton()->GetPDGEncoding()/1000;
1084 G4int LeftQuark2=(
string->GetLeftParton()->GetPDGEncoding()/100)%10;
1086 G4int RightQuark1=
string->GetRightParton()->GetPDGEncoding()/1000;
1087 G4int RightQuark2=(
string->GetRightParton()->GetPDGEncoding()/100)%10;
1100 while ((StringMass <= LeftHadron->GetPDGMass() + RightHadron->
GetPDGMass()));
1106 G4bool G4LundStringFragmentation::
1113 G4double StringMass =
string->Mass();
1119 Anti_Di_Quark =
string->GetLeftParton();
1120 Di_Quark=
string->GetRightParton();
1122 Anti_Di_Quark =
string->GetRightParton();
1123 Di_Quark=
string->GetLeftParton();
1127 G4int AbsIDAnti_di_quark =std::abs(IDAnti_di_quark);
1129 G4int AbsIDdi_quark =std::abs(IDdi_quark);
1131 G4int ADi_q1=AbsIDAnti_di_quark/1000;
1132 G4int ADi_q2=(AbsIDAnti_di_quark-ADi_q1*1000)/100;
1134 G4int Di_q1=AbsIDdi_quark/1000;
1135 G4int Di_q2=(AbsIDdi_quark-Di_q1*1000)/100;
1138 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1141 const G4int maxNumberOfLoops = 1000;
1142 G4int loopCounter = 0;
1146 -Baryon[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]);
1152 const G4int maxNumberOfInternalLoops = 1000;
1153 G4int internalLoopCounter = 0;
1157 +Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]);
1160 if(StringMass > LeftHadronMass + RightHadronMass)
1162 if ( NumberOf_FS > 34 ) {
1164 ed <<
" NumberOf_FS exceeds its limit: NumberOf_FS=" << NumberOf_FS <<
G4endl;
1165 G4Exception(
"G4LundStringFragmentation::Diquark_AntiDiquark_aboveThreshold_lastSplitting ",
1170 G4double FS_Psqr=lambda(StringMassSqr,
sqr(LeftHadronMass),
sqr(RightHadronMass));
1172 FS_Weight[NumberOf_FS]=std::sqrt(FS_Psqr)*FS_Psqr*
1173 BaryonWeight[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]*
1174 BaryonWeight[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]*
1175 Prob_QQbar[ProdQ-1];
1177 FS_LeftHadron[NumberOf_FS] = LeftHadron;
1178 FS_RightHadron[NumberOf_FS]= RightHadron;
1185 }
while( (Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]!=0) &&
1186 ++internalLoopCounter < maxNumberOfInternalLoops );
1187 if ( internalLoopCounter >= maxNumberOfInternalLoops ) {
1192 }
while( (Baryon[ADi_q1-1][ADi_q2-1][ProdQ-1][StateADiQ]!=0) &&
1193 ++loopCounter < maxNumberOfLoops );
1194 if ( loopCounter >= maxNumberOfLoops ) {
1203 G4bool G4LundStringFragmentation::
1208 G4double StringMass =
string->Mass();
1215 Quark =
string->GetLeftParton();
1216 Di_Quark=
string->GetRightParton();
1218 Quark =
string->GetRightParton();
1219 Di_Quark=
string->GetLeftParton();
1223 G4int AbsIDquark =std::abs(IDquark);
1225 G4int AbsIDdi_quark=std::abs(IDdi_quark);
1226 G4int Di_q1=AbsIDdi_quark/1000;
1227 G4int Di_q2=(AbsIDdi_quark-Di_q1*1000)/100;
1230 if(IDdi_quark < 0) SignDiQ=-1;
1233 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1238 if(IDquark == 2) SignQ= 1;
1239 if((IDquark == 1) && (ProdQ == 3)) SignQ= 1;
1240 if((IDquark == 3) && (ProdQ == 1)) SignQ=-1;
1243 if(IDquark == -2) SignQ=-1;
1244 if((IDquark ==-1) && (ProdQ == 3)) SignQ=-1;
1245 if((IDquark ==-3) && (ProdQ == 1)) SignQ= 1;
1248 if(AbsIDquark == ProdQ) SignQ= 1;
1254 const G4int maxNumberOfLoops = 1000;
1255 G4int loopCounter = 0;
1259 SignQ*Meson[AbsIDquark-1][ProdQ-1][StateQ]);
1263 const G4int maxNumberOfInternalLoops = 1000;
1264 G4int internalLoopCounter = 0;
1268 SignDiQ*Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]);
1271 if(StringMass > LeftHadronMass + RightHadronMass)
1273 if ( NumberOf_FS > 34 ) {
1275 ed <<
" NumberOf_FS exceeds its limit: NumberOf_FS=" << NumberOf_FS <<
G4endl;
1276 G4Exception(
"G4LundStringFragmentation::Quark_Diquark_lastSplitting ",
1281 G4double FS_Psqr=lambda(StringMassSqr,
sqr(LeftHadronMass),
sqr(RightHadronMass));
1282 FS_Weight[NumberOf_FS]=std::sqrt(FS_Psqr)*MesonWeight[AbsIDquark-1][ProdQ-1][StateQ]*
1283 BaryonWeight[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]*
1284 Prob_QQbar[ProdQ-1];
1286 FS_LeftHadron[NumberOf_FS] = LeftHadron;
1287 FS_RightHadron[NumberOf_FS]= RightHadron;
1294 }
while( (Baryon[Di_q1-1][Di_q2-1][ProdQ-1][StateDiQ]!=0) &&
1295 ++internalLoopCounter < maxNumberOfInternalLoops );
1296 if ( internalLoopCounter >= maxNumberOfInternalLoops ) {
1301 }
while( (Meson[AbsIDquark-1][ProdQ-1][StateQ]!=0) &&
1302 ++loopCounter < maxNumberOfLoops );
1303 if ( loopCounter >= maxNumberOfLoops ) {
1312 G4bool G4LundStringFragmentation::
1317 G4double StringMass =
string->Mass();
1324 Quark =
string->GetLeftParton();
1325 Anti_Quark=
string->GetRightParton();
1327 Quark =
string->GetRightParton();
1328 Anti_Quark=
string->GetLeftParton();
1332 G4int AbsIDquark =std::abs(IDquark);
1334 G4int AbsIDanti_quark=std::abs(IDanti_quark);
1337 for(
G4int ProdQ=1; ProdQ < 4; ProdQ++)
1340 if(IDquark == 2) SignQ= 1;
1341 if((IDquark == 1) && (ProdQ == 3)) SignQ= 1;
1342 if((IDquark == 3) && (ProdQ == 1)) SignQ=-1;
1343 if(IDquark == ProdQ) SignQ= 1;
1346 if(IDanti_quark == -2) SignAQ=-1;
1347 if((IDanti_quark ==-1) && (ProdQ == 3)) SignAQ=-1;
1348 if((IDanti_quark ==-3) && (ProdQ == 1)) SignAQ= 1;
1349 if(AbsIDanti_quark == ProdQ) SignAQ= 1;
1352 const G4int maxNumberOfLoops = 1000;
1353 G4int loopCounter = 0;
1357 SignQ*Meson[AbsIDquark-1][ProdQ-1][StateQ]);
1361 const G4int maxNumberOfInternalLoops = 1000;
1362 G4int internalLoopCounter = 0;
1366 SignAQ*Meson[AbsIDanti_quark-1][ProdQ-1][StateAQ]);
1369 if(StringMass > LeftHadronMass + RightHadronMass)
1371 if ( NumberOf_FS > 34 ) {
1373 ed <<
" NumberOf_FS exceeds its limit: NumberOf_FS=" << NumberOf_FS <<
G4endl;
1374 G4Exception(
"G4LundStringFragmentation::Quark_AntiQuark_lastSplitting ",
1379 G4double FS_Psqr=lambda(StringMassSqr,
sqr(LeftHadronMass),
sqr(RightHadronMass));
1381 FS_Weight[NumberOf_FS]=std::sqrt(FS_Psqr)*MesonWeight[AbsIDquark-1][ProdQ-1][StateQ]*
1382 MesonWeight[AbsIDanti_quark-1][ProdQ-1][StateAQ]*
1383 Prob_QQbar[ProdQ-1];
1386 FS_LeftHadron[NumberOf_FS] = RightHadron;
1387 FS_RightHadron[NumberOf_FS]= LeftHadron;
1389 FS_LeftHadron[NumberOf_FS] = LeftHadron;
1390 FS_RightHadron[NumberOf_FS]= RightHadron;
1397 }
while( (Meson[AbsIDanti_quark-1][ProdQ-1][StateAQ]!=0) &&
1398 ++internalLoopCounter < maxNumberOfInternalLoops );
1399 if ( internalLoopCounter >= maxNumberOfInternalLoops ) {
1404 }
while( (Meson[AbsIDquark-1][ProdQ-1][StateQ]!=0) &&
1405 ++loopCounter < maxNumberOfLoops );
1406 if ( loopCounter >= maxNumberOfLoops ) {
1414 G4int G4LundStringFragmentation::SampleState(
void)
1416 if ( NumberOf_FS > 34 ) {
1418 ed <<
" NumberOf_FS exceeds its limit: NumberOf_FS=" << NumberOf_FS <<
G4endl;
1425 for(
G4int i=0; i<NumberOf_FS; i++) {SumWeights+=FS_Weight[i];}
1429 G4int indexPosition = 0;
1431 for(
G4int i=0; i<NumberOf_FS; i++)
1433 Sum+=(FS_Weight[i]/SumWeights);
1435 if(Sum >= ksi)
break;
1437 return indexPosition;
1455 G4int Swap = stableQuarkEncoding;
1456 stableQuarkEncoding = decayQuarkEncoding;
1457 decayQuarkEncoding = Swap;
1460 G4int IsParticle=(decayQuarkEncoding>0) ? -1 : +1;
1470 G4int QuarkEncoding=QuarkPair.second->GetPDGEncoding();
1471 G4int i10 =
std::max(std::abs(QuarkEncoding), std::abs(stableQuarkEncoding));
1472 G4int i20 =
std::min(std::abs(QuarkEncoding), std::abs(stableQuarkEncoding));
1474 G4int NewDecayEncoding = -1*IsParticle*(i10 * 1000 + i20 * 100 + spin);
1491 created = QuarkPair.second;
virtual G4KineticTrackVector * FragmentString(const G4ExcitedString &theString)
G4ParticleDefinition * GetRightParton(void) const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
std::ostringstream G4ExceptionDescription
const G4ThreeVector & GetPosition() const
G4ExcitedString * CPExcited(const G4ExcitedString &string)
void SetFormationTime(G4double aFormationTime)
void SetStrangenessSuppression(G4double aValue)
const G4LorentzVector & Get4Momentum() const
G4ParticleDefinition * Build(G4ParticleDefinition *black, G4ParticleDefinition *white)
G4int StringLoopInterrupt
G4Parton * GetLeftParton(void) const
G4int ClusterLoopInterrupt
G4int GetPDGEncoding() const
G4ThreeVector SampleQuarkPt(G4double ptMax=-1.)
std::vector< G4double > vectorMesonMix
const G4String & GetParticleSubType() const
virtual void SetMassCut(G4double aValue)
const G4String & GetParticleName() const
G4ParticleDefinition * GetDecayParton() const
pDefPair CreatePartonPair(G4int NeedParticle, G4bool AllowDiquarks=true)
void SetStringTensionParameter(G4double aValue)
const G4ThreeVector & GetPosition() const
G4ParticleDefinition * GetLeftParton(void) const
void SetDiquarkBreakProbability(G4double aValue)
G4double GetStrangeSuppress()
G4GLOB_DLL std::ostream G4cout
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
G4KineticTrackVector * LightFragmentationTest(const G4ExcitedString *const theString)
G4LorentzVector Get4Momentum() const
G4double GetFormationTime() const
std::pair< G4ParticleDefinition *, G4ParticleDefinition * > pDefPair
G4LorentzRotation TransformToAlignedCms()
HepLorentzVector & boost(double, double, double)
G4ParticleDefinition * FindParticle(G4int Encoding)
void SetPosition(const G4ThreeVector aPosition)
G4int GetDecayDirection() const
void Set4Momentum(const G4LorentzVector &a4Momentum)
G4LundStringFragmentation()
G4bool FourQuarkString(void) const
std::vector< G4double > scalarMesonMix
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4Parton * GetRightParton(void) const
virtual ~G4LundStringFragmentation()
G4HadronBuilder * hadronizer
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
static constexpr double c_light
G4double GetTimeOfCreation() const
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static constexpr double GeV
G4double DiquarkBreakProb
G4int GetDirection(void) const
static constexpr double MeV
static constexpr double pi
HepLorentzRotation inverse() const
static constexpr double fermi
const G4LorentzVector & Get4Momentum() const
void CalculateHadronTimePosition(G4double theInitialStringMass, G4KineticTrackVector *)
const G4ParticleDefinition * GetDefinition() const
G4KineticTrack * Splitup(G4FragmentingString *string, G4FragmentingString *&newString)
void SetDiquarkSuppression(G4double aValue)
CLHEP::HepLorentzVector G4LorentzVector