87 std::istringstream& dataStream )
88 : Isotope_(WhichIsotope),
89 MetaState_(WhichMetaState),
91 YieldType_(WhichYieldType),
99 Initialize(dataStream);
100 }
catch (std::exception e)
115 std::istringstream& dataStream)
116 : Isotope_(WhichIsotope),
117 MetaState_(WhichMetaState),
119 YieldType_(WhichYieldType),
120 Verbosity_(Verbosity)
127 Initialize(dataStream);
128 }
catch (std::exception e)
137 void G4FissionProductYieldDist::
138 Initialize( std::istringstream& dataStream )
179 }
catch (std::exception& e)
204 std::vector< G4ReactionProduct* >* Alphas =
new std::vector< G4ReactionProduct* >;
205 std::vector< G4ReactionProduct* >* Neutrons =
new std::vector< G4ReactionProduct* >;
206 std::vector< G4ReactionProduct* >* Gammas =
new std::vector< G4ReactionProduct* >;
252 G4cout <<
" -- First daughter product sampled" <<
G4endl;
269 if(
Verbosity_ & G4FFGEnumerations::DAUGHTER_INFO)
274 G4cout <<
" -- Second daughter product sampled" <<
G4endl;
317 G4int icounter_max=1024;
321 if ( icounter > icounter_max ) {
322 G4cout <<
"Loop-counter exceeded the threshold value at " << __LINE__ <<
"th line of " << __FILE__ <<
"." <<
G4endl;
345 G4double NumeratorSqrt, NumeratorOther, Denominator;
350 if(Alphas->size() > 0)
375 MassRatio = 1 / MassRatio;
383 const G4double MeanAlphaAngle = 0.3644 * MassRatio * MassRatio * MassRatio
384 - 1.9766 * MassRatio * MassRatio
391 const G4double MeanAlphaAngleStdDev = 0.0523598776;
394 for(
unsigned int i = 0; i < Alphas->size(); ++i)
397 Theta = MeanAlphaAngle + PlusMinus;
401 }
else if(Theta >
pi)
403 Theta = (2 *
pi - Theta);
408 Magnitude = std::sqrt(2 * Alphas->at(i)->GetKineticEnergy() * Alphas->at(i)->GetDefinition()->GetPDGMass());
409 Alphas->at(i)->SetMomentum(Direction * Magnitude);
410 ResultantVector += Alphas->at(i)->GetMomentum();
415 if(Neutrons->size() != 0)
417 for(
unsigned int i = 0; i < Neutrons->size(); ++i)
423 Magnitude = std::sqrt(2 * Neutrons->at(i)->GetKineticEnergy() * Neutrons->at(i)->GetDefinition()->GetPDGMass());
424 Neutrons->at(i)->SetMomentum(Direction * Magnitude);
425 ResultantVector += Neutrons->at(i)->GetMomentum();
430 if(Gammas->size() != 0)
432 for(
unsigned int i = 0; i < Gammas->size(); ++i)
439 Gammas->at(i)->SetMomentum(Direction * Magnitude);
440 ResultantVector += Gammas->at(i)->GetMomentum();
449 G4double ResultantX, ResultantY, ResultantZ;
450 ResultantX = ResultantVector.
getX();
451 ResultantY = ResultantVector.
getY();
452 ResultantZ = ResultantVector.
getZ();
456 LightFragment = FirstDaughter;
457 HeavyFragment = SecondDaughter;
460 LightFragment = SecondDaughter;
461 HeavyFragment = FirstDaughter;
501 NumeratorSqrt = std::sqrt(LightFragmentMass *
502 (LightFragmentMass * (2 * HeavyFragmentMass * FragmentsKE
503 - ResultantX * ResultantX
504 - ResultantY * ResultantY)
505 + HeavyFragmentMass * (2 * HeavyFragmentMass * FragmentsKE
506 - ResultantX * ResultantX
507 - ResultantY * ResultantY
508 - ResultantZ - ResultantZ)));
511 NumeratorOther = LightFragmentMass * ResultantZ;
514 Denominator = LightFragmentMass + HeavyFragmentMass;
517 const G4double LightFragmentMomentum = (NumeratorSqrt + NumeratorOther) / Denominator;
518 const G4double HeavyFragmentMomentum = std::sqrt(ResultantX * ResultantX
519 + ResultantY * ResultantY
523 LightFragment->
SetMomentum(LightFragmentDirection * LightFragmentMomentum);
524 HeavyFragmentDirection.
setX(-ResultantX);
525 HeavyFragmentDirection.
setY(-ResultantY);
526 HeavyFragmentDirection.
setZ((-LightFragmentMomentum - ResultantZ));
528 HeavyFragmentDirection.
setR(1.0);
529 HeavyFragment->
SetMomentum(HeavyFragmentDirection * HeavyFragmentMomentum);
536 G4cout <<
" -- Daugher product momenta finalized" <<
G4endl;
548 for(
unsigned int i = 0; i < Neutrons->size(); i++)
553 for(
unsigned int i = 0; i < Gammas->size(); i++)
558 for(
unsigned int i = 0; i < Alphas->size(); i++)
573 ResultantVector.
set(0.0, 0.0, 0.0);
574 for(
unsigned int i = 0; i < FissionProducts->size(); i++)
576 Direction = FissionProducts->at(i)->GetMomentumDirection();
578 FissionProducts->at(i)->SetMomentumDirection(Direction);
579 ResultantVector += FissionProducts->at(i)->GetMomentum();
584 G4double PossibleImbalance = ResultantVector.
mag();
585 if(PossibleImbalance > 0.01)
587 std::ostringstream Temp;
588 Temp <<
"Momenta imbalance of ";
590 Temp <<
" MeV/c in the system";
591 G4Exception(
"G4FissionProductYieldDist::G4GetFission()",
594 "Results may not be valid");
598 delete FirstDaughter;
599 delete SecondDaughter;
605 return FissionProducts;
636 IncidentEnergy_ = WhatIncidentEnergy;
639 IncidentEnergy_ = 0 *
GeV;
692 G4bool lowerExists =
false;
693 G4bool higherExists =
false;
703 if(energyGroup == 0 && IncidentEnergy_ <
YieldEnergies_[energyGroup])
708 }
else if(energyGroup == YieldEnergyGroups_ - 1)
727 G4Ions* FoundParticle = NULL;
728 if(isExact || YieldEnergyGroups_ == 1)
735 if(RandomParticle <=
Trees_[tree].ProbabilityRangeEnd[energyGroup])
746 while((RangeIsSmaller = (RandomParticle < Branch->ProbabilityRangeBottom[energyGroup]))
752 Branch = Branch->
Left;
754 Branch = Branch->
Right;
759 }
else if(lowerExists && higherExists)
771 return FoundParticle;
776 G4bool LowerEnergyGroupExists )
780 G4Ions* FoundParticle = NULL;
782 G4int NextNearestEnergy;
785 if(LowerEnergyGroupExists ==
true)
788 NextNearestEnergy = NearestEnergy - 1;
792 NextNearestEnergy = 1;
795 for(
G4int Tree = 0; Tree <
TreeCount_ && FoundParticle == NULL; Tree++)
804 return FoundParticle;
809 G4int LowerEnergyGroup )
813 G4Ions* FoundParticle = NULL;
814 G4int HigherEnergyGroup = LowerEnergyGroup + 1;
816 for(
G4int Tree = 0; Tree <
TreeCount_ && FoundParticle == NULL; Tree++)
825 return FoundParticle;
844 || EnergyGroup1 == EnergyGroup2
852 G4Ions* FoundParticle = NULL;
861 RangeAtIncidentEnergy = Slope * IncidentEnergy_ + Intercept;
864 if(RandomParticle < RangeAtIncidentEnergy)
875 RangeAtIncidentEnergy = Slope * IncidentEnergy_ + Intercept;
878 if(RandomParticle > RangeAtIncidentEnergy)
891 Particle = FoundParticle;
907 G4int NumberOfAlphasToProduce;
922 for(
int i = 0; i < NumberOfAlphasToProduce; i++)
941 G4int NeutronProduction;
946 for(
int i = 0; i < NeutronProduction; i++)
970 G4int Z = (Product -
A) / 1000;
1042 std::ostringstream DirectoryName;
1047 return DirectoryName.str();
1058 std::ostringstream FileName;
1061 if(Isotope < 100000)
1070 return FileName.str();
1081 return DynamicParticle;
1091 G4int A = Isotope % 1000;
1092 G4int Z = (Isotope -
A) / 1000;
1095 std::ostringstream IsotopeName;
1097 IsotopeName << Z <<
"_" <<
A;
1114 return IsotopeName.str();
1163 for(
G4int i = 0; i < ProductCount; i++)
1226 TotalAlphaEnergy = 0;
1230 for(
unsigned int i = 0; i < Alphas->size(); i++)
1236 Alphas->at(i)->SetKineticEnergy(AlphaEnergy);
1239 TotalAlphaEnergy += AlphaEnergy;
1243 MeanAlphaEnergy -= 0.1;
1268 G4int icounter_max=1024;
1272 if ( icounter > icounter_max ) {
1273 G4cout <<
"Loop-counter exceeded the threshold value at " << __LINE__ <<
"th line of " << __FILE__ <<
"." <<
G4endl;
1294 Gammas->back()->SetTotalEnergy(SampleEnergy);
1311 Gammas->back()->SetTotalEnergy(SampleEnergy);
1334 G4int icounter_max=1024;
1338 if ( icounter > icounter_max ) {
1339 G4cout <<
"Loop-counter exceeded the threshold value at " << __LINE__ <<
"th line of " << __FILE__ <<
"." <<
G4endl;
1342 TotalNeutronEnergy = 0;
1347 for(
unsigned int i = 0; i < Neutrons->size(); i++)
1351 Neutrons->at(i)->SetKineticEnergy(NeutronEnergy);
1354 TotalNeutronEnergy +=NeutronEnergy;
1385 Nubar_ = *(WhichNubar + 1) * IncidentEnergy_ * XFactor
1386 + *(WhichNubar + 2) * BFactor;
1387 while(*WhichNubar != -1)
1391 Nubar_ = *(WhichNubar + 1) * IncidentEnergy_ * XFactor
1392 + *(WhichNubar + 2) * BFactor;
1401 while(*WhichNubar != -1)
1423 NewBranch->Left = NULL;
1424 NewBranch->Right = NULL;
1477 while(BranchPosition > 1)
1479 if(BranchPosition & 1)
1482 WhichBranch = &((*WhichBranch)->Right);
1486 WhichBranch = &((*WhichBranch)->Left);
1489 BranchPosition >>= 1;
1492 *WhichBranch = NewBranch;
1504 G4int WhichTree = 0;
1535 delete Branch->
Left;
1537 delete Branch->
Right;
#define G4FFG_RECURSIVE_FUNCTIONLEAVE__
void set(double x, double y, double z)
virtual ~G4FissionProductYieldDist(void)
static G4Pow * GetInstance()
const G4FFGEnumerations::YieldType YieldType_
G4ENDFYieldDataContainer * G4GetYield(G4int WhichYield)
G4FFGEnumerations::MetaState GetMetaState(void)
G4double powA(G4double A, G4double y) const
G4double G4SampleGaussian(G4double Mean, G4double StdDev)
void Copy(G4int Elements, T *To, T *From)
G4double G4SampleWatt(G4int WhatIsotope, G4FFGEnumerations::FissionCause WhatCause, G4double WhatEnergy)
G4int IncidentEnergiesCount
G4ParticleHPNames * ElementNames_
void Divide(G4int Elements, T *To, T *Numerator, T *Denominator=NULL)
G4double * ProbabilityRangeEnd
G4double powN(G4double x, G4int n) const
G4double G4SampleUniform(void)
void CheckAlphaSanity(void)
G4double * GetYieldProbability(void)
G4FissionProductYieldDist(G4int WhichIsotope, G4FFGEnumerations::MetaState WhichMetaState, G4FFGEnumerations::FissionCause WhichCause, G4FFGEnumerations::YieldType WhichYieldType, std::istringstream &dataStream)
G4Ions * FindParticle(G4double RandomParticle)
G4FPYSamplingOps * RandomEngine_
G4double * YieldEnergies_
void G4SetTernaryProbability(G4double TernaryProbability)
void SetMomentum(const G4double x, const G4double y, const G4double z)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4Alpha * Definition()
ProbabilityBranch * Right
static const G4int SpontaneousNubar_[][3]
G4DynamicParticleVector * G4GetFission(void)
G4String MakeDirectoryName(void)
G4int GetPDGEncoding() const
G4ENDFTapeRead * ENDFData_
void G4SetAlphaProduction(G4double WhatAlphaProduction)
G4String MakeFileName(G4int Isotope, G4FFGEnumerations::MetaState MetaState)
G4double RemainingEnergy_
static const G4String theString[100]
G4double * ProbabilityRangeBottom
#define G4FFG_DATA_FUNCTIONENTER__
virtual void SortProbability(G4ENDFYieldDataContainer *YieldData)
void G4SetVerbosity(G4int WhatVerbosity)
const G4String & GetParticleName() const
G4Gamma * GammaDefinition_
G4double * ProbabilityRangeTop
G4int GetAtomicNumber() const
G4Ions * NeutronDefinition_
G4double TernaryProbability_
static const G4int SpontaneousNubarWidth_[][2]
virtual void GenerateNeutrons(std::vector< G4ReactionProduct * > *Neutrons)
virtual void GenerateAlphas(std::vector< G4ReactionProduct * > *Alphas)
G4DynamicParticle * MakeG4DynamicParticle(G4ReactionProduct *)
const G4ParticleDefinition * GetDefinition() const
void SampleAlphaEnergies(std::vector< G4ReactionProduct * > *Alphas)
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
virtual void MakeTrees(void)
#define G4FFG_DATA_FUNCTIONLEAVE__
G4double AlphaProduction_
Hep3Vector & rotateUz(const Hep3Vector &)
static const G4int NeutronInducedNubar_[][3]
void Multiply(G4int Elements, T *To, T *M1, T *M2=NULL)
std::vector< G4DynamicParticle * > G4DynamicParticleVector
G4Ions * GetParticleDefinition(G4int Product, G4FFGEnumerations::MetaState MetaState)
G4Ions * FindParticleBranchSearch(ProbabilityBranch *Branch, G4double RandomParticle, G4int EnergyGroup1, G4int EnergyGroup2)
void G4SetEnergy(G4double WhatIncidentEnergy)
static const G4double MeanGammaEnergy
static const char ENDFFissionDataLocation[]
void DeleteVectorOfPointers(std::vector< T > &Vector)
static const G4int Isotope
void setRThetaPhi(double r, double theta, double phi)
G4int GetAtomicMass() const
static G4IonTable * GetIonTable()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
void Renormalize(ProbabilityBranch *Branch)
G4int G4GetNumberOfEnergyGroups(void)
ProbabilityBranch * Trunk
G4double GetPDGMass() const
void SampleGammaEnergies(std::vector< G4ReactionProduct * > *Gammas)
G4Ions * FindParticleExtrapolation(G4double RandomParticle, G4bool LowerEnergyGroupExists)
G4Ions * FindParticleInterpolation(G4double RandomParticle, G4int LowerEnergyGroup)
virtual void ReadProbabilities(void)
const G4FFGEnumerations::FissionCause Cause_
static constexpr double c_light
static const G4int NeutronInducedNubarWidth_[][2]
G4double * IncidentEnergies
static G4Neutron * Definition()
static constexpr double GeV
void Set(G4int Elements, T *To, T Value)
void G4SetVerbosity(G4int WhatVerbosity)
G4ThreeVector GetMomentum() const
#define G4FFG_FUNCTIONLEAVE__
G4double * MaintainNormalizedData_
static constexpr double MeV
void SampleNeutronEnergies(std::vector< G4ReactionProduct * > *Neutrons)
static constexpr double pi
#define G4FFG_RECURSIVE_FUNCTIONENTER__
G4int G4GetNumberOfFissionProducts(void)
void BurnTree(ProbabilityBranch *Branch)
void G4SetVerbosity(G4int WhatVerbosity)
G4Ions * AlphaDefinition_
virtual G4Ions * GetFissionProduct(void)=0
static constexpr double keV
G4Ions * G4GetFissionProduct(void)
#define G4FFG_FUNCTIONENTER__
G4String MakeIsotopeName(G4int Isotope, G4FFGEnumerations::MetaState MetaState)
static constexpr double pi
void Add(G4int Elements, T *To, T *A1, T *A2=NULL)
G4double * G4GetEnergyGroupValues(void)
static G4Gamma * Definition()
G4int G4SampleIntegerGaussian(G4double Mean, G4double StdDev)