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)