46 for (
G4int i = 0; i < 20; i++) dndl[i] = 0.0;
59 for (
G4int i = 1; i < 20; i++) {
61 term1 = 1. + parMass*parMass*x*
x;
62 term2 = pt*x*et*pt*x*et + pt*pt + secMass*secMass;
63 dndl[i] = dx / std::sqrt( term1*term1*term1*term2 )
72 G4bool& incidentHasChanged,
97 if (vecLen == 0)
return false;
106 G4bool veryForward =
false;
113 G4double centerofmassEnergy = std::sqrt( mOriginal*mOriginal +
114 targetMass*targetMass +
115 2.0*targetMass*etOriginal );
122 for (i=0; i<vecLen; ++i) {
125 *vec[itemp] = *vec[i];
129 if (currentMass == 0.0 && targetMass == 0.0) {
135 currentParticle = *vec[0];
137 targetParticle = *vec[1];
139 for( i=0; i<(vecLen-2); ++i )*vec[i] = *vec[i+2];
142 temp = vec[vecLen-2];
147 incidentHasChanged =
true;
148 targetHasChanged =
true;
160 currentParticle = targetParticle;
161 targetParticle = temp;
162 incidentHasChanged =
true;
163 targetHasChanged =
true;
168 0.312+0.200*
G4Log(
G4Log(centerofmassEnergy*centerofmassEnergy))+
169 std::pow(centerofmassEnergy*centerofmassEnergy,1.5)/6000.0 );
171 G4double freeEnergy = centerofmassEnergy-currentMass-targetMass;
172 G4double forwardEnergy = freeEnergy/2.;
173 G4int forwardCount = 1;
175 G4double backwardEnergy = freeEnergy/2.;
176 G4int backwardCount = 1;
179 if(currentParticle.
GetSide()==-1)
181 forwardEnergy += currentMass;
183 backwardEnergy -= currentMass;
186 if(targetParticle.
GetSide()!=-1)
188 backwardEnergy += targetMass;
190 forwardEnergy -= targetMass;
195 for (i=0; i<vecLen; ++i) {
196 if( vec[i]->GetSide() == -1 )
199 backwardEnergy -= vec[i]->GetMass()/
GeV;
202 forwardEnergy -= vec[i]->GetMass()/
GeV;
210 if (backwardEnergy < 0.0) {
211 for (i = 0; i < vecLen; ++i) {
212 if (vec[i]->GetSide() == -1) {
213 backwardEnergy += vec[i]->GetMass()/
GeV;
216 forwardEnergy -= vec[i]->GetMass()/
GeV;
218 if (backwardEnergy > 0.0)
break;
223 if (forwardEnergy < 0.0) {
224 for (i = 0; i < vecLen; ++i) {
225 if (vec[i]->GetSide() == 1) {
226 forwardEnergy += vec[i]->GetMass()/
GeV;
229 backwardEnergy -= vec[i]->GetMass()/
GeV;
231 if (forwardEnergy > 0.0)
break;
239 if (forwardEnergy > 0.0 && backwardEnergy < 0.0) {
240 forwardEnergy += backwardEnergy;
245 if (forwardEnergy + backwardEnergy < 0.0)
return false;
263 xtarg = afc * (a13-1.0) * (2.0*backwardCount+vecLen+2)/2.0;
265 xtarg = afc * (a13-1.0) * (2.0*backwardCount);
267 if( xtarg <= 0.0 )xtarg = 0.01;
271 if(atomicWeight<1.0001) nuclearExcitationCount = 0;
272 G4int extraNucleonCount = 0;
275 if (nuclearExcitationCount > 0) {
276 const G4double nucsup[] = { 1.00, 0.7, 0.5, 0.4, 0.35, 0.3 };
277 const G4double psup[] = { 3., 6., 20., 50., 100., 1000. };
278 G4int momentumBin = 0;
282 ed <<
" While count exceeded " <<
G4endl;
283 while( (momentumBin < 6) &&
293 momentumBin =
std::min( 5, momentumBin );
299 for (i = 0; i < nuclearExcitationCount; ++i) {
323 else if( ran < 0.6819 )
346 for (i = 0; i < 8; ++i) pseudoParticle[i].SetZero();
349 pseudoParticle[0].
SetMomentum( 0.0, 0.0, pOriginal*GeV );
351 std::sqrt( pOriginal*pOriginal + mOriginal*mOriginal )*GeV );
353 pseudoParticle[1].
SetMass(protonMass);
356 pseudoParticle[3].
SetMass(protonMass*(1+extraNucleonCount) );
357 pseudoParticle[3].
SetTotalEnergy(protonMass*(1+extraNucleonCount) );
359 pseudoParticle[2] = pseudoParticle[0] + pseudoParticle[1];
360 pseudoParticle[3] = pseudoParticle[3] + pseudoParticle[0];
362 pseudoParticle[0].
Lorentz( pseudoParticle[0], pseudoParticle[2] );
363 pseudoParticle[1].Lorentz( pseudoParticle[1], pseudoParticle[2] );
369 G4int innerCounter, outerCounter;
370 G4bool eliminateThisParticle, resetEnergies, constantCrossSection;
380 G4int backwardNucleonCount = 0;
381 G4double totalEnergy, kineticEnergy, vecMass;
384 for (i = vecLen-1; i >= 0; --i) {
386 if (vec[i]->GetNewlyAdded()) {
387 if (vec[i]->GetSide() == -2) {
388 if (backwardNucleonCount < 18) {
389 if (vec[i]->GetDefinition()->GetParticleSubType() ==
"pi") {
390 for (
G4int j = 0; j < vecLen; j++)
delete vec[j];
393 "G4RPGFragmentation::ReactionStage : a pion has been counted as a backward nucleon");
396 ++backwardNucleonCount;
407 vecMass = vec[i]->GetMass()/
GeV;
410 if (vec[i]->GetSide() == -2) {
412 pt = std::sqrt( std::pow( ran, 1.2 ) );
415 if (vec[i]->GetDefinition()->GetParticleSubType() ==
"pi") {
417 pt = std::sqrt( std::pow( ran, 1.7 ) );
418 }
else if (vec[i]->GetDefinition()->GetParticleSubType() ==
"kaon") {
420 pt = std::sqrt( std::pow( ran, 1.7 ) );
423 pt = std::sqrt( std::pow( ran, 1.5 ) );
429 vec[i]->SetMomentum( pt*std::cos(phi)*GeV, pt*std::sin(phi)*GeV );
430 if (vec[i]->GetSide() > 0)
431 et = pseudoParticle[0].GetTotalEnergy()/
GeV;
433 et = pseudoParticle[1].GetTotalEnergy()/
GeV;
439 eliminateThisParticle =
true;
440 resetEnergies =
true;
443 while (++outerCounter < 3) {
447 vec[i]->SetMomentum( pt*std::cos(phi)*GeV, pt*std::sin(phi)*GeV );
451 while (++innerCounter < 7) {
458 ed <<
" While count exceeded " <<
G4endl;
459 while( ( ran > dndl[l] ) && ( l < 19 ) ) {
469 if (vec[i]->GetSide() < 0) x *= -1.;
470 vec[i]->SetMomentum( x*et*GeV );
471 totalEnergy = std::sqrt( x*et*x*et + pt*pt + vecMass*vecMass );
472 vec[i]->SetTotalEnergy( totalEnergy*GeV );
473 kineticEnergy = vec[i]->GetKineticEnergy()/
GeV;
475 if (vec[i]->GetSide() > 0) {
476 if( (forwardKinetic+kineticEnergy) < 0.95*forwardEnergy ) {
479 pseudoParticle[4] = pseudoParticle[4] + (*vec[i]);
480 forwardKinetic += kineticEnergy;
482 eliminateThisParticle =
false;
483 resetEnergies =
false;
486 if( innerCounter > 5 )
break;
487 if( backwardEnergy >= vecMass )
490 forwardEnergy += vecMass;
491 backwardEnergy -= vecMass;
499 if (extraNucleonCount < 20) xxx = 0.95+0.05*extraNucleonCount/20.0;
501 if ((backwardKinetic+kineticEnergy) < xxx*backwardEnergy) {
502 pseudoParticle[5] = pseudoParticle[5] + (*vec[i]);
503 backwardKinetic += kineticEnergy;
505 eliminateThisParticle =
false;
506 resetEnergies =
false;
509 if (innerCounter > 5)
break;
510 if (forwardEnergy >= vecMass) {
512 forwardEnergy -= vecMass;
513 backwardEnergy += vecMass;
518 vec[i]->SetMomentum( momentum.
x() * 0.9, momentum.
y() * 0.9 );
529 ReduceEnergiesOfSecondaries(i+1, forwardKinetic, backwardKinetic,
531 pseudoParticle[4], pseudoParticle[5],
536 if (eliminateThisParticle && vec[i]->GetMayBeKilled()) {
539 if (vec[i]->GetSide() > 0) {
541 forwardEnergy += vecMass;
544 if (vec[i]->GetSide() == -2) {
546 extraNucleonMass -= vecMass;
548 backwardEnergy += vecMass;
552 for(
G4int j=i; j<(vecLen-1); ++j )*vec[j] = *vec[j+1];
558 G4cout <<
" FALSE RETURN DUE TO ENERGY BALANCE " <<
G4endl;
566 G4double forwardKEDiff = forwardEnergy - forwardKinetic;
567 G4double backwardKEDiff = backwardEnergy - backwardKinetic;
569 if (forwardKEDiff < 0.0 || backwardKEDiff < 0.0) {
570 ReduceEnergiesOfSecondaries(0, forwardKinetic, backwardKinetic,
572 pseudoParticle[4], pseudoParticle[5],
575 forwardKEDiff = forwardEnergy - forwardKinetic;
576 backwardKEDiff = backwardEnergy - backwardKinetic;
577 if (backwardKEDiff < 0.0) {
578 if (forwardKEDiff + backwardKEDiff > 0.0) {
579 backwardEnergy = backwardKinetic;
580 forwardEnergy += backwardKEDiff;
581 forwardKEDiff = forwardEnergy - forwardKinetic;
582 backwardKEDiff = 0.0;
584 G4cout <<
" False return due to insufficient backward energy " <<
G4endl;
589 if (forwardKEDiff < 0.0) {
590 if (forwardKEDiff + backwardKEDiff > 0.0) {
591 forwardEnergy = forwardKinetic;
592 backwardEnergy += forwardKEDiff;
593 backwardKEDiff = backwardEnergy - backwardKinetic;
596 G4cout <<
" False return due to insufficient forward energy " <<
G4endl;
610 pt = std::sqrt( std::pow( ran/6.0, 1.7 ) );
613 pt = std::sqrt( std::pow( ran/5.0, 1.4 ) );
616 pt = std::sqrt( std::pow( ran/4.0, 1.2 ) );
620 currentParticle.
SetMomentum(pt*std::cos(phi)*GeV, pt*std::sin(phi)*GeV);
621 et = pseudoParticle[0].GetTotalEnergy()/
GeV;
632 ed <<
" While count exceeded " <<
G4endl;
633 while( ( ran > dndl[l] ) && ( l < 19 ) ) {
645 if (forwardEnergy < forwardKinetic) {
646 totalEnergy = vecMass + 0.04*std::fabs(
normal());
647 G4cout <<
" Not enough forward energy: forwardEnergy = "
648 << forwardEnergy <<
" forwardKinetic = "
649 << forwardKinetic <<
" total energy left = "
650 << backwardKEDiff + forwardKEDiff <<
G4endl;
652 totalEnergy = vecMass + forwardEnergy - forwardKinetic;
653 forwardKinetic = forwardEnergy;
656 pp = std::sqrt(std::abs( totalEnergy*totalEnergy - vecMass*vecMass) )*
GeV;
659 if (pp1 < 1.0e-6*GeV) {
665 pseudoParticle[4] = pseudoParticle[4] + currentParticle;
671 if (backwardNucleonCount < 18) {
673 ++backwardNucleonCount;
682 pt =
std::max( 0.001, std::sqrt( std::pow( ran/4.0, 1.2 ) ) );
684 targetParticle.
SetMomentum(pt*std::cos(phi)*GeV, pt*std::sin(phi)*GeV);
685 et = pseudoParticle[1].GetTotalEnergy()/
GeV;
688 G4bool marginalEnergy =
true;
691 if( extraNucleonCount < 20 ) xxx = 0.95+0.05*extraNucleonCount/20.0;
694 while (++outerCounter < 4) {
697 for (innerCounter = 0; innerCounter < 6; innerCounter++) {
703 eda <<
" While count exceeded " <<
G4endl;
704 while( ( ran > dndl[l] ) && ( l < 19 ) ) {
715 totalEnergy = std::sqrt(x*et*x*et + pt*pt + vecMass*vecMass);
718 if ((backwardKinetic+totalEnergy-vecMass) < xxx*backwardEnergy) {
719 pseudoParticle[5] = pseudoParticle[5] + targetParticle;
720 backwardKinetic += totalEnergy - vecMass;
722 marginalEnergy =
false;
726 targetParticle.
SetMomentum(momentum.
x() * 0.9, momentum.
y() * 0.9);
732 if (marginalEnergy) {
733 G4cout <<
" Extra backward kinetic energy = "
734 << 0.999*backwardEnergy - backwardKinetic <<
G4endl;
735 totalEnergy = vecMass + 0.999*backwardEnergy - backwardKinetic;
737 pp = std::sqrt(std::abs(totalEnergy*totalEnergy - vecMass*vecMass) )*
GeV;
738 targetParticle.
SetMomentum(momentum.
x()/0.9, momentum.
y()/0.9);
741 pseudoParticle[5] = pseudoParticle[5] + targetParticle;
742 backwardKinetic = 0.999*backwardEnergy;
747 if (backwardEnergy < backwardKinetic)
748 G4cout <<
" Backward Edif = " << backwardEnergy - backwardKinetic <<
G4endl;
749 if (forwardEnergy != forwardKinetic)
750 G4cout <<
" Forward Edif = " << forwardEnergy - forwardKinetic <<
G4endl;
760 pseudoParticle[6].Lorentz( pseudoParticle[3], pseudoParticle[2] );
761 pseudoParticle[6] = pseudoParticle[6] - pseudoParticle[4];
762 pseudoParticle[6] = pseudoParticle[6] - pseudoParticle[5];
764 if (backwardNucleonCount == 1) {
769 std::min(backwardEnergy-backwardKinetic, centerofmassEnergy/2.0-protonMass/GeV);
771 if( ekin < 0.04 )ekin = 0.04 * std::fabs(
normal() );
773 totalEnergy = ekin + vecMass;
775 pp = std::sqrt(std::abs(totalEnergy*totalEnergy - vecMass*vecMass) )*
GeV;
776 pp1 = pseudoParticle[6].GetMomentum().mag();
777 if (pp1 < 1.0e-6*GeV) {
781 targetParticle.
SetMomentum( pseudoParticle[6].GetMomentum() * (pp/pp1));
783 pseudoParticle[5] = pseudoParticle[5] + targetParticle;
785 }
else if (backwardNucleonCount > 1) {
789 if (backwardNucleonCount < 5) tempCount = backwardNucleonCount;
793 if (targetParticle.
GetSide() == -3)
795 for (i = 0; i < vecLen; ++i)
796 if (vec[i]->GetSide() == -3) clusterMass += vec[i]->GetMass()/
GeV;
797 clusterMass += backwardEnergy - backwardKinetic;
799 totalEnergy = pseudoParticle[6].GetTotalEnergy()/
GeV;
800 pseudoParticle[6].SetMass(clusterMass*GeV);
802 pp = std::sqrt(std::abs(totalEnergy*totalEnergy -
803 clusterMass*clusterMass) )*
GeV;
804 pp1 = pseudoParticle[6].GetMomentum().mag();
805 if (pp1 < 1.0e-6*GeV) {
807 pseudoParticle[6].SetMomentum(iso.
x(), iso.
y(), iso.
z());
809 pseudoParticle[6].SetMomentum(pseudoParticle[6].GetMomentum() * (-pp/pp1));
812 std::vector<G4ReactionProduct*> tempList;
813 if (targetParticle.
GetSide() == -3) tempList.push_back(&targetParticle);
814 for (i = 0; i < vecLen; ++i)
815 if (vec[i]->GetSide() == -3) tempList.push_back(vec[i]);
817 constantCrossSection =
true;
819 if (tempList.size() > 1) {
822 constantCrossSection, tempList);
824 if (targetParticle.
GetSide() == -3) {
825 targetParticle = *tempList[0];
826 targetParticle.
Lorentz(targetParticle, pseudoParticle[6]);
830 for (i = 0; i < vecLen; ++i) {
831 if (vec[i]->GetSide() == -3) {
832 *vec[i] = *tempList[n_entry];
833 vec[i]->Lorentz(*vec[i], pseudoParticle[6]);
840 if (vecLen == 0)
return false;
844 currentParticle.Lorentz( currentParticle, pseudoParticle[1] );
845 targetParticle.
Lorentz( targetParticle, pseudoParticle[1] );
846 for (i = 0; i < vecLen; ++i) vec[i]->Lorentz(*vec[i], pseudoParticle[1]);
856 G4bool leadingStrangeParticleHasChanged =
true;
859 if (currentParticle.GetDefinition() == leadingStrangeParticle.
GetDefinition())
860 leadingStrangeParticleHasChanged =
false;
861 if (leadingStrangeParticleHasChanged &&
863 leadingStrangeParticleHasChanged =
false;
864 if( leadingStrangeParticleHasChanged )
866 for( i=0; i<vecLen; i++ )
868 if( vec[i]->GetDefinition() == leadingStrangeParticle.
GetDefinition() )
870 leadingStrangeParticleHasChanged =
false;
875 if( leadingStrangeParticleHasChanged )
886 if( (leadTest&&targetTest) || !(leadTest||targetTest) )
889 targetHasChanged =
true;
893 currentParticle.SetDefinitionAndUpdateE( leadingStrangeParticle.
GetDefinition() );
894 incidentHasChanged =
false;
902 std::pair<G4int, G4int> finalStateNucleons =
905 G4int protonsInFinalState = finalStateNucleons.first;
906 G4int neutronsInFinalState = finalStateNucleons.second;
908 G4int numberofFinalStateNucleons =
909 protonsInFinalState + neutronsInFinalState;
911 if (currentParticle.GetDefinition()->GetBaryonNumber() == 1 &&
915 numberofFinalStateNucleons++;
917 numberofFinalStateNucleons =
std::max(1, numberofFinalStateNucleons);
924 pseudoParticle[3].SetMomentum( 0.0, 0.0, pOriginal*GeV );
925 pseudoParticle[3].SetMass( mOriginal*GeV );
926 pseudoParticle[3].SetTotalEnergy(
927 std::sqrt( pOriginal*pOriginal + mOriginal*mOriginal )*GeV );
932 if(numberofFinalStateNucleons == 1) diff = 0;
933 pseudoParticle[4].SetMomentum( 0.0, 0.0, 0.0 );
934 pseudoParticle[4].SetMass( protonMass*(numberofFinalStateNucleons-diff) );
935 pseudoParticle[4].SetTotalEnergy( protonMass*(numberofFinalStateNucleons-diff) );
938 pseudoParticle[3].GetTotalEnergy() + pseudoParticle[4].GetTotalEnergy() -
939 currentParticle.GetMass() - targetParticle.
GetMass();
940 for (i = 0; i < vecLen; ++i) theoreticalKinetic -= vec[i]->GetMass();
944 for (i = 0; i < vecLen; ++i)
945 simulatedKinetic += vec[i]->GetKineticEnergy();
947 pseudoParticle[5] = pseudoParticle[3] + pseudoParticle[4];
948 pseudoParticle[3].Lorentz( pseudoParticle[3], pseudoParticle[5] );
949 pseudoParticle[4].Lorentz( pseudoParticle[4], pseudoParticle[5] );
951 pseudoParticle[7].SetZero();
952 pseudoParticle[7] = pseudoParticle[7] + currentParticle;
953 pseudoParticle[7] = pseudoParticle[7] + targetParticle;
954 for (i = 0; i < vecLen; ++i)
955 pseudoParticle[7] = pseudoParticle[7] + *vec[i];
1000 if (simulatedKinetic != 0.0) {
1001 wgt = theoreticalKinetic/simulatedKinetic;
1002 theoreticalKinetic = currentParticle.GetKineticEnergy() * wgt;
1003 simulatedKinetic = theoreticalKinetic;
1004 currentParticle.SetKineticEnergy(theoreticalKinetic);
1005 pp = currentParticle.GetTotalMomentum();
1006 pp1 = currentParticle.GetMomentum().mag();
1007 if (pp1 < 1.0e-6*GeV) {
1009 currentParticle.SetMomentum( iso.
x(), iso.
y(), iso.
z() );
1011 currentParticle.SetMomentum(currentParticle.GetMomentum() * (pp/pp1));
1014 theoreticalKinetic = targetParticle.GetKineticEnergy() * wgt;
1015 targetParticle.SetKineticEnergy(theoreticalKinetic);
1016 simulatedKinetic += theoreticalKinetic;
1017 pp = targetParticle.GetTotalMomentum();
1018 pp1 = targetParticle.GetMomentum().mag();
1020 if (pp1 < 1.0e-6*GeV) {
1022 targetParticle.SetMomentum(iso.
x(), iso.
y(), iso.
z() );
1024 targetParticle.SetMomentum(targetParticle.GetMomentum() * (pp/pp1) );
1027 for (i = 0; i < vecLen; ++i ) {
1028 theoreticalKinetic = vec[i]->GetKineticEnergy() * wgt;
1029 simulatedKinetic += theoreticalKinetic;
1030 vec[i]->SetKineticEnergy(theoreticalKinetic);
1031 pp = vec[i]->GetTotalMomentum();
1032 pp1 = vec[i]->GetMomentum().mag();
1033 if( pp1 < 1.0e-6*GeV ) {
1035 vec[i]->SetMomentum(iso.
x(), iso.
y(), iso.
z() );
1037 vec[i]->SetMomentum(vec[i]->GetMomentum() * (pp/pp1) );
1050 if( atomicWeight >= 1.5 )
1090 if (epnb > pnCutOff)
1092 npnb =
G4Poisson((1.5+1.25*numberofFinalStateNucleons)*epnb/(epnb+edta));
1093 if (numberofFinalStateNucleons + npnb > atomicWeight)
1094 npnb =
G4int(atomicWeight+0.00001 - numberofFinalStateNucleons);
1095 npnb =
std::min( npnb, 127-vecLen );
1097 if( edta >= dtaCutOff )
1099 ndta =
G4Poisson((1.5+1.25*numberofFinalStateNucleons)*edta/(epnb+edta));
1100 ndta =
std::min( ndta, 127-vecLen );
1102 if (npnb == 0 && ndta == 0) npnb = 1;
1105 PinNucleus, NinNucleus, targetNucleus,
1116 if( (atomicWeight >= 1.5) && (atomicWeight <= 230.0) && (ekOriginal <= 0.2) )
1117 currentParticle.SetTOF(
1120 currentParticle.SetTOF( 1.0 );
1126 void G4RPGFragmentation::
1127 ReduceEnergiesOfSecondaries(
G4int startingIndex,
1148 forwardKinetic = 0.0;
1149 backwardKinetic = 0.0;
1150 forwardPseudoParticle.
SetZero();
1151 backwardPseudoParticle.
SetZero();
1153 for (i = startingIndex; i < vecLen; i++) {
1159 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - mass*mass ) );
1161 if (pp1 < 1.0e-6*
GeV) {
1170 pt =
std::max(1.0, std::sqrt( px*px + py*py ) )/
GeV;
1173 forwardPseudoParticle = forwardPseudoParticle + (*pVec);
1176 backwardPseudoParticle = backwardPseudoParticle + (*pVec);
void FragmentationIntegral(G4double, G4double, G4double, G4double)
static G4Pow * GetInstance()
void SetElement(G4int anIndex, Type *anElement)
G4long G4Poisson(G4double mean)
G4double GetTotalMomentum() const
void Lorentz(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
std::ostringstream G4ExceptionDescription
G4double GetAnnihilationPNBlackTrackEnergy() const
void SetKineticEnergy(const G4double en)
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetSide(const G4int sid)
G4double GetDTABlackTrackEnergy() const
const G4String & GetParticleSubType() const
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
static constexpr double twopi
void SetNewlyAdded(const G4bool f)
std::pair< G4int, G4int > GetFinalStateNucleons(const G4DynamicParticle *originalTarget, const G4FastVector< G4ReactionProduct, 256 > &vec, const G4int &vecLen)
const G4ParticleDefinition * GetDefinition() const
void SetMass(const G4double mas)
G4GLOB_DLL std::ostream G4cout
const G4ParticleDefinition * GetDefinition() const
G4double GetAnnihilationDTABlackTrackEnergy() const
void SetTotalEnergy(const G4double en)
static G4Proton * Proton()
static G4PionPlus * PionPlus()
void SetDefinitionAndUpdateE(const G4ParticleDefinition *aParticleDefinition)
static G4Neutron * Neutron()
static G4PionZero * PionZero()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double GetKineticEnergy() const
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double GetTotalEnergy() const
G4double GenerateNBodyEventT(const G4double totalEnergy, const G4bool constantCrossSection, std::vector< G4ReactionProduct * > &list)
G4double GetPDGMass() const
G4double A13(G4double A) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
static G4PionMinus * PionMinus()
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static constexpr double GeV
G4ThreeVector GetMomentum() const
void AddBlackTrackParticles(const G4double, const G4int, const G4double, const G4int, const G4ReactionProduct &, G4int, G4int, const G4Nucleus &, G4FastVector< G4ReactionProduct, 256 > &, G4int &)
static G4Lambda * Lambda()
G4ThreeVector Isotropic(const G4double &)
G4double GetPNBlackTrackEnergy() const
G4int GetBaryonNumber() const
G4bool ReactionStage(const G4HadProjectile *, G4ReactionProduct &, G4bool &, const G4DynamicParticle *, G4ReactionProduct &, G4bool &, const G4Nucleus &, G4ReactionProduct &, G4FastVector< G4ReactionProduct, 256 > &, G4int &, G4bool, G4ReactionProduct &)