Import Geant4 10.6.1 source tree
This commit is contained in:
+1
-1
@@ -167,7 +167,7 @@ endif
|
||||
|
||||
banner:
|
||||
@$(ECHO) "*************************************************************"
|
||||
@$(ECHO) " Installation Geant4 version geant4-10-06 "
|
||||
@$(ECHO) " Installation Geant4 version geant4-10-06-patch-01 "
|
||||
@$(ECHO) " Copyright (C) 1994-2020 Geant4 Collaboration "
|
||||
@$(ECHO) "*************************************************************"
|
||||
|
||||
|
||||
@@ -10,9 +10,6 @@ endif
|
||||
|
||||
include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
ifdef G4LIB_BUILD_EXPAT
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
@@ -16,6 +16,15 @@ committal in the CVS repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
February 12th, 2020 T.Aso (detutils-V10-05-06)
|
||||
- In G4ScoreQuantityMessenger, changed SetDefaultUnit() in trackLength
|
||||
scorer to SetDefaultValue() to support various unit category.
|
||||
Addressing problem report #2216.
|
||||
|
||||
December 29th, 2019 M.Asai (detutils-V10-05-05)
|
||||
- G4ScoringManager, G4VScoreWriter, G4ScoringMessenger:
|
||||
Add missing setter/getter functions.
|
||||
|
||||
October 23rd, 2019 M.Asai (detutils-V10-05-04)
|
||||
- Revising utils/src/G4ScoringQuantiryMessenger.cc to better handle
|
||||
ther error cases.
|
||||
|
||||
@@ -153,6 +153,18 @@ class G4ScoringManager
|
||||
if(writer) writer->SetVerboseLevel(verboseLevel);
|
||||
}
|
||||
// Replace score writers.
|
||||
|
||||
public:
|
||||
inline void SetFactor(G4double val=1.0)
|
||||
{ if(writer) writer->SetFactor(val); }
|
||||
inline G4double GetFactor() const
|
||||
{
|
||||
if(writer)
|
||||
{ return writer->GetFactor(); }
|
||||
else
|
||||
{ return -1.0; }
|
||||
}
|
||||
|
||||
private:
|
||||
//Disable copy constructor and assignement operator
|
||||
G4ScoringManager(const G4ScoringManager&);
|
||||
|
||||
@@ -129,6 +129,8 @@ class G4ScoringMessenger: public G4UImessenger
|
||||
// Dump scoring result to file
|
||||
G4UIcommand * dumpQtyToFileCmd;
|
||||
G4UIcommand * dumpAllQtsToFileCmd;
|
||||
G4UIcommand * dumpQtyWithFactorCmd;
|
||||
G4UIcommand * dumpAllQtsWithFactorCmd;
|
||||
//
|
||||
|
||||
};
|
||||
|
||||
@@ -55,9 +55,9 @@ public:
|
||||
// set a socring mesh to retrieve its quantities
|
||||
void SetScoringMesh(G4VScoringMesh * sm);
|
||||
// set a verbose level
|
||||
inline void SetVerboseLevel(G4int vl) {
|
||||
verboseLevel = vl;
|
||||
}
|
||||
inline void SetVerboseLevel(G4int vl) { verboseLevel = vl; }
|
||||
inline void SetFactor(G4double val=1.0) { fact = val; }
|
||||
inline G4double GetFactor() const { return fact; }
|
||||
|
||||
protected:
|
||||
// get an index from (x,y,z)
|
||||
@@ -67,6 +67,7 @@ protected:
|
||||
G4int fNMeshSegments[3]; // number of segments of the mesh
|
||||
G4VScoringMesh * fScoringMesh;
|
||||
G4int verboseLevel;
|
||||
G4double fact;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
// 29-Mar-2013 T.Aso Support weighted options in the nOfTrack command.
|
||||
// Support a boundary flag option in the nOfStep command
|
||||
// for skipping stepLength=0 steps.
|
||||
//
|
||||
// 13-Feb-2020 T.Aso Change SetDefaultUnit() in trackLength scorer to
|
||||
// SetDefaultValue() to support various unit category.
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
#include "G4ScoreQuantityMessenger.hh"
|
||||
@@ -205,7 +206,7 @@ void G4ScoreQuantityMessenger::QuantityCommands()
|
||||
param->SetDefaultValue("false");
|
||||
qTrackLengthCmd->SetParameter(param);
|
||||
param = new G4UIparameter("unit",'s',true);
|
||||
param->SetDefaultUnit("mm");
|
||||
param->SetDefaultValue("mm");
|
||||
qTrackLengthCmd->SetParameter(param);
|
||||
//
|
||||
qPassCellCurrCmd = new G4UIcommand("/score/quantity/passageCellCurrent",this);
|
||||
|
||||
@@ -287,6 +287,22 @@ G4ScoringMessenger::G4ScoringMessenger(G4ScoringManager* SManager)
|
||||
dumpQtyToFileCmd->SetParameter(param);
|
||||
dumpQtyToFileCmd->SetToBeBroadcasted(false);
|
||||
|
||||
dumpQtyWithFactorCmd = new G4UIcommand("/score/dumpQuantityWithFactor", this);
|
||||
dumpQtyWithFactorCmd->SetGuidance("Dump one scored quantity to file.");
|
||||
dumpQtyWithFactorCmd->SetGuidance("Each value is multiplied by the specified factor.");
|
||||
param = new G4UIparameter("meshName", 's', false);
|
||||
dumpQtyWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("psName", 's', false);
|
||||
dumpQtyWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("fileName", 's', false);
|
||||
dumpQtyWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("factor", 'd', false);
|
||||
param->SetParameterRange("factor>0.");
|
||||
dumpQtyWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("option", 's', true);
|
||||
dumpQtyWithFactorCmd->SetParameter(param);
|
||||
dumpQtyWithFactorCmd->SetToBeBroadcasted(false);
|
||||
|
||||
// Dump all scored quantities
|
||||
dumpAllQtsToFileCmd = new G4UIcommand("/score/dumpAllQuantitiesToFile", this);
|
||||
dumpAllQtsToFileCmd->SetGuidance("Dump all quantities of the mesh to file.");
|
||||
@@ -298,6 +314,20 @@ G4ScoringMessenger::G4ScoringMessenger(G4ScoringManager* SManager)
|
||||
dumpAllQtsToFileCmd->SetParameter(param);
|
||||
dumpAllQtsToFileCmd->SetToBeBroadcasted(false);
|
||||
|
||||
dumpAllQtsWithFactorCmd = new G4UIcommand("/score/dumpAllQuantitiesWithFactor", this);
|
||||
dumpAllQtsWithFactorCmd->SetGuidance("Dump all quantities of the mesh to file.");
|
||||
dumpAllQtsWithFactorCmd->SetGuidance("Each value is multiplied by the specified factor.");
|
||||
param = new G4UIparameter("meshName", 's', false);
|
||||
dumpAllQtsWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("fileName", 's', false);
|
||||
dumpAllQtsWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("factor", 'd', false);
|
||||
param->SetParameterRange("factor>0.");
|
||||
dumpAllQtsWithFactorCmd->SetParameter(param);
|
||||
param = new G4UIparameter("option", 's', true);
|
||||
dumpAllQtsWithFactorCmd->SetParameter(param);
|
||||
dumpAllQtsWithFactorCmd->SetToBeBroadcasted(false);
|
||||
|
||||
}
|
||||
|
||||
G4ScoringMessenger::~G4ScoringMessenger()
|
||||
@@ -340,8 +370,10 @@ G4ScoringMessenger::~G4ScoringMessenger()
|
||||
delete floatMinMaxCmd;
|
||||
delete colorMapMinMaxCmd;
|
||||
delete colorMapDir;
|
||||
delete dumpQtyToFileCmd;
|
||||
delete dumpQtyWithFactorCmd;
|
||||
delete dumpQtyWithFactorCmd;
|
||||
delete dumpAllQtsToFileCmd;
|
||||
delete dumpAllQtsWithFactorCmd;
|
||||
//
|
||||
delete scoreDir;
|
||||
}
|
||||
@@ -383,13 +415,64 @@ void G4ScoringMessenger::SetNewValue(G4UIcommand * command,G4String newVal)
|
||||
G4String psName = next();
|
||||
G4String fileName = next();
|
||||
G4String option = next("\n");
|
||||
auto mesh = fSMan->FindMesh(meshName);
|
||||
if(!mesh)
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Mesh name <" << meshName << "> is not found. Command ignored.";
|
||||
command->CommandFailed(ed);
|
||||
return;
|
||||
}
|
||||
fSMan->DumpQuantityToFile(meshName, psName, fileName, option);
|
||||
} else if(command==dumpQtyWithFactorCmd) {
|
||||
G4Tokenizer next(newVal);
|
||||
G4String meshName = next();
|
||||
G4String psName = next();
|
||||
G4String fileName = next();
|
||||
G4double fac = StoD(next());
|
||||
G4String option = next("\n");
|
||||
auto mesh = fSMan->FindMesh(meshName);
|
||||
if(!mesh)
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Mesh name <" << meshName << "> is not found. Command ignored.";
|
||||
command->CommandFailed(ed);
|
||||
return;
|
||||
}
|
||||
fSMan->SetFactor(fac);
|
||||
fSMan->DumpQuantityToFile(meshName, psName, fileName, option);
|
||||
fSMan->SetFactor(1.0);
|
||||
} else if(command==dumpAllQtsToFileCmd) {
|
||||
G4Tokenizer next(newVal);
|
||||
G4String meshName = next();
|
||||
G4String fileName = next();
|
||||
G4String option = next("\n");
|
||||
auto mesh = fSMan->FindMesh(meshName);
|
||||
if(!mesh)
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Mesh name <" << meshName << "> is not found. Command ignored.";
|
||||
command->CommandFailed(ed);
|
||||
return;
|
||||
}
|
||||
fSMan->DumpAllQuantitiesToFile(meshName, fileName, option);
|
||||
} else if(command==dumpAllQtsWithFactorCmd) {
|
||||
G4Tokenizer next(newVal);
|
||||
G4String meshName = next();
|
||||
G4String fileName = next();
|
||||
G4double fac = StoD(next());
|
||||
G4String option = next("\n");
|
||||
auto mesh = fSMan->FindMesh(meshName);
|
||||
if(!mesh)
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Mesh name <" << meshName << "> is not found. Command ignored.";
|
||||
command->CommandFailed(ed);
|
||||
return;
|
||||
}
|
||||
fSMan->SetFactor(fac);
|
||||
fSMan->DumpAllQuantitiesToFile(meshName, fileName, option);
|
||||
fSMan->SetFactor(1.0);
|
||||
} else if(command==verboseCmd) {
|
||||
fSMan->SetVerboseLevel(verboseCmd->GetNewIntValue(newVal));
|
||||
} else if(command==meshBoxCreateCmd) {
|
||||
|
||||
@@ -37,7 +37,8 @@
|
||||
#include <fstream>
|
||||
|
||||
G4VScoreWriter::G4VScoreWriter()
|
||||
: fScoringMesh(nullptr), verboseLevel(0) {
|
||||
: fScoringMesh(nullptr), verboseLevel(0), fact(1.0)
|
||||
{
|
||||
fNMeshSegments[0] = fNMeshSegments[1] = fNMeshSegments[2] = 0;
|
||||
}
|
||||
|
||||
@@ -90,7 +91,8 @@ void G4VScoreWriter::DumpQuantityToFile(const G4String& psName,
|
||||
|
||||
std::map<G4int, G4StatDouble*> * score = msMapItr->second->GetMap();
|
||||
ofile << "# primitive scorer name: " << msMapItr->first << std::endl;
|
||||
|
||||
if(fact!=1.0)
|
||||
{ ofile << "# multiplied factor : " << fact << std::endl; }
|
||||
|
||||
G4double unitValue = fScoringMesh->GetPSUnitValue(psName);
|
||||
G4String unit = fScoringMesh->GetPSUnit(psName);
|
||||
@@ -126,8 +128,8 @@ void G4VScoreWriter::DumpQuantityToFile(const G4String& psName,
|
||||
if(value == score->end()) {
|
||||
ofile << 0. << "," << 0. << "," << 0;
|
||||
} else {
|
||||
ofile << (value->second->sum_wx())/unitValue << ","
|
||||
<< (value->second->sum_wx2())/unitValue/unitValue << ","
|
||||
ofile << (value->second->sum_wx())/unitValue*fact << ","
|
||||
<< (value->second->sum_wx2())/unitValue/unitValue*fact*fact << ","
|
||||
<< value->second->n();
|
||||
}
|
||||
|
||||
@@ -172,6 +174,8 @@ void G4VScoreWriter::DumpAllQuantitiesToFile(const G4String& fileName,
|
||||
return;
|
||||
}
|
||||
ofile << "# mesh name: " << fScoringMesh->GetWorldName() << G4endl;
|
||||
if(fact!=1.0)
|
||||
{ ofile << "# multiplied factor : " << fact << std::endl; }
|
||||
|
||||
// retrieve the map
|
||||
using MeshScoreMap = G4VScoringMesh::MeshScoreMap;
|
||||
@@ -220,8 +224,8 @@ void G4VScoreWriter::DumpAllQuantitiesToFile(const G4String& fileName,
|
||||
if(value == score->end()) {
|
||||
ofile << 0. << "," << 0. << "," << 0;
|
||||
} else {
|
||||
ofile << (value->second->sum_wx())/unitValue << ","
|
||||
<< (value->second->sum_wx2())/unitValue/unitValue << ","
|
||||
ofile << (value->second->sum_wx())/unitValue*fact << ","
|
||||
<< (value->second->sum_wx2())/unitValue/unitValue*fact*fact << ","
|
||||
<< value->second->n();
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,12 @@ committal in the CVS repository !
|
||||
----------------------------------------------------------
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
January 13, 2020 G.Cosmo - field-V10-05-18
|
||||
------------------------
|
||||
- Turn off verbosity flags by default in G4IntegratorDriver,
|
||||
G4InterpolationDriver and G4MagIntegratorDriver.
|
||||
|
||||
November 14, 2019 J.Apostolakis - field-V10-05-17
|
||||
-------------------------------
|
||||
- Added method / attribute to G4VIntegrationDriver DoesReIntegrate()
|
||||
|
||||
@@ -53,7 +53,7 @@ class G4IntegrationDriver : public G4RKIntegrationDriver<T>,
|
||||
G4IntegrationDriver( G4double hminimum,
|
||||
T* stepper,
|
||||
G4int numberOfComponents = 6,
|
||||
G4int statisticsVerbosity = 1 );
|
||||
G4int statisticsVerbosity = 0 );
|
||||
|
||||
virtual ~G4IntegrationDriver() override;
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ class G4InterpolationDriver : public G4RKIntegrationDriver<T>
|
||||
G4InterpolationDriver(G4double hminimum,
|
||||
T* stepper,
|
||||
G4int numberOfComponents = 6,
|
||||
G4int statisticsVerbosity = 1);
|
||||
G4int statisticsVerbosity = 0);
|
||||
|
||||
virtual ~G4InterpolationDriver() override;
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class G4MagInt_Driver : public G4VIntegrationDriver,
|
||||
G4MagInt_Driver(G4double hminimum,
|
||||
G4MagIntegratorStepper* pItsStepper,
|
||||
G4int numberOfComponents = 6,
|
||||
G4int statisticsVerbosity = 1);
|
||||
G4int statisticsVerbosity = 0);
|
||||
virtual ~G4MagInt_Driver() override;
|
||||
// Constructor, destructor.
|
||||
|
||||
|
||||
@@ -16,6 +16,11 @@ committal in the CVS repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
February 5, 2020 - P.Arce (geomnav-V10-05-20)
|
||||
-------------------------
|
||||
- Fixed problem report #2196.
|
||||
Avoid looping infinitely by pushing N times with increasing step size.
|
||||
|
||||
November 29, 2019 - J.Apostolakis (geomnav-V10-05-19)
|
||||
---------------------------------
|
||||
- Added method to PropagatorInField to Get/Set new parameter that
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
// navigation does not stop at the surface
|
||||
|
||||
// History:
|
||||
// - Created: P.Arce, May 2007
|
||||
// - Created. P.Arce, May 2007
|
||||
// --------------------------------------------------------------------
|
||||
#ifndef G4RegularNavigation_HH
|
||||
#define G4RegularNavigation_HH
|
||||
@@ -122,6 +122,21 @@ class G4RegularNavigation
|
||||
|
||||
G4NormalNavigation* fnormalNav = nullptr;
|
||||
G4double kCarTolerance;
|
||||
G4double fMinStep;
|
||||
|
||||
G4bool fLastStepWasZero;
|
||||
// Whether the last ComputeStep moved Zero. Used to check for edges.
|
||||
G4int fNumberZeroSteps;
|
||||
// Number of preceding moves that were Zero. Reset to 0 after finite step
|
||||
G4int fActionThreshold_NoZeroSteps;
|
||||
// After this many failed/zero steps, act (push etc)
|
||||
G4int fAbandonThreshold_NoZeroSteps;
|
||||
// After this many failed/zero steps, abandon track
|
||||
G4int fNoStepsAllowed;
|
||||
// Maximum number of steps a track can travel skipping voxels
|
||||
// (if there are more, track is assumed to be stuck and it is killed)
|
||||
G4bool fWarnPush;
|
||||
// Send warning message that a stuck particle has been pushed
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
// class G4RegularNavigation implementation
|
||||
//
|
||||
// Author: Pedro Arce, May 2007
|
||||
//
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
#include "G4RegularNavigation.hh"
|
||||
@@ -41,6 +42,12 @@
|
||||
G4RegularNavigation::G4RegularNavigation()
|
||||
{
|
||||
kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
|
||||
fMinStep = 101*kCarTolerance;
|
||||
|
||||
fActionThreshold_NoZeroSteps = 2;
|
||||
fAbandonThreshold_NoZeroSteps = 25;
|
||||
fNoStepsAllowed = 10000;
|
||||
fWarnPush = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +78,7 @@ G4double G4RegularNavigation::
|
||||
// problems would make this method to be called
|
||||
|
||||
G4ThreeVector globalPoint =
|
||||
history.GetTopTransform().InverseTransformPoint(localPoint);
|
||||
history.GetTopTransform().InverseTransformPoint(localPoint);
|
||||
G4ThreeVector globalDirection =
|
||||
history.GetTopTransform().InverseTransformAxis(localDirection);
|
||||
|
||||
@@ -156,7 +163,8 @@ G4double G4RegularNavigation::ComputeStepSkippingEqualMaterials(
|
||||
//
|
||||
G4int ide = history.GetDepth();
|
||||
G4ThreeVector containerPoint = history.GetTransform(ide)
|
||||
.InverseTransformPoint(localPoint);
|
||||
.InverseTransformPoint(localPoint);
|
||||
|
||||
// Point in global frame
|
||||
//
|
||||
containerPoint = history.GetTransform(ide).InverseTransformPoint(localPoint);
|
||||
@@ -191,9 +199,96 @@ G4double G4RegularNavigation::ComputeStepSkippingEqualMaterials(
|
||||
|
||||
// Loop while same material is found
|
||||
//
|
||||
for( ;; )
|
||||
//
|
||||
fNumberZeroSteps = 0;
|
||||
for( G4int ii = 0; ii < fNoStepsAllowed+1; ++ii )
|
||||
{
|
||||
if( ii == fNoStepsAllowed ) {
|
||||
// Must kill this stuck track
|
||||
//
|
||||
G4ThreeVector pGlobalpoint = history.GetTransform(ide)
|
||||
.InverseTransformPoint(localPoint);
|
||||
std::ostringstream message;
|
||||
message << "G4RegularNavigation::ComputeStepSkippingEqualMaterials()"
|
||||
<< "Stuck Track: potential geometry or navigation problem."
|
||||
<< G4endl
|
||||
<< " Track stuck, moving for more than "
|
||||
<< ii << " steps" << G4endl
|
||||
<< "- at point " << pGlobalpoint << G4endl
|
||||
<< " local direction: " << localDirection << G4endl;
|
||||
G4Exception("G4RegularNavigation::ComputeStepSkippingEqualMaterials()",
|
||||
"GeomRegNav1001",
|
||||
EventMustBeAborted,
|
||||
message);
|
||||
}
|
||||
newStep = voxelBox->DistanceToOut( localPoint, localDirection );
|
||||
fLastStepWasZero = (newStep<fMinStep);
|
||||
if( fLastStepWasZero )
|
||||
{
|
||||
++fNumberZeroSteps;
|
||||
//#ifdef G4DEBUG_NAVIGATION
|
||||
if( fNumberZeroSteps > 1 )
|
||||
{
|
||||
G4ThreeVector pGlobalpoint = history.GetTransform(ide)
|
||||
.InverseTransformPoint(localPoint);
|
||||
G4cout << "G4RegularNavigation::ComputeStepSkippingEqualMaterials():"
|
||||
<< " another 'zero' step, # "
|
||||
<< fNumberZeroSteps
|
||||
<< ", at " << pGlobalpoint
|
||||
<< ", nav-comp-step calls # " << ii
|
||||
<< ", Step= " << newStep
|
||||
<< G4endl;
|
||||
}
|
||||
//#endif
|
||||
if( fNumberZeroSteps > fActionThreshold_NoZeroSteps-1 )
|
||||
{
|
||||
// Act to recover this stuck track. Pushing it along direction
|
||||
//
|
||||
newStep = std::min(101*kCarTolerance*pow(10,fNumberZeroSteps-2),0.1);
|
||||
#ifdef G4VERBOSE
|
||||
if (fWarnPush)
|
||||
{
|
||||
G4ThreeVector pGlobalpoint = history.GetTransform(ide)
|
||||
.InverseTransformPoint(localPoint);
|
||||
std::ostringstream message;
|
||||
message.precision(16);
|
||||
message << "Track stuck or not moving." << G4endl
|
||||
<< " Track stuck, not moving for "
|
||||
<< fNumberZeroSteps << " steps" << G4endl
|
||||
<< "- at point " << pGlobalpoint
|
||||
<< " (local point " << localPoint << ")" << G4endl
|
||||
<< " local direction: " << localDirection
|
||||
<< " Potential geometry or navigation problem !"
|
||||
<< G4endl
|
||||
<< " Trying pushing it of " << newStep << " mm ...";
|
||||
G4Exception("G4RegularNavigation::ComputeStepSkippingEqualMaterials()",
|
||||
"GeomRegNav1002",
|
||||
JustWarning,
|
||||
message,
|
||||
"Potential overlap in geometry!");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if( fNumberZeroSteps > fAbandonThreshold_NoZeroSteps-1 )
|
||||
{
|
||||
// Must kill this stuck track
|
||||
//
|
||||
G4ThreeVector pGlobalpoint = history.GetTransform(ide)
|
||||
.InverseTransformPoint(localPoint);
|
||||
std::ostringstream message;
|
||||
message << "G4RegularNavigation::ComputeStepSkippingEqualMaterials()"
|
||||
<< "Stuck Track: potential geometry or navigation problem."
|
||||
<< G4endl
|
||||
<< " Track stuck, not moving for "
|
||||
<< fNumberZeroSteps << " steps" << G4endl
|
||||
<< "- at point " << pGlobalpoint << G4endl
|
||||
<< " local direction: " << localDirection << G4endl;
|
||||
G4Exception("G4RegularNavigation::ComputeStepSkippingEqualMaterials()",
|
||||
"GeomRegNav1003",
|
||||
EventMustBeAborted,
|
||||
message);
|
||||
}
|
||||
}
|
||||
|
||||
if( (bFirstStep) && (newStep < currentProposedStepLength) )
|
||||
{
|
||||
@@ -245,7 +340,6 @@ G4double G4RegularNavigation::ComputeStepSkippingEqualMaterials(
|
||||
prevVoxelTranslation = voxelTranslation;
|
||||
|
||||
// Check if material of next voxel is the same as that of the current voxel
|
||||
//
|
||||
nextMate = param->ComputeMaterial( copyNo, nullptr, nullptr );
|
||||
|
||||
if( currentMate != nextMate ) { break; }
|
||||
|
||||
@@ -16,8 +16,29 @@ committal in the source repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
17-January-2020 E.Tcherniaev (geom-specific-V10-05-22)
|
||||
- Implemented G4Tet::SetVertices(), it addresses request made
|
||||
at Geant4 Technical Forum.
|
||||
|
||||
14-January-2020 Gabriele Cosmo
|
||||
- Added protection in G4VFacet header for double definition of global
|
||||
symbols from Windows Kits code.
|
||||
|
||||
08-January-2020 E.Tcherniaev
|
||||
- Complete revision of G4Tet, speed up, new testG4Tet.cc.
|
||||
It also fixes issues spotted by new unit test.
|
||||
|
||||
16-December-2019 E.Tcherniaev
|
||||
- Complete revision of G4Ellipsoid, it fixes issues with former
|
||||
implementation, in particular it addresses problem report #2206.
|
||||
30%-70% speed-up in all main methods
|
||||
|
||||
10-December-2019 G.Cosmo
|
||||
- Re-established parameterisation mechanism for G4Tet and G4UTet which was
|
||||
removed by mistake. Addressing problem report #2209.
|
||||
|
||||
26-November-2019 G.Cosmo (geom-specific-V10-05-21)
|
||||
- Fixed cases of implicit type conversions from size_t to G4int.
|
||||
- Fixed cases of implicit type conversions from size_t to G4int.
|
||||
|
||||
05-November-2019 E.Tcherniaev (geom-specific-V10-05-20)
|
||||
- G4TesselatedSolid.cc: fixed minor Coverity defect (uninitialized array)
|
||||
|
||||
@@ -27,18 +27,19 @@
|
||||
//
|
||||
// Class description:
|
||||
//
|
||||
// A G4Ellipsoid is an ellipsoidal solid, optionally cut at a given z.
|
||||
// A G4Ellipsoid is an ellipsoidal solid, optionally cut at a given z
|
||||
//
|
||||
// Member Data:
|
||||
//
|
||||
// xSemiAxis semi-axis, x
|
||||
// ySemiAxis semi-axis, y
|
||||
// zSemiAxis semi-axis, z
|
||||
// zBottomCut lower cut plane level, z (solid lies above this plane)
|
||||
// zTopCut upper cut plane level, z (solid lies below this plane)
|
||||
// xSemiAxis semi-axis, X
|
||||
// ySemiAxis semi-axis, Y
|
||||
// zSemiAxis semi-axis, Z
|
||||
// zBottomCut lower cut in Z (solid lies above this plane)
|
||||
// zTopCut upper cut in Z (solid lies below this plane)
|
||||
|
||||
// 10.11.1999 G.Horton-Smith (Caltech, USA) - First implementation
|
||||
// 10.02.2005 G.Guerrieri (INFN Genova, Italy) - Revision
|
||||
// 15.12.2019 E.Tcherniaev - Complete revision
|
||||
// --------------------------------------------------------------------
|
||||
#ifndef G4ELLIPSOID_HH
|
||||
#define G4ELLIPSOID_HH
|
||||
@@ -61,32 +62,32 @@
|
||||
|
||||
class G4Ellipsoid : public G4VSolid
|
||||
{
|
||||
public: // with description
|
||||
public:
|
||||
|
||||
G4Ellipsoid(const G4String& pName,
|
||||
G4double pxSemiAxis,
|
||||
G4double pySemiAxis,
|
||||
G4double pzSemiAxis,
|
||||
G4double pzBottomCut = 0,
|
||||
G4double pzTopCut = 0);
|
||||
// Constructor
|
||||
G4Ellipsoid(const G4String& name,
|
||||
G4double xSemiAxis,
|
||||
G4double ySemiAxis,
|
||||
G4double zSemiAxis,
|
||||
G4double zBottomCut = 0.,
|
||||
G4double zTopCut = 0.);
|
||||
|
||||
// Destructor
|
||||
virtual ~G4Ellipsoid();
|
||||
|
||||
// Access functions
|
||||
|
||||
// Accessors
|
||||
inline G4double GetDx() const;
|
||||
inline G4double GetDy() const;
|
||||
inline G4double GetDz() const;
|
||||
inline G4double GetSemiAxisMax (G4int i) const;
|
||||
inline G4double GetZBottomCut() const;
|
||||
inline G4double GetZTopCut() const;
|
||||
|
||||
// Modifiers
|
||||
inline void SetSemiAxis (G4double x, G4double y, G4double z);
|
||||
inline void SetZCuts (G4double newzBottomCut, G4double newzTopCut);
|
||||
inline G4double GetCubicVolume();
|
||||
inline G4double GetSurfaceArea();
|
||||
|
||||
// Solid standard methods
|
||||
|
||||
// Standard methods
|
||||
void ComputeDimensions(G4VPVParameterisation* p,
|
||||
const G4int n,
|
||||
const G4VPhysicalVolume* pRep);
|
||||
@@ -96,6 +97,7 @@ class G4Ellipsoid : public G4VSolid
|
||||
const G4VoxelLimits& pVoxelLimit,
|
||||
const G4AffineTransform& pTransform,
|
||||
G4double& pmin, G4double& pmax) const;
|
||||
|
||||
EInside Inside(const G4ThreeVector& p) const;
|
||||
G4ThreeVector SurfaceNormal( const G4ThreeVector& p) const;
|
||||
G4double DistanceToIn(const G4ThreeVector& p,
|
||||
@@ -114,40 +116,69 @@ class G4Ellipsoid : public G4VSolid
|
||||
|
||||
std::ostream& StreamInfo(std::ostream& os) const;
|
||||
|
||||
G4double GetCubicVolume();
|
||||
G4double GetSurfaceArea();
|
||||
|
||||
G4ThreeVector GetPointOnSurface() const;
|
||||
|
||||
// Visualisation functions
|
||||
|
||||
G4Polyhedron* GetPolyhedron () const;
|
||||
// Visualisation methods
|
||||
void DescribeYourselfTo(G4VGraphicsScene& scene) const;
|
||||
G4VisExtent GetExtent() const;
|
||||
G4VisExtent GetExtent() const;
|
||||
G4Polyhedron* CreatePolyhedron() const;
|
||||
|
||||
public: // without description
|
||||
G4Polyhedron* GetPolyhedron () const;
|
||||
|
||||
public:
|
||||
|
||||
// Fake default constructor for usage restricted to direct object
|
||||
// persistency for clients requiring preallocation of memory for
|
||||
// persistifiable objects
|
||||
G4Ellipsoid(__void__&);
|
||||
// Fake default constructor for usage restricted to direct object
|
||||
// persistency for clients requiring preallocation of memory for
|
||||
// persistifiable objects.
|
||||
|
||||
// Copy constructorassignment operator
|
||||
G4Ellipsoid(const G4Ellipsoid& rhs);
|
||||
G4Ellipsoid& operator=(const G4Ellipsoid& rhs);
|
||||
// Copy constructor and assignment operator.
|
||||
|
||||
protected: // without description
|
||||
|
||||
mutable G4bool fRebuildPolyhedron = false;
|
||||
mutable G4Polyhedron* fpPolyhedron = nullptr;
|
||||
// Assignment
|
||||
G4Ellipsoid& operator=(const G4Ellipsoid& rhs);
|
||||
|
||||
private:
|
||||
|
||||
G4double kRadTolerance;
|
||||
G4double halfCarTolerance, halfRadTolerance;
|
||||
// Check parameters and set cached values
|
||||
void CheckParameters();
|
||||
|
||||
G4double fCubicVolume = 0.0;
|
||||
G4double fSurfaceArea = 0.0;
|
||||
G4double xSemiAxis, ySemiAxis, zSemiAxis,
|
||||
semiAxisMax, zBottomCut, zTopCut;
|
||||
// Return normal to surface closest to p
|
||||
G4ThreeVector ApproxSurfaceNormal(const G4ThreeVector& p) const;
|
||||
|
||||
// Calculate area of lateral surface
|
||||
G4double LateralSurfaceArea() const;
|
||||
|
||||
private:
|
||||
|
||||
// Ellipsoid parameters
|
||||
G4double fDx; // X semi-axis
|
||||
G4double fDy; // Y semi-axis
|
||||
G4double fDz; // Z semi-axis
|
||||
G4double fZBottomCut; // Bottom cut in Z
|
||||
G4double fZTopCut; // Top cut in Z
|
||||
|
||||
// Precalculated cached values
|
||||
G4double halfTolerance; // Surface tolerance
|
||||
G4double fXmax; // X extent
|
||||
G4double fYmax; // Y extent
|
||||
G4double fRsph; // Radius of bounding sphere
|
||||
G4double fR; // Radius of sphere after scaling
|
||||
G4double fSx; // X scale factor
|
||||
G4double fSy; // Y scale factor
|
||||
G4double fSz; // Z scale factor
|
||||
G4double fZMidCut; // Middle position between cuts after scaling
|
||||
G4double fZDimCut; // Half distance between cut after scaling
|
||||
G4double fQ1; // 1st coefficient in approximation of dist = Q1*(x^2+y^2+z^2) - Q2
|
||||
G4double fQ2; // 2nd coefficient in approximation of dist = Q1*(x^2+y^2+z^2) - Q2
|
||||
|
||||
G4double fCubicVolume = 0.0; // Volume
|
||||
G4double fSurfaceArea = 0.0; // Surface area
|
||||
mutable G4double fLateralArea = 0.0; // Lateral surface area
|
||||
mutable G4bool fRebuildPolyhedron = false;
|
||||
mutable G4Polyhedron* fpPolyhedron = nullptr;
|
||||
};
|
||||
|
||||
#include "G4Ellipsoid.icc"
|
||||
|
||||
@@ -31,94 +31,58 @@
|
||||
inline
|
||||
G4double G4Ellipsoid::GetDx() const
|
||||
{
|
||||
return xSemiAxis;
|
||||
return fDx;
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetDy() const
|
||||
{
|
||||
return ySemiAxis;
|
||||
return fDy;
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetDz() const
|
||||
{
|
||||
return zSemiAxis;
|
||||
return fDz;
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetSemiAxisMax (G4int i) const
|
||||
{
|
||||
return (i==0) ? xSemiAxis
|
||||
: (i==1) ? ySemiAxis
|
||||
: zSemiAxis;
|
||||
return (i==0) ? fDx : ((i==1) ? fDy : fDz);
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetZBottomCut() const
|
||||
{
|
||||
return zBottomCut;
|
||||
return fZBottomCut;
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetZTopCut() const
|
||||
{
|
||||
return zTopCut;
|
||||
return fZTopCut;
|
||||
}
|
||||
|
||||
inline
|
||||
void G4Ellipsoid::SetSemiAxis (G4double newxSemiAxis,
|
||||
G4double newySemiAxis,
|
||||
G4double newzSemiAxis)
|
||||
void G4Ellipsoid::SetSemiAxis(G4double newxSemiAxis,
|
||||
G4double newySemiAxis,
|
||||
G4double newzSemiAxis)
|
||||
{
|
||||
xSemiAxis= newxSemiAxis; ySemiAxis= newySemiAxis; zSemiAxis= newzSemiAxis;
|
||||
semiAxisMax = xSemiAxis > ySemiAxis ? xSemiAxis : ySemiAxis;
|
||||
if (zSemiAxis > semiAxisMax) { semiAxisMax= zSemiAxis; }
|
||||
if (zBottomCut < -zSemiAxis) { zBottomCut = -zSemiAxis; }
|
||||
if (zTopCut > +zSemiAxis) { zTopCut = +zSemiAxis; }
|
||||
fDx = newxSemiAxis;
|
||||
fDy = newySemiAxis;
|
||||
fDz = newzSemiAxis;
|
||||
|
||||
CheckParameters();
|
||||
fRebuildPolyhedron = true;
|
||||
}
|
||||
|
||||
inline
|
||||
void G4Ellipsoid::SetZCuts (G4double newzBottomCut, G4double newzTopCut)
|
||||
{
|
||||
if (newzBottomCut < -zSemiAxis)
|
||||
{ zBottomCut = -zSemiAxis; }
|
||||
else
|
||||
{ zBottomCut = newzBottomCut; }
|
||||
fZBottomCut = newzBottomCut;
|
||||
fZTopCut = newzTopCut;
|
||||
|
||||
if (newzTopCut > +zSemiAxis)
|
||||
{ zTopCut = +zSemiAxis; }
|
||||
else
|
||||
{ zTopCut = newzTopCut; }
|
||||
CheckParameters();
|
||||
fRebuildPolyhedron = true;
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetCubicVolume()
|
||||
{
|
||||
if(fCubicVolume != 0 ) {;}
|
||||
else
|
||||
{
|
||||
if ((zTopCut > +zSemiAxis && zBottomCut < -zSemiAxis)
|
||||
|| (zTopCut == 0 && zBottomCut == 0) )
|
||||
{
|
||||
fCubicVolume = (4./3.)*CLHEP::pi*xSemiAxis*ySemiAxis*zSemiAxis;
|
||||
}
|
||||
else
|
||||
{
|
||||
fCubicVolume = CLHEP::pi*xSemiAxis*ySemiAxis
|
||||
* ((zTopCut-std::pow(zTopCut,3.)/(3.*sqr(zSemiAxis)))
|
||||
- (zBottomCut-std::pow(zBottomCut,3.)/(3.*sqr(zSemiAxis))));
|
||||
}
|
||||
}
|
||||
return fCubicVolume;
|
||||
}
|
||||
|
||||
inline
|
||||
G4double G4Ellipsoid::GetSurfaceArea()
|
||||
{
|
||||
if(fSurfaceArea != 0.) {;}
|
||||
else { fSurfaceArea = G4VSolid::GetSurfaceArea(); }
|
||||
return fSurfaceArea;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
// A G4Tet is a tetrahedra solid.
|
||||
|
||||
// 03.09.2004 - M.H.Mendenhall & R.A.Weller (Vanderbilt University, USA)
|
||||
// 08.01.2020 - E.Tcherniaev, complete revision, speed up
|
||||
// --------------------------------------------------------------------
|
||||
#ifndef G4TET_HH
|
||||
#define G4TET_HH
|
||||
@@ -56,98 +57,116 @@ class G4Tet : public G4VSolid
|
||||
|
||||
public: // with description
|
||||
|
||||
// Constructor
|
||||
G4Tet(const G4String& pName,
|
||||
G4ThreeVector anchor,
|
||||
G4ThreeVector p2,
|
||||
G4ThreeVector p3,
|
||||
G4ThreeVector p4,
|
||||
const G4ThreeVector& anchor,
|
||||
const G4ThreeVector& p1,
|
||||
const G4ThreeVector& p2,
|
||||
const G4ThreeVector& p3,
|
||||
G4bool* degeneracyFlag = nullptr);
|
||||
|
||||
// Destructor
|
||||
virtual ~G4Tet();
|
||||
|
||||
void ComputeDimensions(G4VPVParameterisation* p,
|
||||
const G4int n,
|
||||
const G4VPhysicalVolume* pRep);
|
||||
// Modifier
|
||||
void SetVertices(const G4ThreeVector& anchor,
|
||||
const G4ThreeVector& p1,
|
||||
const G4ThreeVector& p2,
|
||||
const G4ThreeVector& p3);
|
||||
|
||||
// Accessors, return the four vertices of the shape
|
||||
void GetVertices(G4ThreeVector& anchor,
|
||||
G4ThreeVector& p1,
|
||||
G4ThreeVector& p2,
|
||||
G4ThreeVector& p3) const;
|
||||
std::vector<G4ThreeVector> GetVertices() const;
|
||||
|
||||
// Set warning flag - depricated (dummy)
|
||||
void PrintWarnings(G4bool) {};
|
||||
|
||||
// Return true if the tetrahedron is degenerate
|
||||
G4bool CheckDegeneracy(const G4ThreeVector& p0,
|
||||
const G4ThreeVector& p1,
|
||||
const G4ThreeVector& p2,
|
||||
const G4ThreeVector& p3) const;
|
||||
|
||||
// Standard methods
|
||||
void ComputeDimensions(G4VPVParameterisation* p,
|
||||
const G4int n,
|
||||
const G4VPhysicalVolume* pRep);
|
||||
|
||||
void BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const;
|
||||
|
||||
G4bool CalculateExtent(const EAxis pAxis,
|
||||
const G4VoxelLimits& pVoxelLimit,
|
||||
const G4AffineTransform& pTransform,
|
||||
G4double& pmin, G4double& pmax) const;
|
||||
// Methods for solid
|
||||
|
||||
EInside Inside(const G4ThreeVector& p) const;
|
||||
|
||||
G4ThreeVector SurfaceNormal( const G4ThreeVector& p) const;
|
||||
|
||||
G4double DistanceToIn(const G4ThreeVector& p, const G4ThreeVector& v) const;
|
||||
|
||||
G4double DistanceToIn(const G4ThreeVector& p,
|
||||
const G4ThreeVector& v) const;
|
||||
G4double DistanceToIn(const G4ThreeVector& p) const;
|
||||
|
||||
G4double DistanceToOut(const G4ThreeVector& p, const G4ThreeVector& v,
|
||||
G4double DistanceToOut(const G4ThreeVector& p,
|
||||
const G4ThreeVector& v,
|
||||
const G4bool calcNorm = false,
|
||||
G4bool* validNorm = nullptr,
|
||||
G4ThreeVector* n = nullptr) const;
|
||||
|
||||
G4double DistanceToOut(const G4ThreeVector& p) const;
|
||||
|
||||
G4double GetCubicVolume();
|
||||
G4double GetSurfaceArea();
|
||||
|
||||
G4GeometryType GetEntityType() const;
|
||||
|
||||
G4VSolid* Clone() const;
|
||||
|
||||
std::ostream& StreamInfo(std::ostream& os) const;
|
||||
|
||||
G4double GetCubicVolume();
|
||||
G4double GetSurfaceArea();
|
||||
|
||||
G4ThreeVector GetPointOnSurface() const;
|
||||
|
||||
// Functions for visualization
|
||||
|
||||
void DescribeYourselfTo (G4VGraphicsScene& scene) const;
|
||||
G4VisExtent GetExtent () const;
|
||||
G4Polyhedron* CreatePolyhedron () const;
|
||||
G4Polyhedron* GetPolyhedron () const;
|
||||
// Methods for visualization
|
||||
void DescribeYourselfTo (G4VGraphicsScene& scene) const;
|
||||
G4VisExtent GetExtent () const;
|
||||
G4Polyhedron* CreatePolyhedron () const;
|
||||
G4Polyhedron* GetPolyhedron () const;
|
||||
|
||||
public: // without description
|
||||
|
||||
// Fake default constructor for usage restricted to direct object
|
||||
// persistency for clients requiring preallocation of memory for
|
||||
// persistifiable objects
|
||||
G4Tet(__void__&);
|
||||
// Fake default constructor for usage restricted to direct object
|
||||
// persistency for clients requiring preallocation of memory for
|
||||
// persistifiable objects.
|
||||
|
||||
// Copy constructor
|
||||
G4Tet(const G4Tet& rhs);
|
||||
G4Tet& operator=(const G4Tet& rhs);
|
||||
// Copy constructor and assignment operator.
|
||||
|
||||
void PrintWarnings(G4bool flag) { warningFlag=flag; }
|
||||
static G4bool CheckDegeneracy(G4ThreeVector anchor,
|
||||
G4ThreeVector p2,
|
||||
G4ThreeVector p3,
|
||||
G4ThreeVector p4);
|
||||
std::vector<G4ThreeVector> GetVertices() const;
|
||||
// Return the four vertices of the shape.
|
||||
// Assignment operator
|
||||
G4Tet& operator=(const G4Tet& rhs);
|
||||
|
||||
private:
|
||||
|
||||
G4double fCubicVolume = 0.0, fSurfaceArea = 0.0;
|
||||
// Set data members
|
||||
void Initialize(const G4ThreeVector& p0,
|
||||
const G4ThreeVector& p1,
|
||||
const G4ThreeVector& p2,
|
||||
const G4ThreeVector& p3);
|
||||
|
||||
// Return normal to surface closest to p
|
||||
G4ThreeVector ApproxSurfaceNormal(const G4ThreeVector& p) const;
|
||||
|
||||
private:
|
||||
|
||||
G4double halfTolerance = 0;
|
||||
G4double fCubicVolume = 0; // Volume
|
||||
G4double fSurfaceArea = 0; // Surface area
|
||||
mutable G4bool fRebuildPolyhedron = false;
|
||||
mutable G4Polyhedron* fpPolyhedron = nullptr;
|
||||
|
||||
G4ThreeVector GetPointOnFace(G4ThreeVector p1, G4ThreeVector p2,
|
||||
G4ThreeVector p3, G4double& area) const;
|
||||
private:
|
||||
|
||||
G4ThreeVector fAnchor, fP2, fP3, fP4, fMiddle;
|
||||
G4ThreeVector fNormal123, fNormal142, fNormal134, fNormal234;
|
||||
|
||||
G4bool warningFlag = false;
|
||||
|
||||
G4double fCdotN123, fCdotN142, fCdotN134, fCdotN234;
|
||||
G4double fXMin, fXMax, fYMin, fYMax, fZMin, fZMax;
|
||||
G4double fDx, fDy, fDz, fTol, fMaxSize;
|
||||
G4ThreeVector fVertex[4]; // thetrahedron vertices
|
||||
G4ThreeVector fNormal[4]; // normals to faces
|
||||
G4double fDist[4] = {0}; // distances from origin to faces
|
||||
G4double fArea[4] = {0}; // face areas
|
||||
G4ThreeVector fBmin, fBmax; // bounding box
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -59,6 +59,12 @@ class G4UTet : public G4UAdapter<vecgeom::UnplacedTet>
|
||||
|
||||
~G4UTet();
|
||||
|
||||
void ComputeDimensions( G4VPVParameterisation* p,
|
||||
const G4int n,
|
||||
const G4VPhysicalVolume* pRep);
|
||||
|
||||
G4VSolid* Clone() const;
|
||||
|
||||
inline G4GeometryType GetEntityType() const;
|
||||
|
||||
public: // without description
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "globals.hh"
|
||||
#include "windefs.hh"
|
||||
#include "G4ThreeVector.hh"
|
||||
#include "G4VSolid.hh"
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -134,6 +134,26 @@ G4UTet& G4UTet::operator = (const G4UTet& rhs)
|
||||
return *this;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dispatch to parameterisation for replication mechanism dimension
|
||||
// computation & modification.
|
||||
//
|
||||
void G4UTet::ComputeDimensions(G4VPVParameterisation*,
|
||||
const G4int,
|
||||
const G4VPhysicalVolume*)
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Make a clone of the object
|
||||
//
|
||||
G4VSolid* G4UTet::Clone() const
|
||||
{
|
||||
return new G4UTet(*this);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Accessors
|
||||
|
||||
@@ -16,6 +16,18 @@ commit in the repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
December 03, 2019 Gabriele Cosmo (global-V10-05-27)
|
||||
- Updated tag IDs for release 10.6.p01.
|
||||
|
||||
January 30, 2020 Gabriele Cosmo
|
||||
- Fixed symbol exporting problem in G4coutDestination on Windows; define
|
||||
'masterG4coutDestination' static pointer as a normal pointer.
|
||||
Addressing problem report #2217.
|
||||
|
||||
January 14, 2020 Gabriele Cosmo
|
||||
- Added windefs.hh header, including protections for double definition
|
||||
of global symbols from Windows Kits code.
|
||||
|
||||
December 03, 2019 Gabriele Cosmo (global-V10-05-26)
|
||||
- Updated tag IDs for release 10.6.
|
||||
|
||||
|
||||
@@ -40,11 +40,11 @@
|
||||
// |--> patch number
|
||||
|
||||
#ifndef G4VERSION_NUMBER
|
||||
#define G4VERSION_NUMBER 1060
|
||||
#define G4VERSION_NUMBER 1061
|
||||
#endif
|
||||
|
||||
#ifndef G4VERSION_TAG
|
||||
#define G4VERSION_TAG "$Name: geant4-10-06 $"
|
||||
#define G4VERSION_TAG "$Name: geant4-10-06-patch-01 $"
|
||||
#endif
|
||||
|
||||
// as variables
|
||||
@@ -53,10 +53,10 @@
|
||||
#include "G4String.hh"
|
||||
|
||||
#ifdef G4MULTITHREADED
|
||||
static const G4String G4Version = "$Name: geant4-10-06 [MT]$";
|
||||
static const G4String G4Version = "$Name: geant4-10-06-patch-01 [MT]$";
|
||||
#else
|
||||
static const G4String G4Version = "$Name: geant4-10-06 $";
|
||||
static const G4String G4Version = "$Name: geant4-10-06-patch-01 $";
|
||||
#endif
|
||||
static const G4String G4Date = "(6-December-2019)";
|
||||
static const G4String G4Date = "(14-February-2020)";
|
||||
|
||||
#endif
|
||||
|
||||
@@ -91,7 +91,7 @@ class G4coutDestination
|
||||
// derived class should set this pointer.
|
||||
// Needed for some G4UIsession like GUIs
|
||||
//
|
||||
static G4coutDestination* masterG4coutDestination;
|
||||
G4coutDestination* masterG4coutDestination = nullptr;
|
||||
|
||||
std::vector<Transformer> transformersCout;
|
||||
std::vector<Transformer> transformersCerr;
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * License and Disclaimer *
|
||||
// * *
|
||||
// * The Geant4 software is copyright of the Copyright Holders of *
|
||||
// * the Geant4 Collaboration. It is provided under the terms and *
|
||||
// * conditions of the Geant4 Software License, included in the file *
|
||||
// * LICENSE and available at http://cern.ch/geant4/license . These *
|
||||
// * include a list of copyright holders. *
|
||||
// * *
|
||||
// * Neither the authors of this software system, nor their employing *
|
||||
// * institutes,nor the agencies providing financial support for this *
|
||||
// * work make any representation or warranty, express or implied, *
|
||||
// * regarding this software system or assume any liability for its *
|
||||
// * use. Please see the license in the file LICENSE and URL above *
|
||||
// * for the full disclaimer and the limitation of liability. *
|
||||
// * *
|
||||
// * This code implementation is the result of the scientific and *
|
||||
// * technical work of the GEANT4 collaboration. *
|
||||
// * By using, copying, modifying or distributing the software (or *
|
||||
// * any work based on the software) you agree to acknowledge its *
|
||||
// * use in resulting scientific publications, and indicate your *
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// GEANT 4 class header file
|
||||
//
|
||||
// Class Description:
|
||||
//
|
||||
// This file includes protections from Windows declarations in the
|
||||
// global scope that may cause trouble in compilation.
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
#ifndef windefs_hh
|
||||
#define windefs_hh
|
||||
|
||||
#if defined(_WIN32)
|
||||
#if defined (ABSOLUTE)
|
||||
#undef ABSOLUTE
|
||||
#undef RELATIVE
|
||||
#endif
|
||||
#endif // _WIN32
|
||||
|
||||
#endif // windefs_hh
|
||||
@@ -49,6 +49,7 @@ GEANT4_DEFINE_MODULE(NAME G4globman
|
||||
globals.hh
|
||||
templates.hh
|
||||
tls.hh
|
||||
windefs.hh
|
||||
G4Allocator.hh
|
||||
G4AutoDelete.hh
|
||||
G4ios.hh
|
||||
|
||||
@@ -33,8 +33,6 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
G4coutDestination* G4coutDestination::masterG4coutDestination = 0;
|
||||
|
||||
G4coutDestination::~G4coutDestination()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -16,6 +16,9 @@ committal in the CVS repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
16 Jan 2020 Gabriele Cosmo (interfaces-V10-05-08)
|
||||
- Fixed obsolete URLs in UIQt splash screen.
|
||||
|
||||
30 Nov 2019 Igor Semeniouk (interfaces-V10-05-07)
|
||||
-- G4UIQt.cc:
|
||||
o fix ui command not stored in callback for icon defined via /gui/addIcon command.
|
||||
|
||||
@@ -1622,7 +1622,7 @@ void G4UIQt::CreateViewerWidget(){
|
||||
SetStartPage(std::string("<table width='100%'><tr><td width='30%'></td><td><div ")+
|
||||
"style='color: rgb(140, 31, 31); font-size: xx-large; font-family: Garamond, serif; padding-bottom: 0px; font-weight: normal'>Geant4: "+
|
||||
QApplication::applicationName ().toStdString()+
|
||||
"</div></td><td width='40%'> <br/><i>http://geant4.web.cern.ch/geant4/</i></td></tr></table>"+
|
||||
"</div></td><td width='40%'> <br/><i>http://cern.ch/geant4/</i></td></tr></table>"+
|
||||
"<p> </p>"+
|
||||
"<div style='background:#EEEEEE;'><b>Tooltips :</b><ul>"+
|
||||
"<li><b>Start a new viewer :</b><br />"+
|
||||
@@ -1633,15 +1633,13 @@ void G4UIQt::CreateViewerWidget(){
|
||||
"</ul></div>"+
|
||||
|
||||
"<div style='background:#EEEEEE;'><b>Documentation :</b><ul>"+
|
||||
"<li><b>Visualization tutorial :</b><br />"+
|
||||
"<i><a href='http://geant4.in2p3.fr/spip.php?article60&lang=en'>Geant4 Qt User Interface tutorial </a>: http://geant4.in2p3.fr/spip.php?article60&lang=en</i></li>"+
|
||||
"<li><b>Visualisation publication :</b><br />"+
|
||||
"<i><a href='http://www.worldscientific.com/doi/abs/10.1142/S1793962313400011'>The Geant4 Visualization System - A Multi-Driver Graphics System</b><br />, Allison, J. et al., International Journal of Modeling, Simulation, and Scientific Computing, Vol. 4, Suppl. 1 (2013) 1340001</a>:<br/> http://www.worldscientific.com/doi/abs/10.1142/S1793962313400011</i></li>"+
|
||||
"</ul></div>"+
|
||||
|
||||
"<div style='background:#EEEEEE;'><b>Getting Help :</b><ul>"+
|
||||
"<li><b>If problems arise, try <a href='http://geant4-hn.slac.stanford.edu:5090/Geant4-HyperNews/index'>browsing the user forum</a> to see whether or not your problem has already been encountered.<br /> If it hasn't, you can post it and Geant4 developers will do their best to find a solution. This is also a good place to<br /> discuss Geant4 topics in general.</b> http://geant4-hn.slac.stanford.edu:5090/Geant4-HyperNews/index"+
|
||||
"<li><b>Get a look at <a href='http://geant4.kek.jp/geant4/support/index.shtml'>Geant4 User support pages</a>: <i>http://geant4.kek.jp/geant4/support/index.shtml</i></b></li>"+
|
||||
"<li><b>If problems arise, try <a href='https://cern.ch/geant4-forum'>browsing the user forum</a> to see whether or not your problem has already been encountered.<br /> If it hasn't, you can post it and Geant4 developers will do their best to find a solution. This is also a good place to<br /> discuss Geant4 topics in general.</b> https://cern.ch/geant4-forum"+
|
||||
"<li><b>Get a look at <a href='http://cern.ch/geant4/support'>Geant4 User support pages</a>: <i>http://cern.ch/geant4/support</i></b></li>"+
|
||||
"</ul></div>"
|
||||
);
|
||||
|
||||
|
||||
@@ -16,6 +16,10 @@ committal in the CVS repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
- 06 February 2020 Makoto Asai (particles-V10-05-11)
|
||||
Fix broken if-block in G4DecayTableMessenger.cc.
|
||||
Addressing to Bug report #2193.
|
||||
|
||||
- 05 November 2019 Vladimir Ivanchenko (particles-V10-05-10)
|
||||
G4NucleiProperties - in some hadronic models a fragment may be
|
||||
produced consisting of only neutrons or only protons;
|
||||
|
||||
@@ -167,17 +167,18 @@ G4ParticleDefinition* G4DecayTableMessenger::SetCurrentParticle()
|
||||
currentParticle = theParticleTable->FindParticle(particleName);
|
||||
idxCurrentChannel = -1;
|
||||
currentDecayTable = nullptr;
|
||||
if (currentParticle != nullptr ){
|
||||
currentDecayTable = currentParticle->GetDecayTable();
|
||||
if ((currentDecayTable != nullptr ) && (idxCurrentChannel >0) ) {
|
||||
currentChannel = currentDecayTable->GetDecayChannel(idxCurrentChannel);
|
||||
} else {
|
||||
idxCurrentChannel = -1;
|
||||
currentChannel = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (currentParticle != nullptr ){
|
||||
currentDecayTable = currentParticle->GetDecayTable();
|
||||
if ((currentDecayTable != nullptr ) && (idxCurrentChannel >0) ) {
|
||||
currentChannel = currentDecayTable->GetDecayChannel(idxCurrentChannel);
|
||||
} else {
|
||||
idxCurrentChannel = -1;
|
||||
currentChannel = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
return currentParticle;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib
|
||||
GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib
|
||||
GLOBLIBS += libG4materials.lib libG4graphics_reps.lib
|
||||
GLOBLIBS += libG4intercoms.lib libG4global.lib
|
||||
GLOBLIBS += libG4expat.lib
|
||||
ifdef G4LIB_BUILD_EXPAT
|
||||
GLOBLIBS += libG4expat.lib
|
||||
endif
|
||||
|
||||
include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
|
||||
@@ -12,14 +12,10 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
ifdef G4LIB_BUILD_EXPAT
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
|
||||
CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/global/HEPRandom/include \
|
||||
-I$(G4BASE)/global/HEPNumerics/include \
|
||||
@@ -66,7 +62,7 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/util/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/binary_cascade/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/cascade/cascade/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/qmd/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/qmd/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/coherent_elastic/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/de_excitation/evaporation/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/de_excitation/fermi_breakup/include \
|
||||
|
||||
@@ -13,6 +13,10 @@ introduced in the code and keeptrack of all tags.
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
21 December 2019, V.Ivanchenko (phys-ctor-em-V10-05-18)
|
||||
- G4EmModelActivator - fixed configuration of the default EM multiple
|
||||
scattering on top of any other physics configuration (problem #2106)
|
||||
|
||||
19 October 2019, W.G.Shin, S.Incerti (phys-ctor-em-V10-05-17)
|
||||
- added new ELSEPA elastic model for Geant4-DNA in G4EmDNAPhysics_option2
|
||||
|
||||
|
||||
@@ -185,9 +185,15 @@ void G4EmModelActivator::ActivateEmOptions()
|
||||
|
||||
if("G4EmStandard" == typesPhys[i]) {
|
||||
G4UrbanMscModel* msc = new G4UrbanMscModel();
|
||||
msc->SetRangeFactor(0.04);
|
||||
msc->SetSkin(1);
|
||||
msc->SetStepLimitType(fUseSafety);
|
||||
AddStandardScattering(elec, em_config, msc, reg, mscEnergyLimit, highEnergy);
|
||||
|
||||
msc = new G4UrbanMscModel();
|
||||
msc->SetRangeFactor(0.04);
|
||||
msc->SetSkin(1);
|
||||
msc->SetStepLimitType(fUseSafety);
|
||||
AddStandardScattering(posi, em_config, msc, reg, mscEnergyLimit, highEnergy);
|
||||
|
||||
} else if("G4EmStandard_opt1" == typesPhys[i] ||
|
||||
|
||||
@@ -13,6 +13,10 @@ introduced in the code and keeptrack of all tags.
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
13 January 2020, Dennis Wright (phys-ctor-glnuclear-V10-05-04)
|
||||
- Remove double delete in destructor of G4LENDBertiniGammaElectroNuclearBuilder
|
||||
(Coverity errors 101609 and 101727).
|
||||
|
||||
29 November 2019, A.Ribon (phys-ctor-glnuclear-V10-05-03)
|
||||
- Update of the only README file.
|
||||
|
||||
|
||||
+4
@@ -56,10 +56,14 @@ G4BertiniElectroNuclearBuilder( eNucl )
|
||||
|
||||
G4LENDBertiniGammaElectroNuclearBuilder::~G4LENDBertiniGammaElectroNuclearBuilder()
|
||||
{
|
||||
/*
|
||||
DHW 13 Jan 2020 - fix double deletion error; these deletes are already done in the base class dtor
|
||||
(Coverity bugs 101609 and 101727)
|
||||
if ( wasActivated ) {
|
||||
delete theFragmentation;
|
||||
delete theStringDecay;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void G4LENDBertiniGammaElectroNuclearBuilder::Build()
|
||||
|
||||
@@ -13,9 +13,6 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
ifdef G4LIB_BUILD_EXPAT
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
@@ -37,10 +34,10 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/particles/hadrons/barions/include \
|
||||
-I$(G4BASE)/particles/hadrons/ions/include \
|
||||
-I$(G4BASE)/run/include \
|
||||
-I$(G4BASE)/physics_lists/builders/include \
|
||||
-I$(G4BASE)/physics_lists/util/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/factory/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/hadron_inelastic/include \
|
||||
-I$(G4BASE)/physics_lists/builders/include \
|
||||
-I$(G4BASE)/physics_lists/util/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/factory/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/hadron_inelastic/include \
|
||||
-I$(G4BASE)/processes/management/include \
|
||||
-I$(G4BASE)/processes/transportation/include \
|
||||
-I$(G4BASE)/processes/cuts/include \
|
||||
|
||||
@@ -13,14 +13,10 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
ifdef G4LIB_BUILD_EXPAT
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
|
||||
CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/global/HEPRandom/include \
|
||||
-I$(G4BASE)/global/HEPNumerics/include \
|
||||
@@ -39,9 +35,9 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/particles/hadrons/barions/include \
|
||||
-I$(G4BASE)/particles/hadrons/ions/include \
|
||||
-I$(G4BASE)/run/include \
|
||||
-I$(G4BASE)/physics_lists/builders/include \
|
||||
-I$(G4BASE)/physics_lists/util/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/factory/include \
|
||||
-I$(G4BASE)/physics_lists/builders/include \
|
||||
-I$(G4BASE)/physics_lists/util/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/factory/include \
|
||||
-I$(G4BASE)/processes/management/include \
|
||||
-I$(G4BASE)/processes/transportation/include \
|
||||
-I$(G4BASE)/processes/decay/include \
|
||||
@@ -55,7 +51,7 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/util/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/binary_cascade/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/cascade/cascade/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/qmd/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/qmd/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/coherent_elastic/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/de_excitation/evaporation/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/de_excitation/fermi_breakup/include \
|
||||
|
||||
@@ -13,11 +13,6 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
|
||||
CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/global/HEPRandom/include \
|
||||
-I$(G4BASE)/global/HEPNumerics/include \
|
||||
@@ -37,14 +32,14 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/particles/hadrons/barions/include \
|
||||
-I$(G4BASE)/particles/hadrons/ions/include \
|
||||
-I$(G4BASE)/run/include \
|
||||
-I$(G4BASE)/physics_lists/builders/include \
|
||||
-I$(G4BASE)/physics_lists/util/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/factory/include \
|
||||
-I$(G4BASE)/physics_lists/builders/include \
|
||||
-I$(G4BASE)/physics_lists/util/include \
|
||||
-I$(G4BASE)/physics_lists/constructors/factory/include \
|
||||
-I$(G4BASE)/processes/management/include \
|
||||
-I$(G4BASE)/processes/scoring/include \
|
||||
-I$(G4BASE)/processes/transportation/include \
|
||||
-I$(G4BASE)/processes/decay/include \
|
||||
-I$(G4BASE)/processes/electromagnetic/utils/include \
|
||||
-I$(G4BASE)/processes/electromagnetic/utils/include \
|
||||
-I$(G4BASE)/processes/cuts/include \
|
||||
-I$(G4BASE)/processes/biasing/generic/include \
|
||||
-I$(G4BASE)/processes/biasing/importance/include \
|
||||
@@ -58,7 +53,7 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/util/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/binary_cascade/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/cascade/cascade/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/qmd/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/qmd/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/coherent_elastic/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/de_excitation/evaporation/include \
|
||||
-I$(G4BASE)/processes/hadronic/models/de_excitation/fermi_breakup/include \
|
||||
|
||||
@@ -12,10 +12,6 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/global/HEPRandom/include \
|
||||
-I$(G4BASE)/global/HEPGeometry/include \
|
||||
|
||||
@@ -13,6 +13,11 @@ introduced in the code and keeptrack of all tags.
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
15-January-2020 Alberto Ribon (phys-lists-V10-05-05)
|
||||
- LBE : updated cross sections to avoid crashes caused by the removal of
|
||||
default Gheisha cross sections, and to have consistency between elastic
|
||||
and inelastic cross sections.
|
||||
|
||||
22-October-2019 Alberto Ribon (phys-lists-V10-05-04)
|
||||
- FTFP_BERT_HP, QGSP_BERT_HP, INCLXXPhysicsListHelper : added (consistently)
|
||||
RadioactiveDecay to all physics lists which use NeutronHP (the rationale
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
// 16-08-10 Remove inclusion of obsolete class of G4ParticleWithCuts
|
||||
// 20-10-10 Migrate LowEnergy process to Livermore models, LP
|
||||
// 28-03-13 Replace LEP/HEP with FTFP+BERT (A.R.)
|
||||
// 15-01-20 Updated cross sections (A.R.)
|
||||
// --------------------------------------------------------------
|
||||
|
||||
#include <iomanip>
|
||||
@@ -534,6 +535,10 @@ LBE::~LBE()
|
||||
#include "G4ChipsProtonElasticXS.hh"
|
||||
#include "G4ChipsNeutronElasticXS.hh"
|
||||
#include "G4ComponentAntiNuclNuclearXS.hh"
|
||||
#include "G4ChipsKaonMinusElasticXS.hh"
|
||||
#include "G4ChipsKaonPlusElasticXS.hh"
|
||||
#include "G4ChipsKaonZeroElasticXS.hh"
|
||||
#include "G4BGGNucleonElasticXS.hh"
|
||||
#include "G4CrossSectionElastic.hh"
|
||||
|
||||
// Inelastic processes:
|
||||
@@ -561,8 +566,7 @@ LBE::~LBE()
|
||||
#include "G4ExcitedStringDecay.hh"
|
||||
#include "G4CascadeInterface.hh"
|
||||
#include "G4CrossSectionInelastic.hh"
|
||||
#include "G4PiNuclearCrossSection.hh"
|
||||
#include "G4CrossSectionPairGG.hh"
|
||||
#include "G4BGGPionInelasticXS.hh"
|
||||
#include "G4ChipsKaonMinusInelasticXS.hh"
|
||||
#include "G4ChipsKaonPlusInelasticXS.hh"
|
||||
#include "G4ChipsKaonZeroInelasticXS.hh"
|
||||
@@ -592,16 +596,16 @@ LBE::~LBE()
|
||||
void LBE::ConstructHad()
|
||||
{
|
||||
// Elastic scattering
|
||||
const G4double elastic_elimitPi = 1.0*CLHEP::GeV;
|
||||
|
||||
G4HadronElastic* elastic_lhep0 = new G4HadronElastic();
|
||||
G4HadronElastic* elastic_lhep1 = new G4HadronElastic();
|
||||
elastic_lhep1->SetMaxEnergy( elastic_elimitPi );
|
||||
|
||||
G4ChipsElasticModel* elastic_chip = new G4ChipsElasticModel();
|
||||
|
||||
G4ElasticHadrNucleusHE* elastic_he = new G4ElasticHadrNucleusHE();
|
||||
elastic_he->SetMinEnergy( elastic_elimitPi );
|
||||
|
||||
const G4double elastic_elimitAntiNuc = 100.0*CLHEP::MeV;
|
||||
G4AntiNuclElastic* elastic_anuc = new G4AntiNuclElastic();
|
||||
elastic_anuc->SetMinEnergy( elastic_elimitAntiNuc );
|
||||
G4CrossSectionElastic* elastic_anucxs = new G4CrossSectionElastic( elastic_anuc->GetComponentCrossSection() );
|
||||
G4HadronElastic* elastic_lhep2 = new G4HadronElastic();
|
||||
elastic_lhep2->SetMaxEnergy( elastic_elimitAntiNuc );
|
||||
|
||||
// Inelastic scattering
|
||||
const G4double theFTFMin0 = 0.0*CLHEP::GeV;
|
||||
@@ -647,8 +651,6 @@ LBE::~LBE()
|
||||
theIonBC->SetMinEnergy( theIonBCMin );
|
||||
theIonBC->SetMaxEnergy( theIonBCMax );
|
||||
|
||||
G4VCrossSectionDataSet * thePiData = new G4CrossSectionPairGG(
|
||||
(G4PiNuclearCrossSection*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4PiNuclearCrossSection::Default_Name()), 91*CLHEP::GeV );
|
||||
G4VCrossSectionDataSet * theAntiNucleonData = new G4CrossSectionInelastic( new G4ComponentAntiNuclNuclearXS );
|
||||
G4ComponentGGNuclNuclXsc * ggNuclNuclXsec = new G4ComponentGGNuclNuclXsc();
|
||||
G4VCrossSectionDataSet * theGGNuclNuclData = new G4CrossSectionInelastic(ggNuclNuclXsec);
|
||||
@@ -666,12 +668,11 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) );
|
||||
theElasticProcess->RegisterMe( elastic_lhep1 );
|
||||
theElasticProcess->RegisterMe( elastic_he );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4PionPlusInelasticProcess* theInelasticProcess = new G4PionPlusInelasticProcess("inelastic");
|
||||
theInelasticProcess->AddDataSet( thePiData );
|
||||
theInelasticProcess->AddDataSet( new G4BGGPionInelasticXS( G4PionPlus::Definition() ) );
|
||||
theInelasticProcess->RegisterMe( theFTFModel1 );
|
||||
theInelasticProcess->RegisterMe( theBERTModel0 );
|
||||
pmanager->AddDiscreteProcess( theInelasticProcess );
|
||||
@@ -682,12 +683,11 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) );
|
||||
theElasticProcess->RegisterMe( elastic_lhep1 );
|
||||
theElasticProcess->RegisterMe( elastic_he );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4PionMinusInelasticProcess* theInelasticProcess = new G4PionMinusInelasticProcess("inelastic");
|
||||
theInelasticProcess->AddDataSet( thePiData );
|
||||
theInelasticProcess->AddDataSet( new G4BGGPionInelasticXS( G4PionMinus::Definition() ) );
|
||||
theInelasticProcess->RegisterMe( theFTFModel1 );
|
||||
theInelasticProcess->RegisterMe( theBERTModel0 );
|
||||
pmanager->AddDiscreteProcess( theInelasticProcess );
|
||||
@@ -698,6 +698,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonPlusElasticXS::Default_Name()));
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4KaonPlusInelasticProcess* theInelasticProcess = new G4KaonPlusInelasticProcess("inelastic");
|
||||
@@ -712,6 +713,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroElasticXS::Default_Name()));
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4KaonZeroSInelasticProcess* theInelasticProcess = new G4KaonZeroSInelasticProcess("inelastic");
|
||||
@@ -726,6 +728,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroElasticXS::Default_Name()));
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4KaonZeroLInelasticProcess* theInelasticProcess = new G4KaonZeroLInelasticProcess("inelastic");
|
||||
@@ -740,6 +743,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonMinusElasticXS::Default_Name()));
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4KaonMinusInelasticProcess* theInelasticProcess = new G4KaonMinusInelasticProcess("inelastic");
|
||||
@@ -754,6 +758,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsProtonElasticXS::Default_Name()));
|
||||
theElasticProcess->AddDataSet( new G4BGGNucleonElasticXS( G4Proton::Proton() ) );
|
||||
theElasticProcess->RegisterMe( elastic_chip );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
@@ -767,12 +772,6 @@ LBE::~LBE()
|
||||
else if (particleName == "anti_proton")
|
||||
{
|
||||
// Elastic scattering
|
||||
const G4double elastic_elimitAntiNuc = 100.0*CLHEP::MeV;
|
||||
G4AntiNuclElastic* elastic_anuc = new G4AntiNuclElastic();
|
||||
elastic_anuc->SetMinEnergy( elastic_elimitAntiNuc );
|
||||
G4CrossSectionElastic* elastic_anucxs = new G4CrossSectionElastic( elastic_anuc->GetComponentCrossSection() );
|
||||
G4HadronElastic* elastic_lhep2 = new G4HadronElastic();
|
||||
elastic_lhep2->SetMaxEnergy( elastic_elimitAntiNuc );
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->AddDataSet( elastic_anucxs );
|
||||
theElasticProcess->RegisterMe( elastic_lhep2 );
|
||||
@@ -826,7 +825,9 @@ LBE::~LBE()
|
||||
{
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( elastic_anucxs );
|
||||
theElasticProcess->RegisterMe( elastic_lhep2 );
|
||||
theElasticProcess->RegisterMe( elastic_anuc );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4AntiNeutronInelasticProcess* theInelasticProcess = new G4AntiNeutronInelasticProcess("inelastic");
|
||||
@@ -840,6 +841,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( theGGNuclNuclData );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4DeuteronInelasticProcess* theInelasticProcess = new G4DeuteronInelasticProcess("inelastic");
|
||||
@@ -854,6 +856,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( theGGNuclNuclData );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4TritonInelasticProcess* theInelasticProcess = new G4TritonInelasticProcess("inelastic");
|
||||
@@ -868,6 +871,7 @@ LBE::~LBE()
|
||||
// Elastic scattering
|
||||
G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
|
||||
theElasticProcess->RegisterMe( elastic_lhep0 );
|
||||
theElasticProcess->AddDataSet( theGGNuclNuclData );
|
||||
pmanager->AddDiscreteProcess( theElasticProcess );
|
||||
// Inelastic scattering
|
||||
G4AlphaInelasticProcess* theInelasticProcess = new G4AlphaInelasticProcess("inelastic");
|
||||
|
||||
@@ -12,10 +12,6 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
CPPFLAGS += -I$(G4BASE)/global/management/include \
|
||||
-I$(G4BASE)/global/HEPRandom/include \
|
||||
-I$(G4BASE)/global/HEPGeometry/include \
|
||||
|
||||
@@ -16,12 +16,16 @@ committal in the CVS repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
13 January 20: V.Ivanchenko (emmuons-V10-05-02)
|
||||
- G4MuPairProductionModel - added Store/Retrieve data methods
|
||||
by request of CMS
|
||||
|
||||
14 August 19: V.Ivanchenko (emmuons-V10-05-01)
|
||||
- G4TablesForExtrapolator - created G4LossTableBuilder and
|
||||
destruct end of run
|
||||
|
||||
07 February 19: V.Ivanchenko (emmuons-V10-05-00)
|
||||
- G4MuMultipleSacttering - reduced length of printout (fix problem #2105)
|
||||
- G4MuMultipleScattering - reduced length of printout (fix problem #2105)
|
||||
|
||||
17 September 18: D.Sawkey (emmuons-V10-04-05)
|
||||
- G4MuMultipleScattering, G4MuPairProduction, G4eePairProduction,
|
||||
|
||||
@@ -110,6 +110,11 @@ public:
|
||||
|
||||
inline void SetParticle(const G4ParticleDefinition*);
|
||||
|
||||
// hide assignment operator and copy constructor
|
||||
G4MuPairProductionModel & operator=
|
||||
(const G4MuPairProductionModel &right) = delete;
|
||||
G4MuPairProductionModel(const G4MuPairProductionModel&) = delete;
|
||||
|
||||
protected:
|
||||
|
||||
G4double ComputMuPairLoss(G4double Z, G4double tkin, G4double cut,
|
||||
@@ -130,15 +135,15 @@ private:
|
||||
|
||||
void MakeSamplingTables();
|
||||
|
||||
void DataCorrupted(G4int Z, G4double logTkin);
|
||||
void StoreTables() const;
|
||||
|
||||
G4bool RetrieveTables();
|
||||
|
||||
void DataCorrupted(G4int Z, G4double logTkin) const;
|
||||
|
||||
inline G4double FindScaledEnergy(G4int Z, G4double rand, G4double logTkin,
|
||||
G4double yymin, G4double yymax);
|
||||
|
||||
// hide assignment operator
|
||||
G4MuPairProductionModel & operator=(const G4MuPairProductionModel &right) = delete;
|
||||
G4MuPairProductionModel(const G4MuPairProductionModel&) = delete;
|
||||
|
||||
protected:
|
||||
|
||||
const G4ParticleDefinition* particle;
|
||||
@@ -171,6 +176,8 @@ protected:
|
||||
G4double dy;
|
||||
G4double emin;
|
||||
G4double emax;
|
||||
|
||||
G4bool fTableToFile;
|
||||
};
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
#include "G4MuPairProductionModel.hh"
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4EmParameters.hh"
|
||||
#include "G4Electron.hh"
|
||||
#include "G4Positron.hh"
|
||||
#include "G4MuonMinus.hh"
|
||||
@@ -84,6 +85,8 @@
|
||||
#include "G4ParticleChangeForGamma.hh"
|
||||
#include "G4Log.hh"
|
||||
#include "G4Exp.hh"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -118,7 +121,8 @@ G4MuPairProductionModel::G4MuPairProductionModel(const G4ParticleDefinition* p,
|
||||
nbiny(1000),
|
||||
nbine(0),
|
||||
ymin(-5.),
|
||||
dy(0.005)
|
||||
dy(0.005),
|
||||
fTableToFile(false)
|
||||
{
|
||||
nist = G4NistManager::Instance();
|
||||
|
||||
@@ -173,10 +177,12 @@ void G4MuPairProductionModel::Initialise(const G4ParticleDefinition* p,
|
||||
}
|
||||
|
||||
if(IsMaster() && p == particle) {
|
||||
|
||||
if(!fElementData) {
|
||||
fElementData = new G4ElementData();
|
||||
MakeSamplingTables();
|
||||
G4bool dataFile = G4EmParameters::Instance()->RetrieveMuDataFromFile();
|
||||
if(dataFile) { dataFile = RetrieveTables(); }
|
||||
if(!dataFile) { MakeSamplingTables(); }
|
||||
if(fTableToFile) { StoreTables(); }
|
||||
}
|
||||
InitialiseElementSelectors(p, cuts);
|
||||
}
|
||||
@@ -244,10 +250,8 @@ G4double G4MuPairProductionModel::ComputMuPairLoss(G4double Z,
|
||||
G4double hhh = (bbb-aaa)/(G4double)kkk;
|
||||
G4double x = aaa;
|
||||
|
||||
for (G4int l=0 ; l<kkk; l++)
|
||||
{
|
||||
|
||||
for (G4int ll=0; ll<8; ll++)
|
||||
for (G4int l=0 ; l<kkk; ++l) {
|
||||
for (G4int ll=0; ll<8; ++ll)
|
||||
{
|
||||
G4double ep = G4Exp(x+xgi[ll]*hhh);
|
||||
loss += wgi[ll]*ep*ep*ComputeDMicroscopicCrossSection(tkin, Z, ep);
|
||||
@@ -645,7 +649,7 @@ void G4MuPairProductionModel::SampleSecondaries(
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4MuPairProductionModel::DataCorrupted(G4int Z, G4double logTkin)
|
||||
void G4MuPairProductionModel::DataCorrupted(G4int Z, G4double logTkin) const
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4ElementData is not properly initialized Z= " << Z
|
||||
@@ -658,4 +662,49 @@ void G4MuPairProductionModel::DataCorrupted(G4int Z, G4double logTkin)
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4MuPairProductionModel::StoreTables() const
|
||||
{
|
||||
for (G4int iz=0; iz<nzdat; ++iz) {
|
||||
G4int Z = zdat[iz];
|
||||
G4Physics2DVector* pv = fElementData->GetElement2DData(Z);
|
||||
if(!pv) { DataCorrupted(Z, 1.0); }
|
||||
std::ostringstream ss;
|
||||
ss << "mupair/" << particle->GetParticleName() << Z << ".dat";
|
||||
std::ofstream outfile(ss.str());
|
||||
pv->Store(outfile);
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4bool G4MuPairProductionModel::RetrieveTables()
|
||||
{
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
G4String dir("");
|
||||
if (path) {
|
||||
std::ostringstream ost;
|
||||
ost << path << "/mupair/";
|
||||
dir = ost.str();
|
||||
} else {
|
||||
dir = "./mupair/";
|
||||
}
|
||||
|
||||
for (G4int iz=0; iz<nzdat; ++iz) {
|
||||
G4double Z = zdat[iz];
|
||||
G4Physics2DVector* pv = new G4Physics2DVector(nbiny+1,nbine+1);
|
||||
if(!pv) {
|
||||
DataCorrupted(Z, 2.0);
|
||||
return false;
|
||||
}
|
||||
std::ostringstream ss;
|
||||
ss << dir << particle->GetParticleName() << Z << ".dat";
|
||||
std::ifstream infile(ss.str(), std::ios::in);
|
||||
if(!pv->Retrieve(infile)) { return false; }
|
||||
fElementData->InitialiseForElement(Z, pv);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,10 @@ committal in the CVS repository !
|
||||
|
||||
----------------------------------------------------------
|
||||
|
||||
07 December 19: V.Ivanchenko (emstand-V10-05-27)
|
||||
- G4BetheHeitler5DModel - added protection against negative
|
||||
argument of sqrt() due to precision lost
|
||||
|
||||
06 November 19: V.Ivanchenko (emstand-V10-05-26)
|
||||
- G4ESTARStopping, G4GSMottCorrection, G4GSPWACorrections,
|
||||
G4GoudsmitSaundersonTable, G4SBBremTable, G4SeltzerBergerModel
|
||||
|
||||
@@ -481,12 +481,12 @@ G4BetheHeitler5DModel::SampleSecondaries(std::vector<G4DynamicParticle*>* fvect,
|
||||
const G4double LeptonEnergy2 = PairInvMass*0.5;
|
||||
|
||||
// New way of calucaltion thePRecoil to avoid underflow
|
||||
const G4double ap1 = 2.0*GammaEnergy*RecoilMass -
|
||||
PairInvMass*PairInvMass + 2.0*PairInvMass*RecoilMass;
|
||||
const G4double bp1 = 2.0*GammaEnergy*RecoilMass -
|
||||
PairInvMass*PairInvMass - 2.0*PairInvMass*RecoilMass;
|
||||
G4double abp = std::max((2.0*GammaEnergy*RecoilMass -
|
||||
PairInvMass*PairInvMass + 2.0*PairInvMass*RecoilMass)*
|
||||
(2.0*GammaEnergy*RecoilMass -
|
||||
PairInvMass*PairInvMass - 2.0*PairInvMass*RecoilMass),0.0);
|
||||
|
||||
const G4double thePRecoil = std::sqrt(ap1 * bp1) * isqrts2;
|
||||
G4double thePRecoil = std::sqrt(abp) * isqrts2;
|
||||
|
||||
// back to the center-of-mass frame
|
||||
Recoil.set( thePRecoil*sinTheta*cosPhi,
|
||||
|
||||
@@ -16,12 +16,16 @@ committal in the CVS repository !
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
13 January 19: V.Ivanchenko (emutils-V10-05-23)
|
||||
- G4EmParameters, G4EmParametersMessenger - added new parameter
|
||||
to enable read of e+e- production table from file (CMS request)
|
||||
|
||||
16 October 19: D.Sawkey (emutils-V10-05-22)
|
||||
- G4EmBiasingManager - delete non-tracked particles
|
||||
|
||||
11 October 19: W.G.Shin, S.Incerti (emutils-V10-05-21)
|
||||
- G4DNAModelSubType.hh : added Kreipl and Meesungnoen amorphous
|
||||
ice models
|
||||
- G4DNAModelSubType.hh : added Kreipl and Meesungnoen amorphous
|
||||
ice models
|
||||
- G4EmLowEParametersMessenger.* : added corresponding commands
|
||||
|
||||
10 October 19: V.Ivanchenko (emutils-V10-05-20)
|
||||
|
||||
@@ -168,12 +168,15 @@ public:
|
||||
void SetEnablePolarisation(G4bool val);
|
||||
G4bool EnablePolarisation() const;
|
||||
|
||||
G4bool GetDirectionalSplitting();
|
||||
G4bool GetDirectionalSplitting() const;
|
||||
void SetDirectionalSplitting(G4bool v);
|
||||
|
||||
G4bool QuantumEntanglement();
|
||||
G4bool QuantumEntanglement() const;
|
||||
void SetQuantumEntanglement(G4bool v);
|
||||
|
||||
G4bool RetrieveMuDataFromFile() const;
|
||||
void SetRetrieveMuDataFromFile(G4bool v);
|
||||
|
||||
// 5d
|
||||
void SetOnIsolated(G4bool val);
|
||||
G4bool OnIsolated() const;
|
||||
@@ -378,6 +381,7 @@ private:
|
||||
G4bool gener;
|
||||
G4bool fSamplingTable;
|
||||
G4bool fPolarisation;
|
||||
G4bool fMuDataFromFile;
|
||||
G4bool onIsolated; // 5d model conversion on free ions
|
||||
G4bool fDNA;
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ private:
|
||||
G4UIcmdWithABool* onIsolatedCmd;
|
||||
G4UIcmdWithABool* sampleTCmd;
|
||||
G4UIcmdWithABool* icru90Cmd;
|
||||
G4UIcmdWithABool* mudatCmd;
|
||||
|
||||
G4UIcmdWithADouble* minSubSecCmd;
|
||||
G4UIcmdWithADoubleAndUnit* minEnCmd;
|
||||
|
||||
@@ -136,6 +136,7 @@ void G4EmParameters::Initialise()
|
||||
onIsolated = false;
|
||||
fSamplingTable = false;
|
||||
fPolarisation = false;
|
||||
fMuDataFromFile = false;
|
||||
fDNA = false;
|
||||
|
||||
minSubRange = 1.0;
|
||||
@@ -414,6 +415,7 @@ G4bool G4EmParameters::BirksActive() const
|
||||
|
||||
void G4EmParameters::SetUseICRU90Data(G4bool val)
|
||||
{
|
||||
if(IsLocked()) { return; }
|
||||
fICRU90 = val;
|
||||
}
|
||||
|
||||
@@ -481,6 +483,16 @@ void G4EmParameters::SetEmSaturation(G4EmSaturation* ptr)
|
||||
}
|
||||
}
|
||||
|
||||
G4bool G4EmParameters::RetrieveMuDataFromFile() const
|
||||
{
|
||||
return fMuDataFromFile;
|
||||
}
|
||||
|
||||
void G4EmParameters::SetRetrieveMuDataFromFile(G4bool v)
|
||||
{
|
||||
fMuDataFromFile = v;
|
||||
}
|
||||
|
||||
void G4EmParameters::SetOnIsolated(G4bool val)
|
||||
{
|
||||
if(IsLocked()) { return; }
|
||||
@@ -1156,7 +1168,7 @@ void G4EmParameters::DefineRegParamForEM(G4VEmProcess* ptr) const
|
||||
fBParameters->DefineRegParamForEM(ptr);
|
||||
}
|
||||
|
||||
G4bool G4EmParameters::QuantumEntanglement()
|
||||
G4bool G4EmParameters::QuantumEntanglement() const
|
||||
{
|
||||
return fBParameters->QuantumEntanglement();
|
||||
}
|
||||
@@ -1167,7 +1179,7 @@ void G4EmParameters::SetQuantumEntanglement(G4bool v)
|
||||
fBParameters->SetQuantumEntanglement(v);
|
||||
}
|
||||
|
||||
G4bool G4EmParameters::GetDirectionalSplitting() {
|
||||
G4bool G4EmParameters::GetDirectionalSplitting() const {
|
||||
return fBParameters->GetDirectionalSplitting();
|
||||
}
|
||||
|
||||
@@ -1266,7 +1278,8 @@ void G4EmParameters::StreamInfo(std::ostream& os) const
|
||||
<<G4BestUnit(maxKinEnergyCSDA,"Energy") << "\n";
|
||||
os << "Max kinetic energy for NIEL computation "
|
||||
<<G4BestUnit(maxNIELEnergy,"Energy") << "\n";
|
||||
os << "Linear loss limit " <<linLossLimit << "\n";
|
||||
os << "Linear loss limit " <<linLossLimit << "\n";
|
||||
os << "Read data from file for e+e- pair production by mu " <<fMuDataFromFile << "\n";
|
||||
|
||||
os << "=======================================================================" << "\n";
|
||||
os << "====== Multiple Scattering Parameters ========" << "\n";
|
||||
|
||||
@@ -174,6 +174,12 @@ G4EmParametersMessenger::G4EmParametersMessenger(G4EmParameters* ptr)
|
||||
icru90Cmd->SetDefaultValue(false);
|
||||
icru90Cmd->AvailableForStates(G4State_PreInit);
|
||||
|
||||
mudatCmd = new G4UIcmdWithABool("/process/em/MuDataFromFile",this);
|
||||
mudatCmd->SetGuidance("Enable usage of muon data from file");
|
||||
mudatCmd->SetParameterName("mudat",true);
|
||||
mudatCmd->SetDefaultValue(false);
|
||||
mudatCmd->AvailableForStates(G4State_PreInit);
|
||||
|
||||
minSubSecCmd = new G4UIcmdWithADouble("/process/eLoss/minsubsec",this);
|
||||
minSubSecCmd->SetGuidance("Set the ratio subcut/cut ");
|
||||
minSubSecCmd->SetParameterName("rcmin",true);
|
||||
@@ -408,6 +414,7 @@ G4EmParametersMessenger::~G4EmParametersMessenger()
|
||||
delete onIsolatedCmd;
|
||||
delete sampleTCmd;
|
||||
delete icru90Cmd;
|
||||
delete mudatCmd;
|
||||
|
||||
delete minSubSecCmd;
|
||||
delete minEnCmd;
|
||||
@@ -496,6 +503,8 @@ void G4EmParametersMessenger::SetNewValue(G4UIcommand* command,
|
||||
theParameters->SetGeneralProcessActive(sharkCmd->GetNewBoolValue(newValue));
|
||||
} else if (command == sampleTCmd) {
|
||||
theParameters->SetEnableSamplingTable(sampleTCmd->GetNewBoolValue(newValue));
|
||||
} else if (command == mudatCmd) {
|
||||
theParameters->SetRetrieveMuDataFromFile(mudatCmd->GetNewBoolValue(newValue));
|
||||
|
||||
} else if (command == minSubSecCmd) {
|
||||
theParameters->SetMinSubRange(minSubSecCmd->GetNewDoubleValue(newValue));
|
||||
|
||||
@@ -14,6 +14,9 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
30 January 2020 - Vladimir Ivanchenko (hadr-cross-V10-05-32)
|
||||
- G4HadronInelasticDataSet - fixed problem #2220 - wrong GHEISHA x-section
|
||||
|
||||
19 November 2019 - G. Folger (hadr-cross-V10-05-31)
|
||||
- remove using namespace std and using namespace CLHEP from header file G4NeutronElectronElXsc.hh
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ G4HadronInelasticDataSet::GetElementCrossSection(
|
||||
fKinEnergy = ekin;
|
||||
fParticle = pd;
|
||||
G4int A = G4lrint(fNIST->GetAtomicMassAmu(Z));
|
||||
fInelasticXS = fGheishaXS->GetElasticCrossSection(aParticle, Z, A);
|
||||
fInelasticXS = fGheishaXS->GetInelasticCrossSection(aParticle, Z, A);
|
||||
}
|
||||
return fInelasticXS;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,11 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
7 January 2020 V. Ivanchenko (hadr-man-V10-05-10)
|
||||
---------------------------------------------------
|
||||
- G4HadronicProcess : for charge check assume, that all final electrons
|
||||
come from internal conversion
|
||||
|
||||
11 November 2019 A. Ribon (hadr-man-V10-05-07)
|
||||
---------------------------------------------------
|
||||
- G4HadronicProcess : in the method CheckResult, a short-lived secondary
|
||||
|
||||
@@ -270,7 +270,7 @@ G4HadronicProcess::PostStepDoIt(const G4Track& aTrack, const G4Step&)
|
||||
|
||||
G4HadFinalState* result = nullptr;
|
||||
G4int reentryCount = 0;
|
||||
/*
|
||||
/*
|
||||
G4cout << "### " << aParticle->GetDefinition()->GetParticleName()
|
||||
<< " Ekin(MeV)= " << aParticle->GetKineticEnergy()
|
||||
<< " Z= " << targetNucleus.GetZ_asInt()
|
||||
@@ -356,7 +356,7 @@ G4HadronicProcess::PostStepDoIt(const G4Track& aTrack, const G4Step&)
|
||||
if (epReportLevel != 0) {
|
||||
CheckEnergyMomentumConservation(aTrack, targetNucleus);
|
||||
}
|
||||
//G4cout << "PostStepDoIt done " << G4endl;
|
||||
//G4cout << "PostStepDoIt done nICelectrons= " << nICelectrons << G4endl;
|
||||
return theTotalResult;
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ G4HadronicProcess::FillResult(G4HadFinalState * aR, const G4Track & aT)
|
||||
//G4cout << "FillResult: Efinal= " << efinal << " status= "
|
||||
// << theTotalResult->GetTrackStatus()
|
||||
// << " fKill= " << fStopAndKill << G4endl;
|
||||
|
||||
|
||||
// check secondaries
|
||||
nICelectrons = 0;
|
||||
if(idxIC == -1) {
|
||||
@@ -458,7 +458,8 @@ G4HadronicProcess::FillResult(G4HadFinalState * aR, const G4Track & aT)
|
||||
dynParticle->SetMass(mass);
|
||||
}
|
||||
G4int idxModel = aR->GetSecondary(i)->GetCreatorModelType();
|
||||
if(idxIC == idxModel) { ++nICelectrons; }
|
||||
//if(idxIC == idxModel) { ++nICelectrons; }
|
||||
if(part->GetPDGEncoding() == 11) { ++nICelectrons; }
|
||||
|
||||
// time of interaction starts from zero + global time
|
||||
G4double time = std::max(aR->GetSecondary(i)->GetTime(), 0.0) + time0;
|
||||
@@ -482,6 +483,7 @@ G4HadronicProcess::FillResult(G4HadFinalState * aR, const G4Track & aT)
|
||||
}
|
||||
}
|
||||
aR->Clear();
|
||||
// G4cout << "FillResults done nICe= " << nICelectrons << G4endl;
|
||||
}
|
||||
|
||||
void G4HadronicProcess::MultiplyCrossSectionBy(G4double factor)
|
||||
|
||||
@@ -14,6 +14,26 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
06 February 2019 Vladimir Ivanchenko (hadr-casc-V10-05-03)
|
||||
-----------------------------------------------------------
|
||||
13 January 2020 Dennis Wright
|
||||
----------------------------------------------------
|
||||
- G4CascadeInterface.cc: fix memory leak by deleting ltcollider in class
|
||||
dtor
|
||||
|
||||
10 January 2020 Michael Kelsey
|
||||
-----------------------------------------------------
|
||||
- G4CascadeParamMessenger.cc: Ensure that Bertini-specific commands get
|
||||
added to /process/had/cascade/ directory, instead of /process/had.
|
||||
Requires resetting cmdDir=0 between CreateDirectory() calls.
|
||||
|
||||
16 December 2019 Vladimir Ivanchenko
|
||||
-----------------------------------------------------------
|
||||
- G4CascadeCheckBalance: fixed outstanding problem of the interface
|
||||
with native pre-compound model, which happens since in the
|
||||
default de-excitation internal electron conversion become
|
||||
enabled
|
||||
|
||||
7 November 2019 Dennis Wright (hadr-casc-V10-05-02)
|
||||
-----------------------------------------------------
|
||||
- G4LightTargetCollider: fix crash when gamma energy below deuteron
|
||||
|
||||
@@ -118,6 +118,21 @@ void G4CascadeCheckBalance::collide(G4InuclParticle* bullet,
|
||||
if (pbullet) initialStrange += pbullet->getStrangeness();
|
||||
if (ptarget) initialStrange += ptarget->getStrangeness();
|
||||
|
||||
G4int nelec = 0;
|
||||
G4double elMass = 0.;
|
||||
std::vector<G4InuclElementaryParticle>& outParts =
|
||||
output.getOutgoingParticles();
|
||||
for (G4int i = 0; i < output.numberOfOutgoingParticles(); i++) {
|
||||
if (outParts[i].getDefinition() == G4Electron::Electron() ) {
|
||||
elMass += outParts[i].getDefinition()->GetPDGMass();
|
||||
++nelec;
|
||||
}
|
||||
}
|
||||
if(nelec > 0) {
|
||||
initial += G4LorentzVector(0.,0.,0.,elMass/GeV);
|
||||
initialCharge -= nelec;
|
||||
}
|
||||
|
||||
// Final state totals are computed for us
|
||||
final = output.getTotalOutputMomentum();
|
||||
finalBaryon = output.getTotalBaryonNumber();
|
||||
@@ -155,13 +170,20 @@ void G4CascadeCheckBalance::collide(const G4Fragment& fragment,
|
||||
|
||||
// Remove electron masses when internal conversion occurs
|
||||
G4double elMass = 0.;
|
||||
std::vector<G4InuclElementaryParticle> outParts = output.getOutgoingParticles();
|
||||
std::vector<G4InuclElementaryParticle>& outParts =
|
||||
output.getOutgoingParticles();
|
||||
G4int nelec = 0;
|
||||
for (G4int i = 0; i < output.numberOfOutgoingParticles(); i++) {
|
||||
if (outParts[i].getDefinition() == G4Electron::Electron() )
|
||||
elMass += outParts[i].getDefinition()->GetPDGMass();
|
||||
if (outParts[i].getDefinition() == G4Electron::Electron() ) {
|
||||
elMass += outParts[i].getDefinition()->GetPDGMass();
|
||||
++nelec;
|
||||
}
|
||||
}
|
||||
if(nelec > 0) {
|
||||
initial += G4LorentzVector(0.,0.,0.,elMass/GeV);
|
||||
initialCharge -= nelec;
|
||||
}
|
||||
|
||||
final.setE(final.e() - elMass/GeV);
|
||||
finalBaryon = output.getTotalBaryonNumber();
|
||||
finalCharge = output.getTotalCharge();
|
||||
finalStrange = output.getTotalStrangeness();
|
||||
|
||||
@@ -167,6 +167,7 @@ G4CascadeInterface::G4CascadeInterface(const G4String& name)
|
||||
G4CascadeInterface::~G4CascadeInterface() {
|
||||
clear();
|
||||
delete collider; collider=0;
|
||||
delete ltcollider; ltcollider = 0;
|
||||
delete balance; balance=0;
|
||||
delete output; output=0;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
// 20130703 M. Kelsey -- Add flag for USE_PHASESPACE
|
||||
// 20141030 M. Kelsey -- Add flag to enable direct pi-N absorption
|
||||
// 20141211 M. Kelsey -- Change PIN_ABSORPTION flag to double, for energy cut
|
||||
// 20200110 M. Kelsey -- Reset cmdDir to 0 before .../cascade/ directory.
|
||||
|
||||
#include "G4CascadeParamMessenger.hh"
|
||||
#include "G4CascadeParameters.hh"
|
||||
@@ -50,7 +51,7 @@
|
||||
G4CascadeParamMessenger::G4CascadeParamMessenger(G4CascadeParameters* params)
|
||||
: G4UImessenger(), theParams(params), cmdDir(0), localCmdDir(false) {
|
||||
// NOTE: Put under same top-level tree as EM
|
||||
CreateDirectory("/process/had/","Hadronic processes");
|
||||
CreateDirectory("/process/had/","Hadronic processes"); cmdDir=0;
|
||||
CreateDirectory("/process/had/cascade/","Bertini-esque cascade parameters");
|
||||
|
||||
verboseCmd = CreateCommand<G4UIcmdWithAnInteger>("verbose",
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
|
||||
#include "G4CollisionOutput.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4CascadParticle.hh"
|
||||
#include "G4CascadeParameters.hh"
|
||||
#include "G4Electron.hh"
|
||||
@@ -254,15 +255,8 @@ G4int G4CollisionOutput::getTotalCharge() const {
|
||||
G4int charge = 0;
|
||||
G4int i(0);
|
||||
|
||||
if (G4CascadeParameters::usePreCompound() ) {
|
||||
// Possible to have internal conversion electron
|
||||
for (i = 0; i < numberOfOutgoingParticles(); i++)
|
||||
if (outgoingParticles[i].getDefinition() != G4Electron::Electron() )
|
||||
charge += G4int(outgoingParticles[i].getCharge());
|
||||
} else {
|
||||
for (i = 0; i < numberOfOutgoingParticles(); i++)
|
||||
charge += G4int(outgoingParticles[i].getCharge());
|
||||
}
|
||||
for (i = 0; i < numberOfOutgoingParticles(); i++)
|
||||
charge += G4int(outgoingParticles[i].getCharge());
|
||||
|
||||
for (i = 0; i < numberOfOutgoingNuclei(); i++)
|
||||
charge += G4int(outgoingNuclei[i].getCharge());
|
||||
@@ -426,6 +420,12 @@ void G4CollisionOutput::setOnShell(G4InuclParticle* bullet,
|
||||
G4cout << " target momentum = " << momt.e()<<", "<< momt.x()<<", "<< momt.y()<<", "<< momt.z()<<G4endl;
|
||||
G4cout << " Fstate momentum = " << out_mom.e()<<", "<< out_mom.x()<<", "<< out_mom.y()<<", "<< out_mom.z()<<G4endl;
|
||||
}
|
||||
// correction for internal conversion
|
||||
G4LorentzVector el4mom(0.,0.,0.,electron_mass_c2/GeV);
|
||||
for(G4int i=0; i < numberOfOutgoingParticles(); ++i) {
|
||||
if (outgoingParticles[i].getDefinition() == G4Electron::Electron())
|
||||
momt += el4mom;
|
||||
}
|
||||
|
||||
ini_mom += momt;
|
||||
|
||||
|
||||
@@ -14,6 +14,17 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
18 January 2019 - V.Ivanchenko (hadr-cohe-V10-05-12)
|
||||
---------------------------------------------------------------
|
||||
- G4ElasticHadrNucleusHE - for pi- and Z>1 reuse data structure
|
||||
computed for pi+ in order to reduce memory and CPU at
|
||||
initialisation; fixed false positive Coverity report
|
||||
|
||||
17 December 2019 - V.Ivanchenko (hadr-cohe-V10-05-11)
|
||||
---------------------------------------------------------------
|
||||
- G4ElasticHadrNucleusHE - switch to parameterized model by
|
||||
cut on kinetic energy and not momentum
|
||||
|
||||
26 November 2019 - V.Ivanchenko (hadr-cohe-V10-05-10)
|
||||
---------------------------------------------------------------
|
||||
- G4HadronElastic : Added limit on number of warning printouts
|
||||
|
||||
@@ -149,7 +149,7 @@ private:
|
||||
static const G4int fHadronType1[NHADRONS];
|
||||
|
||||
// momemtum limits
|
||||
G4double plabLowLimit;
|
||||
G4double ekinLowLimit;
|
||||
G4double dQ2;
|
||||
|
||||
// projectile kinematics in GeV
|
||||
|
||||
@@ -248,7 +248,7 @@ G4ElasticHadrNucleusHE::G4ElasticHadrNucleusHE(const G4String& name)
|
||||
iHadrCode = iHadron = iHadron1 = 0;
|
||||
|
||||
verboseLevel = 0;
|
||||
plabLowLimit = 400.0*CLHEP::MeV;
|
||||
ekinLowLimit = 400.0*CLHEP::MeV;
|
||||
|
||||
BoundaryP[0]=9.0; BoundaryTG[0]=5.0;BoundaryTL[0]=0.;
|
||||
BoundaryP[1]=20.0;BoundaryTG[1]=1.5;BoundaryTL[1]=0.;
|
||||
@@ -314,8 +314,14 @@ G4ElasticHadrNucleusHE::~G4ElasticHadrNucleusHE()
|
||||
if(isMaster) {
|
||||
for(G4int j = 0; j < NHADRONS; ++j) {
|
||||
for(G4int k = 0; k < ZMAX; ++k) {
|
||||
delete fElasticData[j][k];
|
||||
fElasticData[j][k]=nullptr;
|
||||
G4ElasticData* ptr = fElasticData[j][k];
|
||||
if(ptr) {
|
||||
delete ptr;
|
||||
fElasticData[j][k] = nullptr;
|
||||
for(G4int l = j+1; l < NHADRONS; ++l) {
|
||||
if(ptr == fElasticData[l][k]) { fElasticData[l][k] = nullptr; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -344,7 +350,13 @@ void G4ElasticHadrNucleusHE::InitialiseModel()
|
||||
size_t numOfElem = mat->GetNumberOfElements();
|
||||
for(size_t k=0; k<numOfElem; ++k) {
|
||||
G4int Z = std::min((*elmVec)[k]->GetZasInt(), ZMAX-1);
|
||||
if(!fElasticData[i][Z]) { FillData(p, i, Z); }
|
||||
if(!fElasticData[i][Z]) {
|
||||
if(1 == i && Z > 1) {
|
||||
fElasticData[1][Z] = fElasticData[0][Z];
|
||||
} else {
|
||||
FillData(p, i, Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -357,7 +369,9 @@ G4ElasticHadrNucleusHE::SampleInvariantT(const G4ParticleDefinition* p,
|
||||
G4double inLabMom,
|
||||
G4int iZ, G4int A)
|
||||
{
|
||||
if(inLabMom <= plabLowLimit) {
|
||||
G4double mass = p->GetPDGMass();
|
||||
G4double kine = sqrt(inLabMom*inLabMom + mass*mass) - mass;
|
||||
if(kine <= ekinLowLimit) {
|
||||
return G4HadronElastic::SampleInvariantT(p,inLabMom,iZ,A);
|
||||
}
|
||||
G4int Z = std::min(iZ,ZMAX-1);
|
||||
@@ -365,7 +379,7 @@ G4ElasticHadrNucleusHE::SampleInvariantT(const G4ParticleDefinition* p,
|
||||
iHadrCode = p->GetPDGEncoding();
|
||||
|
||||
// below computations in GeV/c
|
||||
hMass = p->GetPDGMass()*invGeV;
|
||||
hMass = mass*invGeV;
|
||||
hMass2 = hMass*hMass;
|
||||
G4double plab = inLabMom*invGeV;
|
||||
G4double tmax = pLocalTmax*invGeV2;
|
||||
@@ -641,8 +655,9 @@ G4int G4ElasticHadrNucleusHE::FillFq2(G4int A)
|
||||
<<dQ2<<" Tot= "<<totSum << " dTot " <<curSum
|
||||
<<" curSec= " <<curSec<<G4endl;
|
||||
}
|
||||
if(totSum*1.e-4 > curSum || Q2l >= Q2max || ii == ONQ2-2) { break; }
|
||||
if(totSum*1.e-4 > curSum || Q2l >= Q2max) { break; }
|
||||
}
|
||||
ii = std::min(ii, ONQ2-2);
|
||||
curQ2 = Q2l;
|
||||
G4double xx = R1*(Q2max - curQ2);
|
||||
if(xx > 0.0) {
|
||||
|
||||
@@ -13,9 +13,6 @@ include $(G4INSTALL)/config/architecture.gmk
|
||||
CPPFLAGS += -DG4PROCESSES_EXPORT
|
||||
CPPFLAGS += -DG4HADRONIC_ALLOC_EXPORT
|
||||
|
||||
ifeq ($(G4SYSTEM), WIN32-VC)
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
ifdef G4LIB_BUILD_EXPAT
|
||||
CPPFLAGS += -I$(G4BASE)/externals/expat/include
|
||||
endif
|
||||
|
||||
@@ -14,6 +14,12 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
5 February 2020 Alberto Ribon (hadr-lend-V10-05-02)
|
||||
---------------------------------------------------
|
||||
- MCGIDI_energy : (applied patch from Tech-X made by Ben Morgan on
|
||||
6 January 2020 on the master) remove inclusion of amp_math on Windows
|
||||
as it is not required.
|
||||
|
||||
29 May 2019 Dennis Wright (hadr-lend-V10-05-01)
|
||||
-------------------------------------------------
|
||||
- G4LENDCapture::ApplyYourself : fix Coverity memory leak of products_from_PE
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
#include <cmath>
|
||||
|
||||
#ifdef WIN32
|
||||
//#include "erf.h"
|
||||
#include "amp_math.h"
|
||||
#define M_PI 3.141592653589793238463
|
||||
#endif
|
||||
|
||||
|
||||
@@ -14,6 +14,11 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
07-Dec-2019 V. Ivanchenko (hadr-string-diff-V10-05-11)
|
||||
- G4FTFParameters:
|
||||
o Fixed division by zero (Coverity report) due to wrong protection
|
||||
in previous MR 05-09
|
||||
|
||||
28-Nov-2019 A. Ribon (hadr-string-diff-V10-05-10)
|
||||
- G4FTFParameters: set parameters of a string kink in the constructor
|
||||
(instead of setting it at each interaction, causing memory leaks).
|
||||
|
||||
@@ -377,7 +377,7 @@ void G4FTFParameters::InitForInteraction( const G4ParticleDefinition* particle,
|
||||
// Gaussian parametrization of elastic scattering amplitude assumed
|
||||
SetAvaragePt2ofElasticScattering( 1.0/( Xtotal*Xtotal/16.0/pi/Xelastic/0.3894 )*GeV*GeV );
|
||||
} else {
|
||||
SetSlope(0.0);
|
||||
SetSlope(1.0);
|
||||
SetAvaragePt2ofElasticScattering( 0.0);
|
||||
}
|
||||
SetGamma0( GetSlope()*Xtotal/10.0/2.0/pi );
|
||||
|
||||
@@ -14,6 +14,35 @@ track of all tags.
|
||||
* Reverse chronological order (last date on top), please *
|
||||
----------------------------------------------------------
|
||||
|
||||
12 February 2020 Alberto Ribon radioactive_decay-V10-05-11
|
||||
----------------------------------------------------------
|
||||
- G4RadioactiveDecayBase.cc , G4RadioactiveDecay.cc : forgotten change of
|
||||
verbosity from 0 to 1, at lines: 309, 316, 331 and 932 for
|
||||
G4RadioactiveDecayBase.cc , and 340, 396, 403, 418 and 1676 for
|
||||
G4RadioactiveDecay.cc .
|
||||
|
||||
5 February 2020 Alberto Ribon radioactive_decay-V10-05-10
|
||||
----------------------------------------------------------
|
||||
(Including a set of fixes made by Dennis Wright on the master on the period
|
||||
between 15 December 2019 and 22 January 2020)
|
||||
- G4BetaPlusDecay.cc, line 166: change sign of daughterZ argument in
|
||||
G4BetaDecayCorrections according to bug report 2199.
|
||||
- G4RadioactiveDecay.cc, G4RadioactiveDecayBase.cc : change default verbosity
|
||||
from 0 to 1, and remove G4cerr wherever it occurs and replace it with
|
||||
G4Exception or G4cout.
|
||||
- Fix Coverity errors 102466 and 102470, "dereference before null test"
|
||||
of ptr theDecayChannel in G4RadioactiveDecay.cc and G4RadioactiveDecayBase.cc,
|
||||
respectively.
|
||||
- Fix Coverity error 98937, uninitialized boolean, in G4SFDecay by removing
|
||||
boolean applyARM, which was unused.
|
||||
- G4Radioactivation::AddDeexcitationSpectrumForBiasMode : fix memory leak
|
||||
by deleting pevap_products. Addresses bug report #2164.
|
||||
- Increased verbosity thresholds in G4RadioactiveDecay, G4RadioactiveDecayBase,
|
||||
G4Radioctivation in order to reduce printout size.
|
||||
- G4RadioactiveDecayBase.cc , G4RadioactiveDecay.cc : forgotten change of
|
||||
verbosity from 0 to 1, at line 977 and 1720 respectively.
|
||||
(Only this fix has been made by A.R.).
|
||||
|
||||
1 November 2019 Laurent Desorgher radioactive_decay-V10-05-09
|
||||
----------------------------------------------------------
|
||||
-Add passing of type of sub-models to secondary particles generated in
|
||||
|
||||
@@ -38,7 +38,7 @@ G4BetaDecayCorrections::G4BetaDecayCorrections(const G4int theZ, const G4int the
|
||||
// Nuclear radius in units of hbar/m_e/c
|
||||
Rnuc = 0.5*fine_structure_const*std::pow(A, 0.33333);
|
||||
|
||||
// Electron screening potential in units of electrom mass
|
||||
// Electron screening potential in units of electron mass
|
||||
V0 = 1.13*fine_structure_const*fine_structure_const
|
||||
*std::pow(std::abs(Z), 1.33333);
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ G4BetaPlusDecay::SetUpBetaSpectrumSampler(const G4int& daughterZ,
|
||||
const G4BetaDecayType& betaType)
|
||||
{
|
||||
G4double e0 = endpointEnergy/CLHEP::electron_mass_c2;
|
||||
G4BetaDecayCorrections corrections(daughterZ, daughterA);
|
||||
G4BetaDecayCorrections corrections(-daughterZ, daughterA);
|
||||
spectrumSampler = 0;
|
||||
|
||||
// Check for cases in which Q < 2Me (e.g. z67.a162)
|
||||
|
||||
@@ -181,7 +181,7 @@ G4Radioactivation::GetChainsFromParent(const G4ParticleDefinition& aParticle)
|
||||
}
|
||||
}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "The DecayRate Table for " << aParticleName << " is selected."
|
||||
<< G4endl;
|
||||
}
|
||||
@@ -208,7 +208,7 @@ G4Radioactivation::ConvolveSourceTimeProfile(const G4double t, const G4double ta
|
||||
while (t > SBin[nbin]) { // Loop checking, 01.09.2015, D.Wright
|
||||
loop++;
|
||||
if (loop > 1000) {
|
||||
G4Exception("G4RadioactiveDecay::ConvolveSourceTimeProfile()",
|
||||
G4Exception("G4Radioactivation::ConvolveSourceTimeProfile()",
|
||||
"HAD_RDM_100", JustWarning, "While loop count exceeded");
|
||||
break;
|
||||
}
|
||||
@@ -242,7 +242,7 @@ G4Radioactivation::ConvolveSourceTimeProfile(const G4double t, const G4double ta
|
||||
convolvedTime = 0.;
|
||||
}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1)
|
||||
if (GetVerboseLevel() > 2)
|
||||
G4cout << " Convolved time: " << convolvedTime << G4endl;
|
||||
#endif
|
||||
return convolvedTime;
|
||||
@@ -270,7 +270,7 @@ G4double G4Radioactivation::GetDecayTime()
|
||||
i++;
|
||||
loop++;
|
||||
if (loop > 100000) {
|
||||
G4Exception("G4RadioactiveDecay::GetDecayTime()", "HAD_RDM_100",
|
||||
G4Exception("G4Radioactivation::GetDecayTime()", "HAD_RDM_100",
|
||||
JustWarning, "While loop count exceeded");
|
||||
break;
|
||||
}
|
||||
@@ -279,7 +279,7 @@ G4double G4Radioactivation::GetDecayTime()
|
||||
rand = G4UniformRand();
|
||||
decaytime = DBin[i] + rand*(DBin[i+1]-DBin[i]);
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1)
|
||||
if (GetVerboseLevel() > 2)
|
||||
G4cout <<" Decay time: " <<decaytime/s <<"[s]" <<G4endl;
|
||||
#endif
|
||||
return decaytime;
|
||||
@@ -295,7 +295,7 @@ G4int G4Radioactivation::GetDecayTimeBin(const G4double aDecayTime)
|
||||
i++;
|
||||
loop++;
|
||||
if (loop > 100000) {
|
||||
G4Exception("G4RadioactiveDecay::GetDecayTimeBin()", "HAD_RDM_100",
|
||||
G4Exception("G4Radioactivation::GetDecayTimeBin()", "HAD_RDM_100",
|
||||
JustWarning, "While loop count exceeded");
|
||||
break;
|
||||
}
|
||||
@@ -422,7 +422,7 @@ CalculateChainsFromParent(const G4ParticleDefinition& theParentNucleus)
|
||||
while (!stable) { /* Loop checking, 01.09.2015, D.Wright */
|
||||
loop++;
|
||||
if (loop > 10000) {
|
||||
G4Exception("G4RadioactiveDecay::CalculateChainsFromParent()", "HAD_RDM_100",
|
||||
G4Exception("G4Radioactivation::CalculateChainsFromParent()", "HAD_RDM_100",
|
||||
JustWarning, "While loop count exceeded");
|
||||
break;
|
||||
}
|
||||
@@ -434,7 +434,7 @@ CalculateChainsFromParent(const G4ParticleDefinition& theParentNucleus)
|
||||
EP = theDecayRateVector[j].GetE();
|
||||
RP = theDecayRateVector[j].GetDecayRateC();
|
||||
TP = theDecayRateVector[j].GetTaos();
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "G4RadioactiveDecay::CalculateChainsFromParent: daughters of ("
|
||||
<< ZP << ", " << AP << ", " << EP
|
||||
<< ") are being calculated, generation = " << nGeneration
|
||||
@@ -680,7 +680,7 @@ void G4Radioactivation::SetSourceTimeProfile(G4String filename)
|
||||
if (!infile) {
|
||||
G4ExceptionDescription ed;
|
||||
ed << " Could not open file " << filename << G4endl;
|
||||
G4Exception("G4RadioactiveDecay::SetSourceTimeProfile()", "HAD_RDM_001",
|
||||
G4Exception("G4Radioactivation::SetSourceTimeProfile()", "HAD_RDM_001",
|
||||
FatalException, ed);
|
||||
}
|
||||
|
||||
@@ -691,14 +691,14 @@ void G4Radioactivation::SetSourceTimeProfile(G4String filename)
|
||||
while (infile >> bin >> flux) { /* Loop checking, 01.09.2015, D.Wright */
|
||||
loop++;
|
||||
if (loop > 10000) {
|
||||
G4Exception("G4RadioactiveDecay::SetSourceTimeProfile()", "HAD_RDM_100",
|
||||
G4Exception("G4Radioactivation::SetSourceTimeProfile()", "HAD_RDM_100",
|
||||
JustWarning, "While loop count exceeded");
|
||||
break;
|
||||
}
|
||||
|
||||
NSourceBin++;
|
||||
if (NSourceBin > 99) {
|
||||
G4Exception("G4RadioactiveDecay::SetSourceTimeProfile()", "HAD_RDM_002",
|
||||
G4Exception("G4Radioactivation::SetSourceTimeProfile()", "HAD_RDM_002",
|
||||
FatalException, "Input source time file too big (>100 rows)");
|
||||
|
||||
} else {
|
||||
@@ -711,7 +711,7 @@ void G4Radioactivation::SetSourceTimeProfile(G4String filename)
|
||||
infile.close();
|
||||
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1)
|
||||
if (GetVerboseLevel() > 2)
|
||||
G4cout <<" Source Timeprofile Nbin = " << NSourceBin <<G4endl;
|
||||
#endif
|
||||
}
|
||||
@@ -726,7 +726,7 @@ void G4Radioactivation::SetSourceTimeProfile(G4String filename)
|
||||
void G4Radioactivation::SetDecayBias(G4String filename)
|
||||
{
|
||||
std::ifstream infile(filename, std::ios::in);
|
||||
if (!infile) G4Exception("G4RadioactiveDecay::SetDecayBias()", "HAD_RDM_003",
|
||||
if (!infile) G4Exception("G4Radioactivation::SetDecayBias()", "HAD_RDM_001",
|
||||
FatalException, "Unable to open bias data file" );
|
||||
|
||||
G4double bin, flux;
|
||||
@@ -742,13 +742,13 @@ void G4Radioactivation::SetDecayBias(G4String filename)
|
||||
NDecayBin++;
|
||||
loop++;
|
||||
if (loop > 10000) {
|
||||
G4Exception("G4RadioactiveDecay::SetDecayBias()", "HAD_RDM_100",
|
||||
G4Exception("G4Radioactivation::SetDecayBias()", "HAD_RDM_100",
|
||||
JustWarning, "While loop count exceeded");
|
||||
break;
|
||||
}
|
||||
|
||||
if (NDecayBin > 99) {
|
||||
G4Exception("G4RadioactiveDecay::SetDecayBias()", "HAD_RDM_004",
|
||||
G4Exception("G4Radioactivation::SetDecayBias()", "HAD_RDM_002",
|
||||
FatalException, "Input bias file too big (>100 rows)" );
|
||||
} else {
|
||||
DBin[NDecayBin] = bin * s; // Convert read-in time to ns
|
||||
@@ -770,7 +770,7 @@ void G4Radioactivation::SetDecayBias(G4String filename)
|
||||
infile.close();
|
||||
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1)
|
||||
if (GetVerboseLevel() > 2)
|
||||
G4cout <<" Decay Bias Profile Nbin = " << NDecayBin <<G4endl;
|
||||
#endif
|
||||
}
|
||||
@@ -819,7 +819,7 @@ G4Radioactivation::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (!(IsApplicable(*theParticleDef) ) ) {
|
||||
// Particle is not an ion or is outside the nucleuslimits for decay
|
||||
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "G4RadioactiveDecay::DecayIt : "
|
||||
<< theParticleDef->GetParticleName()
|
||||
<< " is not an ion or is outside (Z,A) limits set for the decay. "
|
||||
@@ -863,247 +863,227 @@ G4Radioactivation::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
|
||||
} else {
|
||||
// Proceed with decay using variance reduction
|
||||
G4double energyDeposit = 0.0;
|
||||
G4double finalGlobalTime = theTrack.GetGlobalTime();
|
||||
G4double finalLocalTime = theTrack.GetLocalTime();
|
||||
G4int index;
|
||||
G4ThreeVector currentPosition;
|
||||
currentPosition = theTrack.GetPosition();
|
||||
G4double energyDeposit = 0.0;
|
||||
G4double finalGlobalTime = theTrack.GetGlobalTime();
|
||||
G4double finalLocalTime = theTrack.GetLocalTime();
|
||||
G4int index;
|
||||
G4ThreeVector currentPosition;
|
||||
currentPosition = theTrack.GetPosition();
|
||||
|
||||
G4IonTable* theIonTable;
|
||||
G4ParticleDefinition* parentNucleus;
|
||||
G4IonTable* theIonTable;
|
||||
G4ParticleDefinition* parentNucleus;
|
||||
|
||||
// Get decay chains for the given nuclide
|
||||
if (!IsRateTableReady(*theParticleDef)) CalculateChainsFromParent(*theParticleDef);
|
||||
GetChainsFromParent(*theParticleDef);
|
||||
// Get decay chains for the given nuclide
|
||||
if (!IsRateTableReady(*theParticleDef)) CalculateChainsFromParent(*theParticleDef);
|
||||
GetChainsFromParent(*theParticleDef);
|
||||
|
||||
// Declare some of the variables required in the implementation
|
||||
// G4ParticleDefinition* parentNucleus;
|
||||
// G4IonTable* theIonTable;
|
||||
G4int PZ;
|
||||
G4int PA;
|
||||
G4double PE;
|
||||
G4String keyName;
|
||||
std::vector<G4double> PT;
|
||||
std::vector<G4double> PR;
|
||||
G4double taotime;
|
||||
long double decayRate;
|
||||
// Declare some of the variables required in the implementation
|
||||
G4int PZ;
|
||||
G4int PA;
|
||||
G4double PE;
|
||||
G4String keyName;
|
||||
std::vector<G4double> PT;
|
||||
std::vector<G4double> PR;
|
||||
G4double taotime;
|
||||
long double decayRate;
|
||||
|
||||
size_t i;
|
||||
// size_t j;
|
||||
G4int numberOfSecondaries;
|
||||
G4int totalNumberOfSecondaries = 0;
|
||||
G4double currentTime = 0.;
|
||||
G4int ndecaych;
|
||||
G4DynamicParticle* asecondaryparticle;
|
||||
std::vector<G4DynamicParticle*> secondaryparticles;
|
||||
std::vector<G4double> pw;
|
||||
std::vector<G4double> ptime;
|
||||
pw.clear();
|
||||
ptime.clear();
|
||||
size_t i;
|
||||
G4int numberOfSecondaries;
|
||||
G4int totalNumberOfSecondaries = 0;
|
||||
G4double currentTime = 0.;
|
||||
G4int ndecaych;
|
||||
G4DynamicParticle* asecondaryparticle;
|
||||
std::vector<G4DynamicParticle*> secondaryparticles;
|
||||
std::vector<G4double> pw;
|
||||
std::vector<G4double> ptime;
|
||||
pw.clear();
|
||||
ptime.clear();
|
||||
|
||||
// Now apply the nucleus splitting
|
||||
for (G4int n = 0; n < NSplit; n++) {
|
||||
// Get the decay time following the decay probability function
|
||||
// supplied by user
|
||||
G4double theDecayTime = GetDecayTime();
|
||||
G4int nbin = GetDecayTimeBin(theDecayTime);
|
||||
// Now apply the nucleus splitting
|
||||
for (G4int n = 0; n < NSplit; n++) {
|
||||
// Get the decay time following the decay probability function
|
||||
// supplied by user
|
||||
G4double theDecayTime = GetDecayTime();
|
||||
G4int nbin = GetDecayTimeBin(theDecayTime);
|
||||
|
||||
// calculate the first part of the weight function
|
||||
G4double weight1 = 1.;
|
||||
if (nbin == 1) {
|
||||
weight1 = 1./DProfile[nbin-1]
|
||||
*(DBin[nbin]-DBin[nbin-1])/NSplit; // width of window in ns
|
||||
} else if (nbin > 1) {
|
||||
// Go from nbin to nbin-2 because flux entries in file alternate between 0 and 1
|
||||
weight1 = 1./(DProfile[nbin]-DProfile[nbin-2])
|
||||
*(DBin[nbin]-DBin[nbin-1])/NSplit;
|
||||
// weight1 = (probability of choosing one of the bins)*(time width of bin)/NSplit
|
||||
}
|
||||
// it should be calculated in seconds
|
||||
weight1 /= s ;
|
||||
// calculate the first part of the weight function
|
||||
G4double weight1 = 1.;
|
||||
if (nbin == 1) {
|
||||
weight1 = 1./DProfile[nbin-1]
|
||||
*(DBin[nbin]-DBin[nbin-1])/NSplit; // width of window in ns
|
||||
} else if (nbin > 1) {
|
||||
// Go from nbin to nbin-2 because flux entries in file alternate between 0 and 1
|
||||
weight1 = 1./(DProfile[nbin]-DProfile[nbin-2])
|
||||
*(DBin[nbin]-DBin[nbin-1])/NSplit;
|
||||
// weight1 = (probability of choosing one of the bins)*(time width of bin)/NSplit
|
||||
}
|
||||
// it should be calculated in seconds
|
||||
weight1 /= s ;
|
||||
|
||||
// loop over all the possible secondaries of the nucleus
|
||||
// the first one is itself.
|
||||
for (i = 0; i < theDecayRateVector.size(); i++) {
|
||||
PZ = theDecayRateVector[i].GetZ();
|
||||
PA = theDecayRateVector[i].GetA();
|
||||
PE = theDecayRateVector[i].GetE();
|
||||
PT = theDecayRateVector[i].GetTaos();
|
||||
PR = theDecayRateVector[i].GetDecayRateC();
|
||||
// loop over all the possible secondaries of the nucleus
|
||||
// the first one is itself.
|
||||
for (i = 0; i < theDecayRateVector.size(); i++) {
|
||||
PZ = theDecayRateVector[i].GetZ();
|
||||
PA = theDecayRateVector[i].GetA();
|
||||
PE = theDecayRateVector[i].GetE();
|
||||
PT = theDecayRateVector[i].GetTaos();
|
||||
PR = theDecayRateVector[i].GetDecayRateC();
|
||||
|
||||
// The array of arrays theDecayRateVector contains all possible decay
|
||||
// chains of a given parent nucleus (ZP,AP,EP) to a given descendant
|
||||
// nuclide (Z,A,E).
|
||||
//
|
||||
// theDecayRateVector[0] contains the decay parameters of the parent
|
||||
// nucleus
|
||||
// PZ = ZP
|
||||
// PA = AP
|
||||
// PE = EP
|
||||
// PT[] = {TP}
|
||||
// PR[] = {RP}
|
||||
//
|
||||
// theDecayRateVector[1] contains the decay of the parent to the first
|
||||
// generation daughter (Z1,A1,E1).
|
||||
// PZ = Z1
|
||||
// PA = A1
|
||||
// PE = E1
|
||||
// PT[] = {TP, T1}
|
||||
// PR[] = {RP, R1}
|
||||
//
|
||||
// theDecayRateVector[2] contains the decay of the parent to the first
|
||||
// generation daughter (Z1,A1,E1) and the decay of the first
|
||||
// generation daughter to the second generation daughter (Z2,A2,E2).
|
||||
// PZ = Z2
|
||||
// PA = A2
|
||||
// PE = E2
|
||||
// PT[] = {TP, T1, T2}
|
||||
// PR[] = {RP, R1, R2}
|
||||
//
|
||||
// theDecayRateVector[3] may contain a branch chain
|
||||
// PZ = Z2a
|
||||
// PA = A2a
|
||||
// PE = E2a
|
||||
// PT[] = {TP, T1, T2a}
|
||||
// PR[] = {RP, R1, R2a}
|
||||
//
|
||||
// and so on.
|
||||
// The array of arrays theDecayRateVector contains all possible decay
|
||||
// chains of a given parent nucleus (ZP,AP,EP) to a given descendant
|
||||
// nuclide (Z,A,E).
|
||||
//
|
||||
// theDecayRateVector[0] contains the decay parameters of the parent
|
||||
// nucleus
|
||||
// PZ = ZP
|
||||
// PA = AP
|
||||
// PE = EP
|
||||
// PT[] = {TP}
|
||||
// PR[] = {RP}
|
||||
//
|
||||
// theDecayRateVector[1] contains the decay of the parent to the first
|
||||
// generation daughter (Z1,A1,E1).
|
||||
// PZ = Z1
|
||||
// PA = A1
|
||||
// PE = E1
|
||||
// PT[] = {TP, T1}
|
||||
// PR[] = {RP, R1}
|
||||
//
|
||||
// theDecayRateVector[2] contains the decay of the parent to the first
|
||||
// generation daughter (Z1,A1,E1) and the decay of the first
|
||||
// generation daughter to the second generation daughter (Z2,A2,E2).
|
||||
// PZ = Z2
|
||||
// PA = A2
|
||||
// PE = E2
|
||||
// PT[] = {TP, T1, T2}
|
||||
// PR[] = {RP, R1, R2}
|
||||
//
|
||||
// theDecayRateVector[3] may contain a branch chain
|
||||
// PZ = Z2a
|
||||
// PA = A2a
|
||||
// PE = E2a
|
||||
// PT[] = {TP, T1, T2a}
|
||||
// PR[] = {RP, R1, R2a}
|
||||
//
|
||||
// and so on.
|
||||
|
||||
// Calculate the decay rate of the isotope. decayRate is the
|
||||
// radioactivity of isotope (PZ,PA,PE) at 'theDecayTime'
|
||||
// it will be used to calculate the statistical weight of the
|
||||
// decay products of this isotope
|
||||
// Calculate the decay rate of the isotope. decayRate is the
|
||||
// radioactivity of isotope (PZ,PA,PE) at 'theDecayTime'
|
||||
// it will be used to calculate the statistical weight of the
|
||||
// decay products of this isotope
|
||||
|
||||
// For each nuclide, calculate all the decay chains which can reach
|
||||
// the parent nuclide
|
||||
decayRate = 0.L;
|
||||
for (G4int j = 0; j < G4int(PT.size() ); j++) {
|
||||
// G4cout << " RDM::DecayIt: tau input to Convolve: " << PT[j] << G4endl;
|
||||
taotime = ConvolveSourceTimeProfile(theDecayTime,PT[j]);
|
||||
// taotime = GetTaoTime(theDecayTime,PT[j]);
|
||||
decayRate -= PR[j] * (long double)taotime; // PRs are Acoeffs, taotime is inverse time
|
||||
// Eq.4.23 of of the TN
|
||||
// note the negative here is required as the rate in the
|
||||
// equation is defined to be negative,
|
||||
// i.e. decay away, but we need positive value here.
|
||||
// For each nuclide, calculate all the decay chains which can reach
|
||||
// the parent nuclide
|
||||
decayRate = 0.L;
|
||||
for (G4int j = 0; j < G4int(PT.size() ); j++) {
|
||||
taotime = ConvolveSourceTimeProfile(theDecayTime,PT[j]);
|
||||
decayRate -= PR[j] * (long double)taotime; // PRs are Acoeffs, taotime is inverse time
|
||||
// Eq.4.23 of of the TN
|
||||
// note the negative here is required as the rate in the
|
||||
// equation is defined to be negative,
|
||||
// i.e. decay away, but we need positive value here.
|
||||
|
||||
// G4cout << j << "\t"<< PT[j]/s << "\t" << PR[j] << "\t" << decayRate << G4endl;
|
||||
}
|
||||
// G4cout << j << "\t"<< PT[j]/s << "\t" << PR[j] << "\t" << decayRate << G4endl;
|
||||
}
|
||||
|
||||
// At this point any negative decay rates are probably small enough
|
||||
// (order 10**-30) that negative values are likely due to cancellation
|
||||
// errors. Set them to zero.
|
||||
if (decayRate < 0.0) decayRate = 0.0;
|
||||
// At this point any negative decay rates are probably small enough
|
||||
// (order 10**-30) that negative values are likely due to cancellation
|
||||
// errors. Set them to zero.
|
||||
if (decayRate < 0.0) decayRate = 0.0;
|
||||
|
||||
// // Test code
|
||||
// if (decayRate < 0.0) {
|
||||
// if (-decayRate > 1.0e-30) {
|
||||
// G4ExceptionDescription ed;
|
||||
// ed << " Negative decay probability (magnitude > 1e-30) \n"
|
||||
// << " in variance reduction branch " << G4endl;
|
||||
// G4Exception("G4RadioactiveDecay::DecayIt()",
|
||||
// "HAD_RDM_200", JustWarning, ed);
|
||||
// } else {
|
||||
// // Decay probability is small enough that negative value is likely
|
||||
// // due to cancellation errors. Set it to zero.
|
||||
// decayRate = 0.0;
|
||||
// }
|
||||
// }
|
||||
// G4cout << " VR in i loop after decayRate < 0 " << G4endl;
|
||||
// if (decayRate < 0.0) G4cout << " NEGATIVE decay rate = " << decayRate << G4endl;
|
||||
// G4cout <<theDecayTime/s <<"\t"<<nbin<<G4endl;
|
||||
// G4cout << theTrack.GetWeight() <<"\t"<<weight1<<"\t"<<decayRate<< G4endl;
|
||||
|
||||
// G4cout <<theDecayTime/s <<"\t"<<nbin<<G4endl;
|
||||
// G4cout << theTrack.GetWeight() <<"\t"<<weight1<<"\t"<<decayRate<< G4endl;
|
||||
// Add isotope to the radioactivity tables
|
||||
// One table for each observation time window specifed in
|
||||
// SetDecayBias(G4String filename)
|
||||
|
||||
// Add isotope to the radioactivity tables
|
||||
// One table for each observation time window specifed in
|
||||
// SetDecayBias(G4String filename)
|
||||
theRadioactivityTables[decayWindows[nbin-1]]
|
||||
->AddIsotope(PZ,PA,PE,weight1*decayRate,theTrack.GetWeight());
|
||||
|
||||
theRadioactivityTables[decayWindows[nbin-1]]
|
||||
->AddIsotope(PZ,PA,PE,weight1*decayRate,theTrack.GetWeight());
|
||||
// Now calculate the statistical weight
|
||||
// One needs to fold the source bias function with the decaytime
|
||||
// also need to include the track weight! (F.Lei, 28/10/10)
|
||||
G4double weight = weight1*decayRate*theTrack.GetWeight();
|
||||
|
||||
// Now calculate the statistical weight
|
||||
// One needs to fold the source bias function with the decaytime
|
||||
// also need to include the track weight! (F.Lei, 28/10/10)
|
||||
G4double weight = weight1*decayRate*theTrack.GetWeight();
|
||||
// decay the isotope
|
||||
theIonTable = (G4IonTable *)(G4ParticleTable::GetParticleTable()->GetIonTable());
|
||||
parentNucleus = theIonTable->GetIon(PZ,PA,PE);
|
||||
|
||||
// decay the isotope
|
||||
theIonTable = (G4IonTable *)(G4ParticleTable::GetParticleTable()->GetIonTable());
|
||||
parentNucleus = theIonTable->GetIon(PZ,PA,PE);
|
||||
// Create a temprary products buffer.
|
||||
// Its contents to be transfered to the products at the end of the loop
|
||||
G4DecayProducts* tempprods = 0;
|
||||
|
||||
// Create a temprary products buffer.
|
||||
// Its contents to be transfered to the products at the end of the loop
|
||||
G4DecayProducts* tempprods = 0;
|
||||
// Decide whether to apply branching ratio bias or not
|
||||
if (BRBias) {
|
||||
G4DecayTable* decayTable = GetDecayTable1(parentNucleus);
|
||||
ndecaych = G4int(decayTable->entries()*G4UniformRand());
|
||||
G4VDecayChannel* theDecayChannel = decayTable->GetDecayChannel(ndecaych);
|
||||
|
||||
// Decide whether to apply branching ratio bias or not
|
||||
if (BRBias) {
|
||||
G4DecayTable* decayTable = GetDecayTable1(parentNucleus);
|
||||
ndecaych = G4int(decayTable->entries()*G4UniformRand());
|
||||
G4VDecayChannel* theDecayChannel = decayTable->GetDecayChannel(ndecaych);
|
||||
if (theDecayChannel == 0) {
|
||||
// Decay channel not found.
|
||||
|
||||
if (theDecayChannel == 0) {
|
||||
// Decay channel not found.
|
||||
if (GetVerboseLevel() > 0) {
|
||||
G4cout << " G4RadioactiveDecay::DoIt : cannot determine decay channel ";
|
||||
G4cout << " for this nucleus; decay as if no biasing active. ";
|
||||
G4cout << G4endl;
|
||||
decayTable ->DumpInfo();
|
||||
}
|
||||
|
||||
if (GetVerboseLevel() > 0) {
|
||||
G4cout << " G4RadioactiveDecay::DoIt : cannot determine decay channel ";
|
||||
G4cout << " for this nucleus; decay as if no biasing active. ";
|
||||
G4cout << G4endl;
|
||||
decayTable ->DumpInfo();
|
||||
}
|
||||
|
||||
tempprods = DoDecay(*parentNucleus); // DHW 6 Dec 2010 - do decay as if no biasing
|
||||
tempprods = DoDecay(*parentNucleus); // DHW 6 Dec 2010 - do decay as if no biasing
|
||||
// to avoid deref of temppprods = 0
|
||||
} else {
|
||||
// A decay channel has been identified, so execute the DecayIt.
|
||||
G4double tempmass = parentNucleus->GetPDGMass();
|
||||
tempprods = theDecayChannel->DecayIt(tempmass);
|
||||
weight *= (theDecayChannel->GetBR())*(decayTable->entries());
|
||||
}
|
||||
} else {
|
||||
// A decay channel has been identified, so execute the DecayIt.
|
||||
G4double tempmass = parentNucleus->GetPDGMass();
|
||||
tempprods = theDecayChannel->DecayIt(tempmass);
|
||||
weight *= (theDecayChannel->GetBR())*(decayTable->entries());
|
||||
tempprods = DoDecay(*parentNucleus);
|
||||
}
|
||||
} else {
|
||||
tempprods = DoDecay(*parentNucleus);
|
||||
}
|
||||
|
||||
// save the secondaries for buffers
|
||||
numberOfSecondaries = tempprods->entries();
|
||||
currentTime = finalGlobalTime + theDecayTime;
|
||||
for (index = 0; index < numberOfSecondaries; index++) {
|
||||
asecondaryparticle = tempprods->PopProducts();
|
||||
if (asecondaryparticle->GetDefinition()->GetPDGStable() ) {
|
||||
pw.push_back(weight);
|
||||
ptime.push_back(currentTime);
|
||||
secondaryparticles.push_back(asecondaryparticle);
|
||||
// save the secondaries for buffers
|
||||
numberOfSecondaries = tempprods->entries();
|
||||
currentTime = finalGlobalTime + theDecayTime;
|
||||
for (index = 0; index < numberOfSecondaries; index++) {
|
||||
asecondaryparticle = tempprods->PopProducts();
|
||||
if (asecondaryparticle->GetDefinition()->GetPDGStable() ) {
|
||||
pw.push_back(weight);
|
||||
ptime.push_back(currentTime);
|
||||
secondaryparticles.push_back(asecondaryparticle);
|
||||
}
|
||||
// Generate gammas and Xrays from excited nucleus, added by L.Desorgher
|
||||
else if (((const G4Ions*)(asecondaryparticle->GetDefinition()))
|
||||
->GetExcitationEnergy() > 0. && weight > 0.) { //Compute the gamma
|
||||
G4ParticleDefinition* apartDef = asecondaryparticle->GetDefinition();
|
||||
AddDeexcitationSpectrumForBiasMode(apartDef,weight,currentTime,pw,
|
||||
ptime,secondaryparticles);
|
||||
}
|
||||
}
|
||||
//Generate gammas and XRays from excited nucleus, added by L.Desorgher
|
||||
else if (((const G4Ions*)(asecondaryparticle->GetDefinition()))->GetExcitationEnergy()>0. && weight>0.){//Compute the gamma
|
||||
G4ParticleDefinition* apartDef =asecondaryparticle->GetDefinition();
|
||||
AddDeexcitationSpectrumForBiasMode(apartDef,weight,currentTime,pw,ptime,secondaryparticles);
|
||||
}
|
||||
}
|
||||
|
||||
delete tempprods;
|
||||
} // end of i loop
|
||||
} // end of n loop
|
||||
delete tempprods;
|
||||
} // end of i loop
|
||||
} // end of n loop
|
||||
|
||||
// now deal with the secondaries in the two stl containers
|
||||
// and submmit them back to the tracking manager
|
||||
totalNumberOfSecondaries = pw.size();
|
||||
fParticleChangeForRadDecay.SetNumberOfSecondaries(totalNumberOfSecondaries);
|
||||
for (index=0; index < totalNumberOfSecondaries; index++) {
|
||||
G4Track* secondary = new G4Track(secondaryparticles[index],
|
||||
// now deal with the secondaries in the two stl containers
|
||||
// and submmit them back to the tracking manager
|
||||
totalNumberOfSecondaries = pw.size();
|
||||
fParticleChangeForRadDecay.SetNumberOfSecondaries(totalNumberOfSecondaries);
|
||||
for (index=0; index < totalNumberOfSecondaries; index++) {
|
||||
G4Track* secondary = new G4Track(secondaryparticles[index],
|
||||
ptime[index], currentPosition);
|
||||
secondary->SetGoodForTrackingFlag();
|
||||
secondary->SetTouchableHandle(theTrack.GetTouchableHandle());
|
||||
secondary->SetWeight(pw[index]);
|
||||
fParticleChangeForRadDecay.AddSecondary(secondary);
|
||||
}
|
||||
secondary->SetGoodForTrackingFlag();
|
||||
secondary->SetTouchableHandle(theTrack.GetTouchableHandle());
|
||||
secondary->SetWeight(pw[index]);
|
||||
fParticleChangeForRadDecay.AddSecondary(secondary);
|
||||
}
|
||||
|
||||
// Kill the parent particle
|
||||
fParticleChangeForRadDecay.ProposeTrackStatus(fStopAndKill) ;
|
||||
fParticleChangeForRadDecay.ProposeLocalEnergyDeposit(energyDeposit);
|
||||
fParticleChangeForRadDecay.ProposeLocalTime(finalLocalTime);
|
||||
// Reset NumberOfInteractionLengthLeft.
|
||||
ClearNumberOfInteractionLengthLeft();
|
||||
// Kill the parent particle
|
||||
fParticleChangeForRadDecay.ProposeTrackStatus(fStopAndKill) ;
|
||||
fParticleChangeForRadDecay.ProposeLocalEnergyDeposit(energyDeposit);
|
||||
fParticleChangeForRadDecay.ProposeLocalTime(finalLocalTime);
|
||||
// Reset NumberOfInteractionLengthLeft.
|
||||
ClearNumberOfInteractionLengthLeft();
|
||||
} // end VR decay
|
||||
|
||||
return &fParticleChangeForRadDecay;
|
||||
@@ -1123,7 +1103,7 @@ G4Radioactivation::AddDeexcitationSpectrumForBiasMode(G4ParticleDefinition* apar
|
||||
G4double life_time=apartDef->GetPDGLifeTime();
|
||||
G4ITDecay* anITChannel = 0;
|
||||
|
||||
while (life_time <halflifethreshold && elevel>0.) {
|
||||
while (life_time < halflifethreshold && elevel > 0.) {
|
||||
anITChannel = new G4ITDecay(apartDef, 100., elevel, elevel, photonEvaporation);
|
||||
G4DecayProducts* pevap_products = anITChannel->DecayIt(0.);
|
||||
G4int nb_pevapSecondaries = pevap_products->entries();
|
||||
@@ -1151,6 +1131,7 @@ G4Radioactivation::AddDeexcitationSpectrumForBiasMode(G4ParticleDefinition* apar
|
||||
}
|
||||
|
||||
delete anITChannel;
|
||||
delete pevap_products;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@ G4int& G4RadioactiveDecay::NumberOfInstances()
|
||||
G4RadioactiveDecay::G4RadioactiveDecay(const G4String& processName)
|
||||
: G4VRestDiscreteProcess(processName, fDecay), isInitialised(false),
|
||||
forceDecayDirection(0.,0.,0.), forceDecayHalfAngle(0.*deg), dirPath(""),
|
||||
verboseLevel(0)
|
||||
verboseLevel(1)
|
||||
{
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1) {
|
||||
@@ -177,6 +177,10 @@ G4RadioactiveDecay::G4RadioactiveDecay(const G4String& processName)
|
||||
}
|
||||
#endif
|
||||
|
||||
G4cout << " G4RadioactiveDecay is deprecated and will be removed in Geant4 version 11. " << G4endl;
|
||||
G4cout << " Please replace it with G4RadioactiveDecayBase if you want the unbiased radioactive deacy process." << G4endl;
|
||||
G4cout << " If you want the general process, with optional biasing, use G4Radioactivation. " << G4endl;
|
||||
|
||||
SetProcessSubType(fRadioactiveDecay);
|
||||
|
||||
theRadioactiveDecaymessenger = new G4RadioactiveDecaymessenger(this);
|
||||
@@ -333,12 +337,15 @@ void G4RadioactiveDecay::SelectAVolume(const G4String aVolume)
|
||||
std::sort(ValidVolumes.begin(), ValidVolumes.end());
|
||||
// sort need for performing binary_search
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0)
|
||||
if (GetVerboseLevel()>1)
|
||||
G4cout << " RDM Applies to : " << aVolume << G4endl;
|
||||
#endif
|
||||
} else if(i == theLogicalVolumes->size()) {
|
||||
G4cerr << "SelectAVolume: "<< aVolume
|
||||
<< " is not a valid logical volume name" << G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << aVolume << " is not a valid logical volume name. Decay not activated for it."
|
||||
<< G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::SelectAVolume()", "HAD_RDM_300",
|
||||
JustWarning, ed);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -359,8 +366,10 @@ void G4RadioactiveDecay::DeselectAVolume(const G4String aVolume)
|
||||
std::sort(ValidVolumes.begin(), ValidVolumes.end());
|
||||
isAllVolumesMode =false;
|
||||
} else {
|
||||
G4cerr << " DeselectVolume:" << aVolume << " is not in the list "
|
||||
<< G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << aVolume << " is not in the list " << G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::DeselectAVolume()", "HAD_RDM_300",
|
||||
JustWarning, ed);
|
||||
}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0)
|
||||
@@ -368,8 +377,10 @@ void G4RadioactiveDecay::DeselectAVolume(const G4String aVolume)
|
||||
<< G4endl;
|
||||
#endif
|
||||
} else if (i == theLogicalVolumes->size()) {
|
||||
G4cerr << " DeselectVolume:" << aVolume
|
||||
<< "is not a valid logical volume name" << G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << aVolume << " is not a valid logical volume name " << G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::SelectAVolume()", "HAD_RDM_300",
|
||||
JustWarning, ed);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -382,14 +393,14 @@ void G4RadioactiveDecay::SelectAllVolumes()
|
||||
theLogicalVolumes = G4LogicalVolumeStore::GetInstance();
|
||||
ValidVolumes.clear();
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0)
|
||||
if (GetVerboseLevel()>1)
|
||||
G4cout << " RDM Applies to all Volumes" << G4endl;
|
||||
#endif
|
||||
for (size_t i = 0; i < theLogicalVolumes->size(); i++){
|
||||
volume = (*theLogicalVolumes)[i];
|
||||
ValidVolumes.push_back(volume->GetName());
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0)
|
||||
if (GetVerboseLevel()>1)
|
||||
G4cout << " RDM Applies to Volume " << volume->GetName() << G4endl;
|
||||
#endif
|
||||
}
|
||||
@@ -404,7 +415,7 @@ void G4RadioactiveDecay::DeselectAllVolumes()
|
||||
ValidVolumes.clear();
|
||||
isAllVolumesMode=false;
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) G4cout << "RDM removed from all volumes" << G4endl;
|
||||
if (GetVerboseLevel() > 1) G4cout << "RDM removed from all volumes" << G4endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -433,7 +444,7 @@ G4RadioactiveDecay::GetChainsFromParent(const G4ParticleDefinition& aParticle)
|
||||
}
|
||||
}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "The DecayRate Table for " << aParticleName << " is selected."
|
||||
<< G4endl;
|
||||
}
|
||||
@@ -647,7 +658,7 @@ G4double G4RadioactiveDecay::GetMeanLifeTime(const G4Track& theTrack,
|
||||
meanlife == DBL_MAX) {meanlife = 0.;}
|
||||
}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1)
|
||||
if (GetVerboseLevel() > 2)
|
||||
G4cout << " mean life time: " << meanlife/s << " s " << G4endl;
|
||||
#endif
|
||||
|
||||
@@ -1304,7 +1315,7 @@ CalculateChainsFromParent(const G4ParticleDefinition& theParentNucleus)
|
||||
EP = theDecayRateVector[j].GetE();
|
||||
RP = theDecayRateVector[j].GetDecayRateC();
|
||||
TP = theDecayRateVector[j].GetTaos();
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "G4RadioactiveDecay::CalculateChainsFromParent: daughters of ("
|
||||
<< ZP << ", " << AP << ", " << EP
|
||||
<< ") are being calculated, generation = " << nGeneration
|
||||
@@ -1662,7 +1673,7 @@ G4RadioactiveDecay::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (!std::binary_search(ValidVolumes.begin(), ValidVolumes.end(),
|
||||
theTrack.GetVolume()->GetLogicalVolume()->GetName())) {
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0) {
|
||||
if (GetVerboseLevel()>1) {
|
||||
G4cout <<"G4RadioactiveDecay::DecayIt : "
|
||||
<< theTrack.GetVolume()->GetLogicalVolume()->GetName()
|
||||
<< " is not selected for the RDM"<< G4endl;
|
||||
@@ -1686,13 +1697,13 @@ G4RadioactiveDecay::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (!(IsApplicable(*theParticleDef) ) ) {
|
||||
// Particle is not an ion or is outside the nucleuslimits for decay
|
||||
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0) {
|
||||
G4cerr << "G4RadioactiveDecay::DecayIt : "
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << " G4RadioactiveDecay::DecayIt : "
|
||||
<< theParticleDef->GetParticleName()
|
||||
<< " is not a valid nucleus for the RDM"<< G4endl;
|
||||
<< " is not a valid nucleus for the RDM. "<< G4endl;
|
||||
G4cout << " Set particle change accordingly. " << G4endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
fParticleChangeForRadDecay.SetNumberOfSecondaries(0);
|
||||
|
||||
// Kill the parent particle
|
||||
@@ -1706,12 +1717,11 @@ G4RadioactiveDecay::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (theDecayTable == 0 || theDecayTable->entries() == 0) {
|
||||
// No data in the decay table. Set particle change parameters
|
||||
// to indicate this.
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) {
|
||||
G4cerr <<"G4RadioactiveDecay::DecayIt : decay table not defined for ";
|
||||
G4cerr <<theParticleDef->GetParticleName() <<G4endl;
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout <<" G4RadioactiveDecay::DecayIt : decay table not defined for ";
|
||||
G4cout << theParticleDef->GetParticleName() << G4endl;
|
||||
G4cout << " Set particle change to indicate this. " << G4endl;
|
||||
}
|
||||
#endif
|
||||
fParticleChangeForRadDecay.SetNumberOfSecondaries(0);
|
||||
|
||||
// Kill the parent particle.
|
||||
@@ -1732,7 +1742,7 @@ G4RadioactiveDecay::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
// Check whether use Analogue or VR implementation
|
||||
if (AnalogueMC) {
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0)
|
||||
if (GetVerboseLevel() > 1)
|
||||
G4cout <<"DecayIt: Analogue MC version " << G4endl;
|
||||
# endif
|
||||
|
||||
@@ -1987,10 +1997,10 @@ G4RadioactiveDecay::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (theDecayChannel == 0) {
|
||||
// Decay channel not found.
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0) {
|
||||
G4cerr << " G4RadioactiveDecay::DoIt : cannot determine decay channel ";
|
||||
G4cerr << " for this nucleus; decay as if no biasing active ";
|
||||
G4cerr << G4endl;
|
||||
if (GetVerboseLevel() > 0) {
|
||||
G4cout << " G4RadioactiveDecay::DoIt : cannot determine decay ";
|
||||
G4cout << " channel for this nucleus; decay as if no biasing active ";
|
||||
G4cout << G4endl;
|
||||
decayTable ->DumpInfo();
|
||||
}
|
||||
#endif
|
||||
@@ -2066,16 +2076,11 @@ G4RadioactiveDecay::DoDecay(const G4ParticleDefinition& theParticleDef)
|
||||
G4DecayTable* theDecayTable = GetDecayTable(&theParticleDef);
|
||||
|
||||
// Choose a decay channel.
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) G4cout << "Select a channel..." << G4endl;
|
||||
#endif
|
||||
|
||||
// G4DecayTable::SelectADecayChannel checks to see if sum of daughter masses
|
||||
// exceeds parent mass. Pass it the parent mass + maximum Q value to account
|
||||
// for difference in mass defect.
|
||||
G4double parentPlusQ = theParticleDef.GetPDGMass() + 30.*MeV;
|
||||
G4VDecayChannel* theDecayChannel = theDecayTable->SelectADecayChannel(parentPlusQ);
|
||||
theRadDecayMode = (static_cast<G4NuclearDecay*>(theDecayChannel))->GetDecayMode();
|
||||
if (theDecayChannel == 0) {
|
||||
// Decay channel not found.
|
||||
G4ExceptionDescription ed;
|
||||
@@ -2086,10 +2091,11 @@ G4RadioactiveDecay::DoDecay(const G4ParticleDefinition& theParticleDef)
|
||||
// A decay channel has been identified, so execute the DecayIt.
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cerr << "G4RadioactiveDecay::DoIt : selected decay channel addr:";
|
||||
G4cerr << theDecayChannel << G4endl;
|
||||
G4cout << "G4RadioactiveDecay::DoIt : selected decay channel address:";
|
||||
G4cout << theDecayChannel << G4endl;
|
||||
}
|
||||
#endif
|
||||
theRadDecayMode = (static_cast<G4NuclearDecay*>(theDecayChannel))->GetDecayMode();
|
||||
products = theDecayChannel->DecayIt(theParticleDef.GetPDGMass() );
|
||||
|
||||
// Apply directional bias if requested by user
|
||||
@@ -2108,7 +2114,7 @@ void G4RadioactiveDecay::CollimateDecay(G4DecayProducts* products) {
|
||||
if (0 == products || 0 == products->entries()) return;
|
||||
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) G4cout << "Begin of CollimateDecay..." << G4endl;
|
||||
if (GetVerboseLevel() > 1) G4cout << "Begin decay collimation " << G4endl;
|
||||
#endif
|
||||
|
||||
// Particles suitable for directional biasing (for if-blocks below)
|
||||
|
||||
@@ -108,7 +108,7 @@ G4int& G4RadioactiveDecayBase::NumberOfInstances()
|
||||
G4RadioactiveDecayBase::G4RadioactiveDecayBase(const G4String& processName)
|
||||
: G4VRestDiscreteProcess(processName, fDecay), isInitialised(false),
|
||||
forceDecayDirection(0.,0.,0.), forceDecayHalfAngle(0.*deg), dirPath(""),
|
||||
verboseLevel(0)
|
||||
verboseLevel(1)
|
||||
{
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1) {
|
||||
@@ -255,9 +255,11 @@ void G4RadioactiveDecayBase::SelectAVolume(const G4String aVolume)
|
||||
G4cout << " Radioactive decay applied to " << aVolume << G4endl;
|
||||
|
||||
} else if (i == theLogicalVolumes->size() ) {
|
||||
G4cout << " G4RadioactiveDecay::SelectAVolume: " << aVolume
|
||||
<< " is not a valid logical volume name."
|
||||
<< " Decay not activated for it." << G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << aVolume << " is not a valid logical volume name. Decay not activated for it."
|
||||
<< G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::SelectAVolume()", "HAD_RDM_300",
|
||||
JustWarning, ed);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -281,13 +283,17 @@ void G4RadioactiveDecayBase::DeselectAVolume(const G4String aVolume)
|
||||
G4cout << " G4RadioactiveDecay::DeselectAVolume: " << aVolume
|
||||
<< " is removed from list " << G4endl;
|
||||
} else {
|
||||
G4cout << " G4RadioactiveDecay::DeselectAVolume: " << aVolume
|
||||
<< " is not in the list. No action taken. " << G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << aVolume << " is not in the list. No action taken." << G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::DeselectAVolume()", "HAD_RDM_300",
|
||||
JustWarning, ed);
|
||||
}
|
||||
} else if (i == theLogicalVolumes->size()) {
|
||||
G4cout << " G4RadioactiveDecay::DeselectVolume:" << aVolume
|
||||
<< " is not a valid logical volume name. No action taken."
|
||||
<< G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << aVolume << " is not a valid logical volume name. No action taken."
|
||||
<< G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::DeselectAVolume()", "HAD_RDM_300",
|
||||
JustWarning, ed);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -300,14 +306,14 @@ void G4RadioactiveDecayBase::SelectAllVolumes()
|
||||
theLogicalVolumes = G4LogicalVolumeStore::GetInstance();
|
||||
ValidVolumes.clear();
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0)
|
||||
if (GetVerboseLevel()>1)
|
||||
G4cout << " RDM Applies to all Volumes" << G4endl;
|
||||
#endif
|
||||
for (size_t i = 0; i < theLogicalVolumes->size(); i++){
|
||||
volume = (*theLogicalVolumes)[i];
|
||||
ValidVolumes.push_back(volume->GetName());
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0)
|
||||
if (GetVerboseLevel()>1)
|
||||
G4cout << " RDM Applies to Volume " << volume->GetName() << G4endl;
|
||||
#endif
|
||||
}
|
||||
@@ -322,7 +328,7 @@ void G4RadioactiveDecayBase::DeselectAllVolumes()
|
||||
ValidVolumes.clear();
|
||||
isAllVolumesMode=false;
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) G4cout << "RDM removed from all volumes" << G4endl;
|
||||
if (GetVerboseLevel() > 1) G4cout << "RDM removed from all volumes" << G4endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -356,7 +362,7 @@ G4double G4RadioactiveDecayBase::GetMeanLifeTime(const G4Track& theTrack,
|
||||
if (((const G4Ions*)(theParticleDef))->GetExcitationEnergy() > 0. &&
|
||||
meanlife == DBL_MAX) {meanlife = 0.;}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1)
|
||||
if (GetVerboseLevel() > 2)
|
||||
G4cout << " mean life time: " << meanlife/s << " s " << G4endl;
|
||||
#endif
|
||||
|
||||
@@ -421,7 +427,7 @@ G4double G4RadioactiveDecayBase::GetMeanFreePath (const G4Track& aTrack, G4doubl
|
||||
}
|
||||
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 1) {
|
||||
if (GetVerboseLevel() > 2) {
|
||||
G4cout << "mean free path: "<< pathlength/m << " m" << G4endl;
|
||||
}
|
||||
#endif
|
||||
@@ -896,7 +902,10 @@ G4RadioactiveDecayBase::AddUserDecayDataFile(G4int Z, G4int A, G4String filename
|
||||
G4int ID_ion = A*1000 + Z;
|
||||
theUserRadioactiveDataFiles[ID_ion] = filename;
|
||||
} else {
|
||||
G4cout << "The file " << filename << " does not exist!" << G4endl;
|
||||
G4ExceptionDescription ed;
|
||||
ed << filename << " does not exist! " << G4endl;
|
||||
G4Exception("G4RadioactiveDecayBase::AddUserDecayDataFile()", "HAD_RDM_001",
|
||||
FatalException, ed);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -920,7 +929,7 @@ G4RadioactiveDecayBase::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (!std::binary_search(ValidVolumes.begin(), ValidVolumes.end(),
|
||||
theTrack.GetVolume()->GetLogicalVolume()->GetName())) {
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>0) {
|
||||
if (GetVerboseLevel()>1) {
|
||||
G4cout <<"G4RadioactiveDecay::DecayIt : "
|
||||
<< theTrack.GetVolume()->GetLogicalVolume()->GetName()
|
||||
<< " is not selected for the RDM"<< G4endl;
|
||||
@@ -944,7 +953,7 @@ G4RadioactiveDecayBase::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (!(IsApplicable(*theParticleDef) ) ) {
|
||||
// Particle is not an ion or is outside the nucleuslimits for decay
|
||||
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "G4RadioactiveDecay::DecayIt : "
|
||||
<< theParticleDef->GetParticleName()
|
||||
<< " is not an ion or is outside (Z,A) limits set for the decay. "
|
||||
@@ -965,7 +974,7 @@ G4RadioactiveDecayBase::DecayIt(const G4Track& theTrack, const G4Step&)
|
||||
if (theDecayTable == 0 || theDecayTable->entries() == 0) {
|
||||
// No data in the decay table. Set particle change parameters
|
||||
// to indicate this.
|
||||
if (GetVerboseLevel() > 0) {
|
||||
if (GetVerboseLevel() > 1) {
|
||||
G4cout << "G4RadioactiveDecay::DecayIt : "
|
||||
<< "decay table not defined for "
|
||||
<< theParticleDef->GetParticleName()
|
||||
@@ -1169,17 +1178,13 @@ G4RadioactiveDecayBase::DoDecay(const G4ParticleDefinition& theParticleDef)
|
||||
{
|
||||
G4DecayProducts* products = 0;
|
||||
G4DecayTable* theDecayTable = GetDecayTable(&theParticleDef);
|
||||
// Choose a decay channel.
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) G4cout << "Select a channel..." << G4endl;
|
||||
#endif
|
||||
|
||||
// Choose a decay channel.
|
||||
// G4DecayTable::SelectADecayChannel checks to see if sum of daughter masses
|
||||
// exceeds parent mass. Pass it the parent mass + maximum Q value to account
|
||||
// for difference in mass defect.
|
||||
G4double parentPlusQ = theParticleDef.GetPDGMass() + 30.*MeV;
|
||||
G4VDecayChannel* theDecayChannel = theDecayTable->SelectADecayChannel(parentPlusQ);
|
||||
theRadDecayMode = (static_cast<G4NuclearDecay*>(theDecayChannel))->GetDecayMode();
|
||||
|
||||
if (theDecayChannel == 0) {
|
||||
// Decay channel not found.
|
||||
@@ -1195,6 +1200,7 @@ G4RadioactiveDecayBase::DoDecay(const G4ParticleDefinition& theParticleDef)
|
||||
<< theDecayChannel << G4endl;
|
||||
}
|
||||
#endif
|
||||
theRadDecayMode = (static_cast<G4NuclearDecay*>(theDecayChannel))->GetDecayMode();
|
||||
products = theDecayChannel->DecayIt(theParticleDef.GetPDGMass() );
|
||||
|
||||
// Apply directional bias if requested by user
|
||||
@@ -1213,7 +1219,7 @@ void G4RadioactiveDecayBase::CollimateDecay(G4DecayProducts* products) {
|
||||
if (0 == products || 0 == products->entries()) return;
|
||||
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel() > 0) G4cout << "Begin of CollimateDecay..." << G4endl;
|
||||
if (GetVerboseLevel() > 1) G4cout << "Begin of CollimateDecay..." << G4endl;
|
||||
#endif
|
||||
|
||||
// Particles suitable for directional biasing (for if-blocks below)
|
||||
|
||||
@@ -15,6 +15,11 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
17 December 2019 Vladimir Ivanchenko (hadr-proc-V10-05-09)
|
||||
----------------------------------------------------------
|
||||
- G4HadronElasticProcess : removed forgotten try/catch pattern for
|
||||
target isotope selection, which should be a part of 10.6
|
||||
|
||||
11 July 2019 Alberto Ribon (hadr-proc-V10-05-06)
|
||||
-----------------------------------------------------
|
||||
- Created new inelastic processes for heavy hadron - nucleus interactions:
|
||||
|
||||
@@ -82,21 +82,8 @@ G4HadronElasticProcess::PostStepDoIt(const G4Track& track,
|
||||
G4Nucleus* targNucleus = GetTargetNucleusPointer();
|
||||
|
||||
// Select element
|
||||
const G4Element* elm = nullptr;
|
||||
try
|
||||
{
|
||||
elm = GetCrossSectionDataStore()->SampleZandA(dynParticle, material,
|
||||
*targNucleus);
|
||||
}
|
||||
catch(G4HadronicException & aR)
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
aR.Report(ed);
|
||||
DumpState(track,"SampleZandA",ed);
|
||||
ed << " PostStepDoIt failed on element selection" << G4endl;
|
||||
G4Exception("G4HadronElasticProcess::PostStepDoIt", "had003",
|
||||
FatalException, ed);
|
||||
}
|
||||
const G4Element* elm =
|
||||
GetCrossSectionDataStore()->SampleZandA(dynParticle, material, *targNucleus);
|
||||
|
||||
// Initialize the hadronic projectile from the track
|
||||
G4HadProjectile theProj(track);
|
||||
|
||||
@@ -14,6 +14,12 @@ code and to keep track of all tags.
|
||||
* Please list in reverse chronological order (last date on top)
|
||||
---------------------------------------------------------------
|
||||
|
||||
05 February 2020 A. Ribon (hadr-stopping-V10-05-03)
|
||||
--------------------------------------------------------------------
|
||||
- G4MuonicAtomDecay : (applied fix made by Vladimir Ivanchenko on
|
||||
27 January 2020 on the master) fixed Coverity warning by addition
|
||||
of G4Exception.
|
||||
|
||||
06 November 2019 V.Ivanchenko (hadr-stopping-V10-05-02)
|
||||
--------------------------------------------------------------------
|
||||
- G4MuonMinusAtomicCapture - fixed trivial Coverity warning
|
||||
|
||||
@@ -256,6 +256,12 @@ G4VParticleChange* G4MuonicAtomDecay::DecayIt(const G4Track& aTrack,
|
||||
}
|
||||
#endif
|
||||
products = decaychannel->DecayIt(aParticle->GetMass());
|
||||
if(!products) {
|
||||
G4ExceptionDescription ed;
|
||||
ed << "No products are generated for "
|
||||
<< aParticleDef->GetParticleName();
|
||||
G4Exception("G4MuonicAtomDecay::DecayIt","DECAY003",FatalException,ed);
|
||||
}
|
||||
#ifdef G4VERBOSE
|
||||
if (GetVerboseLevel()>1) {
|
||||
decaychannel->SetVerboseLevel(temp);
|
||||
|
||||
@@ -14,7 +14,10 @@ endif
|
||||
# CPPFLAGS += -DG4DEBUG_VIS_OGL
|
||||
|
||||
GLOBLIBS = libG4vis_management.lib libG4modeling.lib libG4gl2ps.lib
|
||||
GLOBLIBS += libG4zlib.lib libG4interfaces.lib libG4run.lib libG4event.lib
|
||||
ifdef G4LIB_BUILD_ZLIB
|
||||
GLOBLIBS += libG4zlib.lib
|
||||
endif
|
||||
GLOBLIBS += libG4interfaces.lib libG4run.lib libG4event.lib
|
||||
GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib
|
||||
GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib
|
||||
GLOBLIBS += libG4materials.lib libG4graphics_reps.lib
|
||||
|
||||
@@ -17,3 +17,11 @@ else()
|
||||
GEANT4_GLOBAL_LIBRARY_TARGET(COMPONENTS sources.cmake)
|
||||
endif()
|
||||
|
||||
# Fix for Inventor not yet supporting usage requirements
|
||||
if(TARGET G4OpenInventor)
|
||||
target_include_directories(G4OpenInventor PUBLIC ${G4VIS_MODULE_OPENINVENTOR_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(TARGET G4OpenInventor-static)
|
||||
target_include_directories(G4OpenInventor-static PUBLIC ${G4VIS_MODULE_OPENINVENTOR_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
@@ -6,7 +6,10 @@ ifndef G4INSTALL
|
||||
endif
|
||||
|
||||
GLOBLIBS = libG4vis_management.lib libG4modeling.lib libG4gl2ps.lib
|
||||
GLOBLIBS += libG4zlib.lib libG4interfaces.lib libG4run.lib libG4event.lib
|
||||
ifdef G4LIB_BUILD_ZLIB
|
||||
GLOBLIBS += libG4zlib.lib
|
||||
endif
|
||||
GLOBLIBS += libG4interfaces.lib libG4run.lib libG4event.lib
|
||||
GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib
|
||||
GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib
|
||||
GLOBLIBS += libG4materials.lib libG4graphics_reps.lib
|
||||
|
||||
@@ -18,6 +18,11 @@ committal in the CVS repository !
|
||||
|
||||
History file for visualization/OpenInventor
|
||||
-------------------------------------------
|
||||
22 January 2020 B.Morgan (openinventor-V10-05-08)
|
||||
- Add include paths to Inventor et al to usage requirements on G4OpenInventor
|
||||
Inventor does not yet support imported targets, and paths added by
|
||||
include_directories are now explicitly removed.
|
||||
Fixes Bugzilla 2215
|
||||
|
||||
23rd October 2019 Ben Morgan (openinventor-V10-05-07)
|
||||
- Remove inclusion of QT_USE_FILE from CMake scripts.
|
||||
|
||||
@@ -40,9 +40,11 @@ include_directories(${CMAKE_SOURCE_DIR}/source/visualization/modeling/include)
|
||||
# Generic Inventor Headers, base library, OpenGL and Geant4 defines
|
||||
#
|
||||
include_directories(${INVENTOR_INCLUDE_DIR})
|
||||
set(G4VIS_MODULE_OPENINVENTOR_INCLUDE_DIRS ${INVENTOR_INCLUDE_DIR})
|
||||
set(G4VIS_MODULE_OPENINVENTOR_LINK_LIBRARIES ${INVENTOR_LIBRARY})
|
||||
|
||||
include_directories(${OPENGL_INCLUDE_DIR})
|
||||
list(APPEND G4VIS_MODULE_OPENINVENTOR_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR})
|
||||
list(APPEND G4VIS_MODULE_OPENINVENTOR_LINK_LIBRARIES ${OPENGL_LIBRARIES})
|
||||
|
||||
add_definitions(-DG4VIS_BUILD_OI_DRIVER)
|
||||
@@ -133,6 +135,10 @@ if(UNIX)
|
||||
# We also need Xm and X11
|
||||
include_directories(${X11_INCLUDE_DIR})
|
||||
include_directories(${MOTIF_INCLUDE_DIR})
|
||||
list(APPEND G4VIS_MODULE_OPENINVENTOR_INCLUDE_DIRS
|
||||
${OPENGL_INCLUDE_DIR}
|
||||
${MOTIF_INCLUDE_DIR}
|
||||
)
|
||||
list(APPEND G4VIS_MODULE_OPENINVENTOR_LINK_LIBRARIES
|
||||
${MOTIF_LIBRARIES}
|
||||
${X11_LIBRARIES}
|
||||
|
||||
+3
-1
@@ -10,7 +10,9 @@ ifndef G4INSTALL
|
||||
G4INSTALL = ../../../..
|
||||
endif
|
||||
|
||||
GLOBLIBS = libG4zlib.lib
|
||||
ifdef G4LIB_BUILD_ZLIB
|
||||
GLOBLIBS = libG4zlib.lib
|
||||
endif
|
||||
|
||||
include $(G4INSTALL)/config/architecture.gmk
|
||||
include $(G4INSTALL)/config/G4VIS_BUILD.gmk
|
||||
|
||||
Reference in New Issue
Block a user