59 #include "G4ParticleChange.hh"   140     strtol(getenv(
"G4Hadronic_epReportLevel"),0,10) : 0;
   142   epCheckLevels.first = getenv(
"G4Hadronic_epCheckRelativeLevel") ?
   143     strtod(getenv(
"G4Hadronic_epCheckRelativeLevel"),0) : 
DBL_MAX;
   145   epCheckLevels.second = getenv(
"G4Hadronic_epCheckAbsoluteLevel") ?
   146     strtod(getenv(
"G4Hadronic_epCheckAbsoluteLevel"),0) : 
DBL_MAX;
   181   if(x < 0.0) { x = 0.0; }
   196   if(getenv(
"G4HadronicProcess_debug")) {
   213     ed << 
" hadronic initialisation fails" << 
G4endl;
   214     G4Exception(
"G4HadronicProcess::BuildPhysicsTable", 
"had000", 
   229                         aTrack.GetMaterial());
   236     ed << 
" Cross section is not available" << 
G4endl;
   274     ed << 
" PostStepDoIt failed on element selection" << 
G4endl;
   289   if (aTrack.GetTrackStatus() != fAlive && 
   290       aTrack.GetTrackStatus() != fSuspend) {
   291     if (aTrack.GetTrackStatus() == fStopAndKill ||
   292         aTrack.GetTrackStatus() == fKillTrackAndSecondaries ||
   293         aTrack.GetTrackStatus() == fPostponeToNextEvent) {
   295       ed << 
"G4HadronicProcess: track in unusable state - "   296      << aTrack.GetTrackStatus() << 
G4endl;
   297       ed << 
"G4HadronicProcess: returning unchanged track " << 
G4endl;
   317     ed << 
"Target element "<<anElement->
GetName()<<
"  Z= "   320     DumpState(aTrack,
"ChooseHadronicInteraction",ed);
   321     ed << 
" No HadronicInteraction found out" << 
G4endl;
   327   G4int reentryCount = 0;
   346       ed << 
"Target element "<<anElement->
GetName()<<
"  Z= "   350       ed << 
" ApplyYourself failed" << 
G4endl;
   358     if(reentryCount>100) {
   361       ed << 
"Target element "<<anElement->
GetName()<<
"  Z= "   365       ed << 
" ApplyYourself does not completed after 100 attempts" << 
G4endl;
   388   outFile << 
"The description for this process has not been written yet.\n";
   396   G4double biasedProbability = 1.-std::exp(-nLTraversed);
   398   result = (biasedProbability-realProbability)/biasedProbability;
   420   if(efinal < 0.0) { efinal = 0.0; }
   428   } 
else if(0.0 == efinal) {
   430     if(aT.GetParticleDefinition()->GetProcessManager()
   431        ->GetAtRestProcessVector()->size() > 0)
   438     G4double mass = aT.GetParticleDefinition()->GetPDGMass();
   440     G4double newP = std::sqrt(efinal*(efinal + 2*mass));
   443     newP4.
rotate(rotation, it);
   446     newE = newP4.
e() - mass;
   449       DumpState(aT,
"Primary has zero energy after interaction",ed);
   452     if(newE < 0.0) { newE = 0.0; }
   465     G4double time0 = aT.GetGlobalTime();
   466     for (
G4int i = 0; i < nSec; ++i) {
   468       theM.
rotate(rotation, it);
   474       if (time < 0.0) { time = 0.0; }
   480                                    time, aT.GetPosition());
   493       track->SetWeight(newWeight);
   494       track->SetTouchableHandle(aT.GetTouchableHandle());
   500           DumpState(aT,
"Secondary has zero energy",ed);
   501           ed << 
"Secondary " << track->GetDefinition()->GetParticleName()
   503           G4Exception(
"G4HadronicProcess::FillResults", 
"had011", 
   518   if ((it != 
"photonNuclear") &&
   519       (it != 
"electronNuclear") &&
   520       (it != 
"positronNuclear") ) {
   522     G4Exception(
"G4HadronicProcess::BiasCrossSectionByFactor", 
"had009", 
   524                 "Cross-section biasing available only for gamma and electro nuclear reactions.");
   530                 "Cross-section bias readjusted to be above safe limit. New value is 100");
   564     for (
G4int i = 0; i < nSec; i++) {
   569       if ( std::abs(mass_pdg - mass_dyn) > 0.1*mass_pdg + 1.*
MeV){
   573           desc << 
"Warning: Secondary with off-shell dynamic mass detected:  " << 
G4endl   575            << 
", PDG mass: " << mass_pdg << 
", dynamic mass: "<< mass_dyn << 
G4endl   582            << 
", target nucleus (" << aNucleus.
GetZ_asInt() << 
", "   584           G4Exception(
"G4HadronicProcess:CheckResult()", 
"had012",
   592     std::pair<G4double, G4double> checkLevels = 
   594     if (std::abs(deltaE) > checkLevels.second && 
   600       desc << 
"Warning: Bad energy non-conservation detected, will "   607        << 
", target nucleus (" << aNucleus.
GetZ_asInt() << 
", "   609        << 
" E(initial - final) = " << deltaE << 
" MeV." << 
G4endl;
   610       G4Exception(
"G4HadronicProcess:CheckResult()", 
"had012", 
   626   G4LorentzVector projectile4mom = aTrack.GetDynamicParticle()->Get4Momentum();
   627   G4int track_A = aTrack.GetDefinition()->GetBaryonNumber();
   628   G4int track_Z = 
G4lrint(aTrack.GetDefinition()->GetPDGCharge());
   630   G4int initial_A = target_A + track_A;
   631   G4int initial_Z = target_Z + track_Z;
   637   G4int final_A(0), final_Z(0);
   643      G4Track temp(aTrack);
   646      temp.SetMomentumDirection(*
theTotalResult->GetMomentumDirection());
   652         final4mom = temp.GetDynamicParticle()->Get4Momentum() + target4mom;
   657         final4mom = temp.GetDynamicParticle()->Get4Momentum();
   667     for (
G4int i = 0; i < nSec; i++) {
   669       final4mom += sec->GetDynamicParticle()->Get4Momentum();
   670       final_A += sec->GetDefinition()->GetBaryonNumber();
   671       final_Z += 
G4lrint(sec->GetDefinition()->GetPDGCharge());
   688   G4bool checkRelative = (aTrack.GetKineticEnergy() > checkLevels.second);
   692   G4double relative = checkRelative ? absolute/aTrack.GetKineticEnergy() : 0.;
   695   G4double relative_mom = checkRelative ? absolute_mom/aTrack.GetMomentum().mag() : 0.;
   700   if (  std::abs(relative) > checkLevels.first
   701      || std::abs(relative_mom) > checkLevels.first) {
   703     relResult = checkRelative ? 
"fail" : 
"N/A";
   708   if (   std::abs(absolute) > checkLevels.second
   709       || std::abs(absolute_mom) > checkLevels.second ) {
   716   if (   (initial_A-final_A)!=0
   717       || (initial_Z-final_Z)!=0 ) {
   718     chargePass = checkLevels.second < 
DBL_MAX ? false : 
true;
   719     chargeResult = 
"fail";
   722   G4bool conservationPass = (relPass || absPass) && chargePass;
   724   std::stringstream Myout;
   725   G4bool Myout_notempty(
false);
   736       Myout << 
" Process: " << processName << 
" , Model: " <<  modelName << 
G4endl;
   737       Myout << 
" Primary: " << aTrack.GetParticleDefinition()->GetParticleName()
   738             << 
" (" << aTrack.GetParticleDefinition()->GetPDGEncoding() << 
"),"   739             << 
" E= " <<  aTrack.GetDynamicParticle()->Get4Momentum().e()
   740         << 
", target nucleus (" << aNucleus.
GetZ_asInt() << 
","   746      || ! conservationPass ){
   748       Myout << 
"   "<< relResult  <<
" relative, limit " << checkLevels.
first << 
", values E/T(0) = "   749              << relative << 
" p/p(0)= " << relative_mom  << 
G4endl;
   750       Myout << 
"   "<< absResult << 
" absolute, limit (MeV) " << checkLevels.second/
MeV << 
", values E / p (MeV) = "   751              << absolute/
MeV << 
" / " << absolute_mom/
MeV << 
" 3mom: " << (diff.
vect())*1./
MeV <<  G4endl;
   752       Myout << 
"   "<< chargeResult << 
" charge/baryon number balance " << (initial_Z-final_Z) << 
" / " << (initial_A-final_A) << 
" "<<  
G4endl;
   757   if ( Myout_notempty ) {
   768   ed << 
"Unrecoverable error in the method " << method << 
" of "   770   ed << 
"TrackID= "<< aTrack.GetTrackID() << 
"  ParentID= "   771      << aTrack.GetParentID()
   772      << 
"  " << aTrack.GetParticleDefinition()->GetParticleName()
   774   ed << 
"Ekin(GeV)= " << aTrack.GetKineticEnergy()/
CLHEP::GeV   775      << 
";  direction= " << aTrack.GetMomentumDirection() << 
G4endl;
   776   ed << 
"Position(mm)= " << aTrack.GetPosition()/
CLHEP::mm << 
";";
   778   if (aTrack.GetMaterial()) {
   779     ed << 
"  material " << aTrack.GetMaterial()->GetName();
   783   if (aTrack.GetVolume()) {
   784     ed << 
"PhysicalVolume  <" << aTrack.GetVolume()->GetName()
 G4bool levelsSetByProcess
 
static G4double GetNuclearMass(const G4double A, const G4double Z)
 
void RegisterMe(G4HadronicInteraction *a)
 
void RegisterInteraction(G4HadronicProcess *, G4HadronicInteraction *)
 
G4int GetNumberOfSecondaries() const
 
std::ostringstream G4ExceptionDescription
 
G4HadSecondary * GetSecondary(size_t i)
 
G4LorentzRotation & GetTrafoToLab()
 
void BiasCrossSectionByFactor(G4double aScale)
 
static G4HadronicProcessStore * Instance()
 
G4Material * FindOrBuildSimpleMaterial(G4int Z, G4bool warning=false)
 
const G4LorentzVector & Get4Momentum() const
 
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
 
G4HadronicInteraction * GetHadronicInteraction() const
 
bool G4HadronicProcess_debug_flag
 
G4HadronicInteraction * theInteraction
 
G4EnergyRangeManager theEnergyRangeManager
 
const G4LorentzRotation & GetTrafoToLab() const
 
G4double GetEnergyChange() const
 
G4double GetTotalEnergy() const
 
virtual void PreparePhysicsTable(const G4ParticleDefinition &)
 
G4double GetWeight() const
 
virtual std::pair< G4double, G4double > GetEnergyMomentumCheckLevels() const
 
void CheckEnergyMomentumConservation(const G4Track &, const G4Nucleus &)
 
void ClearNumberOfInteractionLengthLeft()
 
static G4NistManager * Instance()
 
#define G4MUTEX_INITIALIZER
 
std::pair< G4double, G4double > epCheckLevels
 
G4double GetTotalEnergy() const
 
void GetEnergyMomentumCheckEnvvars()
 
void RegisterMe(G4HadronicInteraction *a)
 
G4HadFinalStateStatus GetStatusChange() const
 
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
 
G4CrossSectionDataStore * theCrossSectionDataStore
 
void DumpState(const G4Track &, const G4String &, G4ExceptionDescription &)
 
void SetTrafoToLab(const G4LorentzRotation &aT)
 
const G4String & GetProcessName() const
 
void FillResult(G4HadFinalState *aR, const G4Track &aT)
 
const G4String & GetParticleName() const
 
G4double GetLocalEnergyDeposit() const
 
G4GLOB_DLL std::ostream G4cout
 
G4ParticleChange * theTotalResult
 
G4int GetPDGEncoding() const
 
void Register(G4HadronicProcess *)
 
G4double GetMeanFreePath(const G4Track &aTrack, G4double, G4ForceCondition *)
 
G4double XBiasSurvivalProbability()
 
G4double theInitialNumberOfInteractionLength
 
G4double GetCrossSection(const G4DynamicParticle *, const G4Material *)
 
const G4ThreeVector & GetMomentumChange() const
 
void SetProcessSubType(G4int)
 
static const char * G4Hadronic_Random_File
 
void RegisterParticle(G4HadronicProcess *, const G4ParticleDefinition *)
 
G4HadronicProcessStore * theProcessStore
 
void DeRegister(G4HadronicProcess *)
 
HepLorentzVector & rotate(double, const Hep3Vector &)
 
void Initialise(const G4Track &aT)
 
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
 
G4Material * InitialiseMaterial(G4int Z)
 
const G4ParticleDefinition * GetDefinition() const
 
void Set4Momentum(const G4LorentzVector &momentum)
 
const G4String & GetName() const
 
void BuildPhysicsTable(const G4ParticleDefinition &)
 
G4double GetElementCrossSection(const G4DynamicParticle *part, const G4Element *elm, const G4Material *mat=0)
 
G4double GetKineticEnergy() const
 
G4double XBiasSecondaryWeight()
 
static void saveEngineStatus(const char filename[]="Config.conf")
 
G4double GetPDGMass() const
 
virtual ~G4HadronicProcess()
 
G4DynamicParticle * GetParticle()
 
void BuildPhysicsTable(const G4ParticleDefinition &)
 
G4HadronicInteraction * ChooseHadronicInteraction(const G4HadProjectile &aHadProjectile, G4Nucleus &aTargetNucleus, G4Material *aMaterial, G4Element *anElement)
 
G4LorentzVector Get4Momentum() const
 
G4ParticleDefinition * GetDefinition() const
 
G4HadronicProcess(const G4String &processName="Hadronic", G4ProcessType procType=fHadronic)
 
G4Element * SampleZandA(const G4DynamicParticle *, const G4Material *, G4Nucleus &target)
 
const G4String & GetModelName() const
 
static const double twopi
 
virtual G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
 
G4double GetTotalNumberOfInteractionLengthTraversed() const
 
G4double GetPDGCharge() const
 
void Report(std::ostream &aS)
 
G4double theLastCrossSection
 
virtual const std::pair< G4double, G4double > GetFatalEnergyCheckLevels() const
 
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)=0
 
virtual void ProcessDescription(std::ostream &outFile) const
 
G4HadFinalState * CheckResult(const G4HadProjectile &thePro, const G4Nucleus &targetNucleus, G4HadFinalState *result)
 
G4GLOB_DLL std::ostream G4cerr
 
G4int GetCreatorModelType() const
 
void PrintInfo(const G4ParticleDefinition *)