79 NumberOfInvolvedNucleonsOfTarget = 0;
80 NumberOfInvolvedNucleonsOfProjectile= 0;
81 for (
G4int i = 0; i < 250; ++i ) {
82 TheInvolvedNucleonsOfTarget[i] = 0;
83 TheInvolvedNucleonsOfProjectile[i] = 0;
87 LowEnergyLimit = 1000.0*MeV;
89 HighEnergyInter =
true;
92 ProjectileResidual4Momentum = tmp;
93 ProjectileResidualMassNumber = 0;
94 ProjectileResidualCharge = 0;
95 ProjectileResidualLambdaNumber = 0;
96 ProjectileResidualExcitationEnergy = 0.0;
98 TargetResidual4Momentum = tmp;
99 TargetResidualMassNumber = 0;
100 TargetResidualCharge = 0;
101 TargetResidualExcitationEnergy = 0.0;
107 NumberOfProjectileSpectatorNucleons = 0;
108 NumberOfTargetSpectatorNucleons = 0;
109 NumberOfNNcollisions = 0;
130 if ( theParameters != 0 )
delete theParameters;
131 if ( theExcitation != 0 )
delete theExcitation;
132 if ( theElastic != 0 )
delete theElastic;
133 if ( theAnnihilation != 0 )
delete theAnnihilation;
136 if ( theAdditionalString.size() != 0 ) {
137 std::for_each( theAdditionalString.begin(), theAdditionalString.end(),
140 theAdditionalString.clear();
143 if ( NumberOfInvolvedNucleonsOfTarget != 0 ) {
144 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
146 if ( aNucleon )
delete aNucleon;
151 if ( NumberOfInvolvedNucleonsOfProjectile != 0 ) {
152 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
153 G4VSplitableHadron* aNucleon = TheInvolvedNucleonsOfProjectile[i]->GetSplitableHadron();
154 if ( aNucleon )
delete aNucleon;
164 theProjectile = aProjectile;
169 G4cout <<
"FTF init Proj Name " << theProjectile.GetDefinition()->GetParticleName() <<
G4endl
170 <<
"FTF init Proj Mass " << theProjectile.GetMass()
171 <<
" " << theProjectile.GetMomentum() <<
G4endl
172 <<
"FTF init Proj B Q " << theProjectile.GetDefinition()->GetBaryonNumber()
173 <<
" " << (
G4int) theProjectile.GetDefinition()->GetPDGCharge() <<
G4endl
174 <<
"FTF init Target A Z " << aNucleus.
GetA_asInt()
178 theParticipants.Clean();
180 theParticipants.SetProjectileNucleus( 0 );
183 ProjectileResidualMassNumber = 0;
184 ProjectileResidualCharge = 0;
185 ProjectileResidualLambdaNumber = 0;
186 ProjectileResidualExcitationEnergy = 0.0;
187 ProjectileResidual4Momentum = tmp;
189 TargetResidualMassNumber = aNucleus.
GetA_asInt();
191 TargetResidualExcitationEnergy = 0.0;
192 TargetResidual4Momentum = tmp;
194 ->
GetIonMass( TargetResidualCharge, TargetResidualMassNumber );
196 TargetResidual4Momentum.setE( TargetResidualMass );
198 if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 ) {
200 ProjectileResidualMassNumber = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() );
201 ProjectileResidualCharge =
G4int( theProjectile.GetDefinition()->GetPDGCharge() );
202 PlabPerParticle = theProjectile.GetMomentum().z();
203 ProjectileResidualExcitationEnergy = 0.0;
205 ProjectileResidual4Momentum.setVect( theProjectile.GetMomentum() );
206 ProjectileResidual4Momentum.setE( theProjectile.GetTotalEnergy() );
207 if ( PlabPerParticle < LowEnergyLimit ) {
208 HighEnergyInter =
false;
210 HighEnergyInter =
true;
213 if ( theProjectile.GetDefinition()->GetBaryonNumber() > 1 ) {
215 ProjectileResidualMassNumber = theProjectile.GetDefinition()->GetBaryonNumber();
216 ProjectileResidualCharge =
G4int( theProjectile.GetDefinition()->GetPDGCharge() );
217 ProjectileResidualLambdaNumber = theProjectile.GetDefinition()->GetNumberOfLambdasInHypernucleus();
218 PlabPerParticle = theProjectile.GetMomentum().z() / ProjectileResidualMassNumber;
219 if ( PlabPerParticle < LowEnergyLimit ) {
220 HighEnergyInter =
false;
222 HighEnergyInter =
true;
224 theParticipants.InitProjectileNucleus( ProjectileResidualMassNumber, ProjectileResidualCharge,
225 ProjectileResidualLambdaNumber );
226 }
else if ( theProjectile.GetDefinition()->GetBaryonNumber() < -1 ) {
228 ProjectileResidualMassNumber = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() );
229 ProjectileResidualCharge = std::abs(
G4int( theProjectile.GetDefinition()->GetPDGCharge() ) );
230 ProjectileResidualLambdaNumber = theProjectile.GetDefinition()->GetNumberOfAntiLambdasInAntiHypernucleus();
231 PlabPerParticle = theProjectile.GetMomentum().z() / ProjectileResidualMassNumber;
232 if ( PlabPerParticle < LowEnergyLimit ) {
233 HighEnergyInter =
false;
235 HighEnergyInter =
true;
237 theParticipants.InitProjectileNucleus( ProjectileResidualMassNumber, ProjectileResidualCharge,
238 ProjectileResidualLambdaNumber );
239 theParticipants.GetProjectileNucleus()->StartLoop();
241 while ( ( aNucleon = theParticipants.GetProjectileNucleus()->GetNextNucleon() ) ) {
252 G4ThreeVector BoostVector = theProjectile.GetMomentum() / theProjectile.GetTotalEnergy();
253 theParticipants.GetProjectileNucleus()->DoLorentzBoost( BoostVector );
254 theParticipants.GetProjectileNucleus()->DoLorentzContraction( BoostVector );
255 ProjectileResidualExcitationEnergy = 0.0;
257 ProjectileResidual4Momentum.setVect( theProjectile.GetMomentum() );
258 ProjectileResidual4Momentum.setE( theProjectile.GetTotalEnergy() );
264 NumberOfProjectileSpectatorNucleons = std::abs( theProjectile.GetDefinition()->GetBaryonNumber() );
265 NumberOfTargetSpectatorNucleons = aNucleus.
GetA_asInt();
266 NumberOfNNcollisions = 0;
269 theParameters->InitForInteraction( theProjectile.GetDefinition(), aNucleus.
GetA_asInt(),
272 if ( theAdditionalString.size() != 0 ) {
273 std::for_each( theAdditionalString.begin(), theAdditionalString.end(),
276 theAdditionalString.clear();
289 if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 &&
290 aNucleus.
GetA_asInt() < 2 ) theParameters->SetProbabilityOfElasticScatt( 0.0 );
308 theParticipants.GetList( theProjectile, theParameters );
312 StoreInvolvedNucleon();
316 if ( HighEnergyInter ) {
323 Success = PutOnMassShell();
326 G4cout <<
"FTF PutOnMassShell Success? " << Success <<
G4endl;
335 if ( Success ) Success = ExciteParticipants();
338 G4cout <<
"FTF ExciteParticipants Success? " << Success <<
G4endl;
344 G4cout <<
"FTF BuildStrings ";
347 BuildStrings( theStrings );
350 G4cout <<
"FTF BuildStrings " << theStrings <<
" OK" <<
G4endl
351 <<
"FTF GetResiduals of Nuclei " <<
G4endl;
364 std::vector< G4VSplitableHadron* > primaries;
365 theParticipants.StartLoop();
366 while ( theParticipants.Next() ) {
369 if ( primaries.end() ==
370 std::find( primaries.begin(), primaries.end(), interaction.
GetProjectile() ) ) {
382 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
383 aNucleon = TheInvolvedNucleonsOfProjectile[i]->GetSplitableHadron();
384 if ( aNucleon )
delete aNucleon;
386 NumberOfInvolvedNucleonsOfProjectile = 0;
389 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
390 aNucleon = TheInvolvedNucleonsOfTarget[i]->GetSplitableHadron();
391 if ( aNucleon )
delete aNucleon;
393 NumberOfInvolvedNucleonsOfTarget = 0;
397 <<
"To continue - enter 1, to stop - ^C" <<
G4endl;
400 theParticipants.Clean();
408void G4FTFModel::StoreInvolvedNucleon() {
411 NumberOfInvolvedNucleonsOfTarget = 0;
419 TheInvolvedNucleonsOfTarget[NumberOfInvolvedNucleonsOfTarget] = aNucleon;
420 NumberOfInvolvedNucleonsOfTarget++;
425 G4cout <<
"G4FTFModel::StoreInvolvedNucleon -------------" <<
G4endl;
426 G4cout <<
"NumberOfInvolvedNucleonsOfTarget " << NumberOfInvolvedNucleonsOfTarget
435 NumberOfInvolvedNucleonsOfProjectile = 0;
440 G4Nucleon* aProjectileNucleon;
441 while ( ( aProjectileNucleon = theProjectileNucleus->
GetNextNucleon() ) ) {
444 TheInvolvedNucleonsOfProjectile[NumberOfInvolvedNucleonsOfProjectile] = aProjectileNucleon;
445 NumberOfInvolvedNucleonsOfProjectile++;
450 G4cout <<
"NumberOfInvolvedNucleonsOfProjectile " << NumberOfInvolvedNucleonsOfProjectile
459void G4FTFModel::ReggeonCascade() {
462 #ifdef debugReggeonCascade
463 G4cout <<
"G4FTFModel::ReggeonCascade -----------" <<
G4endl
464 <<
"theProjectile.GetTotalMomentum() " << theProjectile.GetTotalMomentum() <<
G4endl
465 <<
"theProjectile.GetTotalEnergy() " << theProjectile.GetTotalEnergy() <<
G4endl
466 <<
"ExcitationE/WN " << theParameters->GetExcitationEnergyPerWoundedNucleon() <<
G4endl;
469 G4int InitNINt = NumberOfInvolvedNucleonsOfTarget;
472 for (
G4int InvTN = 0; InvTN < InitNINt; InvTN++ ) {
473 G4Nucleon* aTargetNucleon = TheInvolvedNucleonsOfTarget[ InvTN ];
483 G4Nucleon* Neighbour(0);
485 if ( ! Neighbour->AreYouHit() ) {
486 G4double impact2 =
sqr( XofWoundedNucleon - Neighbour->GetPosition().x() ) +
487 sqr( YofWoundedNucleon - Neighbour->GetPosition().y() );
489 if (
G4UniformRand() < theParameters->GetCofNuclearDestruction() *
490 G4Exp( -impact2 / theParameters->GetR2ofNuclearDestruction() )
493 TheInvolvedNucleonsOfTarget[ NumberOfInvolvedNucleonsOfTarget ] = Neighbour;
494 NumberOfInvolvedNucleonsOfTarget++;
496 G4VSplitableHadron* targetSplitable;
497 targetSplitable =
new G4DiffractiveSplitableHadron( *Neighbour );
499 Neighbour->Hit( targetSplitable );
507 #ifdef debugReggeonCascade
508 G4cout <<
"Final NumberOfInvolvedNucleonsOfTarget "
509 << NumberOfInvolvedNucleonsOfTarget <<
G4endl <<
G4endl;
515 G4int InitNINp = NumberOfInvolvedNucleonsOfProjectile;
518 for (
G4int InvPN = 0; InvPN < InitNINp; InvPN++ ) {
519 G4Nucleon* aProjectileNucleon = TheInvolvedNucleonsOfProjectile[ InvPN ];
529 G4Nucleon* Neighbour( 0 );
530 while ( ( Neighbour = theProjectileNucleus->
GetNextNucleon() ) ) {
531 if ( ! Neighbour->AreYouHit() ) {
532 G4double impact2=
sqr( XofWoundedNucleon - Neighbour->GetPosition().x() ) +
533 sqr( YofWoundedNucleon - Neighbour->GetPosition().y() );
535 if (
G4UniformRand() < theParameters->GetCofNuclearDestructionPr() *
536 G4Exp( -impact2 / theParameters->GetR2ofNuclearDestruction() )
539 TheInvolvedNucleonsOfProjectile[ NumberOfInvolvedNucleonsOfProjectile ] = Neighbour;
540 NumberOfInvolvedNucleonsOfProjectile++;
542 G4VSplitableHadron* projectileSplitable;
543 projectileSplitable =
new G4DiffractiveSplitableHadron( *Neighbour );
545 Neighbour->Hit( projectileSplitable );
553 #ifdef debugReggeonCascade
554 G4cout <<
"NumberOfInvolvedNucleonsOfProjectile "
555 << NumberOfInvolvedNucleonsOfProjectile <<
G4endl <<
G4endl;
562G4bool G4FTFModel::PutOnMassShell() {
564 G4bool isProjectileNucleus =
false;
567 #ifdef debugPutOnMassShell
569 if ( isProjectileNucleus ) {
570 G4cout <<
"PutOnMassShell for Nucleus_Nucleus " <<
G4endl;
574 G4LorentzVector Pprojectile( theProjectile.GetMomentum(), theProjectile.GetTotalEnergy() );
575 if ( Pprojectile.z() < 0.0 )
return false;
585 #ifdef debugPutOnMassShell
588 isOk = ComputeNucleusProperties( theTargetNucleus, Ptarget, PtargetResidual, SumMasses,
589 TargetResidualExcitationEnergy, TargetResidualMass,
590 TargetResidualMassNumber, TargetResidualCharge );
591 if ( ! isOk )
return false;
600 if ( ! isProjectileNucleus ) {
601 Mprojectile = Pprojectile.mag();
602 M2projectile = Pprojectile.mag2();
603 SumMasses += Mprojectile + 20.0*MeV;
605 #ifdef debugPutOnMassShell
606 G4cout <<
"Projectile : ";
608 isOk = ComputeNucleusProperties( thePrNucleus, Pproj, PprojResidual, SumMasses,
609 ProjectileResidualExcitationEnergy, PrResidualMass,
610 ProjectileResidualMassNumber, ProjectileResidualCharge );
611 if ( ! isOk )
return false;
618 #ifdef debugPutOnMassShell
619 G4cout <<
"Psum " << Psum/GeV <<
" GeV" <<
G4endl <<
"SqrtS " << SqrtS/GeV <<
" GeV" <<
G4endl
620 <<
"SumMasses, PrResidualMass and TargetResidualMass " << SumMasses/GeV <<
" "
621 << PrResidualMass/GeV <<
" " << TargetResidualMass/GeV <<
" GeV" <<
G4endl;
624 if ( SqrtS < SumMasses )
return false;
628 G4double savedSumMasses = SumMasses;
629 if ( isProjectileNucleus ) {
630 SumMasses -= std::sqrt(
sqr( PrResidualMass ) + PprojResidual.perp2() );
631 SumMasses += std::sqrt(
sqr( PrResidualMass + ProjectileResidualExcitationEnergy )
632 + PprojResidual.perp2() );
634 SumMasses -= std::sqrt(
sqr( TargetResidualMass ) + PtargetResidual.perp2() );
635 SumMasses += std::sqrt(
sqr( TargetResidualMass + TargetResidualExcitationEnergy )
636 + PtargetResidual.perp2() );
638 if ( SqrtS < SumMasses ) {
639 SumMasses = savedSumMasses;
640 if ( isProjectileNucleus ) ProjectileResidualExcitationEnergy = 0.0;
641 TargetResidualExcitationEnergy = 0.0;
644 TargetResidualMass += TargetResidualExcitationEnergy;
645 if ( isProjectileNucleus ) PrResidualMass += ProjectileResidualExcitationEnergy;
647 #ifdef debugPutOnMassShell
648 if ( isProjectileNucleus ) {
649 G4cout <<
"PrResidualMass ProjResidualExcitationEnergy " << PrResidualMass/GeV <<
" "
650 << ProjectileResidualExcitationEnergy <<
" MeV" <<
G4endl;
652 G4cout <<
"TargetResidualMass TargetResidualExcitationEnergy " << TargetResidualMass/GeV <<
" "
653 << TargetResidualExcitationEnergy <<
" MeV" <<
G4endl
654 <<
"Sum masses " << SumMasses/GeV <<
G4endl;
658 if ( isProjectileNucleus && thePrNucleus->
GetMassNumber() != 1 ) {
659 isOk = GenerateDeltaIsobar( SqrtS, NumberOfInvolvedNucleonsOfProjectile,
660 TheInvolvedNucleonsOfProjectile, SumMasses );
663 isOk = isOk && GenerateDeltaIsobar( SqrtS, NumberOfInvolvedNucleonsOfTarget,
664 TheInvolvedNucleonsOfTarget, SumMasses );
666 if ( ! isOk )
return false;
677 if ( Ptmp.
pz() <= 0.0 )
return false;
682 if ( isProjectileNucleus ) {
684 YprojectileNucleus = Ptmp.
rapidity();
686 Ptmp = toCms*Ptarget;
691 if ( isProjectileNucleus ) DcorP = theParameters->GetDofNuclearDestruction() / thePrNucleus->
GetMassNumber();
693 G4double AveragePt2 = theParameters->GetPt2ofNuclearDestruction();
694 G4double maxPtSquare = theParameters->GetMaxPt2ofNuclearDestruction();
696 #ifdef debugPutOnMassShell
697 if ( isProjectileNucleus ) {
698 G4cout <<
"Y projectileNucleus " << YprojectileNucleus <<
G4endl;
700 G4cout <<
"Y targetNucleus " << YtargetNucleus <<
G4endl
701 <<
"Dcor " << theParameters->GetDofNuclearDestruction()
702 <<
" DcorP DcorT " << DcorP <<
" " << DcorT <<
" AveragePt2 " << AveragePt2 <<
G4endl;
709 G4int NumberOfTries = 0;
711 G4bool OuterSuccess =
true;
713 const G4int maxNumberOfLoops = 1000;
714 G4int loopCounter = 0;
717 const G4int maxNumberOfInnerLoops = 10000;
720 if ( NumberOfTries == 100*(NumberOfTries/100) ) {
726 DcorP *= ScaleFactor;
727 DcorT *= ScaleFactor;
728 AveragePt2 *= ScaleFactor;
730 if ( isProjectileNucleus ) {
732 isOk = SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorP,
733 thePrNucleus, PprojResidual,
734 PrResidualMass, ProjectileResidualMassNumber,
735 NumberOfInvolvedNucleonsOfProjectile,
736 TheInvolvedNucleonsOfProjectile, M2proj );
739 isOk = isOk && SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorT,
740 theTargetNucleus, PtargetResidual,
741 TargetResidualMass, TargetResidualMassNumber,
742 NumberOfInvolvedNucleonsOfTarget,
743 TheInvolvedNucleonsOfTarget, M2target );
744 #ifdef debugPutOnMassShell
745 G4cout <<
"SqrtS, Mp+Mt, Mp, Mt " << SqrtS/GeV <<
" "
746 << ( std::sqrt( M2proj ) + std::sqrt( M2target) )/GeV <<
" "
747 << std::sqrt( M2proj )/GeV <<
" " << std::sqrt( M2target )/GeV <<
G4endl;
749 if ( ! isOk )
return false;
750 }
while ( ( SqrtS < std::sqrt( M2proj ) + std::sqrt( M2target ) ) &&
751 NumberOfTries < maxNumberOfInnerLoops );
752 if ( NumberOfTries >= maxNumberOfInnerLoops ) {
753 #ifdef debugPutOnMassShell
754 G4cout <<
"BAD situation: forced exit of the inner while loop!" <<
G4endl;
758 if ( isProjectileNucleus ) {
759 isOk = CheckKinematics(
S, SqrtS, M2proj, M2target, YprojectileNucleus,
true,
760 NumberOfInvolvedNucleonsOfProjectile,
761 TheInvolvedNucleonsOfProjectile,
762 WminusTarget, WplusProjectile, OuterSuccess );
764 isOk = isOk && CheckKinematics(
S, SqrtS, M2proj, M2target, YtargetNucleus,
false,
765 NumberOfInvolvedNucleonsOfTarget, TheInvolvedNucleonsOfTarget,
766 WminusTarget, WplusProjectile, OuterSuccess );
767 if ( ! isOk )
return false;
768 }
while ( ( ! OuterSuccess ) &&
769 ++loopCounter < maxNumberOfLoops );
770 if ( loopCounter >= maxNumberOfLoops ) {
771 #ifdef debugPutOnMassShell
772 G4cout <<
"BAD situation: forced exit of the while loop!" <<
G4endl;
783 if ( ! isProjectileNucleus ) {
785 G4double Pzprojectile = WplusProjectile/2.0 - M2projectile/2.0/WplusProjectile;
786 G4double Eprojectile = WplusProjectile/2.0 + M2projectile/2.0/WplusProjectile;
787 Pprojectile.setPz( Pzprojectile );
788 Pprojectile.setE( Eprojectile );
790 #ifdef debugPutOnMassShell
791 G4cout <<
"Proj after in CMS " << Pprojectile <<
G4endl;
794 Pprojectile.transform( toLab );
795 theProjectile.SetMomentum( Pprojectile.vect() );
796 theProjectile.SetTotalEnergy( Pprojectile.e() );
798 theParticipants.StartLoop();
799 theParticipants.Next();
800 G4VSplitableHadron* primary = theParticipants.GetInteraction().GetProjectile();
803 #ifdef debugPutOnMassShell
809 isOk = FinalizeKinematics( WplusProjectile,
true, toLab, PrResidualMass,
810 ProjectileResidualMassNumber, NumberOfInvolvedNucleonsOfProjectile,
811 TheInvolvedNucleonsOfProjectile, ProjectileResidual4Momentum );
813 #ifdef debugPutOnMassShell
814 G4cout <<
"Projectile Residual4Momentum in CMS " << ProjectileResidual4Momentum <<
G4endl;
817 if ( ! isOk )
return false;
819 ProjectileResidual4Momentum.transform( toLab );
821 #ifdef debugPutOnMassShell
822 G4cout <<
"Projectile Residual4Momentum in Lab " << ProjectileResidual4Momentum <<
G4endl;
827 isOk = FinalizeKinematics( WminusTarget,
false, toLab, TargetResidualMass,
828 TargetResidualMassNumber, NumberOfInvolvedNucleonsOfTarget,
829 TheInvolvedNucleonsOfTarget, TargetResidual4Momentum );
831 #ifdef debugPutOnMassShell
832 G4cout <<
"Target Residual4Momentum in CMS " << TargetResidual4Momentum <<
G4endl;
835 if ( ! isOk )
return false;
837 TargetResidual4Momentum.transform( toLab );
839 #ifdef debugPutOnMassShell
840 G4cout <<
"Target Residual4Momentum in Lab " << TargetResidual4Momentum <<
G4endl;
850G4bool G4FTFModel::ExciteParticipants() {
852 #ifdef debugBuildString
853 G4cout <<
"G4FTFModel::ExciteParticipants() " <<
G4endl;
865 G4int MaxNumOfInelCollisions =
G4int( theParameters->GetMaxNumberOfCollisions() );
866 if ( MaxNumOfInelCollisions > 0 ) {
867 G4double ProbMaxNumber = theParameters->GetMaxNumberOfCollisions() - MaxNumOfInelCollisions;
868 if (
G4UniformRand() < ProbMaxNumber ) MaxNumOfInelCollisions++;
871 MaxNumOfInelCollisions = 1;
874 #ifdef debugBuildString
875 G4cout <<
"MaxNumOfInelCollisions per hadron/nucleon " << MaxNumOfInelCollisions <<
G4endl;
878 G4int CurrentInteraction( 0 );
879 theParticipants.StartLoop();
881 G4bool InnerSuccess(
true );
882 while ( theParticipants.Next() ) {
883 CurrentInteraction++;
884 const G4InteractionContent& collision = theParticipants.GetInteraction();
887 G4VSplitableHadron* target = collision.
GetTarget();
890 #ifdef debugBuildString
891 G4cout <<
G4endl <<
"Interaction # Status " << CurrentInteraction <<
" "
893 << target <<
G4endl <<
"projectile->GetStatus target->GetStatus "
900 if (
G4UniformRand() < theParameters->GetProbabilityOfElasticScatt() ) {
903 #ifdef debugBuildString
907 if ( ! HighEnergyInter ) {
908 G4bool Annihilation =
false;
909 G4bool Result = AdjustNucleons( projectile, ProjectileNucleon, target,
910 TargetNucleon, Annihilation );
911 if ( ! Result )
continue;
913 InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters );
914 }
else if (
G4UniformRand() > theParameters->GetProbabilityOfAnnihilation() ) {
917 #ifdef debugBuildString
919 <<
"MaxNumOfInelCollisions per hadron/nucleon " << MaxNumOfInelCollisions <<
G4endl;
922 if ( ! HighEnergyInter ) {
923 G4bool Annihilation =
false;
924 G4bool Result = AdjustNucleons( projectile, ProjectileNucleon, target,
925 TargetNucleon, Annihilation );
926 if ( ! Result )
continue;
939 NumberOfNNcollisions++;
940 #ifdef debugBuildString
949 InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters );
950 #ifdef debugBuildString
951 G4cout <<
"FTF excitation Non InnerSuccess of Elastic scattering "
952 << InnerSuccess <<
G4endl;
956 #ifdef debugBuildString
957 G4cout <<
"Elastic scat. at rejection inelastic scattering" <<
G4endl;
965 InnerSuccess = theElastic->ElasticScattering( projectile, target, theParameters );
969 #ifdef debugBuildString
974 if ( ! HighEnergyInter ) {
975 G4bool Annihilation =
true;
976 G4bool Result = AdjustNucleons( projectile, ProjectileNucleon, target,
977 TargetNucleon, Annihilation );
978 if ( ! Result )
continue;
981 G4VSplitableHadron* AdditionalString = 0;
982 if ( theAnnihilation->Annihilate( projectile, target, AdditionalString, theParameters ) ) {
985 #ifdef debugBuildString
986 G4cout <<
"Annihilation successfull. " <<
"*AdditionalString "
987 << AdditionalString <<
G4endl;
992 if ( AdditionalString != 0 ) theAdditionalString.push_back( AdditionalString );
994 NumberOfNNcollisions++;
997 while ( theParticipants.Next() ) {
998 G4InteractionContent& acollision = theParticipants.GetInteraction();
999 G4VSplitableHadron* NextProjectileNucleon = acollision.
GetProjectile();
1000 G4VSplitableHadron* NextTargetNucleon = acollision.
GetTarget();
1001 if ( projectile == NextProjectileNucleon || target == NextTargetNucleon ) {
1007 theParticipants.StartLoop();
1008 for (
G4int i = 0; i < CurrentInteraction; ++i ) theParticipants.Next();
1028 if( InnerSuccess ) Success =
true;
1030 #ifdef debugBuildString
1031 G4cout <<
"----------------------------- Final properties " <<
G4endl
1032 <<
"projectile->GetStatus target->GetStatus " << projectile->
GetStatus()
1033 <<
" " << target->
GetStatus() <<
G4endl <<
"projectile->GetSoftC target->GetSoftC "
1035 <<
G4endl <<
"ExciteParticipants() Success? " << Success <<
G4endl;
1053 G4cout <<
"AdjustNucleons ---------------------------------------" <<
G4endl
1057 <<
"Pr ResidualMassNumber Pr ResidualCharge Pr ResidualExcitationEnergy "
1058 << ProjectileResidualMassNumber <<
" " << ProjectileResidualCharge <<
" "
1059 << ProjectileResidualExcitationEnergy <<
G4endl
1060 <<
"Tr ResidualMassNumber Tr ResidualCharge Tr ResidualExcitationEnergy "
1061 << TargetResidualMassNumber <<
" " << TargetResidualCharge <<
" "
1062 << TargetResidualExcitationEnergy <<
G4endl
1072 G4int interactionCase = 0;
1082 interactionCase = 1;
1084 G4cout <<
"case 1, hA prcol=0 trcol=0, AA prcol#0 trcol=0" <<
G4endl;
1086 if ( TargetResidualMassNumber < 1 ) {
1092 if ( TargetResidualMassNumber == 1 ) {
1093 TargetResidualMassNumber = 0;
1094 TargetResidualCharge = 0;
1095 TargetResidualExcitationEnergy = 0.0;
1096 SelectedTargetNucleon->
Set4Momentum( TargetResidual4Momentum );
1103 interactionCase = 2;
1107 if ( ProjectileResidualMassNumber < 1 ) {
1110 if ( ProjectileResidual4Momentum.rapidity() <=
1114 if ( ProjectileResidualMassNumber == 1 ) {
1115 ProjectileResidualMassNumber = 0;
1116 ProjectileResidualCharge = 0;
1117 ProjectileResidualExcitationEnergy = 0.0;
1118 SelectedAntiBaryon->
Set4Momentum( ProjectileResidual4Momentum );
1123 interactionCase = 3;
1131 G4cout <<
"Proj res Init " << ProjectileResidual4Momentum <<
G4endl
1132 <<
"Targ res Init " << TargetResidual4Momentum <<
G4endl
1133 <<
"ProjectileResidualMassNumber ProjectileResidualCharge (ProjectileResidualLambdaNumber)"
1134 << ProjectileResidualMassNumber <<
" " << ProjectileResidualCharge
1135 <<
" (" << ProjectileResidualLambdaNumber <<
") " <<
G4endl
1136 <<
"TargetResidualMassNumber TargetResidualCharge " << TargetResidualMassNumber
1137 <<
" " << TargetResidualCharge <<
G4endl;
1141 CommonVariables common;
1142 G4int returnCode = AdjustNucleonsAlgorithm_beforeSampling( interactionCase, SelectedAntiBaryon,
1143 ProjectileNucleon, SelectedTargetNucleon,
1144 TargetNucleon, Annihilation, common );
1145 G4bool returnResult =
false;
1146 if ( returnCode == 0 ) {
1147 returnResult =
true;
1148 }
else if ( returnCode == 1 ) {
1150 returnResult = AdjustNucleonsAlgorithm_Sampling( interactionCase, common );
1151 if ( returnResult ) {
1152 AdjustNucleonsAlgorithm_afterSampling( interactionCase, SelectedAntiBaryon,
1153 SelectedTargetNucleon, common );
1157 return returnResult;
1162G4int G4FTFModel::AdjustNucleonsAlgorithm_beforeSampling(
G4int interactionCase,
1168 G4FTFModel::CommonVariables& common ) {
1174 G4int returnCode = 99;
1176 G4double ExcitationEnergyPerWoundedNucleon = theParameters->GetExcitationEnergyPerWoundedNucleon();
1179 if ( interactionCase == 1 ) {
1180 common.Psum = SelectedAntiBaryon->
Get4Momentum() + TargetResidual4Momentum;
1182 G4cout <<
"Targ res Init " << TargetResidual4Momentum <<
G4endl;
1184 common.Pprojectile = SelectedAntiBaryon->
Get4Momentum();
1185 }
else if ( interactionCase == 2 ) {
1186 common.Psum = ProjectileResidual4Momentum + SelectedTargetNucleon->
Get4Momentum();
1187 common.Pprojectile = ProjectileResidual4Momentum;
1188 }
else if ( interactionCase == 3 ) {
1189 common.Psum = ProjectileResidual4Momentum + TargetResidual4Momentum;
1190 common.Pprojectile = ProjectileResidual4Momentum;
1195 common.Ptmp = common.toCms * common.Pprojectile;
1196 common.toCms.
rotateZ( -1*common.Ptmp.
phi() );
1198 common.Pprojectile.
transform( common.toCms );
1199 common.toLab = common.toCms.
inverse();
1200 common.SqrtS = common.Psum.
mag();
1201 common.S =
sqr( common.SqrtS );
1205 if ( interactionCase == 1 ) {
1206 common.TResidualMassNumber = TargetResidualMassNumber - 1;
1207 common.TResidualCharge = TargetResidualCharge
1209 common.TResidualExcitationEnergy = TargetResidualExcitationEnergy
1211 if ( common.TResidualMassNumber <= 1 ) {
1212 common.TResidualExcitationEnergy = 0.0;
1214 if ( common.TResidualMassNumber != 0 ) {
1216 ->
GetIonMass( common.TResidualCharge, common.TResidualMassNumber );
1219 common.SumMasses = SelectedAntiBaryon->
Get4Momentum().
mag() + common.TNucleonMass
1220 + common.TResidualMass;
1224 }
else if ( interactionCase == 2 ) {
1225 common.Ptarget = common.toCms * SelectedTargetNucleon->
Get4Momentum();
1226 common.TResidualMassNumber = ProjectileResidualMassNumber - 1;
1227 common.TResidualCharge = ProjectileResidualCharge
1229 common.TResidualExcitationEnergy = ProjectileResidualExcitationEnergy
1231 if ( common.TResidualMassNumber <= 1 ) {
1232 common.TResidualExcitationEnergy = 0.0;
1234 if ( common.TResidualMassNumber != 0 ) {
1236 ->
GetIonMass( common.TResidualCharge, common.TResidualMassNumber );
1239 common.SumMasses = SelectedTargetNucleon->
Get4Momentum().
mag() + common.TNucleonMass
1240 + common.TResidualMass;
1242 G4cout <<
"SelectedTN.mag() PNMass + PResidualMass "
1244 << common.TNucleonMass <<
" " << common.TResidualMass <<
G4endl;
1246 }
else if ( interactionCase == 3 ) {
1247 common.Ptarget = common.toCms * TargetResidual4Momentum;
1248 common.PResidualMassNumber = ProjectileResidualMassNumber - 1;
1249 common.PResidualCharge = ProjectileResidualCharge
1251 common.PResidualLambdaNumber = ProjectileResidualLambdaNumber;
1254 --common.PResidualLambdaNumber;
1256 common.PResidualExcitationEnergy = ProjectileResidualExcitationEnergy
1258 if ( common.PResidualMassNumber <= 1 ) {
1259 common.PResidualExcitationEnergy = 0.0;
1261 if ( common.PResidualMassNumber != 0 ) {
1262 if ( common.PResidualMassNumber == 1 ) {
1263 if ( std::abs( common.PResidualCharge ) == 1 ) {
1265 }
else if ( common.PResidualLambdaNumber == 1 ) {
1271 if ( common.PResidualLambdaNumber > 0 ) {
1272 if ( common.PResidualMassNumber == 2 ) {
1274 if ( std::abs( common.PResidualCharge ) == 1 ) {
1276 }
else if ( common.PResidualLambdaNumber == 1 ) {
1283 std::abs( common.PResidualCharge ),
1284 common.PResidualLambdaNumber );
1288 GetIonMass( std::abs( common.PResidualCharge ), common.PResidualMassNumber );
1293 common.TResidualMassNumber = TargetResidualMassNumber - 1;
1294 common.TResidualCharge = TargetResidualCharge
1296 common.TResidualExcitationEnergy = TargetResidualExcitationEnergy
1298 if ( common.TResidualMassNumber <= 1 ) {
1299 common.TResidualExcitationEnergy = 0.0;
1301 if ( common.TResidualMassNumber != 0 ) {
1303 GetIonMass( common.TResidualCharge, common.TResidualMassNumber );
1306 common.SumMasses = common.PNucleonMass + common.PResidualMass + common.TNucleonMass
1307 + common.TResidualMass;
1309 G4cout <<
"PNucleonMass PResidualMass TNucleonMass TResidualMass " << common.PNucleonMass
1310 <<
" " << common.PResidualMass <<
" " << common.TNucleonMass <<
" "
1311 << common.TResidualMass <<
G4endl
1312 <<
"PResidualExcitationEnergy " << common.PResidualExcitationEnergy <<
G4endl
1313 <<
"TResidualExcitationEnergy " << common.TResidualExcitationEnergy <<
G4endl;
1317 if ( ! Annihilation ) {
1318 if ( common.SqrtS < common.SumMasses ) {
1320 G4cout <<
"SqrtS < SumMasses " << common.SqrtS <<
" " << common.SumMasses <<
G4endl;
1324 if ( interactionCase == 1 || interactionCase == 2 ) {
1325 if ( common.SqrtS < common.SumMasses + common.TResidualExcitationEnergy ) {
1327 G4cout <<
"TResidualExcitationEnergy : before " << common.TResidualExcitationEnergy <<
G4endl;
1329 common.TResidualExcitationEnergy = common.SqrtS - common.SumMasses;
1331 G4cout <<
"TResidualExcitationEnergy : after " << common.TResidualExcitationEnergy <<
G4endl;
1336 }
else if ( interactionCase == 3 ) {
1338 G4cout <<
"SqrtS < SumMasses + PResidualExcitationEnergy + TResidualExcitationEnergy "
1339 << common.SqrtS <<
" " << common.SumMasses + common.PResidualExcitationEnergy + common.TResidualExcitationEnergy
1342 if ( common.SqrtS < common.SumMasses + common.PResidualExcitationEnergy
1343 + common.TResidualExcitationEnergy ) {
1345 if ( common.PResidualExcitationEnergy <= 0.0 ) {
1346 common.TResidualExcitationEnergy = common.SqrtS - common.SumMasses;
1347 }
else if ( common.TResidualExcitationEnergy <= 0.0 ) {
1348 common.PResidualExcitationEnergy = common.SqrtS - common.SumMasses;
1350 G4double Fraction = ( common.SqrtS - common.SumMasses )
1351 / ( common.PResidualExcitationEnergy + common.TResidualExcitationEnergy );
1352 common.PResidualExcitationEnergy *= Fraction;
1353 common.TResidualExcitationEnergy *= Fraction;
1359 if ( Annihilation ) {
1361 G4cout <<
"SqrtS < SumMasses - TNucleonMass " << common.SqrtS <<
" "
1362 << common.SumMasses - common.TNucleonMass <<
G4endl;
1364 if ( common.SqrtS < common.SumMasses - common.TNucleonMass ) {
1368 G4cout <<
"SqrtS < SumMasses " << common.SqrtS <<
" " << common.SumMasses <<
G4endl;
1370 if ( common.SqrtS < common.SumMasses ) {
1371 if ( interactionCase == 2 || interactionCase == 3 ) {
1372 common.TResidualExcitationEnergy = 0.0;
1374 common.TNucleonMass = common.SqrtS - ( common.SumMasses - common.TNucleonMass )
1375 - common.TResidualExcitationEnergy;
1377 G4cout <<
"TNucleonMass " << common.TNucleonMass <<
G4endl;
1379 common.SumMasses = common.SqrtS - common.TResidualExcitationEnergy;
1382 G4cout <<
"SqrtS < SumMasses " << common.SqrtS <<
" " << common.SumMasses <<
G4endl;
1385 if ( interactionCase == 1 || interactionCase == 2 ) {
1386 if ( common.SqrtS < common.SumMasses + common.TResidualExcitationEnergy ) {
1387 common.TResidualExcitationEnergy = common.SqrtS - common.SumMasses;
1390 }
else if ( interactionCase == 3 ) {
1391 if ( common.SqrtS < common.SumMasses + common.PResidualExcitationEnergy
1392 + common.TResidualExcitationEnergy ) {
1394 if ( common.PResidualExcitationEnergy <= 0.0 ) {
1395 common.TResidualExcitationEnergy = common.SqrtS - common.SumMasses;
1396 }
else if ( common.TResidualExcitationEnergy <= 0.0 ) {
1397 common.PResidualExcitationEnergy = common.SqrtS - common.SumMasses;
1399 G4double Fraction = ( common.SqrtS - common.SumMasses ) /
1400 ( common.PResidualExcitationEnergy + common.TResidualExcitationEnergy );
1401 common.PResidualExcitationEnergy *= Fraction;
1402 common.TResidualExcitationEnergy *= Fraction;
1414 common.Ptmp.
setPx( 0.0 ); common.Ptmp.
setPy( 0.0 ); common.Ptmp.
setPz( 0.0 );
1416 if ( interactionCase == 1 ) {
1418 }
else if ( interactionCase == 2 ) {
1419 common.Ptmp.
setE( common.TNucleonMass );
1420 }
else if ( interactionCase == 3 ) {
1421 common.Ptmp.
setE( common.PNucleonMass );
1426 common.Pprojectile = common.Ptmp;
1427 common.Pprojectile.
transform( common.toLab );
1431 saveSelectedAntiBaryon4Momentum.
transform( common.toCms );
1433 SelectedAntiBaryon->
Set4Momentum( common.Pprojectile );
1435 if ( interactionCase == 1 || interactionCase == 3 ) {
1436 common.Ptmp.
setE( common.TNucleonMass );
1437 }
else if ( interactionCase == 2 ) {
1443 common.Ptarget = common.Ptmp;
1444 common.Ptarget.
transform( common.toLab );
1448 saveSelectedTargetNucleon4Momentum.
transform( common.toCms );
1452 if ( interactionCase == 1 || interactionCase == 3 ) {
1453 common.Ptmp.
setPx( 0.0 ); common.Ptmp.
setPy( 0.0 ); common.Ptmp.
setPz( 0.0 );
1454 TargetResidualMassNumber = common.TResidualMassNumber;
1455 TargetResidualCharge = common.TResidualCharge;
1456 TargetResidualExcitationEnergy = common.TResidualExcitationEnergy;
1461 common.Ptmp.
setPx( -saveSelectedTargetNucleon4Momentum.
x() );
1462 common.Ptmp.
setPy( -saveSelectedTargetNucleon4Momentum.
y() );
1463 common.Ptmp.
setPz( -saveSelectedTargetNucleon4Momentum.
z() );
1464 common.Ptmp.
setE( std::sqrt(
sqr( common.TResidualMass + TargetResidualExcitationEnergy ) + common.Ptmp.
vect().
mag2() ) );
1470 TargetResidual4Momentum = common.Ptmp;
1473 if ( interactionCase == 2 || interactionCase == 3 ) {
1474 common.Ptmp.
setPx( 0.0 ); common.Ptmp.
setPy( 0.0 ); common.Ptmp.
setPz( 0.0 );
1475 if ( interactionCase == 2 ) {
1476 ProjectileResidualMassNumber = common.TResidualMassNumber;
1477 ProjectileResidualCharge = common.TResidualCharge;
1478 ProjectileResidualLambdaNumber = 0;
1479 ProjectileResidualExcitationEnergy = common.TResidualExcitationEnergy;
1480 common.Ptmp.
setE( common.TResidualMass + ProjectileResidualExcitationEnergy );
1482 ProjectileResidualMassNumber = common.PResidualMassNumber;
1483 ProjectileResidualCharge = common.PResidualCharge;
1484 ProjectileResidualLambdaNumber = common.PResidualLambdaNumber;
1485 ProjectileResidualExcitationEnergy = common.PResidualExcitationEnergy;
1490 common.Ptmp.
setPx( -saveSelectedAntiBaryon4Momentum.
x() );
1491 common.Ptmp.
setPy( -saveSelectedAntiBaryon4Momentum.
y() );
1492 common.Ptmp.
setPz( -saveSelectedAntiBaryon4Momentum.
z() );
1493 common.Ptmp.
setE( std::sqrt(
sqr( common.PResidualMass + ProjectileResidualExcitationEnergy ) + common.Ptmp.
vect().
mag2() ) );
1500 ProjectileResidual4Momentum = common.Ptmp;
1502 return returnCode = 0;
1506 if ( interactionCase == 1 ) {
1507 common.Mprojectile = common.Pprojectile.
mag();
1508 common.M2projectile = common.Pprojectile.
mag2();
1509 common.TResidual4Momentum = common.toCms * TargetResidual4Momentum;
1510 common.YtargetNucleus = common.TResidual4Momentum.
rapidity();
1511 common.TResidualMass += common.TResidualExcitationEnergy;
1512 }
else if ( interactionCase == 2 ) {
1513 common.Mtarget = common.Ptarget.
mag();
1514 common.M2target = common.Ptarget.
mag2();
1515 common.TResidual4Momentum = common.toCms * ProjectileResidual4Momentum;
1516 common.YprojectileNucleus = common.TResidual4Momentum.
rapidity();
1517 common.TResidualMass += common.TResidualExcitationEnergy;
1518 }
else if ( interactionCase == 3 ) {
1519 common.PResidual4Momentum = common.toCms * ProjectileResidual4Momentum;
1520 common.YprojectileNucleus = common.PResidual4Momentum.
rapidity();
1521 common.TResidual4Momentum = common.toCms*TargetResidual4Momentum;
1522 common.YtargetNucleus = common.TResidual4Momentum.
rapidity();
1523 common.PResidualMass += common.PResidualExcitationEnergy;
1524 common.TResidualMass += common.TResidualExcitationEnergy;
1527 G4cout <<
"YprojectileNucleus " << common.YprojectileNucleus <<
G4endl;
1530 return returnCode = 1;
1536G4bool G4FTFModel::AdjustNucleonsAlgorithm_Sampling(
G4int interactionCase,
1537 G4FTFModel::CommonVariables& common ) {
1542 G4double Dcor = theParameters->GetDofNuclearDestruction();
1544 if ( ProjectileResidualMassNumber != 0 ) DcorP = Dcor /
G4double(ProjectileResidualMassNumber);
1545 if ( TargetResidualMassNumber != 0 ) DcorT = Dcor /
G4double(TargetResidualMassNumber);
1546 G4double AveragePt2 = theParameters->GetPt2ofNuclearDestruction();
1547 G4double maxPtSquare = theParameters->GetMaxPt2ofNuclearDestruction();
1550 G4bool OuterSuccess =
true;
1551 const G4int maxNumberOfLoops = 1000;
1552 const G4int maxNumberOfTries = 10000;
1553 G4int loopCounter = 0;
1554 G4int NumberOfTries = 0;
1556 OuterSuccess =
true;
1557 G4bool loopCondition =
false;
1559 if ( NumberOfTries == 100*(NumberOfTries/100) ) {
1562 DcorP *= ScaleFactor;
1563 DcorT *= ScaleFactor;
1564 AveragePt2 *= ScaleFactor;
1571 if ( interactionCase == 1 ) {
1572 }
else if ( interactionCase == 2 ) {
1574 G4cout <<
"ProjectileResidualMassNumber " << ProjectileResidualMassNumber <<
G4endl;
1576 if ( ProjectileResidualMassNumber > 1 ) {
1577 common.PtNucleon = GaussianPt( AveragePt2, maxPtSquare );
1581 common.PtResidual = - common.PtNucleon;
1582 common.Mprojectile = std::sqrt(
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2() )
1583 + std::sqrt(
sqr( common.TResidualMass ) + common.PtResidual.
mag2() );
1585 G4cout <<
"SqrtS < Mtarget + Mprojectile " << common.SqrtS <<
" " << common.Mtarget
1586 <<
" " << common.Mprojectile <<
" " << common.Mtarget + common.Mprojectile <<
G4endl;
1588 common.M2projectile =
sqr( common.Mprojectile );
1589 if ( common.SqrtS < common.Mtarget + common.Mprojectile ) {
1590 OuterSuccess =
false;
1591 loopCondition =
true;
1594 }
else if ( interactionCase == 3 ) {
1595 if ( ProjectileResidualMassNumber > 1 ) {
1596 common.PtNucleonP = GaussianPt( AveragePt2, maxPtSquare );
1600 common.PtResidualP = - common.PtNucleonP;
1601 if ( TargetResidualMassNumber > 1 ) {
1602 common.PtNucleonT = GaussianPt( AveragePt2, maxPtSquare );
1606 common.PtResidualT = - common.PtNucleonT;
1607 common.Mprojectile = std::sqrt(
sqr( common.PNucleonMass ) + common.PtNucleonP.
mag2() )
1608 + std::sqrt(
sqr( common.PResidualMass ) + common.PtResidualP.
mag2() );
1609 common.M2projectile =
sqr( common.Mprojectile );
1610 common.Mtarget = std::sqrt(
sqr( common.TNucleonMass ) + common.PtNucleonT.
mag2() )
1611 + std::sqrt(
sqr( common.TResidualMass ) + common.PtResidualT.
mag2() );
1612 common.M2target =
sqr( common.Mtarget );
1613 if ( common.SqrtS < common.Mprojectile + common.Mtarget ) {
1614 OuterSuccess =
false;
1615 loopCondition =
true;
1620 G4int numberOfTimesExecuteInnerLoop = 1;
1621 if ( interactionCase == 3 ) numberOfTimesExecuteInnerLoop = 2;
1622 for (
G4int iExecute = 0; iExecute < numberOfTimesExecuteInnerLoop; iExecute++ ) {
1624 G4bool InnerSuccess =
true;
1625 G4bool isTargetToBeHandled = ( interactionCase == 1 ||
1626 ( interactionCase == 3 && iExecute == 1 ) );
1628 if ( isTargetToBeHandled ) {
1629 condition = ( TargetResidualMassNumber > 1 );
1631 condition = ( ProjectileResidualMassNumber > 1 );
1634 const G4int maxNumberOfInnerLoops = 1000;
1635 G4int innerLoopCounter = 0;
1637 InnerSuccess =
true;
1638 if ( isTargetToBeHandled ) {
1640 if ( interactionCase == 1 ) {
1641 common.PtNucleon = GaussianPt( AveragePt2, maxPtSquare );
1642 common.PtResidual = - common.PtNucleon;
1643 common.Mtarget = std::sqrt(
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2() )
1644 + std::sqrt(
sqr( common.TResidualMass ) + common.PtResidual.
mag2() );
1645 if ( common.SqrtS < common.Mprojectile + common.Mtarget ) {
1646 InnerSuccess =
false;
1649 Xcenter = std::sqrt(
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2() )
1652 Xcenter = std::sqrt(
sqr( common.TNucleonMass ) + common.PtNucleonT.
mag2() )
1656 common.XminusNucleon = Xcenter + tmpX.
x();
1657 if ( common.XminusNucleon <= 0.0 || common.XminusNucleon >= 1.0 ) {
1658 InnerSuccess =
false;
1661 common.XminusResidual = 1.0 - common.XminusNucleon;
1665 if ( interactionCase == 2 ) {
1666 Xcenter = std::sqrt(
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2() )
1667 / common.Mprojectile;
1669 Xcenter = std::sqrt(
sqr( common.PNucleonMass ) + common.PtNucleonP.
mag2() )
1670 / common.Mprojectile;
1672 common.XplusNucleon = Xcenter + tmpX.
x();
1673 if ( common.XplusNucleon <= 0.0 || common.XplusNucleon >= 1.0 ) {
1674 InnerSuccess =
false;
1677 common.XplusResidual = 1.0 - common.XplusNucleon;
1679 }
while ( ( ! InnerSuccess ) &&
1680 ++innerLoopCounter < maxNumberOfInnerLoops );
1681 if ( innerLoopCounter >= maxNumberOfInnerLoops ) {
1683 G4cout <<
"BAD situation: forced exit of the inner while loop!" <<
G4endl;
1688 if ( isTargetToBeHandled ) {
1689 common.XminusNucleon = 1.0;
1690 common.XminusResidual = 1.0;
1692 common.XplusNucleon = 1.0;
1693 common.XplusResidual = 1.0;
1699 if ( interactionCase == 1 ) {
1700 common.M2target = (
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2() )
1701 / common.XminusNucleon
1702 + (
sqr( common.TResidualMass ) + common.PtResidual.
mag2() )
1703 / common.XminusResidual;
1704 loopCondition = ( common.SqrtS < common.Mprojectile + std::sqrt( common.M2target ) );
1705 }
else if ( interactionCase == 2 ) {
1707 G4cout <<
"TNucleonMass PtNucleon XplusNucleon " << common.TNucleonMass <<
" "
1708 << common.PtNucleon <<
" " << common.XplusNucleon <<
G4endl
1709 <<
"TResidualMass PtResidual XplusResidual " << common.TResidualMass <<
" "
1710 << common.PtResidual <<
" " << common.XplusResidual <<
G4endl;
1712 common.M2projectile = (
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2() )
1713 / common.XplusNucleon
1714 + (
sqr( common.TResidualMass ) + common.PtResidual.
mag2() )
1715 / common.XplusResidual;
1717 G4cout <<
"SqrtS < Mtarget + std::sqrt(M2projectile) " << common.SqrtS <<
" "
1718 << common.Mtarget <<
" " << std::sqrt( common.M2projectile ) <<
" "
1719 << common.Mtarget + std::sqrt( common.M2projectile ) <<
G4endl;
1721 loopCondition = ( common.SqrtS < common.Mtarget + std::sqrt( common.M2projectile ) );
1722 }
else if ( interactionCase == 3 ) {
1724 G4cout <<
"PtNucleonP " << common.PtNucleonP <<
" " << common.PtResidualP <<
G4endl
1725 <<
"XplusNucleon XplusResidual " << common.XplusNucleon
1726 <<
" " << common.XplusResidual <<
G4endl
1727 <<
"PtNucleonT " << common.PtNucleonT <<
" " << common.PtResidualT <<
G4endl
1728 <<
"XminusNucleon XminusResidual " << common.XminusNucleon
1729 <<
" " << common.XminusResidual <<
G4endl;
1731 common.M2projectile = (
sqr( common.PNucleonMass ) + common.PtNucleonP.
mag2() )
1732 / common.XplusNucleon
1733 + (
sqr( common.PResidualMass) + common.PtResidualP.
mag2() )
1734 / common.XplusResidual;
1735 common.M2target = (
sqr( common.TNucleonMass ) + common.PtNucleonT.
mag2() )
1736 / common.XminusNucleon
1737 + (
sqr( common.TResidualMass ) + common.PtResidualT.
mag2() )
1738 / common.XminusResidual;
1739 loopCondition = ( common.SqrtS < ( std::sqrt( common.M2projectile )
1740 + std::sqrt( common.M2target ) ) );
1743 }
while ( loopCondition &&
1744 ++NumberOfTries < maxNumberOfTries );
1745 if ( NumberOfTries >= maxNumberOfTries ) {
1747 G4cout <<
"BAD situation: forced exit of the intermediate while loop!" <<
G4endl;
1753 G4double Yprojectile = 0.0, YprojectileNucleon = 0.0, Ytarget = 0.0, YtargetNucleon = 0.0;
1754 G4double DecayMomentum2 =
sqr( common.S ) +
sqr( common.M2projectile ) +
sqr( common.M2target )
1755 - 2.0 * ( common.S * ( common.M2projectile + common.M2target )
1756 + common.M2projectile * common.M2target );
1757 if ( interactionCase == 1 ) {
1758 common.WminusTarget = ( common.S - common.M2projectile + common.M2target
1759 + std::sqrt( DecayMomentum2 ) ) / 2.0 / common.SqrtS;
1760 common.WplusProjectile = common.SqrtS - common.M2target / common.WminusTarget;
1761 common.Pzprojectile = common.WplusProjectile / 2.0
1762 - common.M2projectile / 2.0 / common.WplusProjectile;
1763 common.Eprojectile = common.WplusProjectile / 2.0
1764 + common.M2projectile / 2.0 / common.WplusProjectile;
1765 Yprojectile = 0.5 *
G4Log( ( common.Eprojectile + common.Pzprojectile )
1766 / ( common.Eprojectile - common.Pzprojectile ) );
1768 G4cout <<
"DecayMomentum2 " << DecayMomentum2 <<
G4endl
1769 <<
"WminusTarget WplusProjectile " << common.WminusTarget
1770 <<
" " << common.WplusProjectile <<
G4endl
1771 <<
"Yprojectile " << Yprojectile <<
G4endl;
1773 common.Mt2targetNucleon =
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2();
1774 common.PztargetNucleon = - common.WminusTarget * common.XminusNucleon / 2.0
1775 + common.Mt2targetNucleon
1776 / ( 2.0 * common.WminusTarget * common.XminusNucleon );
1777 common.EtargetNucleon = common.WminusTarget * common.XminusNucleon / 2.0
1778 + common.Mt2targetNucleon
1779 / ( 2.0 * common.WminusTarget * common.XminusNucleon );
1780 YtargetNucleon = 0.5 *
G4Log( ( common.EtargetNucleon + common.PztargetNucleon )
1781 / ( common.EtargetNucleon - common.PztargetNucleon ) );
1783 G4cout <<
"YtN Ytr YtN-Ytr " <<
" " << YtargetNucleon <<
" " << common.YtargetNucleus
1784 <<
" " << YtargetNucleon - common.YtargetNucleus <<
G4endl
1785 <<
"YtN Ypr YtN-Ypr " <<
" " << YtargetNucleon <<
" " << Yprojectile
1786 <<
" " << YtargetNucleon - Yprojectile <<
G4endl;
1788 if ( std::abs( YtargetNucleon - common.YtargetNucleus ) > 2 ||
1789 Yprojectile < YtargetNucleon ) {
1790 OuterSuccess =
false;
1793 }
else if ( interactionCase == 2 ) {
1794 common.WplusProjectile = ( common.S + common.M2projectile - common.M2target
1795 + std::sqrt( DecayMomentum2 ) ) / 2.0 / common.SqrtS;
1796 common.WminusTarget = common.SqrtS - common.M2projectile / common.WplusProjectile;
1797 common.Pztarget = - common.WminusTarget / 2.0 + common.M2target / 2.0 / common.WminusTarget;
1798 common.Etarget = common.WminusTarget / 2.0 + common.M2target / 2.0 / common.WminusTarget;
1799 Ytarget = 0.5 *
G4Log( ( common.Etarget + common.Pztarget )
1800 / ( common.Etarget - common.Pztarget ) );
1802 G4cout <<
"DecayMomentum2 " << DecayMomentum2 <<
G4endl
1803 <<
"WminusTarget WplusProjectile " << common.WminusTarget
1804 <<
" " << common.WplusProjectile <<
G4endl
1805 <<
"Ytarget " << Ytarget <<
G4endl;
1807 common.Mt2projectileNucleon =
sqr( common.TNucleonMass ) + common.PtNucleon.
mag2();
1808 common.PzprojectileNucleon = common.WplusProjectile * common.XplusNucleon / 2.0
1809 - common.Mt2projectileNucleon
1810 / ( 2.0 * common.WplusProjectile * common.XplusNucleon );
1811 common.EprojectileNucleon = common.WplusProjectile * common.XplusNucleon / 2.0
1812 + common.Mt2projectileNucleon
1813 / ( 2.0 * common.WplusProjectile * common.XplusNucleon );
1814 YprojectileNucleon = 0.5 *
G4Log( ( common.EprojectileNucleon + common.PzprojectileNucleon )
1815 / ( common.EprojectileNucleon - common.PzprojectileNucleon) );
1817 G4cout <<
"YpN Ypr YpN-Ypr " <<
" " << YprojectileNucleon <<
" " << common.YprojectileNucleus
1818 <<
" " << YprojectileNucleon - common.YprojectileNucleus <<
G4endl
1819 <<
"YpN Ytr YpN-Ytr " <<
" " << YprojectileNucleon <<
" " << Ytarget
1820 <<
" " << YprojectileNucleon - Ytarget <<
G4endl;
1822 if ( std::abs( YprojectileNucleon - common.YprojectileNucleus ) > 2 ||
1823 Ytarget > YprojectileNucleon ) {
1824 OuterSuccess =
false;
1827 }
else if ( interactionCase == 3 ) {
1828 common.WplusProjectile = ( common.S + common.M2projectile - common.M2target
1829 + std::sqrt( DecayMomentum2 ) ) / 2.0 / common.SqrtS;
1830 common.WminusTarget = common.SqrtS - common.M2projectile / common.WplusProjectile;
1831 common.Mt2projectileNucleon =
sqr( common.PNucleonMass ) + common.PtNucleonP.
mag2();
1832 common.PzprojectileNucleon = common.WplusProjectile * common.XplusNucleon / 2.0
1833 - common.Mt2projectileNucleon
1834 / ( 2.0 * common.WplusProjectile * common.XplusNucleon );
1835 common.EprojectileNucleon = common.WplusProjectile * common.XplusNucleon / 2.0
1836 + common.Mt2projectileNucleon
1837 / ( 2.0 * common.WplusProjectile * common.XplusNucleon );
1838 YprojectileNucleon = 0.5 *
G4Log( ( common.EprojectileNucleon + common.PzprojectileNucleon )
1839 / ( common.EprojectileNucleon - common.PzprojectileNucleon ) );
1840 common.Mt2targetNucleon =
sqr( common.TNucleonMass ) + common.PtNucleonT.
mag2();
1841 common.PztargetNucleon = - common.WminusTarget * common.XminusNucleon / 2.0
1842 + common.Mt2targetNucleon
1843 / ( 2.0 * common.WminusTarget * common.XminusNucleon );
1844 common.EtargetNucleon = common.WminusTarget * common.XminusNucleon / 2.0
1845 + common.Mt2targetNucleon
1846 / ( 2.0 * common.WminusTarget * common.XminusNucleon );
1847 YtargetNucleon = 0.5 *
G4Log( ( common.EtargetNucleon + common.PztargetNucleon )
1848 / ( common.EtargetNucleon - common.PztargetNucleon ) );
1849 if ( std::abs( YtargetNucleon - common.YtargetNucleus ) > 2 ||
1850 std::abs( YprojectileNucleon - common.YprojectileNucleus ) > 2 ||
1851 YprojectileNucleon < YtargetNucleon ) {
1852 OuterSuccess =
false;
1857 }
while ( ( ! OuterSuccess ) &&
1858 ++loopCounter < maxNumberOfLoops );
1859 if ( loopCounter >= maxNumberOfLoops ) {
1861 G4cout <<
"BAD situation: forced exit of the while loop!" <<
G4endl;
1871void G4FTFModel::AdjustNucleonsAlgorithm_afterSampling(
G4int interactionCase,
1874 G4FTFModel::CommonVariables& common ) {
1879 if ( interactionCase == 1 ) {
1880 common.Pprojectile.
setPz( common.Pzprojectile );
1881 common.Pprojectile.
setE( common.Eprojectile );
1882 }
else if ( interactionCase == 2 ) {
1883 common.Pprojectile.
setPx( common.PtNucleon.
x() );
1884 common.Pprojectile.
setPy( common.PtNucleon.
y() );
1885 common.Pprojectile.
setPz( common.PzprojectileNucleon );
1886 common.Pprojectile.
setE( common.EprojectileNucleon );
1887 }
else if ( interactionCase == 3 ) {
1888 common.Pprojectile.
setPx( common.PtNucleonP.
x() );
1889 common.Pprojectile.
setPy( common.PtNucleonP.
y() );
1890 common.Pprojectile.
setPz( common.PzprojectileNucleon );
1891 common.Pprojectile.
setE( common.EprojectileNucleon );
1894 G4cout <<
"Proj after in CMS " << common.Pprojectile <<
G4endl;
1896 common.Pprojectile.
transform( common.toLab );
1897 SelectedAntiBaryon->
Set4Momentum( common.Pprojectile );
1899 G4cout <<
"Proj after in Lab " << common.Pprojectile <<
G4endl;
1903 if ( interactionCase == 1 ) {
1904 common.Ptarget.
setPx( common.PtNucleon.
x() );
1905 common.Ptarget.
setPy( common.PtNucleon.
y() );
1906 common.Ptarget.
setPz( common.PztargetNucleon );
1907 common.Ptarget.
setE( common.EtargetNucleon );
1908 }
else if ( interactionCase == 2 ) {
1909 common.Ptarget.
setPz( common.Pztarget );
1910 common.Ptarget.
setE( common.Etarget );
1911 }
else if ( interactionCase == 3 ) {
1912 common.Ptarget.
setPx( common.PtNucleonT.
x() );
1913 common.Ptarget.
setPy( common.PtNucleonT.
y() );
1914 common.Ptarget.
setPz( common.PztargetNucleon );
1915 common.Ptarget.
setE( common.EtargetNucleon );
1918 G4cout <<
"Targ after in CMS " << common.Ptarget <<
G4endl;
1920 common.Ptarget.
transform( common.toLab );
1923 G4cout <<
"Targ after in Lab " << common.Ptarget <<
G4endl;
1927 if ( interactionCase == 1 || interactionCase == 3 ) {
1928 TargetResidualMassNumber = common.TResidualMassNumber;
1929 TargetResidualCharge = common.TResidualCharge;
1930 TargetResidualExcitationEnergy = common.TResidualExcitationEnergy;
1932 G4cout <<
"TargetResidualMassNumber TargetResidualCharge TargetResidualExcitationEnergy "
1933 << TargetResidualMassNumber <<
" " << TargetResidualCharge <<
" "
1934 << TargetResidualExcitationEnergy <<
G4endl;
1936 if ( TargetResidualMassNumber != 0 ) {
1938 if ( interactionCase == 1 ) {
1939 Mt2 =
sqr( common.TResidualMass ) + common.PtResidual.
mag2();
1940 TargetResidual4Momentum.setPx( common.PtResidual.
x() );
1941 TargetResidual4Momentum.setPy( common.PtResidual.
y() );
1943 Mt2 =
sqr( common.TResidualMass ) + common.PtResidualT.
mag2();
1944 TargetResidual4Momentum.setPx( common.PtResidualT.
x() );
1945 TargetResidual4Momentum.setPy( common.PtResidualT.
y() );
1947 G4double Pz = - common.WminusTarget * common.XminusResidual / 2.0
1948 + Mt2 / ( 2.0 * common.WminusTarget * common.XminusResidual );
1949 G4double E = common.WminusTarget * common.XminusResidual / 2.0
1950 + Mt2 / ( 2.0 * common.WminusTarget * common.XminusResidual );
1951 TargetResidual4Momentum.setPz( Pz );
1952 TargetResidual4Momentum.setE( E ) ;
1953 TargetResidual4Momentum.transform( common.toLab );
1958 G4cout <<
"Tr N R " << common.Ptarget <<
G4endl <<
" " << TargetResidual4Momentum <<
G4endl;
1963 if ( interactionCase == 2 || interactionCase == 3 ) {
1964 if ( interactionCase == 2 ) {
1965 ProjectileResidualMassNumber = common.TResidualMassNumber;
1966 ProjectileResidualCharge = common.TResidualCharge;
1967 ProjectileResidualExcitationEnergy = common.TResidualExcitationEnergy;
1968 ProjectileResidualLambdaNumber = common.PResidualLambdaNumber;
1970 ProjectileResidualMassNumber = common.PResidualMassNumber;
1971 ProjectileResidualCharge = common.PResidualCharge;
1972 ProjectileResidualExcitationEnergy = common.PResidualExcitationEnergy;
1973 ProjectileResidualLambdaNumber = common.PResidualLambdaNumber;
1976 G4cout <<
"ProjectileResidualMassNumber ProjectileResidualCharge Lambdas ProjectileResidualExcitationEnergy "
1977 << ProjectileResidualMassNumber <<
" " << ProjectileResidualCharge <<
" "
1978 << ProjectileResidualLambdaNumber <<
" "
1979 << ProjectileResidualExcitationEnergy <<
G4endl;
1981 if ( ProjectileResidualMassNumber != 0 ) {
1983 if ( interactionCase == 2 ) {
1984 Mt2 =
sqr( common.TResidualMass ) + common.PtResidual.
mag2();
1985 ProjectileResidual4Momentum.setPx( common.PtResidual.
x() );
1986 ProjectileResidual4Momentum.setPy( common.PtResidual.
y() );
1988 Mt2 =
sqr( common.PResidualMass ) + common.PtResidualP.
mag2();
1989 ProjectileResidual4Momentum.setPx( common.PtResidualP.
x() );
1990 ProjectileResidual4Momentum.setPy( common.PtResidualP.
y() );
1992 G4double Pz = common.WplusProjectile * common.XplusResidual / 2.0
1993 - Mt2 / ( 2.0 * common.WplusProjectile * common.XplusResidual );
1994 G4double E = common.WplusProjectile * common.XplusResidual / 2.0
1995 + Mt2 / ( 2.0 * common.WplusProjectile * common.XplusResidual );
1996 ProjectileResidual4Momentum.setPz( Pz );
1997 ProjectileResidual4Momentum.setE( E );
1998 ProjectileResidual4Momentum.transform( common.toLab );
2004 <<
" " << ProjectileResidual4Momentum <<
G4endl;
2017 G4ExcitedString* FirstString( 0 );
2018 G4ExcitedString* SecondString( 0 );
2022 std::vector< G4VSplitableHadron* > primaries;
2023 theParticipants.StartLoop();
2024 while ( theParticipants.Next() ) {
2025 const G4InteractionContent& interaction = theParticipants.GetInteraction();
2028 if ( primaries.end() == std::find( primaries.begin(), primaries.end(),
2035 #ifdef debugBuildString
2037 <<
"Number of projectile strings " << primaries.size() <<
G4endl;
2040 for (
unsigned int ahadron = 0; ahadron < primaries.size(); ahadron++ ) {
2041 G4bool isProjectile(
true );
2044 FirstString = 0; SecondString = 0;
2045 if ( primaries[ahadron]->GetStatus() == 0 ) {
2046 theExcitation->CreateStrings( primaries[ ahadron ], isProjectile,
2047 FirstString, SecondString, theParameters );
2048 NumberOfProjectileSpectatorNucleons--;
2049 }
else if ( primaries[ahadron]->GetStatus() == 1
2050 && primaries[ahadron]->GetSoftCollisionCount() != 0 ) {
2051 theExcitation->CreateStrings( primaries[ ahadron ], isProjectile,
2052 FirstString, SecondString, theParameters );
2053 NumberOfProjectileSpectatorNucleons--;
2054 }
else if ( primaries[ahadron]->GetStatus() == 1
2055 && primaries[ahadron]->GetSoftCollisionCount() == 0 ) {
2057 G4KineticTrack* aTrack =
new G4KineticTrack( primaries[ahadron]->GetDefinition(),
2058 primaries[ahadron]->GetTimeOfCreation(),
2059 primaries[ahadron]->GetPosition(),
2061 FirstString =
new G4ExcitedString( aTrack );
2062 }
else if (primaries[ahadron]->GetStatus() == 2) {
2064 G4KineticTrack* aTrack =
new G4KineticTrack( primaries[ahadron]->GetDefinition(),
2065 primaries[ahadron]->GetTimeOfCreation(),
2066 primaries[ahadron]->GetPosition(),
2068 FirstString =
new G4ExcitedString( aTrack );
2069 NumberOfProjectileSpectatorNucleons--;
2071 G4cout <<
"Something wrong in FTF Model Build String" <<
G4endl;
2074 if ( FirstString != 0 ) strings->push_back( FirstString );
2075 if ( SecondString != 0 ) strings->push_back( SecondString );
2077 #ifdef debugBuildString
2078 G4cout <<
"FirstString & SecondString? " << FirstString <<
" " << SecondString <<
G4endl;
2079 if ( FirstString->IsExcited() ) {
2080 G4cout <<
"Quarks on the FirstString ends " << FirstString->GetRightParton()->GetPDGcode()
2081 <<
" " << FirstString->GetLeftParton()->GetPDGcode() <<
G4endl;
2089 #ifdef debugBuildString
2090 if ( FirstString->IsExcited() ) {
2091 G4cout <<
"Check 1 string " << strings->operator[](0)->GetRightParton()->GetPDGcode()
2092 <<
" " << strings->operator[](0)->GetLeftParton()->GetPDGcode() <<
G4endl <<
G4endl;
2096 std::for_each( primaries.begin(), primaries.end(), DeleteVSplitableHadron() );
2101 #ifdef debugBuildString
2102 G4cout <<
"Building of projectile-like strings" <<
G4endl;
2105 G4bool isProjectile =
true;
2106 for (
G4int ahadron = 0; ahadron < NumberOfInvolvedNucleonsOfProjectile; ahadron++ ) {
2108 #ifdef debugBuildString
2109 G4cout <<
"Nucleon #, status, intCount " << ahadron <<
" "
2110 << TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron()->GetStatus()
2111 <<
" " << TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron()
2112 ->GetSoftCollisionCount()<<
G4endl;
2115 G4VSplitableHadron* aProjectile =
2116 TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron();
2118 #ifdef debugBuildString
2119 G4cout <<
G4endl <<
"ahadron aProjectile Status " << ahadron <<
" " << aProjectile
2123 FirstString = 0; SecondString = 0;
2126 #ifdef debugBuildString
2127 G4cout <<
"Case1 aProjectile->GetStatus() == 0 " <<
G4endl;
2130 theExcitation->CreateStrings(
2131 TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron(),
2132 isProjectile, FirstString, SecondString, theParameters );
2133 NumberOfProjectileSpectatorNucleons--;
2137 #ifdef debugBuildString
2138 G4cout <<
"Case2 aProjectile->GetStatus() !=0 St==1 SoftCol!=0" <<
G4endl;
2141 theExcitation->CreateStrings(
2142 TheInvolvedNucleonsOfProjectile[ ahadron ]->GetSplitableHadron(),
2143 isProjectile, FirstString, SecondString, theParameters );
2144 NumberOfProjectileSpectatorNucleons--;
2151 #ifdef debugBuildString
2152 G4cout <<
"Case3 aProjectile->GetStatus() !=0 St==1 SoftCol==0" <<
G4endl;
2156 G4KineticTrack* aTrack =
new G4KineticTrack( aProjectile->
GetDefinition(),
2160 FirstString =
new G4ExcitedString( aTrack );
2162 #ifdef debugBuildString
2163 G4cout <<
" Strings are built for nucleon marked for an interaction, but"
2164 <<
" the interaction was skipped." <<
G4endl;
2170 #ifdef debugBuildString
2171 G4cout <<
"Case4 aProjectile->GetStatus() !=0 St==2 " <<
G4endl;
2175 G4KineticTrack* aTrack =
new G4KineticTrack( aProjectile->
GetDefinition(),
2179 FirstString =
new G4ExcitedString( aTrack );
2181 #ifdef debugBuildString
2182 G4cout <<
" Strings are build for involved nucleon." <<
G4endl;
2185 if ( aProjectile->
GetStatus() == 2 ) NumberOfProjectileSpectatorNucleons--;
2188 #ifdef debugBuildString
2195 #ifdef debugBuildString
2201 if ( FirstString != 0 ) strings->push_back( FirstString );
2202 if ( SecondString != 0 ) strings->push_back( SecondString );
2206 #ifdef debugBuildString
2210 G4bool isProjectile =
false;
2211 for (
G4int ahadron = 0; ahadron < NumberOfInvolvedNucleonsOfTarget; ahadron++ ) {
2212 G4VSplitableHadron* aNucleon = TheInvolvedNucleonsOfTarget[ ahadron ]->
GetSplitableHadron();
2214 #ifdef debugBuildString
2215 G4cout <<
"Nucleon #, status, intCount " << aNucleon <<
" " << ahadron <<
" "
2219 FirstString = 0 ; SecondString = 0;
2222 theExcitation->CreateStrings( aNucleon, isProjectile,
2223 FirstString, SecondString, theParameters );
2224 NumberOfTargetSpectatorNucleons--;
2226 #ifdef debugBuildString
2232 theExcitation->CreateStrings( aNucleon, isProjectile,
2233 FirstString, SecondString, theParameters );
2235 #ifdef debugBuildString
2236 G4cout <<
" 2 case A string is build, nucleon was excited." <<
G4endl;
2239 NumberOfTargetSpectatorNucleons--;
2248 G4KineticTrack* aTrack =
new G4KineticTrack( aNucleon->
GetDefinition(),
2253 FirstString =
new G4ExcitedString( aTrack );
2255 #ifdef debugBuildString
2260 ! HighEnergyInter ) {
2267 #ifdef debugBuildString
2271 }
else if ( aNucleon->
GetStatus() == 2 ||
2274 G4KineticTrack* aTrack =
new G4KineticTrack( aNucleon->
GetDefinition(),
2278 FirstString =
new G4ExcitedString( aTrack );
2280 #ifdef debugBuildString
2284 if ( aNucleon->
GetStatus() == 2 ) NumberOfTargetSpectatorNucleons--;
2288 #ifdef debugBuildString
2294 if ( FirstString != 0 ) strings->push_back( FirstString );
2295 if ( SecondString != 0 ) strings->push_back( SecondString );
2299 #ifdef debugBuildString
2300 G4cout <<
G4endl <<
"theAdditionalString.size() " << theAdditionalString.size()
2304 isProjectile =
true;
2305 if ( theAdditionalString.size() != 0 ) {
2306 for (
unsigned int ahadron = 0; ahadron < theAdditionalString.size(); ahadron++ ) {
2308 FirstString = 0; SecondString = 0;
2309 theExcitation->CreateStrings( theAdditionalString[ ahadron ], isProjectile,
2310 FirstString, SecondString, theParameters );
2311 if ( FirstString != 0 ) strings->push_back( FirstString );
2312 if ( SecondString != 0 ) strings->push_back( SecondString );
2328void G4FTFModel::GetResiduals() {
2331 #ifdef debugFTFmodel
2332 G4cout <<
"GetResiduals(): HighEnergyInter? GetProjectileNucleus()?"
2336 if ( HighEnergyInter ) {
2338 #ifdef debugFTFmodel
2339 G4cout <<
"NumberOfInvolvedNucleonsOfTarget "<< NumberOfInvolvedNucleonsOfTarget <<
G4endl;
2342 G4double DeltaExcitationE = TargetResidualExcitationEnergy /
2343 G4double( NumberOfInvolvedNucleonsOfTarget );
2345 G4double( NumberOfInvolvedNucleonsOfTarget );
2347 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
2348 G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
2350 #ifdef debugFTFmodel
2361 if ( TargetResidualMassNumber != 0 ) {
2362 G4ThreeVector bstToCM = TargetResidual4Momentum.findBoostToCM();
2366 G4Nucleon* aNucleon = 0;
2372 residualMomentum += tmp;
2376 residualMomentum /= TargetResidualMassNumber;
2378 G4double Mass = TargetResidual4Momentum.mag();
2394 const G4int maxNumberOfLoops = 1000;
2395 G4int loopCounter = 0;
2397 C = ( Chigh + Clow ) / 2.0;
2410 if ( SumMasses > Mass ) Chigh =
C;
2413 }
while ( Chigh - Clow > 0.01 &&
2414 ++loopCounter < maxNumberOfLoops );
2415 if ( loopCounter >= maxNumberOfLoops ) {
2416 #ifdef debugFTFmodel
2417 G4cout <<
"BAD situation: forced exit of the first while loop in G4FTFModel::GetResidual" <<
G4endl
2418 <<
"\t return immediately from the method!" <<
G4endl;
2438 #ifdef debugFTFmodel
2439 G4cout <<
"NumberOfInvolvedNucleonsOfProjectile " << NumberOfInvolvedNucleonsOfProjectile
2440 <<
G4endl <<
"ProjectileResidualExcitationEnergy ProjectileResidual4Momentum "
2441 << ProjectileResidualExcitationEnergy <<
" " << ProjectileResidual4Momentum <<
G4endl;
2444 DeltaExcitationE = ProjectileResidualExcitationEnergy /
2445 G4double( NumberOfInvolvedNucleonsOfProjectile );
2446 DeltaPResidualNucleus = ProjectileResidual4Momentum /
2447 G4double( NumberOfInvolvedNucleonsOfProjectile );
2449 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
2450 G4Nucleon* aNucleon = TheInvolvedNucleonsOfProjectile[i];
2452 #ifdef debugFTFmodel
2463 if ( ProjectileResidualMassNumber != 0 ) {
2464 G4ThreeVector bstToCM = ProjectileResidual4Momentum.findBoostToCM();
2468 G4Nucleon* aNucleon = 0;
2470 while ( ( aNucleon = theProjectileNucleus->
GetNextNucleon() ) ) {
2474 residualMomentum += tmp;
2478 residualMomentum /= ProjectileResidualMassNumber;
2480 G4double Mass = ProjectileResidual4Momentum.mag();
2485 while ( ( aNucleon = theProjectileNucleus->
GetNextNucleon() ) ) {
2496 const G4int maxNumberOfLoops = 1000;
2497 G4int loopCounter = 0;
2499 C = ( Chigh + Clow ) / 2.0;
2504 while ( ( aNucleon = theProjectileNucleus->
GetNextNucleon() ) ) {
2513 if ( SumMasses > Mass) Chigh =
C;
2516 }
while ( Chigh - Clow > 0.01 &&
2517 ++loopCounter < maxNumberOfLoops );
2518 if ( loopCounter >= maxNumberOfLoops ) {
2519 #ifdef debugFTFmodel
2520 G4cout <<
"BAD situation: forced exit of the second while loop in G4FTFModel::GetResidual" <<
G4endl
2521 <<
"\t return immediately from the method!" <<
G4endl;
2528 while ( ( aNucleon = theProjectileNucleus->
GetNextNucleon() ) ) {
2539 #ifdef debugFTFmodel
2545 #ifdef debugFTFmodel
2546 G4cout <<
"Low energy interaction: Target nucleus --------------" <<
G4endl
2547 <<
"Tr ResidualMassNumber Tr ResidualCharge Tr ResidualExcitationEnergy "
2548 << TargetResidualMassNumber <<
" " << TargetResidualCharge <<
" "
2549 << TargetResidualExcitationEnergy <<
G4endl;
2552 G4int NumberOfTargetParticipant( 0 );
2553 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
2554 G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
2562 if ( NumberOfTargetParticipant != 0 ) {
2563 DeltaExcitationE = TargetResidualExcitationEnergy /
G4double( NumberOfTargetParticipant );
2564 DeltaPResidualNucleus = TargetResidual4Momentum /
G4double( NumberOfTargetParticipant );
2567 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; ++i ) {
2568 G4Nucleon* aNucleon = TheInvolvedNucleonsOfTarget[i];
2575 delete targetSplitable;
2576 targetSplitable = 0;
2577 aNucleon->
Hit( targetSplitable );
2582 #ifdef debugFTFmodel
2583 G4cout <<
"NumberOfTargetParticipant " << NumberOfTargetParticipant <<
G4endl
2584 <<
"TargetResidual4Momentum " << TargetResidual4Momentum <<
G4endl;
2589 #ifdef debugFTFmodel
2590 G4cout <<
"Low energy interaction: Projectile nucleus --------------" <<
G4endl
2591 <<
"Pr ResidualMassNumber Pr ResidualCharge Pr ResidualExcitationEnergy "
2592 << ProjectileResidualMassNumber <<
" " << ProjectileResidualCharge <<
" "
2593 << ProjectileResidualExcitationEnergy <<
G4endl;
2596 G4int NumberOfProjectileParticipant( 0 );
2597 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
2598 G4Nucleon* aNucleon = TheInvolvedNucleonsOfProjectile[i];
2603 #ifdef debugFTFmodel
2607 DeltaExcitationE = 0.0;
2610 if ( NumberOfProjectileParticipant != 0 ) {
2611 DeltaExcitationE = ProjectileResidualExcitationEnergy /
G4double( NumberOfProjectileParticipant );
2612 DeltaPResidualNucleus = ProjectileResidual4Momentum /
G4double( NumberOfProjectileParticipant );
2616 for (
G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; ++i ) {
2617 G4Nucleon* aNucleon = TheInvolvedNucleonsOfProjectile[i];
2624 delete projectileSplitable;
2625 projectileSplitable = 0;
2626 aNucleon->
Hit( projectileSplitable );
2631 #ifdef debugFTFmodel
2632 G4cout <<
"NumberOfProjectileParticipant " << NumberOfProjectileParticipant <<
G4endl
2633 <<
"ProjectileResidual4Momentum " << ProjectileResidual4Momentum <<
G4endl;
2638 #ifdef debugFTFmodel
2639 G4cout <<
"End GetResiduals -----------------" <<
G4endl;
2651 if (AveragePt2 > 0.0) {
2652 const G4double ymax = maxPtSquare/AveragePt2;
2653 if ( ymax < 200. ) {
2658 Pt = std::sqrt( Pt2 );
2663 return G4ThreeVector( Pt*std::cos(phi), Pt*std::sin(phi), 0.0 );
2673 G4double& residualExcitationEnergy,
2675 G4int& residualMassNumber,
2676 G4int& residualCharge ) {
2688 if ( ! nucleus )
return false;
2690 G4double ExcitationEnergyPerWoundedNucleon =
2691 theParameters->GetExcitationEnergyPerWoundedNucleon();
2704 G4int residualNumberOfLambdas = 0;
2705 G4Nucleon* aNucleon = 0;
2707 while ( ( aNucleon =
nucleus->GetNextNucleon() ) ) {
2714 sumMasses += 20.0*MeV;
2717 residualExcitationEnergy += -ExcitationEnergyPerWoundedNucleon*
G4Log(
G4UniformRand() );
2719 residualMassNumber--;
2726 ++residualNumberOfLambdas;
2730 #ifdef debugPutOnMassShell
2731 G4cout <<
"ExcitationEnergyPerWoundedNucleon " << ExcitationEnergyPerWoundedNucleon <<
G4endl
2732 <<
"\t Residual Charge, MassNumber (Number of Lambdas)" << residualCharge <<
" "
2733 << residualMassNumber <<
" (" << residualNumberOfLambdas <<
") "
2734 <<
G4endl <<
"\t Initial Momentum " << nucleusMomentum
2735 <<
G4endl <<
"\t Residual Momentum " << residualMomentum <<
G4endl;
2737 residualMomentum.
setPz( 0.0 );
2738 residualMomentum.
setE( 0.0 );
2739 if ( residualMassNumber == 0 ) {
2741 residualExcitationEnergy = 0.0;
2743 if ( residualMassNumber == 1 ) {
2744 if ( std::abs( residualCharge ) == 1 ) {
2746 }
else if ( residualNumberOfLambdas == 1 ) {
2751 residualExcitationEnergy = 0.0;
2753 if ( residualNumberOfLambdas > 0 ) {
2754 if ( residualMassNumber == 2 ) {
2756 if ( std::abs( residualCharge ) == 1 ) {
2758 }
else if ( residualNumberOfLambdas == 1 ) {
2765 residualNumberOfLambdas );
2769 GetIonMass( std::abs( residualCharge ), residualMassNumber );
2772 residualMass += residualExcitationEnergy;
2774 sumMasses += std::sqrt(
sqr( residualMass ) + residualMomentum.
perp2() );
2782GenerateDeltaIsobar(
const G4double sqrtS,
2783 const G4int numberOfInvolvedNucleons,
2801 if ( sqrtS < 0.0 || numberOfInvolvedNucleons <= 0 || sumMasses < 0.0 )
return false;
2803 const G4double probDeltaIsobar = 0.05;
2805 G4int maxNumberOfDeltas =
G4int( (sqrtS - sumMasses)/(400.0*MeV) );
2806 G4int numberOfDeltas = 0;
2808 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
2810 if (
G4UniformRand() < probDeltaIsobar && numberOfDeltas < maxNumberOfDeltas ) {
2812 if ( ! involvedNucleons[i] )
continue;
2821 const G4ParticleDefinition* old_def = splitableHadron->
GetDefinition();
2822 G4int newPdgCode = pdgCode/10; newPdgCode = newPdgCode*10 + 4;
2824 const G4ParticleDefinition* ptr =
2831 if ( sqrtS < sumMasses + massDelta - massNuc ) {
2835 sumMasses += ( massDelta - massNuc );
2847SamplingNucleonKinematics(
G4double averagePt2,
2853 const G4int residualMassNumber,
2854 const G4int numberOfInvolvedNucleons,
2867#ifdef debugPutOnMassShell
2868 G4cout <<
"G4FTFModel::SamplingNucleonKinematics:" <<
G4endl;
2869 G4cout <<
" averagePt2= " << averagePt2 <<
" maxPt2= " << maxPt2
2870 <<
" dCor= " << dCor <<
" resMass(GeV)= " << residualMass/GeV
2871 <<
" resMassN= " << residualMassNumber
2872 <<
" nNuc= " << numberOfInvolvedNucleons
2873 <<
" lv= " << pResidual <<
G4endl;
2876 if ( ! nucleus || numberOfInvolvedNucleons < 1 )
return false;
2878 if ( residualMassNumber == 0 && numberOfInvolvedNucleons == 1 ) {
2890 const G4int maxNumberOfLoops = 1000;
2891 G4int loopCounter = 0;
2898 if( averagePt2 > 0.0 ) {
2899 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
2900 G4Nucleon* aNucleon = involvedNucleons[i];
2901 if ( ! aNucleon )
continue;
2909 G4double deltaPx = ( ptSum.x() - pResidual.
x() )*invN;
2910 G4double deltaPy = ( ptSum.y() - pResidual.
y() )*invN;
2912 SumMasses = residualMass;
2913 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
2914 G4Nucleon* aNucleon = involvedNucleons[i];
2915 if ( ! aNucleon )
continue;
2919 +
sqr( px ) +
sqr( py ) );
2928 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
2929 G4Nucleon* aNucleon = involvedNucleons[i];
2930 if ( ! aNucleon )
continue;
2938 if ( x < -eps || x > 1.0 + eps ) {
2942 x = std::min(1.0, std::max(x, 0.0));
2952 if ( xSum < -eps || xSum > 1.0 + eps ) success =
false;
2953 if ( ! success )
continue;
2955 G4double delta = ( residualMassNumber == 0 ) ? std::min( xSum - 1.0, 0.0 )*invN : 0.0;
2959 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
2960 G4Nucleon* aNucleon = involvedNucleons[i];
2961 if ( ! aNucleon )
continue;
2965 if ( residualMassNumber == 0 ) {
2966 if ( x <= -eps || x > 1.0 + eps ) {
2971 if ( x <= -eps || x > 1.0 + eps || xSum <= -eps || xSum > 1.0 + eps ) {
2976 x = std::min( 1.0, std::max(x, eps) );
2984 if ( ! success )
continue;
2985 xSum = std::min( 1.0, std::max(xSum, eps) );
2987 if ( residualMassNumber > 0 ) mass2 += (
sqr( residualMass ) + pResidual.
perp2() ) / xSum;
2989 #ifdef debugPutOnMassShell
2990 G4cout <<
"success: " << success <<
" Mt(GeV)= "
2991 << std::sqrt( mass2 )/GeV <<
G4endl;
2994 }
while ( ( ! success ) &&
2995 ++loopCounter < maxNumberOfLoops );
2996 return ( loopCounter < maxNumberOfLoops );
3003CheckKinematics(
const G4double sValue,
3008 const G4bool isProjectileNucleus,
3009 const G4int numberOfInvolvedNucleons,
3024 G4double decayMomentum2 =
sqr( sValue ) +
sqr( projectileMass2 ) +
sqr( targetMass2 )
3025 - 2.0*( sValue*( projectileMass2 + targetMass2 )
3026 + projectileMass2*targetMass2 );
3027 targetWminus = ( sValue - projectileMass2 + targetMass2 + std::sqrt( decayMomentum2 ) )
3029 projectileWplus = sqrtS - targetMass2/targetWminus;
3030 G4double projectilePz = projectileWplus/2.0 - projectileMass2/2.0/projectileWplus;
3031 G4double projectileE = projectileWplus/2.0 + projectileMass2/2.0/projectileWplus;
3032 G4double projectileY = 0.5 *
G4Log( (projectileE + projectilePz)/
3033 (projectileE - projectilePz) );
3034 G4double targetPz = -targetWminus/2.0 + targetMass2/2.0/targetWminus;
3035 G4double targetE = targetWminus/2.0 + targetMass2/2.0/targetWminus;
3036 G4double targetY = 0.5 *
G4Log( (targetE + targetPz)/(targetE - targetPz) );
3038 #ifdef debugPutOnMassShell
3039 G4cout <<
"decayMomentum2 " << decayMomentum2 <<
G4endl
3040 <<
"\t targetWminus projectileWplus " << targetWminus <<
" " << projectileWplus <<
G4endl
3041 <<
"\t projectileY targetY " << projectileY <<
" " << targetY <<
G4endl;
3042 if ( isProjectileNucleus ) {
3043 G4cout <<
"Order# of Wounded nucleon i, nucleon Y proj Y nuclY - proj Y " <<
G4endl;
3045 G4cout <<
"Order# of Wounded nucleon i, nucleon Y targ Y nuclY - targ Y " <<
G4endl;
3050 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
3051 G4Nucleon* aNucleon = involvedNucleons[i];
3052 if ( ! aNucleon )
continue;
3057 G4double pz = -targetWminus*x/2.0 + mt2/(2.0*targetWminus*x);
3058 G4double e = targetWminus*x/2.0 + mt2/(2.0*targetWminus*x);
3059 if ( isProjectileNucleus ) {
3060 pz = projectileWplus*x/2.0 - mt2/(2.0*projectileWplus*x);
3061 e = projectileWplus*x/2.0 + mt2/(2.0*projectileWplus*x);
3065 #ifdef debugPutOnMassShell
3066 if( isProjectileNucleus ) {
3067 G4cout <<
" " << i <<
" " << nucleonY <<
" " << projectileY <<
" " <<nucleonY - projectileY <<
G4endl;
3069 G4cout <<
" " << i <<
" " << nucleonY <<
" " << targetY <<
" " <<nucleonY - targetY <<
G4endl;
3074 if ( std::abs( nucleonY - nucleusY ) > 2 ||
3075 ( isProjectileNucleus && targetY > nucleonY ) ||
3076 ( ! isProjectileNucleus && projectileY < nucleonY ) ) {
3088FinalizeKinematics(
const G4double w,
3089 const G4bool isProjectileNucleus,
3092 const G4int residualMassNumber,
3093 const G4int numberOfInvolvedNucleons,
3111 for (
G4int i = 0; i < numberOfInvolvedNucleons; ++i ) {
3112 G4Nucleon* aNucleon = involvedNucleons[i];
3113 if ( ! aNucleon )
continue;
3115 residual3Momentum -= tmp.
vect();
3119 G4double pz = -w * x / 2.0 + mt2 / ( 2.0 * w * x );
3120 G4double e = w * x / 2.0 + mt2 / ( 2.0 * w * x );
3122 if ( isProjectileNucleus ) pz *= -1.0;
3131 G4double residualMt2 =
sqr( residualMass ) +
sqr( residual3Momentum.x() )
3132 +
sqr( residual3Momentum.y() );
3134 #ifdef debugPutOnMassShell
3135 if ( isProjectileNucleus ) {
3136 G4cout <<
"Wminus Proj and residual3Momentum.z() " << w <<
" " << residual3Momentum.z() <<
G4endl;
3138 G4cout <<
"Wplus Targ and residual3Momentum.z() " << w <<
" " << residual3Momentum.z() <<
G4endl;
3144 if ( residualMassNumber != 0 ) {
3145 residualPz = -w * residual3Momentum.z() / 2.0 +
3146 residualMt2 / ( 2.0 * w * residual3Momentum.z() );
3147 residualE = w * residual3Momentum.z() / 2.0 +
3148 residualMt2 / ( 2.0 * w * residual3Momentum.z() );
3150 if ( isProjectileNucleus ) residualPz *= -1.0;
3153 residual4Momentum.
setPx( residual3Momentum.x() );
3154 residual4Momentum.
setPy( residual3Momentum.y() );
3155 residual4Momentum.
setPz( residualPz );
3156 residual4Momentum.
setE( residualE );
3165 desc <<
" FTF (Fritiof) Model \n"
3166 <<
"The FTF model is based on the well-known FRITIOF \n"
3167 <<
"model (B. Andersson et al., Nucl. Phys. B281, 289 \n"
3168 <<
"(1987)). Its first program implementation was given\n"
3169 <<
"by B. Nilsson-Almquist and E. Stenlund (Comp. Phys.\n"
3170 <<
"Comm. 43, 387 (1987)). The Fritiof model assumes \n"
3171 <<
"that all hadron-hadron interactions are binary \n"
3172 <<
"reactions, h_1+h_2->h_1'+h_2' where h_1' and h_2' \n"
3173 <<
"are excited states of the hadrons with continuous \n"
3174 <<
"mass spectra. The excited hadrons are considered as\n"
3175 <<
"QCD-strings, and the corresponding LUND-string \n"
3176 <<
"fragmentation model is applied for a simulation of \n"
3177 <<
"their decays. \n"
3178 <<
" The Fritiof model assumes that in the course of \n"
3179 <<
"a hadron-nucleus interaction a string originated \n"
3180 <<
"from the projectile can interact with various intra\n"
3181 <<
"nuclear nucleons and becomes into highly excited \n"
3182 <<
"states. The probability of multiple interactions is\n"
3183 <<
"calculated in the Glauber approximation. A cascading\n"
3184 <<
"of secondary particles was neglected as a rule. Due\n"
3185 <<
"to these, the original Fritiof model fails to des- \n"
3186 <<
"cribe a nuclear destruction and slow particle spectra.\n"
3187 <<
" In order to overcome the difficulties we enlarge\n"
3188 <<
"the model by the reggeon theory inspired model of \n"
3189 <<
"nuclear desctruction (Kh. Abdel-Waged and V.V. Uzhi-\n"
3190 <<
"nsky, Phys. Atom. Nucl. 60, 828 (1997); Yad. Fiz. 60, 925\n"
3191 <<
"(1997)). Momenta of the nucleons ejected from a nuc-\n"
3192 <<
"leus in the reggeon cascading are sampled according\n"
3193 <<
"to a Fermi motion algorithm presented in (EMU-01 \n"
3194 <<
"Collaboration (M.I. Adamovich et al.) Zeit. fur Phys.\n"
3195 <<
"A358, 337 (1997)). \n"
3196 <<
" New features were also added to the Fritiof model\n"
3197 <<
"implemented in Geant4: a simulation of elastic had-\n"
3198 <<
"ron-nucleon scatterings, a simulation of binary \n"
3199 <<
"reactions like NN>NN* in hadron-nucleon interactions,\n"
3200 <<
"a separate simulation of single diffractive and non-\n"
3201 <<
" diffractive events. These allowed to describe after\n"
3202 <<
"model parameter tuning a wide set of experimental \n"
G4double C(G4double temp)
G4double S(G4double temp)
G4double condition(const G4ErrorSymMatrix &m)
std::vector< G4ExcitedString * > G4ExcitedStringVector
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
CLHEP::HepLorentzRotation G4LorentzRotation
CLHEP::HepLorentzVector G4LorentzVector
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)
HepLorentzVector & transform(const HepRotation &)
static G4AntiLambda * Definition()
static G4AntiNeutron * Definition()
static G4AntiProton * Definition()
G4bool SampleBinInterval() const
void SetImpactParameter(const G4double b_value)
G4V3DNucleus * GetTargetNucleus() const
G4FTFModel(const G4String &modelName="FTF")
G4ExcitedStringVector * GetStrings() override
G4V3DNucleus * GetProjectileNucleus() const override
void Init(const G4Nucleus &aNucleus, const G4DynamicParticle &aProjectile) override
void ModelDescription(std::ostream &) const override
void SetEnergyMomentumCheckLevels(G4double relativeLevel, G4double absoluteLevel)
static G4double GetNuclearMass(G4int A, G4int Z, G4int L)
G4Nucleon * GetTargetNucleon() const
G4VSplitableHadron * GetProjectile() const
G4Nucleon * GetProjectileNucleon() const
void SetStatus(G4int aValue)
G4VSplitableHadron * GetTarget() const
G4double GetIonMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
static G4Lambda * Definition()
static G4Neutron * Definition()
const G4ThreeVector & GetPosition() const
void SetMomentum(G4LorentzVector &aMomentum)
G4VSplitableHadron * GetSplitableHadron() const
virtual const G4LorentzVector & Get4Momentum() const
void Hit(G4VSplitableHadron *aHit)
G4double GetBindingEnergy() const
void SetParticleType(G4Proton *aProton)
void SetBindingEnergy(G4double anEnergy)
virtual const G4ParticleDefinition * GetDefinition() const
G4double GetPDGMass() const
G4int GetPDGEncoding() const
G4double GetPDGCharge() const
G4IonTable * GetIonTable() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
static G4Proton * Definition()
virtual G4Nucleon * GetNextNucleon()=0
virtual G4bool StartLoop()=0
virtual G4int GetMassNumber()=0
G4bool fIsDiffractiveInteraction
G4bool fIsQuasiElasticInteraction
G4VPartonStringModel(const G4String &modelName="Parton String Model")
void SetTimeOfCreation(G4double aTime)
void SetStatus(const G4int aStatus)
const G4ParticleDefinition * GetDefinition() const
G4double GetTimeOfCreation()
void Set4Momentum(const G4LorentzVector &a4Momentum)
void SetDefinition(const G4ParticleDefinition *aDefinition)
const G4LorentzVector & Get4Momentum() const
const G4ThreeVector & GetPosition() const
G4int GetSoftCollisionCount()
void operator()(G4VSplitableHadron *aH)