51 nCutMax(7),ThresholdParameter(0.000*GeV),
52 QGSMThreshold(3*GeV),theNucleonRadius(1.5*fermi),alpha(-0.5),beta(2.5)
55 SetCofNuclearDestruction(1.);
56 SetR2ofNuclearDestruction( 1.5*fermi*fermi );
57 SetDofNuclearDestruction( 0.3 );
58 SetPt2ofNuclearDestruction( 0.075*GeV*GeV );
59 SetMaxPt2ofNuclearDestruction( 1.0*GeV*GeV );
60 SetExcitationEnergyPerWoundedNucleon( 40.0*MeV );
62 sigmaPt=0.25*
sqr(GeV);
67 ThresholdParameter(right.ThresholdParameter), QGSMThreshold(right.QGSMThreshold),
68 theNucleonRadius(right.theNucleonRadius)
75 theProjectile = thePrimary;
81 NumberOfInvolvedNucleonsOfProjectile= 0;
83 ProjectileResidualMassNumber = 0;
84 ProjectileResidualCharge = 0;
85 ProjectileResidualExcitationEnergy = 0.0;
86 ProjectileResidual4Momentum = tmp;
88 NumberOfInvolvedNucleonsOfTarget= 0;
91 TargetResidualExcitationEnergy = 0.0;
98 TargetResidual4Momentum = tmp;
104 ProjectileResidualExcitationEnergy = 0.0;
109 #ifdef debugQGSParticipants
112 <<ProjectileResidual4Momentum<<
G4endl;
114 << TargetResidual4Momentum<<
G4endl;
119 const G4int maxNumberOfLoops = 1000;
120 G4int loopCounter = 0;
123 const G4int maxNumberOfInternalLoops = 1000;
124 G4int internalLoopCounter = 0;
133 GetList( theProjectile );
138 StoreInvolvedNucleon();
142 Success = PutOnMassShell();
144 if(!Success) PrepareInitialState( thePrimary );
146 }
while( (!Success) && ++internalLoopCounter < maxNumberOfInternalLoops );
148 if ( internalLoopCounter >= maxNumberOfInternalLoops ) {
153 #ifdef debugQGSParticipants
159 #ifdef debugQGSParticipants
166 #ifdef debugQGSParticipants
167 G4cout<<
"Perform non-Diffractive Collisions if they happend. Determine Parton Momenta and so on." <<
G4endl;
172 if(!Success) PrepareInitialState( thePrimary );
174 }
while( (!Success) && ++loopCounter < maxNumberOfLoops );
176 if ( loopCounter >= maxNumberOfLoops ) {
178 #ifdef debugQGSParticipants
188 #ifdef debugQGSParticipants
194 #ifdef debugQGSParticipants
199 if( Regge )
delete Regge;
205 #ifdef debugQGSParticipants
206 G4cout<<
"Erasing of involved target nucleons "<<NumberOfInvolvedNucleonsOfTarget<<
G4endl;
209 if ( NumberOfInvolvedNucleonsOfTarget != 0 ) {
210 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
212 if ( (aNucleon != 0 ) && (aNucleon->
GetStatus() >= 1) )
delete aNucleon;
217 if ( NumberOfInvolvedNucleonsOfProjectile != 0 ) {
218 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
220 if ( aNucleon )
delete aNucleon;
224 #ifdef debugQGSParticipants
225 G4cout<<
"Delition of target nucleons from soft interactions "<<
theTargets.size()
238void G4QGSParticipants::PrepareInitialState(
const G4ReactionProduct& thePrimary )
244 if( pProjectile )
delete pProjectile;
256 if ( (splaNucleon != 0) && (splaNucleon->
GetStatus() >=1) )
delete splaNucleon;
257 aNucleon->
Hit(
nullptr);
258 NumberOfInvolvedNucleonsOfTarget--;
267 theProjectile = thePrimary;
282 NumberOfInvolvedNucleonsOfTarget= 0;
285 TargetResidualExcitationEnergy = 0.0;
291 TargetResidual4Momentum = Tmp;
296 #ifdef debugQGSParticipants
307 G4double SS=(aPrimaryMomentum + aNucleonMomentum).mag2();
316 #ifdef debugQGSParticipants
317 G4cout <<
"QGSM - BAD situation: pNucleon is NULL ! Leaving immediately!" <<
G4endl;
328 theNucleusOuterR = 0.;
339 const G4int maxNumberOfLoops = 1000;
341 G4int NumberOfTries = 0;
344 G4int loopCounter = -1;
345 while( (
theInteractions.size() == 0) && ++loopCounter < maxNumberOfLoops )
347 InteractionMode =
ALL;
350 std::pair<G4double, G4double> theImpactParameter;
353 if( NumberOfTries == 100*(NumberOfTries/100) ) Scale /=2.0;
356 G4double impactX = theImpactParameter.first;
357 G4double impactY = theImpactParameter.second;
359 #ifdef debugQGSParticipants
361 G4cout<<
"Impact parameter (fm ) "<<std::sqrt(
sqr(impactX)+
sqr(impactY))/fermi<<
" "<<
G4endl;
366 G4int nucleonCount = -1;
373 if(Power <= 0.)
break;
382 G4double Pprd(0.), Ptrd(0.), Pdd(0.);
384 G4int NcutPomerons(0);
387 Pint, Pprd, Ptrd, Pdd, Pnd, Pnvr);
388 #ifdef debugQGSParticipants
389 G4cout<<
"Nucleon & its impact parameter: "<<nucleonCount<<
" "<<std::sqrt(Distance2)/fermi<<
" (fm)"<<
G4endl;
391 G4cout<<
"Probability of PrD, TrD, DD: "<<Pprd<<
" "<<Ptrd<<
" "<<Pdd<<
G4endl;
392 G4cout<<
"Probability of NonDiff, QuarkExc.: "<<Pnd<<
" "<<Pnvr<<
" in inel. inter."<<
G4endl;
399 G4int InteractionType(0);
401 if((InteractionMode==
ALL)||(InteractionMode==
WITHOUT_R))
403 if( rndNumber < Pprd ) {InteractionType =
PrD; InteractionMode =
WITHOUT_R;}
404 else if( rndNumber < Pprd+Ptrd) {InteractionType =
TrD; InteractionMode =
WITHOUT_R;}
405 else if( rndNumber < Pprd+Ptrd+Pdd) {InteractionType =
DD; InteractionMode =
WITHOUT_R;}
406 else if( rndNumber < Pprd+Ptrd+Pdd+Pnd ) {InteractionType =
NonD; InteractionMode =
NON_DIFF;
408 else {InteractionType =
Qexc; InteractionMode =
ALL; }
413 if( rndNumber < Ptrd ) {InteractionType =
TrD; }
414 else if( rndNumber < Ptrd + Pnd) {InteractionType =
NonD; NcutPomerons = Regge->
ncPomerons();}
417 if( (InteractionType ==
NonD) && (NcutPomerons == 0))
continue;
421 tNucleon->
Hit(aTargetSPB);
423 #ifdef debugQGSParticipants
425 G4cout<<
"Target nucleon - "<<nucleonCount<<
" "
427 G4cout<<
"Interaction type:"<<InteractionType
428 <<
" (0 -PrD, 1 - TrD, 2 - DD, 3 - NonD, 4 - Qexc)"<<
G4endl;
429 G4cout<<
"New Inter. mode:"<<InteractionMode
430 <<
" (0 -ALL, 1 - WITHOUT_R, 2 - NON_DIFF)"<<
G4endl;
431 if( InteractionType ==
NonD )
432 G4cout<<
"Number of cutted pomerons: "<<NcutPomerons<<
G4endl;
435 if((InteractionType ==
PrD) || (InteractionType ==
TrD) || (InteractionType ==
DD) ||
436 (InteractionType ==
Qexc))
438 #ifdef debugQGSParticipants
452 aInteraction->
SetStatus(InteractionType);
457 #ifdef debugQGSParticipants
458 G4cout<<
"Non-diffractive interaction occurs, max NcutPomerons "<<NcutPomerons<<
G4endl;
464 for(nCuts = 0; nCuts < NcutPomerons; nCuts++)
466 if(
G4UniformRand() < Power/MaxPower ){Vncut++; Power--;
if(Power <= 0.)
break;}
470 if( nCuts == 0 ) {
delete aTargetSPB; tNucleon->
Hit(
nullptr);
continue;}
473 #ifdef debugQGSParticipants
474 G4cout<<
"Number of cuts in the interaction "<<nCuts<<
G4endl;
488 aInteraction->
SetStatus(InteractionType);
494 #ifdef debugQGSParticipants
500 if ( loopCounter >= maxNumberOfLoops ) {
501 #ifdef debugQGSParticipants
510 std::vector<G4InteractionContent*>::iterator i;
514 if( InteractionMode ==
ALL )
538 aTargetNucleon->
Hit(
nullptr);
551 #ifdef debugQGSParticipants
558void G4QGSParticipants::StoreInvolvedNucleon()
561 NumberOfInvolvedNucleonsOfTarget = 0;
568 TheInvolvedNucleonsOfTarget[NumberOfInvolvedNucleonsOfTarget] = aNucleon;
569 NumberOfInvolvedNucleonsOfTarget++;
573 #ifdef debugQGSParticipants
575 <<
"Stored # of wounded nucleons of target "
576 << NumberOfInvolvedNucleonsOfTarget <<
G4endl;
583void G4QGSParticipants::ReggeonCascade()
585 #ifdef debugQGSParticipants
587 G4cout<<
"C of nucl. desctruction "<<GetCofNuclearDestruction()
588 <<
" R2 "<<GetR2ofNuclearDestruction()/fermi/fermi<<
" fermi^2"<<
G4endl;
591 G4int InitNINt = NumberOfInvolvedNucleonsOfTarget;
594 for (
G4int InvTN = 0; InvTN < InitNINt; InvTN++ ) {
595 G4Nucleon* aTargetNucleon = TheInvolvedNucleonsOfTarget[ InvTN ];
609 if ( ! Neighbour->AreYouHit() ) {
610 G4double impact2 =
sqr( XofWoundedNucleon - Neighbour->GetPosition().x() ) +
611 sqr( YofWoundedNucleon - Neighbour->GetPosition().y() );
614 G4Exp( -impact2 / GetR2ofNuclearDestruction() )
617 #ifdef debugQGSParticipants
618 G4cout<<
"Target nucleon involved in reggeon cascading No "<<TrgNuc<<
" "
619 <<Neighbour->GetDefinition()->GetParticleName()<<
G4endl;
621 TheInvolvedNucleonsOfTarget[ NumberOfInvolvedNucleonsOfTarget ] = Neighbour;
622 NumberOfInvolvedNucleonsOfTarget++;
626 Neighbour->Hit( targetSplitable );
632 anInteraction->
SetTarget(targetSplitable);
644 #ifdef debugQGSParticipants
645 G4cout <<
"Number of new involved nucleons "<<NumberOfInvolvedNucleonsOfTarget - InitNINt<<
G4endl;
652G4bool G4QGSParticipants::PutOnMassShell() {
654 G4bool isProjectileNucleus =
false;
655 if ( GetProjectileNucleus() ) {
656 isProjectileNucleus =
true;
659 #ifdef debugPutOnMassShell
661 if ( isProjectileNucleus ) {
G4cout <<
"PutOnMassShell for Nucleus_Nucleus " <<
G4endl;}
665 if ( Pprojectile.z() < 0.0 ) {
677 #ifdef debugPutOnMassShell
681 isOk = ComputeNucleusProperties( theTargetNucleus, Ptarget, PtargetResidual, SumMasses,
682 TargetResidualExcitationEnergy, TargetResidualMass,
683 TargetResidualMassNumber, TargetResidualCharge );
685 if ( ! isOk )
return false;
694 if ( ! isProjectileNucleus ) {
695 Mprojectile = Pprojectile.mag();
696 M2projectile = Pprojectile.mag2();
697 SumMasses += Mprojectile + 20.0*MeV;
700 #ifdef debugPutOnMassShell
701 G4cout <<
"Projectile : ";
704 isOk = ComputeNucleusProperties( thePrNucleus, Pproj, PprojResidual, SumMasses,
705 ProjectileResidualExcitationEnergy, PrResidualMass,
706 ProjectileResidualMassNumber, ProjectileResidualCharge );
707 if ( ! isOk )
return false;
714 #ifdef debugPutOnMassShell
717 G4cout <<
"Psum " << Psum/GeV <<
" GeV" <<
G4endl <<
"SqrtS " << SqrtS/GeV <<
" GeV" <<
G4endl
718 <<
"SumMasses, PrResidualMass and TargetResidualMass " << SumMasses/GeV <<
" "
719 << PrResidualMass/GeV <<
" " << TargetResidualMass/GeV <<
" GeV" <<
G4endl;
723 if ( SqrtS < SumMasses ) {
730 G4double savedSumMasses = SumMasses;
731 if ( isProjectileNucleus ) {
732 SumMasses -= std::sqrt(
sqr( PrResidualMass ) + PprojResidual.perp2() );
733 SumMasses += std::sqrt(
sqr( PrResidualMass + ProjectileResidualExcitationEnergy )
734 + PprojResidual.perp2() );
736 SumMasses -= std::sqrt(
sqr( TargetResidualMass ) + PtargetResidual.perp2() );
737 SumMasses += std::sqrt(
sqr( TargetResidualMass + TargetResidualExcitationEnergy )
738 + PtargetResidual.perp2() );
740 if ( SqrtS < SumMasses ) {
741 SumMasses = savedSumMasses;
742 if ( isProjectileNucleus ) {
743 ProjectileResidualExcitationEnergy = 0.0;
745 TargetResidualExcitationEnergy = 0.0;
748 TargetResidualMass += TargetResidualExcitationEnergy;
749 if ( isProjectileNucleus ) {
750 PrResidualMass += ProjectileResidualExcitationEnergy;
753 #ifdef debugPutOnMassShell
754 if ( isProjectileNucleus ) {
755 G4cout <<
"PrResidualMass ProjResidualExcitationEnergy " << PrResidualMass/GeV <<
" "
756 << ProjectileResidualExcitationEnergy <<
" MeV" <<
G4endl;
758 G4cout <<
"TargetResidualMass TargetResidualExcitationEnergy " << TargetResidualMass/GeV <<
" GeV "
759 << TargetResidualExcitationEnergy <<
" MeV" <<
G4endl
760 <<
"Sum masses " << SumMasses/GeV <<
G4endl;
764 if ( isProjectileNucleus && thePrNucleus->
GetMassNumber() != 1 ) {
765 isOk = GenerateDeltaIsobar( SqrtS, NumberOfInvolvedNucleonsOfProjectile,
766 TheInvolvedNucleonsOfProjectile, SumMasses );
770 GenerateDeltaIsobar( SqrtS, NumberOfInvolvedNucleonsOfTarget,
771 TheInvolvedNucleonsOfTarget, SumMasses );
773 if ( ! isOk )
return false;
786 if ( Ptmp.
pz() <= 0.0 ) {
793 if ( isProjectileNucleus ) {
795 YprojectileNucleus = Ptmp.
rapidity();
797 Ptmp = toCms*Ptarget;
802 if ( isProjectileNucleus ) {
803 DcorP = GetDofNuclearDestruction() / thePrNucleus->
GetMassNumber();
806 G4double AveragePt2 = GetPt2ofNuclearDestruction();
807 G4double maxPtSquare = GetMaxPt2ofNuclearDestruction();
809 #ifdef debugPutOnMassShell
810 if ( isProjectileNucleus ) {
811 G4cout <<
"Y projectileNucleus " << YprojectileNucleus <<
G4endl;
813 G4cout <<
"Y targetNucleus " << YtargetNucleus <<
G4endl
814 <<
"Dcor " << GetDofNuclearDestruction()
815 <<
" DcorP DcorT " << DcorP <<
" " << DcorT <<
" AveragePt2 " << AveragePt2 <<
G4endl;
822 G4int NumberOfTries = 0;
824 G4bool OuterSuccess =
true;
826 const G4int maxNumberOfLoops = 1000;
827 G4int loopCounter = 0;
829 G4double sqrtM2proj = 0.0, sqrtM2target = 0.0;
831 const G4int maxNumberOfTries = 1000;
834 if ( NumberOfTries == 100*(NumberOfTries/100) ) {
840 DcorP *= ScaleFactor;
841 DcorT *= ScaleFactor;
842 AveragePt2 *= ScaleFactor;
844 if ( isProjectileNucleus ) {
846 isOk = SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorP,
847 thePrNucleus, PprojResidual,
848 PrResidualMass, ProjectileResidualMassNumber,
849 NumberOfInvolvedNucleonsOfProjectile,
850 TheInvolvedNucleonsOfProjectile, M2proj );
854 SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorT,
855 theTargetNucleus, PtargetResidual,
856 TargetResidualMass, TargetResidualMassNumber,
857 NumberOfInvolvedNucleonsOfTarget,
858 TheInvolvedNucleonsOfTarget, M2target );
860 if ( M2proj < 0.0 ) {
864 <<
") M2proj=" << M2proj <<
" -> sets it to 0.0 !" <<
G4endl;
865 G4Exception(
"G4QGSParticipants::PutOnMassShell(): negative projectile squared mass!",
869 sqrtM2proj = std::sqrt( M2proj );
870 if ( M2target < 0.0 ) {
874 <<
") M2target=" << M2target <<
" -> sets it to 0.0 !" <<
G4endl;
875 G4Exception(
"G4QGSParticipants::PutOnMassShell(): negative target squared mass!",
879 sqrtM2target = std::sqrt( M2target );
881 #ifdef debugPutOnMassShell
882 G4cout <<
"SqrtS, Mp+Mt, Mp, Mt " << SqrtS/GeV <<
" "
883 << ( sqrtM2proj + sqrtM2target )/GeV <<
" "
884 << sqrtM2proj/GeV <<
" " << sqrtM2target/GeV <<
G4endl;
887 if ( ! isOk )
return false;
888 }
while ( ( SqrtS < ( sqrtM2proj + sqrtM2target ) ) &&
889 ++NumberOfTries < maxNumberOfTries );
890 if ( NumberOfTries >= maxNumberOfTries ) {
893 if ( isProjectileNucleus ) {
894 isOk = CheckKinematics(
S, SqrtS, M2proj, M2target, YprojectileNucleus,
true,
895 NumberOfInvolvedNucleonsOfProjectile,
896 TheInvolvedNucleonsOfProjectile,
897 WminusTarget, WplusProjectile, OuterSuccess );
900 CheckKinematics(
S, SqrtS, M2proj, M2target, YtargetNucleus,
false,
901 NumberOfInvolvedNucleonsOfTarget, TheInvolvedNucleonsOfTarget,
902 WminusTarget, WplusProjectile, OuterSuccess );
903 if ( ! isOk )
return false;
904 }
while ( ( ! OuterSuccess ) &&
905 ++loopCounter < maxNumberOfLoops );
906 if ( loopCounter >= maxNumberOfLoops ) {
916 if ( ! isProjectileNucleus ) {
918 G4double Pzprojectile = WplusProjectile/2.0 - M2projectile/2.0/WplusProjectile;
919 G4double Eprojectile = WplusProjectile/2.0 + M2projectile/2.0/WplusProjectile;
920 Pprojectile.setPz( Pzprojectile );
921 Pprojectile.setE( Eprojectile );
923 #ifdef debugPutOnMassShell
924 G4cout <<
"Proj after in CMS " << Pprojectile/GeV <<
" GeV"<<
G4endl;
927 Pprojectile.transform( toLab );
933 #ifdef debugPutOnMassShell
940 isOk = FinalizeKinematics( WplusProjectile,
true, toLab, PrResidualMass,
941 ProjectileResidualMassNumber, NumberOfInvolvedNucleonsOfProjectile,
942 TheInvolvedNucleonsOfProjectile, ProjectileResidual4Momentum );
944 #ifdef debugPutOnMassShell
945 G4cout <<
"Projectile Residual4Momentum in CMS " << ProjectileResidual4Momentum/GeV <<
" GeV"<<
G4endl;
948 if ( ! isOk )
return false;
950 ProjectileResidual4Momentum.
transform( toLab );
952 #ifdef debugPutOnMassShell
953 G4cout <<
"Projectile Residual4Momentum in Lab " << ProjectileResidual4Momentum/GeV <<
" GeV"<<
G4endl;
958 isOk = FinalizeKinematics( WminusTarget,
false, toLab, TargetResidualMass,
959 TargetResidualMassNumber, NumberOfInvolvedNucleonsOfTarget,
960 TheInvolvedNucleonsOfTarget, TargetResidual4Momentum );
962 #ifdef debugPutOnMassShell
963 G4cout <<
"Target Residual4Momentum in CMS " << TargetResidual4Momentum/GeV <<
" GeV "<<
G4endl;
966 if ( ! isOk )
return false;
968 TargetResidual4Momentum.
transform( toLab );
970 #ifdef debugPutOnMassShell
971 G4cout <<
"Target Residual4Momentum in Lab " << TargetResidual4Momentum/GeV <<
" GeV "<<
G4endl;
984 if ( AveragePt2 > 0.0 ) {
985 G4double x = maxPtSquare/AveragePt2;
989 Pt = std::sqrt( Pt2 );
993 return G4ThreeVector( Pt*std::cos(phi), Pt*std::sin(phi), 0.0 );
1002 G4double& residualExcitationEnergy,
1004 G4int& residualMassNumber,
1005 G4int& residualCharge ) {
1017 if ( ! nucleus )
return false;
1019 G4double ExcitationEPerWoundedNucleon = GetExcitationEnergyPerWoundedNucleon();
1042 sumMasses += 20.0*MeV;
1046 residualMassNumber--;
1053 #ifdef debugPutOnMassShell
1054 G4cout <<
"ExcitationEnergyPerWoundedNucleon " << ExcitationEPerWoundedNucleon <<
" MeV"<<
G4endl
1055 <<
"\t Residual Charge, MassNumber " << residualCharge <<
" " << residualMassNumber
1056 <<
G4endl <<
"\t Initial Momentum " << nucleusMomentum/GeV<<
" GeV"
1057 <<
G4endl <<
"\t Residual Momentum " << residualMomentum/GeV<<
" GeV"<<
G4endl;
1060 residualMomentum.
setPz( 0.0 );
1061 residualMomentum.
setE( 0.0 );
1062 if ( residualMassNumber == 0 ) {
1064 residualExcitationEnergy = 0.0;
1067 GetIonMass( residualCharge, residualMassNumber );
1068 if ( residualMassNumber == 1 ) {
1069 residualExcitationEnergy = 0.0;
1072 sumMasses += std::sqrt(
sqr( residualMass ) + residualMomentum.
perp2() );
1079G4bool G4QGSParticipants::
1080GenerateDeltaIsobar(
const G4double sqrtS,
1081 const G4int numberOfInvolvedNucleons,
1099 if ( sqrtS < 0.0 || numberOfInvolvedNucleons <= 0 || sumMasses < 0.0 )
return false;
1103 const G4double probDeltaIsobar = 0.10;
1105 G4int maxNumberOfDeltas =
G4int( (sqrtS - sumMasses)/(400.0*MeV) );
1106 G4int numberOfDeltas = 0;
1108 for (
G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1111 if (
G4UniformRand() < probDeltaIsobar && numberOfDeltas < maxNumberOfDeltas ) {
1113 if ( ! involvedNucleons[i] )
continue;
1120 G4int newPdgCode = pdgCode/10; newPdgCode = newPdgCode*10 + 4;
1129 if ( sqrtS < sumMasses + massDelta - massNuc ) {
1133 sumMasses += ( massDelta - massNuc );
1145G4bool G4QGSParticipants::
1146SamplingNucleonKinematics(
G4double averagePt2,
1152 const G4int residualMassNumber,
1153 const G4int numberOfInvolvedNucleons,
1167 if ( ! nucleus )
return false;
1169 if ( residualMassNumber == 0 && numberOfInvolvedNucleons == 1 ) {
1177 for (
G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1178 G4Nucleon* aNucleon = involvedNucleons[i];
1179 if ( ! aNucleon )
continue;
1183 const G4int maxNumberOfLoops = 1000;
1184 G4int loopCounter = 0;
1191 for (
G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1192 G4Nucleon* aNucleon = involvedNucleons[i];
1193 if ( ! aNucleon )
continue;
1199 if ( x < 0.0 || x > 1.0 ) {
1209 if ( xSum < 0.0 || xSum > 1.0 ) success =
false;
1211 if ( ! success )
continue;
1213 G4double deltaPx = ( ptSum.x() - pResidual.
x() ) / numberOfInvolvedNucleons;
1214 G4double deltaPy = ( ptSum.y() - pResidual.
y() ) / numberOfInvolvedNucleons;
1216 if ( residualMassNumber == 0 ) {
1217 delta = ( xSum - 1.0 ) / numberOfInvolvedNucleons;
1224 for (
G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1225 G4Nucleon* aNucleon = involvedNucleons[i];
1226 if ( ! aNucleon )
continue;
1229 if ( residualMassNumber == 0 ) {
1230 if ( x <= 0.0 || x > 1.0 ) {
1235 if ( x <= 0.0 || x > 1.0 || xSum <= 0.0 || xSum > 1.0 ) {
1243 +
sqr( px ) +
sqr( py ) ) / x;
1248 if ( success && residualMassNumber != 0 ) {
1249 mass2 += (
sqr( residualMass ) + pResidual.
perp2() ) / xSum;
1252 #ifdef debugPutOnMassShell
1253 G4cout <<
"success " << success <<
G4endl <<
" Mt " << std::sqrt( mass2 )/GeV <<
G4endl;
1256 }
while ( ( ! success ) &&
1257 ++loopCounter < maxNumberOfLoops );
1258 if ( loopCounter >= maxNumberOfLoops ) {
1268G4bool G4QGSParticipants::
1269CheckKinematics(
const G4double sValue,
1274 const G4bool isProjectileNucleus,
1275 const G4int numberOfInvolvedNucleons,
1290 G4double decayMomentum2 =
sqr( sValue ) +
sqr( projectileMass2 ) +
sqr( targetMass2 )
1291 - 2.0*sValue*projectileMass2 - 2.0*sValue*targetMass2
1292 - 2.0*projectileMass2*targetMass2;
1293 targetWminus = ( sValue - projectileMass2 + targetMass2 + std::sqrt( decayMomentum2 ) )
1295 projectileWplus = sqrtS - targetMass2/targetWminus;
1296 G4double projectilePz = projectileWplus/2.0 - projectileMass2/2.0/projectileWplus;
1297 G4double projectileE = projectileWplus/2.0 + projectileMass2/2.0/projectileWplus;
1299 if (projectileE - projectilePz > 0.) {
1300 projectileY = 0.5 *
G4Log( (projectileE + projectilePz)/
1301 (projectileE - projectilePz) );
1303 G4double targetPz = -targetWminus/2.0 + targetMass2/2.0/targetWminus;
1304 G4double targetE = targetWminus/2.0 + targetMass2/2.0/targetWminus;
1305 G4double targetY = 0.5 *
G4Log( (targetE + targetPz)/(targetE - targetPz) );
1307 #ifdef debugPutOnMassShell
1308 G4cout <<
"decayMomentum2 " << decayMomentum2 <<
G4endl
1309 <<
"\t targetWminus projectileWplus " << targetWminus <<
" " << projectileWplus <<
G4endl
1310 <<
"\t projectileY targetY " << projectileY <<
" " << targetY <<
G4endl;
1313 for (
G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1314 G4Nucleon* aNucleon = involvedNucleons[i];
1315 if ( ! aNucleon )
continue;
1320 G4double pz = -targetWminus*x/2.0 + mt2/(2.0*targetWminus*x);
1321 G4double e = targetWminus*x/2.0 + mt2/(2.0*targetWminus*x);
1322 if ( isProjectileNucleus ) {
1323 pz = projectileWplus*x/2.0 - mt2/(2.0*projectileWplus*x);
1324 e = projectileWplus*x/2.0 + mt2/(2.0*projectileWplus*x);
1328 #ifdef debugPutOnMassShell
1329 G4cout <<
"i nY pY nY-AY AY " << i <<
" " << nucleonY <<
" " << projectileY <<
G4endl;
1332 if ( std::abs( nucleonY - nucleusY ) > 2 ||
1333 ( isProjectileNucleus && targetY > nucleonY ) ||
1334 ( ! isProjectileNucleus && projectileY < nucleonY ) ) {
1345G4bool G4QGSParticipants::
1346FinalizeKinematics(
const G4double w,
1347 const G4bool isProjectileNucleus,
1350 const G4int residualMassNumber,
1351 const G4int numberOfInvolvedNucleons,
1369 for (
G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1370 G4Nucleon* aNucleon = involvedNucleons[i];
1371 if ( ! aNucleon )
continue;
1373 residual3Momentum -= tmp.
vect();
1377 G4double pz = -w * x / 2.0 + mt2 / ( 2.0 * w * x );
1378 G4double e = w * x / 2.0 + mt2 / ( 2.0 * w * x );
1380 if ( isProjectileNucleus ) pz *= -1.0;
1387 #ifdef debugPutOnMassShell
1388 G4cout <<
"Target involved nucleon No, name, 4Mom "
1393 G4double residualMt2 =
sqr( residualMass ) +
sqr( residual3Momentum.x() )
1394 +
sqr( residual3Momentum.y() );
1396 #ifdef debugPutOnMassShell
1397 G4cout <<
G4endl<<
"w residual3Momentum.z() " << w <<
" " << residual3Momentum.z() <<
G4endl;
1402 if ( residualMassNumber != 0 ) {
1403 residualPz = -w * residual3Momentum.z() / 2.0 +
1404 residualMt2 / ( 2.0 * w * residual3Momentum.z() );
1405 residualE = w * residual3Momentum.z() / 2.0 +
1406 residualMt2 / ( 2.0 * w * residual3Momentum.z() );
1408 if ( isProjectileNucleus ) residualPz *= -1.0;
1411 residual4Momentum.
setPx( residual3Momentum.x() );
1412 residual4Momentum.
setPy( residual3Momentum.y() );
1413 residual4Momentum.
setPz( residualPz );
1414 residual4Momentum.
setE( residualE );
1422 #ifdef debugQGSParticipants
1431 #ifdef debugQGSParticipants
1432 G4cout<<
"Interaction # and its status "
1437 if ( (InterStatus ==
PrD) || (InterStatus ==
TrD) || (InterStatus ==
DD))
1439 #ifdef debugQGSParticipants
1440 G4cout<<
"Simulation of diffractive interaction. "<<InterStatus <<
" PrD/TrD/DD/ND/Qech - 0,1,2,3,4"<<
G4endl;
1445 #ifdef debugQGSParticipants
1446 G4cout<<
"The proj. before inter "
1453 if ( InterStatus ==
PrD )
1456 if ( InterStatus ==
TrD )
1459 if ( InterStatus ==
DD )
1462 #ifdef debugQGSParticipants
1470 if ( InterStatus ==
Qexc )
1472 #ifdef debugQGSParticipants
1473 G4cout<<
"Simulation of interaction with quark exchange."<<
G4endl;
1477 #ifdef debugQGSParticipants
1486 #ifdef debugQGSParticipants
1501 const G4double aHugeValue = 1.0e+10;
1503 #ifdef debugQGSParticipants
1513 G4double VqM_pr(0.), VaqM_pr(0.), VqM_tr(350.), VqqM_tr(700);
1516 #ifdef debugQGSParticipants
1518 <<
"Target nucleon momenta at start"<<
G4endl;
1521 std::vector<G4VSplitableHadron*>::iterator i;
1526 Psum += (*i)->Get4Momentum();
1527 #ifdef debugQGSParticipants
1528 G4cout<<
"Nusleus nucleon # and its 4Mom. "<<NuclNo<<
" "<<(*i)->Get4Momentum()<<
G4endl;
1543 #ifdef debugQGSParticipants
1545 G4cout<<
"Projectile 4 Mom "<<Projectile4Momentum<<
G4endl;
1553 (*i)->Set4Momentum( tmp );
1554 #ifdef debugQGSParticipants
1555 G4cout<<
"Target nucleon # and 4Mom "<<
" "<<NuclNo<<
" "<<(*i)->Get4Momentum()<<
G4endl;
1557 Target4Momentum += tmp;
1564 #ifdef debugQGSParticipants
1566 G4cout<<
"Target nucleons mom: px, py, z_1, m_i"<<
G4endl;
1586 if ( Mass2 < 0.0 ) {
1589 <<
"Â 4-momentum " << Psum <<
G4endl;
1590 ed <<
"LorentzVector tmp " << tmp <<
" with Mass2 " << Mass2 <<
G4endl;
1591 G4Exception(
"G4QGSParticipants::DeterminePartonMomenta(): 4-momentum with negative mass!",
1594 Mass = std::sqrt( Mass2 );
1598 (*i)->Set4Momentum(tmp);
1599 #ifdef debugQGSParticipants
1600 G4cout<<
"Target nucleons # and mom: "<<NuclNo<<
" "<<(*i)->Get4Momentum()<<
G4endl;
1613 G4double ProjSumMt(0.), ProjSumMt2perX(0.);
1614 G4double TargSumMt(0.), TargSumMt2perX(0.);
1630 const G4int maxNumberOfAttempts = 1000;
1633 attempt++;
if( attempt == 100*(attempt/100) ) {SigPt/=2.;}
1635 ProjSumMt=0.; ProjSumMt2perX=0.;
1636 TargSumMt=0.; TargSumMt2perX=0.;
1640 #ifdef debugQGSParticipants
1641 G4cout<<
"attempt ------------------------ "<<attempt<<
G4endl;
1648 G4int NumberOfUnsampledSeaQuarks = 2*nSeaPair;
1651 for (
G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1654 #ifdef debugQGSParticipants
1657 aPtVector = GaussianPt(SigPt, aHugeValue);
1659 SumPx += aPtVector.
x(); SumPy += aPtVector.
y();
1660 Mt = std::sqrt(aPtVector.
mag2()+
sqr(Qmass));
1664 tmp.
setPz(
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1667 NumberOfUnsampledSeaQuarks--;
1668 ProjSumMt2perX +=
sqr(Mt)/tmp.
pz();
1673 #ifdef debugQGSParticipants
1677 aPtVector = GaussianPt(SigPt, aHugeValue);
1679 SumPx += aPtVector.
x(); SumPy += aPtVector.
y();
1680 Mt = std::sqrt(aPtVector.
mag2()+
sqr(Qmass));
1684 tmp.
setPz(
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1687 NumberOfUnsampledSeaQuarks--;
1688 ProjSumMt2perX +=
sqr(Mt)/tmp.
pz();
1691 #ifdef debugQGSParticipants
1698 #ifdef debugQGSParticipants
1701 aPtVector = GaussianPt(SigPt, aHugeValue);
1703 SumPx += aPtVector.
x(); SumPy += aPtVector.
y();
1704 Mt = std::sqrt(aPtVector.
mag2()+
sqr(VqM_pr));
1708 tmp.
setPz(
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1711 ProjSumMt2perX +=
sqr(Mt)/tmp.
pz();
1717 #ifdef debugQGSParticipants
1723 Mt = std::sqrt(
sqr(SumPx) +
sqr(SumPy) +
sqr(VaqM_pr) );
1727 ProjSumMt2perX +=
sqr(Mt)/tmp.
pz();
1730 #ifdef debugQGSParticipants
1731 G4cout<<
" "<<tmp<<
" "<<SumZ+(1.-SumZ)<<
" (z-fraction)"<<
G4endl;
1741 nSeaPair = (*i)->GetSoftCollisionCount()-1;
1742 #ifdef debugQGSParticipants
1744 <<
"Target nucleon 4Mom "<<(*i)->Get4Momentum()<<
G4endl;
1747 SumPx = (*i)->Get4Momentum().px() * (-1.);
1748 SumPy = (*i)->Get4Momentum().py() * (-1.);
1752 NumberOfUnsampledSeaQuarks = 2*nSeaPair;
1755 for (
G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1757 aParton = (*i)->GetNextParton();
1758 #ifdef debugQGSParticipants
1761 aPtVector = GaussianPt(SigPt, aHugeValue);
1763 SumPx += aPtVector.
x(); SumPy += aPtVector.
y();
1764 Mt=std::sqrt(aPtVector.
mag2()+
sqr(Qmass));
1768 tmp.
setPz(
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1770 tmp.
setPz((*i)->Get4Momentum().pz()*tmp.
pz());
1772 NumberOfUnsampledSeaQuarks--;
1773 TargSumMt2perX +=
sqr(Mt)/tmp.
pz();
1777 aParton = (*i)->GetNextAntiParton();
1778 #ifdef debugQGSParticipants
1782 aPtVector = GaussianPt(SigPt, aHugeValue);
1784 SumPx += aPtVector.
x(); SumPy += aPtVector.
y();
1785 Mt=std::sqrt(aPtVector.
mag2()+
sqr(Qmass));
1789 tmp.
setPz(
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1791 tmp.
setPz((*i)->Get4Momentum().pz()*tmp.
pz());
1793 NumberOfUnsampledSeaQuarks--;
1794 TargSumMt2perX +=
sqr(Mt)/tmp.
pz();
1797 #ifdef debugQGSParticipants
1803 aParton = (*i)->GetNextParton();
1804 #ifdef debugQGSParticipants
1807 aPtVector = GaussianPt(SigPt, aHugeValue);
1809 SumPx += aPtVector.
x(); SumPy += aPtVector.
y();
1810 Mt=std::sqrt(aPtVector.
mag2()+
sqr(VqM_tr));
1814 tmp.
setPz(
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1816 tmp.
setPz((*i)->Get4Momentum().pz()*tmp.
pz());
1818 TargSumMt2perX +=
sqr(Mt)/tmp.
pz();
1823 aParton = (*i)->GetNextAntiParton();
1824 #ifdef debugQGSParticipants
1826 G4cout<<
" "<<tmp<<
" "<<SumZw<<
" (sum z-fracs) "<<SumZ<<
" (total z-sum) "<<
G4endl;
1830 Mt=std::sqrt(
sqr(SumPx) +
sqr(SumPy) +
sqr(VqqM_tr) );
1833 tmp.
setPz((*i)->Get4Momentum().pz()*(1.0 - SumZ));
1835 TargSumMt2perX +=
sqr(Mt)/tmp.
pz();
1838 #ifdef debugQGSParticipants
1839 G4cout<<
" "<<tmp<<
" "<<SumZw<<
" "<<1.0<<
" "<<(*i)->Get4Momentum().
pz()<<
G4endl;
1844 if( ProjSumMt + TargSumMt > SqrtS ) {
1845 Success =
false;
continue;}
1846 if( std::sqrt(ProjSumMt2perX) + std::sqrt(TargSumMt2perX) > SqrtS ) {
1847 Success =
false;
continue;}
1849 }
while( (!Success) &&
1850 attempt < maxNumberOfAttempts );
1852 if ( attempt >= maxNumberOfAttempts ) {
1859 - 2.0*
S*ProjSumMt2perX - 2.0*
S*TargSumMt2perX - 2.0*ProjSumMt2perX*TargSumMt2perX;
1861 G4double targetWminus=(
S - ProjSumMt2perX + TargSumMt2perX + std::sqrt( DecayMomentum2 ))/2.0/SqrtS;
1862 G4double projectileWplus = SqrtS - TargSumMt2perX/targetWminus;
1868 #ifdef debugQGSParticipants
1869 G4cout<<
"Backward transformation ===================="<<
G4endl;
1873 for (
G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1876 #ifdef debugQGSParticipants
1881 Tmp.
setPz(projectileWplus*z/2.0 - Tmp.
e()/(2.0*z*projectileWplus));
1882 Tmp.
setE( projectileWplus*z/2.0 + Tmp.
e()/(2.0*z*projectileWplus));
1888 #ifdef debugQGSParticipants
1893 Tmp.
setPz(projectileWplus*z/2.0 - Tmp.
e()/(2.0*z*projectileWplus));
1894 Tmp.
setE( projectileWplus*z/2.0 + Tmp.
e()/(2.0*z*projectileWplus));
1898 #ifdef debugQGSParticipants
1905 #ifdef debugQGSParticipants
1909 Tmp.
setPz(projectileWplus*z/2.0 - Tmp.
e()/(2.0*z*projectileWplus));
1910 Tmp.
setE( projectileWplus*z/2.0 + Tmp.
e()/(2.0*z*projectileWplus));
1917 #ifdef debugQGSParticipants
1922 Tmp.
setPz(projectileWplus*z/2.0 - Tmp.
e()/(2.0*z*projectileWplus));
1923 Tmp.
setE( projectileWplus*z/2.0 + Tmp.
e()/(2.0*z*projectileWplus));
1928 #ifdef debugQGSParticipants
1938 nSeaPair = (*i)->GetSoftCollisionCount()-1;
1939 #ifdef debugQGSParticipants
1940 G4cout<<
"nSeaPair of target and N# "<<nSeaPair<<
" "<<NuclNo<<
G4endl;
1943 for (
G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1945 aParton = (*i)->GetNextParton();
1946 #ifdef debugQGSParticipants
1950 Tmp.
setPz(-targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1951 Tmp.
setE( targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1956 aParton = (*i)->GetNextAntiParton();
1957 #ifdef debugQGSParticipants
1962 Tmp.
setPz(-targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1963 Tmp.
setE( targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1967 #ifdef debugQGSParticipants
1974 aParton = (*i)->GetNextParton();
1975 #ifdef debugQGSParticipants
1979 Tmp.
setPz(-targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1980 Tmp.
setE( targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1986 aParton = (*i)->GetNextAntiParton();
1987 #ifdef debugQGSParticipants
1992 Tmp.
setPz(-targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1993 Tmp.
setE( targetWminus*z/2.0 + Tmp.
e()/(2.0*z*targetWminus));
1997 #ifdef debugQGSParticipants
2010 G4double Xmin=anXmin;
G4int Nsea=totalSea; Xmin*=1.; Nsea++;
2012 G4double Obeta = 1./(aBeta + (alpha + 1.)*nSea + 1.);
2015 const G4int maxNumberOfLoops = 1000;
2016 G4int loopCounter = 0;
2022 }
while( ( r12 > 1.) &&
2023 ++loopCounter < maxNumberOfLoops );
2024 if ( loopCounter >= maxNumberOfLoops ) {
2033void G4QGSParticipants::CreateStrings()
2036 #ifdef debugQGSParticipants
2041 #ifdef debugQGSParticipants
2042 G4cout<<
"BAD situation: theProjectileSplitable is NULL ! Returning immediately"<<
G4endl;
2047 #ifdef debugQGSParticipants
2059 #ifdef debugQGSParticipants
2074 G4int N_EnvTarg = NumberOfInvolvedNucleonsOfTarget;
2076 for (
G4int i = 0; i < N_EnvTarg; i++ ) {
2077 G4Nucleon* aTargetNucleon = TheInvolvedNucleonsOfTarget[ i ];
2081 #ifdef debugQGSParticipants
2091 #ifdef debugQGSParticipants
2109 #ifdef debugQGSParticipants
2110 G4cout<<
"Strings created in soft interactions"<<
G4endl;
2112 std::vector<G4InteractionContent*>::iterator i;
2120 #ifdef debugQGSParticipants
2121 G4cout<<
"An interaction # and soft coll. # "<<IntNo<<
" "
2134 #ifdef debugQGSParticipants
2149 #ifdef debugQGSParticipants
2157 #ifdef debugQGSParticipants
2173 #ifdef debugQGSParticipants
2180void G4QGSParticipants::GetResiduals() {
2183 #ifdef debugQGSParticipants
2184 G4cout <<
"GetResiduals(): GetProjectileNucleus()? " << GetProjectileNucleus() <<
G4endl;
2187 #ifdef debugQGSParticipants
2188 G4cout <<
"NumberOfInvolvedNucleonsOfTarget "<< NumberOfInvolvedNucleonsOfTarget <<
G4endl;
2191 G4double DeltaExcitationE = TargetResidualExcitationEnergy /
G4double( NumberOfInvolvedNucleonsOfTarget );
2193 G4double( NumberOfInvolvedNucleonsOfTarget );
2195 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
2196 G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
2198 #ifdef debugQGSParticipants
2210 if( TargetResidualMassNumber != 0 )
2222 residualMomentum +=tmp;
2226 residualMomentum/=TargetResidualMassNumber;
2244 const G4int maxNumberOfLoops = 1000;
2245 G4int loopCounter = 0;
2262 if(SumMasses > Mass) {Chigh=
C;}
2265 }
while( (Chigh-Clow > 0.01) &&
2266 ++loopCounter < maxNumberOfLoops );
2267 if ( loopCounter >= maxNumberOfLoops ) {
2268 #ifdef debugQGSParticipants
2289 #ifdef debugQGSParticipants
2290 G4cout <<
"End GetResiduals -----------------" <<
G4endl;
2299 std::vector<G4InteractionContent*>::iterator i;
2314 #ifdef debugQGSParticipants
2322 #ifdef debugQGSParticipants
2329 #ifdef debugQGSParticipants
2337 #ifdef debugQGSParticipants
2349 #ifdef debugQGSParticipants
2366 if ((!(aPrimaryMomentum.
e()>-1)) && (!(aPrimaryMomentum.
e()<1)) )
2369 "G4GammaParticipants::SelectInteractions: primary nan energy.");
2371 G4double S = (aPrimaryMomentum + aTargetNMomentum).mag2();
2375 #ifdef debugQGSParticipants
2376 G4cout <<
"Gamma projectile - SelectInteractions " <<
G4endl;
2393 G4int totalCuts = 0;
2402 {
if(NucleonNo == theCurrent)
break; NucleonNo++; }
2407 pNucleon->
Hit(aTarget);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
G4ThreadLocal G4int G4QGSParticipants_NPart
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
HepLorentzRotation & rotateY(double delta)
HepLorentzRotation & rotateZ(double delta)
HepLorentzRotation inverse() const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void setVect(const Hep3Vector &)
Hep3Vector findBoostToCM() const
HepLorentzVector & transform(const HepRotation &)
static G4Gamma * GammaDefinition()
void SetNumberOfDiffractiveCollisions(int)
void SetTargetNucleon(G4Nucleon *aNucleon)
G4Nucleon * GetTargetNucleon() const
void SetNumberOfSoftCollisions(int)
G4VSplitableHadron * GetProjectile() const
G4int GetNumberOfSoftCollisions()
void SetTarget(G4VSplitableHadron *aTarget)
void SetStatus(G4int aValue)
G4VSplitableHadron * GetTarget() const
static G4KaonMinus * KaonMinusDefinition()
static G4KaonPlus * KaonPlusDefinition()
const G4ThreeVector & GetPosition() const
void SetPosition(const G4ThreeVector aPosition)
void SetMomentum(G4LorentzVector &aMomentum)
G4VSplitableHadron * GetSplitableHadron() const
virtual const G4LorentzVector & Get4Momentum() const
void Hit(G4VSplitableHadron *aHit)
G4double GetBindingEnergy() const
void SetBindingEnergy(G4double anEnergy)
virtual const G4ParticleDefinition * GetDefinition() const
G4double GetPDGMass() const
G4int GetPDGEncoding() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
const G4String & GetParticleName() const
G4IonTable * GetIonTable() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4Parton * GetParton2(void)
G4Parton * GetParton1(void)
G4ParticleDefinition * GetDefinition()
void Set4Momentum(const G4LorentzVector &aMomentum)
const G4LorentzVector & Get4Momentum() const
static G4PionMinus * PionMinusDefinition()
static G4PionPlus * PionPlusDefinition()
static G4PionZero * PionZeroDefinition()
static G4Pow * GetInstance()
G4double powA(G4double A, G4double y) const
virtual G4bool ExciteParticipants(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4bool ProjectileDiffraction=TRUE) const
virtual G4Parton * GetNextParton()
virtual G4Parton * GetNextAntiParton()
const G4double ThresholdParameter
G4double SampleX(G4double anXmin, G4int nSea, G4int theTotalSea, G4double aBeta)
G4ThreeVector theCurrentVelocity
G4QuarkExchange theQuarkExchange
G4SingleDiffractiveExcitation theSingleDiffExcitation
virtual void DoLorentzBoost(G4ThreeVector aBoost)
std::vector< G4InteractionContent * > theInteractions
G4bool DeterminePartonMomenta()
virtual G4VSplitableHadron * SelectInteractions(const G4ReactionProduct &thePrimary)
void PerformDiffractiveCollisions()
G4QGSDiffractiveExcitation theDiffExcitaton
G4QGSMSplitableHadron * theProjectileSplitable
virtual ~G4QGSParticipants()
const G4double QGSMThreshold
const G4double theNucleonRadius
void BuildInteractions(const G4ReactionProduct &thePrimary)
std::vector< G4PartonPair * > thePartonPairs
std::vector< G4VSplitableHadron * > theTargets
void PerformSoftCollisions()
G4bool ExciteParticipants(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner) const
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
const G4ParticleDefinition * GetDefinition() const
G4double GetTotalEnergy() const
G4ThreeVector GetMomentum() const
void GetProbabilities(G4double B, G4int Mode, G4double &Pint, G4double &Pprd, G4double &Ptrd, G4double &Pdd, G4double &Pnd, G4double &Pnvr)
G4bool ExciteParticipants(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4bool ProjectileDiffraction) const
virtual void SortNucleonsIncZ()=0
virtual G4double GetOuterRadius()=0
virtual G4Nucleon * GetNextNucleon()=0
virtual G4int GetCharge()=0
virtual G4bool StartLoop()=0
virtual void Init(G4int theA, G4int theZ)=0
std::pair< G4double, G4double > ChooseImpactXandY(G4double maxImpact)
virtual G4int GetMassNumber()=0
virtual void SetProjectileNucleus(G4V3DNucleus *aNucleus)
G4V3DNucleus * theNucleus
void SetTimeOfCreation(G4double aTime)
void SetStatus(const G4int aStatus)
void SetCollisionCount(G4int aCount)
const G4ParticleDefinition * GetDefinition() const
G4double GetTimeOfCreation()
void Set4Momentum(const G4LorentzVector &a4Momentum)
virtual G4Parton * GetNextParton()=0
virtual G4Parton * GetNextAntiParton()=0
void SetDefinition(const G4ParticleDefinition *aDefinition)
const G4LorentzVector & Get4Momentum() const
const G4ThreeVector & GetPosition() const
void IncrementCollisionCount(G4int aCount)
G4int GetSoftCollisionCount()