56 std::ostringstream ost;
77 if(!getenv(
"G4NEUTRONHPDATA"))
78 throw G4HadronicException(__FILE__, __LINE__,
"Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files where Inelastic/Gammas data is found.");
79 G4String tBase = getenv(
"G4NEUTRONHPDATA");
86 if( getenv(
"G4ParticleHPDebug") )
G4cout <<
" G4ParticleHPInelasticBaseFS::Init FILE " << filename <<
G4endl;
97 if(getenv(
"G4ParticleHPDebug_NamesLogging"))
G4cout <<
"Skipped = "<< filename <<
" "<<A<<
" "<<Z<<
G4endl;
122 while (theData >> infoType)
126 if(dummy==
INT_MAX) theData >> dummy >> dummy;
152 else if(dataType==12)
158 else if(dataType==13)
164 else if(dataType==14)
169 else if(dataType==15)
176 throw G4HadronicException(__FILE__, __LINE__,
"Data-type unknown to G4ParticleHPInelasticBaseFS");
212 if ( targetMass == 0 )
231 boosted.
Lorentz(incidReactionProduct, theTarget);
241 for(ii=0; ii<nDef; ii++)
245 thePhaseSpaceDistribution.
Init(aPhaseMass, nDef);
247 thePhaseSpaceDistribution.
SetTarget(&theTarget);
248 for(ii=0; ii<nDef; ii++)
250 G4double massCode = 1000.*std::abs(theDefs[ii]->GetPDGCharge());
254 aSec->
Lorentz(*aSec, -1.*theTarget);
300 if ( !getenv(
"G4PHP_DO_NOT_ADJUST_FINAL_STATE" ) ) {
303 if ( tmpHadrons != NULL ) {
308 for (
G4int j = 0 ; j != (
G4int)tmpHadrons->size() ; j++ ) {
310 if ( tmpHadrons->at(j)->GetDefinition()->GetBaryonNumber() >
maxA ) {
311 maxA = tmpHadrons->at(j)->GetDefinition()->GetBaryonNumber();
314 sumA += tmpHadrons->at(j)->GetDefinition()->GetBaryonNumber();
315 sumZ +=
G4int( tmpHadrons->at(j)->GetDefinition()->GetPDGCharge() +
eps );
319 if ( dA < 0 || dZ < 0 ) {
320 G4int newA = tmpHadrons->at(jAtMaxA)->GetDefinition()->GetBaryonNumber() + dA ;
321 G4int newZ =
G4int( tmpHadrons->at(jAtMaxA)->GetDefinition()->GetPDGCharge() +
eps ) + dZ;
323 tmpHadrons->at( jAtMaxA )->SetDefinition( pd );
333 for(i0=0; i0<nDef; i0++) Done[i0] =
false;
355 for(i0=0; i0<nDef; i0++)
377 throw G4HadronicException(__FILE__, __LINE__,
"No energy distribution to sample from in InelasticBaseFS::BaseApply");
390 G4double availableEnergy = eKinetic+massn+localMass-mass1-mass2-concreteMass;
392 G4double emin = availableEnergy+mass1+mass2 - std::sqrt((mass1+mass2)*(mass1+mass2)+orgMomentum*orgMomentum);
393 G4double p1=std::sqrt(2.*mass2*emin);
396 if(getenv(
"G4ParticleHPDebug"))
398 G4cout <<
"G4ParticleHPInelasticBaseFS "<<z1<<
" "<<
theBaseZ<<
" "<<a1<<
" "<<
theBaseA<<
" "<<availableEnergy<<
" "
405 bufferedDirection = -bufferedDirection;
409 if(getenv(
"G4ParticleHPDebug"))
411 G4cout <<
" G4ParticleHPInelasticBaseFS "<<bufferedDirection.
mag2()<<
G4endl;
415 +bufferedDirection.
mag2()) );
417 aHadron->
Lorentz(*aHadron, -1.*(theTarget+incidReactionProduct));
419 if(getenv(
"G4ParticleHPDebug"))
425 tmpHadrons->push_back(aHadron);
435 throw G4HadronicException(__FILE__, __LINE__,
"No data to create the neutrons in NInelasticFS");
443 boosted_tmp.
Lorentz(incidReactionProduct, theTarget);
448 for(i=0; i<thePhotons->size(); i++)
451 thePhotons->operator[](i)->Lorentz(*(thePhotons->operator[](i)), -1.*theTarget);
459 G4bool bAdjustPhotons =
true;
461 bAdjustPhotons =
true;
463 if ( getenv(
"G4PHP_DO_NOT_ADJUST_FINAL_STATE" ) ) bAdjustPhotons =
false;
466 if( bAdjustPhotons ) {
469 theGammaEnergy = anEnergy-theGammaEnergy;
479 for(i=0; i<tmpHadrons->size(); i++)
483 eBindProducts+=eBindN;
487 eBindProducts+=eBindP;
491 eBindProducts+=eBindD;
495 eBindProducts+=eBindT;
497 else if(tmpHadrons->operator[](i)->GetDefinition() ==
G4He3::He3())
499 eBindProducts+=eBindHe3;
501 else if(tmpHadrons->operator[](i)->GetDefinition() ==
G4Alpha::Alpha())
503 eBindProducts+=eBindA;
508 theGammaEnergy += eBindProducts;
511 if( getenv(
"G4ParticleHPDebug"))
G4cout <<
" G4ParticleHPInelasticBaseFS::BaseApply gamma Energy " << theGammaEnergy <<
" eBindProducts " << eBindProducts <<
G4endl;
524 theGammaEnergy -= (2*eBindA);
540 if( getenv(
"G4ParticleHPDebug"))
G4cout <<
" G4ParticleHPInelasticBaseFS::BaseApply adding gamma from level " << iLevel << theOtherPhotons->operator[](ii)->GetKineticEnergy() <<
G4endl;
548 if(random > (eHigh-eLow)/(theGammaEnergy-eLow)) iLevel++;
552 if(theOtherPhotons != 0)
554 for(
unsigned int iii=0; iii<theOtherPhotons->size(); iii++)
556 thePhotons->push_back(theOtherPhotons->operator[](iii));
558 if( getenv(
"G4ParticleHPDebug"))
559 G4cout << iii <<
" G4ParticleHPInelasticBaseFS::BaseApply adding gamma " << theOtherPhotons->operator[](iii)->GetKineticEnergy() <<
G4endl;
562 delete theOtherPhotons;
565 if(iLevel == -1)
break;
571 unsigned int nSecondaries = tmpHadrons->size();
572 unsigned int nPhotons = 0;
573 if(thePhotons!=0) { nPhotons = thePhotons->size(); }
574 nSecondaries += nPhotons;
577 if( getenv(
"G4ParticleHPDebug"))
G4cout <<
" G4ParticleHPInelasticBaseFS::BaseApply N hadrons " << nSecondaries-nPhotons <<
G4endl;
580 for(i=0; i<nSecondaries-nPhotons; i++)
583 theSec->
SetDefinition(tmpHadrons->operator[](i)->GetDefinition());
584 theSec->
SetMomentum(tmpHadrons->operator[](i)->GetMomentum());
590 delete tmpHadrons->operator[](i);
593 if( getenv(
"G4ParticleHPDebug"))
G4cout <<
" G4ParticleHPInelasticBaseFS::BaseApply N photons " << nPhotons << G4endl;
597 for(i=0; i<nPhotons; i++)
600 theSec->
SetDefinition(thePhotons->operator[](i)->GetDefinition());
601 theSec->
SetMomentum(thePhotons->operator[](i)->GetMomentum());
606 delete thePhotons->operator[](i);
G4ParticleHPDeExGammas theGammas
G4double total(Particle const *const p1, Particle const *const p2)
static G4ParticleHPManager * GetInstance()
G4double Sample(G4double anEnergy, G4int &it)
void Init(std::istream &aDataFile)
G4ParticleHPVector * theXsection
static G4IonTable * GetIonTable()
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetMomentum(const G4double x, const G4double y, const G4double z)
G4ParticleDefinition * theProjectile
G4ReactionProductVector * Sample(G4double anEnergy)
const G4String & GetParticleName() const
void SetTarget(G4ReactionProduct &aTarget)
G4double GetPDGCharge() const
void SetTarget(G4ReactionProduct *aTarget)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
const G4ParticleDefinition * GetDefinition() const
static G4Proton * Proton()
G4ParticleHPPhotonDist * theFinalStatePhotons
G4double GetPDGMass() const
void SetTotalEnergy(const G4double en)
static G4Deuteron * Deuteron()
void SetTarget(const G4ReactionProduct &aTarget)
G4ReactionProductVector * GetDecayGammas(G4int aLevel)
void GetDataStream(G4String, std::istringstream &iss)
G4double GetTotalEnergy() const
static G4double GetBindingEnergy(const G4int A, const G4int Z)
void SetKineticEnergy(const G4double en)
void SetAZMs(G4double anA, G4double aZ, G4int aM, G4ParticleHPDataUsed used)
G4double GetKineticEnergy() const
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &bit, G4ParticleDefinition *)
void Init(std::istream &aDataFile, G4int total, G4double ux=1., G4double uy=1.)
G4ParticleDefinition * GetDefinition() const
const G4Material * GetMaterial() const
G4double GetLevelEnergy(G4int aLevel)
void SetProjectileRP(G4ReactionProduct *aIncidentParticleRP)
void InitGammas(G4double AR, G4double ZR)
void SetProjectileRP(const G4ReactionProduct &anIncidentParticleRP)
G4int GetBaryonNumber() const
void Init(G4double aMass, G4int aCount)
G4Cache< G4HadFinalState * > theResult
G4ParticleHPNames theNames
static constexpr double MeV
G4bool InitMean(std::istream &aDataFile)
G4ErrorTarget * theTarget
double A(double temperature)
static G4double GetNuclearMass(const G4double A, const G4double Z)
static constexpr double eV
G4ThreeVector GetMomentum() const
std::vector< G4ReactionProduct * > G4ReactionProductVector
G4ParticleHPDataUsed GetName(G4int A, G4int Z, G4String base, G4String rest, G4bool &active)
void Put(const value_type &val) const
const G4LorentzVector & Get4Momentum() const
G4int GetNumberOfSecondaries() const
G4ParticleHPEnAngCorrelation * theEnergyAngData
G4ReactionProductVector * GetPhotons(G4double anEnergy)
G4ParticleHPAngular * theAngularDistribution
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
void Init(std::istream &aDataFile)
void adjust_final_state(G4LorentzVector)
const G4ParticleDefinition * GetDefinition() const
void SetProjectileRP(G4ReactionProduct &aIncidentPart)
void SampleAndUpdate(G4ReactionProduct &anIncidentParticle)
static G4Triton * Triton()
static G4Neutron * Neutron()
void InitPartials(std::istream &aDataFile)
G4double theNuclearMassDifference
void InitAngular(std::istream &aDataFile)
void SetMomentum(const G4ThreeVector &momentum)
G4double GetKineticEnergy() const
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4GLOB_DLL std::ostream G4cout
void Init(std::istream &aDataFile)
G4double GetTotalMeanEnergy()
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
const G4ParticleDefinition * GetParticleDefinition() const
static const G4double eps
G4ReactionProduct * Sample(G4double anEnergy, G4double massCode, G4double mass)
G4int GetNumberOfLevels()
static constexpr double keV
void Lorentz(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
G4ReactionProduct GetBiasedThermalNucleus(G4double aMass, G4ThreeVector aVelocity, G4double temp=-1) const
void Init(std::istream &theData)
void BaseApply(const G4HadProjectile &theTrack, G4ParticleDefinition **theDefs, G4int nDef)
void SetStatusChange(G4HadFinalStateStatus aS)
G4double GetTemperature() const
void InitEnergies(std::istream &aDataFile)
G4ParticleHPEnergyDistribution * theEnergyDistribution