Import Geant4 11.3.0.beta source tree

This commit is contained in:
Gabriele Cosmo
2024-06-28 13:08:51 +02:00
parent f7b23877ed
commit e58e650b32
5232 changed files with 239416 additions and 244360 deletions
@@ -30,18 +30,23 @@
//
#include "B01ActionInitialization.hh"
#include "B01PrimaryGeneratorAction.hh"
#include "B01RunAction.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
B01ActionInitialization::B01ActionInitialization()
{;}
{
;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
B01ActionInitialization::~B01ActionInitialization()
{;}
{
;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -54,11 +59,8 @@ void B01ActionInitialization::BuildForMaster() const
void B01ActionInitialization::Build() const
{
SetUserAction(new B01PrimaryGeneratorAction);
SetUserAction(new B01RunAction);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -29,32 +29,32 @@
//
//
#include "G4Types.hh"
#include <sstream>
#include <set>
#include "globals.hh"
#include "B01DetectorConstruction.hh"
#include "G4Material.hh"
#include "G4Box.hh"
#include "G4Tubs.hh"
#include "G4LogicalVolume.hh"
#include "G4ThreeVector.hh"
#include "G4PVPlacement.hh"
#include "G4VisAttributes.hh"
#include "G4Colour.hh"
#include "G4LogicalVolume.hh"
#include "G4Material.hh"
#include "G4PVPlacement.hh"
#include "G4PhysicalConstants.hh"
#include "G4SystemOfUnits.hh"
#include "G4ThreeVector.hh"
#include "G4Tubs.hh"
#include "G4Types.hh"
#include "G4VisAttributes.hh"
#include "globals.hh"
#include <set>
#include <sstream>
// For Primitive Scorers
#include "G4SDManager.hh"
#include "G4MultiFunctionalDetector.hh"
#include "G4SDParticleFilter.hh"
#include "G4PSNofCollision.hh"
#include "G4PSPopulation.hh"
#include "G4PSTrackCounter.hh"
#include "G4PSTrackLength.hh"
#include "G4SDManager.hh"
#include "G4SDParticleFilter.hh"
// for importance biasing
#include "G4IStore.hh"
@@ -64,10 +64,11 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
B01DetectorConstruction::B01DetectorConstruction() :
G4VUserDetectorConstruction(),
fLogicalVolumeVector(),fPhysicalVolumeVector()
{;}
B01DetectorConstruction::B01DetectorConstruction()
: G4VUserDetectorConstruction(), fLogicalVolumeVector(), fPhysicalVolumeVector()
{
;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -83,7 +84,7 @@ G4VPhysicalVolume* B01DetectorConstruction::Construct()
{
G4double pos_x;
G4double pos_y;
G4double pos_z;
G4double pos_z;
G4double density, pressure, temperature;
G4double A;
@@ -93,55 +94,54 @@ G4VPhysicalVolume* B01DetectorConstruction::Construct()
G4double z;
G4double fractionmass;
A = 1.01*g/mole;
G4Element* elH = new G4Element(name="Hydrogen",symbol="H" , Z= 1, A);
A = 1.01 * g / mole;
G4Element* elH = new G4Element(name = "Hydrogen", symbol = "H", Z = 1, A);
A = 12.01*g/mole;
G4Element* elC = new G4Element(name="Carbon" ,symbol="C" , Z = 6, A);
A = 12.01 * g / mole;
G4Element* elC = new G4Element(name = "Carbon", symbol = "C", Z = 6, A);
A = 16.00*g/mole;
G4Element* elO = new G4Element(name="Oxygen" ,symbol="O" , Z= 8, A);
A = 16.00 * g / mole;
G4Element* elO = new G4Element(name = "Oxygen", symbol = "O", Z = 8, A);
A = 22.99*g/mole;
G4Element* elNa = new G4Element(name="Natrium" ,symbol="Na" , Z=11 , A);
A = 22.99 * g / mole;
G4Element* elNa = new G4Element(name = "Natrium", symbol = "Na", Z = 11, A);
A = 200.59*g/mole;
G4Element* elHg = new G4Element(name="Hg" ,symbol="Hg" , Z=80, A);
A = 200.59 * g / mole;
G4Element* elHg = new G4Element(name = "Hg", symbol = "Hg", Z = 80, A);
A = 26.98*g/mole;
G4Element* elAl = new G4Element(name="Aluminium" ,symbol="Al" , Z=13, A);
A = 26.98 * g / mole;
G4Element* elAl = new G4Element(name = "Aluminium", symbol = "Al", Z = 13, A);
A = 28.09*g/mole;
G4Element* elSi = new G4Element(name="Silicon", symbol="Si", Z=14, A);
A = 28.09 * g / mole;
G4Element* elSi = new G4Element(name = "Silicon", symbol = "Si", Z = 14, A);
A = 39.1*g/mole;
G4Element* elK = new G4Element(name="K" ,symbol="K" , Z=19 , A);
A = 39.1 * g / mole;
G4Element* elK = new G4Element(name = "K", symbol = "K", Z = 19, A);
A = 69.72*g/mole;
G4Element* elCa = new G4Element(name="Calzium" ,symbol="Ca" , Z=31 , A);
A = 69.72 * g / mole;
G4Element* elCa = new G4Element(name = "Calzium", symbol = "Ca", Z = 31, A);
A = 55.85*g/mole;
G4Element* elFe = new G4Element(name="Iron" ,symbol="Fe", Z=26, A);
A = 55.85 * g / mole;
G4Element* elFe = new G4Element(name = "Iron", symbol = "Fe", Z = 26, A);
density = universe_mean_density; //from PhysicalConstants.h
pressure = 3.e-18*pascal;
temperature = 2.73*kelvin;
G4Material *Galactic =
new G4Material(name="Galactic", z=1., A=1.01*g/mole, density,
kStateGas,temperature,pressure);
density = universe_mean_density; // from PhysicalConstants.h
pressure = 3.e-18 * pascal;
temperature = 2.73 * kelvin;
G4Material* Galactic = new G4Material(name = "Galactic", z = 1., A = 1.01 * g / mole, density,
kStateGas, temperature, pressure);
density = 2.03*g/cm3;
density = 2.03 * g / cm3;
G4Material* Concrete = new G4Material("Concrete", density, 10);
Concrete->AddElement(elH , fractionmass= 0.01);
Concrete->AddElement(elO , fractionmass= 0.529);
Concrete->AddElement(elNa , fractionmass= 0.016);
Concrete->AddElement(elHg , fractionmass= 0.002);
Concrete->AddElement(elAl , fractionmass= 0.034);
Concrete->AddElement(elSi , fractionmass= 0.337);
Concrete->AddElement(elK , fractionmass= 0.013);
Concrete->AddElement(elCa , fractionmass= 0.044);
Concrete->AddElement(elFe , fractionmass= 0.014);
Concrete->AddElement(elC , fractionmass= 0.001);
Concrete->AddElement(elH, fractionmass = 0.01);
Concrete->AddElement(elO, fractionmass = 0.529);
Concrete->AddElement(elNa, fractionmass = 0.016);
Concrete->AddElement(elHg, fractionmass = 0.002);
Concrete->AddElement(elAl, fractionmass = 0.034);
Concrete->AddElement(elSi, fractionmass = 0.337);
Concrete->AddElement(elK, fractionmass = 0.013);
Concrete->AddElement(elCa, fractionmass = 0.044);
Concrete->AddElement(elFe, fractionmass = 0.014);
Concrete->AddElement(elC, fractionmass = 0.001);
/////////////////////////////
// world cylinder volume
@@ -149,111 +149,83 @@ G4VPhysicalVolume* B01DetectorConstruction::Construct()
// world solid
G4double innerRadiusCylinder = 0*cm;
G4double outerRadiusCylinder = 100*cm;
G4double heightCylinder = 100*cm;
G4double startAngleCylinder = 0*deg;
G4double spanningAngleCylinder = 360*deg;
G4double innerRadiusCylinder = 0 * cm;
G4double outerRadiusCylinder = 100 * cm;
G4double heightCylinder = 100 * cm;
G4double startAngleCylinder = 0 * deg;
G4double spanningAngleCylinder = 360 * deg;
G4Tubs *worldCylinder = new G4Tubs("worldCylinder",
innerRadiusCylinder,
outerRadiusCylinder,
heightCylinder,
startAngleCylinder,
spanningAngleCylinder);
G4Tubs* worldCylinder = new G4Tubs("worldCylinder", innerRadiusCylinder, outerRadiusCylinder,
heightCylinder, startAngleCylinder, spanningAngleCylinder);
// logical world
G4LogicalVolume *worldCylinder_log =
G4LogicalVolume* worldCylinder_log =
new G4LogicalVolume(worldCylinder, Galactic, "worldCylinder_log");
fLogicalVolumeVector.push_back(worldCylinder_log);
fLogicalVolumeVector.push_back(worldCylinder_log);
name = "shieldWorld";
fWorldVolume = new
G4PVPlacement(0, G4ThreeVector(0,0,0), worldCylinder_log,
name, 0, false, 0);
fWorldVolume = new G4PVPlacement(0, G4ThreeVector(0, 0, 0), worldCylinder_log, name, 0, false, 0);
fPhysicalVolumeVector.push_back(fWorldVolume);
// creating 18 slabs of 10 cm thick concrete
G4double innerRadiusShield = 0*cm;
G4double outerRadiusShield = 100*cm;
G4double heightShield = 5*cm;
G4double startAngleShield = 0*deg;
G4double spanningAngleShield = 360*deg;
G4double innerRadiusShield = 0 * cm;
G4double outerRadiusShield = 100 * cm;
G4double heightShield = 5 * cm;
G4double startAngleShield = 0 * deg;
G4double spanningAngleShield = 360 * deg;
G4Tubs* aShield = new G4Tubs("aShield", innerRadiusShield, outerRadiusShield, heightShield,
startAngleShield, spanningAngleShield);
G4Tubs *aShield = new G4Tubs("aShield",
innerRadiusShield,
outerRadiusShield,
heightShield,
startAngleShield,
spanningAngleShield);
// logical shield
G4LogicalVolume *aShield_log =
new G4LogicalVolume(aShield, Concrete, "aShield_log");
G4LogicalVolume* aShield_log = new G4LogicalVolume(aShield, Concrete, "aShield_log");
fLogicalVolumeVector.push_back(aShield_log);
G4VisAttributes* pShieldVis = new G4VisAttributes(G4Colour(0.0,0.0,1.0));
G4VisAttributes* pShieldVis = new G4VisAttributes(G4Colour(0.0, 0.0, 1.0));
pShieldVis->SetForceSolid(true);
aShield_log->SetVisAttributes(pShieldVis);
// physical shields
G4int i;
G4double startz = -85*cm;
for (i=1; i<=18; i++)
{
G4double startz = -85 * cm;
for (i = 1; i <= 18; i++) {
name = GetCellName(i);
pos_x = 0*cm;
pos_y = 0*cm;
pos_z = startz + (i-1) * (2*heightShield);
G4VPhysicalVolume *pvol =
new G4PVPlacement(0,
G4ThreeVector(pos_x, pos_y, pos_z),
aShield_log,
name,
worldCylinder_log,
false,
i);
pos_x = 0 * cm;
pos_y = 0 * cm;
pos_z = startz + (i - 1) * (2 * heightShield);
G4VPhysicalVolume* pvol = new G4PVPlacement(0, G4ThreeVector(pos_x, pos_y, pos_z), aShield_log,
name, worldCylinder_log, false, i);
fPhysicalVolumeVector.push_back(pvol);
}
// filling the rest of the world volume behind the concrete with
// another slab which should get the same importance value
// another slab which should get the same importance value
// or lower weight bound as the last slab
//
innerRadiusShield = 0*cm;
outerRadiusShield = 100*cm;
heightShield = 5*cm;
startAngleShield = 0*deg;
spanningAngleShield = 360*deg;
innerRadiusShield = 0 * cm;
outerRadiusShield = 100 * cm;
heightShield = 5 * cm;
startAngleShield = 0 * deg;
spanningAngleShield = 360 * deg;
G4Tubs *aRest = new G4Tubs("Rest",
innerRadiusShield,
outerRadiusShield,
heightShield,
startAngleShield,
spanningAngleShield);
G4LogicalVolume *aRest_log =
new G4LogicalVolume(aRest, Galactic, "aRest_log");
G4Tubs* aRest = new G4Tubs("Rest", innerRadiusShield, outerRadiusShield, heightShield,
startAngleShield, spanningAngleShield);
G4LogicalVolume* aRest_log = new G4LogicalVolume(aRest, Galactic, "aRest_log");
fLogicalVolumeVector.push_back(aRest_log);
name = "rest";
pos_x = 0*cm;
pos_y = 0*cm;
pos_z = 95*cm;
G4VPhysicalVolume *pvol_rest =
new G4PVPlacement(0,
G4ThreeVector(pos_x, pos_y, pos_z),
aRest_log,
name,
worldCylinder_log,
false,
19); // i=19
pos_x = 0 * cm;
pos_y = 0 * cm;
pos_z = 95 * cm;
G4VPhysicalVolume* pvol_rest = new G4PVPlacement(0, G4ThreeVector(pos_x, pos_y, pos_z), aRest_log,
name, worldCylinder_log, false,
19); // i=19
fPhysicalVolumeVector.push_back(pvol_rest);
@@ -266,86 +238,77 @@ G4VPhysicalVolume* B01DetectorConstruction::Construct()
G4VIStore* B01DetectorConstruction::CreateImportanceStore()
{
G4cout << " B01DetectorConstruction:: Creating Importance Store " << G4endl;
if (!fPhysicalVolumeVector.size())
{
G4Exception("B01DetectorConstruction::CreateImportanceStore"
,"exampleB01_0001",RunMustBeAborted
,"no physical volumes created yet!");
if (!fPhysicalVolumeVector.size()) {
G4Exception("B01DetectorConstruction::CreateImportanceStore", "exampleB01_0001",
RunMustBeAborted, "no physical volumes created yet!");
}
fWorldVolume = fPhysicalVolumeVector[0];
// creating and filling the importance store
G4IStore *istore = G4IStore::GetInstance();
G4IStore* istore = G4IStore::GetInstance();
G4int n = 0;
G4double imp =1;
istore->AddImportanceGeometryCell(1, *fWorldVolume);
for (std::vector<G4VPhysicalVolume *>::iterator
it = fPhysicalVolumeVector.begin();
G4double imp = 1;
istore->AddImportanceGeometryCell(1, *fWorldVolume);
for (std::vector<G4VPhysicalVolume*>::iterator it = fPhysicalVolumeVector.begin();
it != fPhysicalVolumeVector.end() - 1; it++)
{
if (*it != fWorldVolume)
{
if (*it != fWorldVolume) {
imp = std::pow(2., n++);
G4cout << "Going to assign importance: " << imp << ", to volume: "
<< (*it)->GetName() << G4endl;
istore->AddImportanceGeometryCell(imp, *(*it),n);
G4cout << "Going to assign importance: " << imp << ", to volume: " << (*it)->GetName()
<< G4endl;
istore->AddImportanceGeometryCell(imp, *(*it), n);
}
}
// the remaining part pf the geometry (rest) gets the same
// importance as the last conrete cell
//
istore->AddImportanceGeometryCell(imp,
*(fPhysicalVolumeVector[fPhysicalVolumeVector.size()-1]),++n);
istore->AddImportanceGeometryCell(imp, *(fPhysicalVolumeVector[fPhysicalVolumeVector.size() - 1]),
++n);
return istore;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4VWeightWindowStore *B01DetectorConstruction::CreateWeightWindowStore()
G4VWeightWindowStore* B01DetectorConstruction::CreateWeightWindowStore()
{
if (!fPhysicalVolumeVector.size())
{
G4Exception("B01DetectorConstruction::CreateWeightWindowStore"
,"exampleB01_0002",RunMustBeAborted
,"no physical volumes created yet!");
if (!fPhysicalVolumeVector.size()) {
G4Exception("B01DetectorConstruction::CreateWeightWindowStore", "exampleB01_0002",
RunMustBeAborted, "no physical volumes created yet!");
}
fWorldVolume = fPhysicalVolumeVector[0];
// creating and filling the weight window store
G4WeightWindowStore *wwstore = G4WeightWindowStore::GetInstance();
G4WeightWindowStore* wwstore = G4WeightWindowStore::GetInstance();
// create one energy region covering the energies of the problem
//
std::set<G4double, std::less<G4double> > enBounds;
std::set<G4double, std::less<G4double>> enBounds;
enBounds.insert(1 * GeV);
wwstore->SetGeneralUpperEnergyBounds(enBounds);
G4int n = 0;
G4double lowerWeight =1;
G4double lowerWeight = 1;
std::vector<G4double> lowerWeights;
lowerWeights.push_back(1);
G4GeometryCell gWorldCell(*fWorldVolume,0);
G4GeometryCell gWorldCell(*fWorldVolume, 0);
wwstore->AddLowerWeights(gWorldCell, lowerWeights);
for (std::vector<G4VPhysicalVolume *>::iterator
it = fPhysicalVolumeVector.begin();
for (std::vector<G4VPhysicalVolume*>::iterator it = fPhysicalVolumeVector.begin();
it != fPhysicalVolumeVector.end() - 1; it++)
{
if (*it != fWorldVolume)
{
lowerWeight = 1./std::pow(2., n++);
G4cout << "Going to assign lower weight: " << lowerWeight
<< ", to volume: "
<< (*it)->GetName() << G4endl;
G4GeometryCell gCell(*(*it),n);
if (*it != fWorldVolume) {
lowerWeight = 1. / std::pow(2., n++);
G4cout << "Going to assign lower weight: " << lowerWeight
<< ", to volume: " << (*it)->GetName() << G4endl;
G4GeometryCell gCell(*(*it), n);
lowerWeights.clear();
lowerWeights.push_back(lowerWeight);
wwstore->AddLowerWeights(gCell, lowerWeights);
@@ -355,9 +318,8 @@ G4VWeightWindowStore *B01DetectorConstruction::CreateWeightWindowStore()
// the remaining part pf the geometry (rest) gets the same
// lower weight bound as the last conrete cell
//
G4GeometryCell
gRestCell(*(fPhysicalVolumeVector[fPhysicalVolumeVector.size()-1]), ++n);
wwstore->AddLowerWeights(gRestCell, lowerWeights);
G4GeometryCell gRestCell(*(fPhysicalVolumeVector[fPhysicalVolumeVector.size() - 1]), ++n);
wwstore->AddLowerWeights(gRestCell, lowerWeights);
return wwstore;
}
@@ -368,23 +330,23 @@ G4String B01DetectorConstruction::GetCellName(G4int i)
{
std::ostringstream os;
os << "cell_";
if (i<10)
{
if (i < 10) {
os << "0";
}
os << i ;
os << i;
G4String name = os.str();
return name;
}
G4VPhysicalVolume *B01DetectorConstruction::GetWorldVolume() {
return fWorldVolume;
G4VPhysicalVolume* B01DetectorConstruction::GetWorldVolume()
{
return fWorldVolume;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void B01DetectorConstruction::SetSensitive(){
void B01DetectorConstruction::SetSensitive()
{
// -------------------------------------------------
// The collection names of defined Primitives are
// 0 ConcreteSD/Collisions
@@ -399,14 +361,12 @@ void B01DetectorConstruction::SetSensitive(){
// -------------------------------------------------
// moved to ConstructSDandField() for MT compliance
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void B01DetectorConstruction::ConstructSDandField()
{
// Sensitive Detector Manager.
G4SDManager* SDman = G4SDManager::GetSDMpointer();
// Sensitive Detector Name
@@ -417,61 +377,58 @@ void B01DetectorConstruction::ConstructSDandField()
//------------------------
//
// Define MultiFunctionalDetector with name.
G4MultiFunctionalDetector* MFDet =
new G4MultiFunctionalDetector(concreteSDname);
SDman->AddNewDetector( MFDet ); // Register SD to SDManager
G4MultiFunctionalDetector* MFDet = new G4MultiFunctionalDetector(concreteSDname);
SDman->AddNewDetector(MFDet); // Register SD to SDManager
G4String fltName,particleName;
G4SDParticleFilter* neutronFilter =
new G4SDParticleFilter(fltName="neutronFilter", particleName="neutron");
G4String fltName, particleName;
G4SDParticleFilter* neutronFilter =
new G4SDParticleFilter(fltName = "neutronFilter", particleName = "neutron");
MFDet->SetFilter(neutronFilter);
for (std::vector<G4LogicalVolume *>::iterator it =
fLogicalVolumeVector.begin();
it != fLogicalVolumeVector.end(); it++){
for (std::vector<G4LogicalVolume*>::iterator it = fLogicalVolumeVector.begin();
it != fLogicalVolumeVector.end(); it++)
{
// (*it)->SetSensitiveDetector(MFDet);
SetSensitiveDetector((*it)->GetName(), MFDet);
SetSensitiveDetector((*it)->GetName(), MFDet);
}
G4String psName;
G4PSNofCollision* scorer0 = new G4PSNofCollision(psName="Collisions");
G4PSNofCollision* scorer0 = new G4PSNofCollision(psName = "Collisions");
MFDet->RegisterPrimitive(scorer0);
G4PSNofCollision* scorer1 = new G4PSNofCollision(psName="CollWeight");
G4PSNofCollision* scorer1 = new G4PSNofCollision(psName = "CollWeight");
scorer1->Weighted(true);
MFDet->RegisterPrimitive(scorer1);
G4PSPopulation* scorer2 = new G4PSPopulation(psName="Population");
G4PSPopulation* scorer2 = new G4PSPopulation(psName = "Population");
MFDet->RegisterPrimitive(scorer2);
G4PSTrackCounter* scorer3 = new G4PSTrackCounter(psName="TrackEnter"
,fCurrent_In);
G4PSTrackCounter* scorer3 = new G4PSTrackCounter(psName = "TrackEnter", fCurrent_In);
MFDet->RegisterPrimitive(scorer3);
G4PSTrackLength* scorer4 = new G4PSTrackLength(psName="SL");
G4PSTrackLength* scorer4 = new G4PSTrackLength(psName = "SL");
MFDet->RegisterPrimitive(scorer4);
G4PSTrackLength* scorer5 = new G4PSTrackLength(psName="SLW");
G4PSTrackLength* scorer5 = new G4PSTrackLength(psName = "SLW");
scorer5->Weighted(true);
MFDet->RegisterPrimitive(scorer5);
G4PSTrackLength* scorer6 = new G4PSTrackLength(psName="SLWE");
G4PSTrackLength* scorer6 = new G4PSTrackLength(psName = "SLWE");
scorer6->Weighted(true);
scorer6->MultiplyKineticEnergy(true);
MFDet->RegisterPrimitive(scorer6);
G4PSTrackLength* scorer7 = new G4PSTrackLength(psName="SLW_V");
G4PSTrackLength* scorer7 = new G4PSTrackLength(psName = "SLW_V");
scorer7->Weighted(true);
scorer7->DivideByVelocity(true);
MFDet->RegisterPrimitive(scorer7);
G4PSTrackLength* scorer8 = new G4PSTrackLength(psName="SLWE_V");
G4PSTrackLength* scorer8 = new G4PSTrackLength(psName = "SLWE_V");
scorer8->Weighted(true);
scorer8->MultiplyKineticEnergy(true);
scorer8->DivideByVelocity(true);
MFDet->RegisterPrimitive(scorer8);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -29,26 +29,25 @@
//
//
#include "globals.hh"
#include "B01PrimaryGeneratorAction.hh"
#include "G4Event.hh"
#include "G4ParticleGun.hh"
#include "G4Neutron.hh"
#include "G4ThreeVector.hh"
#include "G4ParticleGun.hh"
#include "G4SystemOfUnits.hh"
#include "G4ThreeVector.hh"
#include "globals.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
B01PrimaryGeneratorAction::B01PrimaryGeneratorAction() :
G4VUserPrimaryGeneratorAction(), fParticleGun(0)
B01PrimaryGeneratorAction::B01PrimaryGeneratorAction()
: G4VUserPrimaryGeneratorAction(), fParticleGun(0)
{
G4int n_particle = 1;
fParticleGun = new G4ParticleGun(n_particle);
fParticleGun->SetParticleDefinition(G4Neutron::NeutronDefinition());
fParticleGun->SetParticleEnergy(10.0*MeV);
fParticleGun->SetParticlePosition(G4ThreeVector(0.0, 0.0, -90.0005*cm));
fParticleGun->SetParticleEnergy(10.0 * MeV);
fParticleGun->SetParticlePosition(G4ThreeVector(0.0, 0.0, -90.0005 * cm));
fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.0, 0.0, 1.0));
}
+65 -70
View File
@@ -32,7 +32,7 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// (Description)
// B01Run Class is for accumulating scored quantities which is
// B01Run Class is for accumulating scored quantities which is
// scored using G4MutiFunctionalDetector and G4VPrimitiveScorer.
// Accumulation is done using G4THitsMap object.
//
@@ -41,10 +41,10 @@
// was assigned at instantiation of MultiFunctionalDetector(MFD).
// Then B01Run constructor automatically scans primitive scorers
// in the MFD, and obtains collectionIDs of all collections associated
// to those primitive scorers. Futhermore, the G4THitsMap objects
// to those primitive scorers. Futhermore, the G4THitsMap objects
// for accumulating during a RUN are automatically created too.
// (*) Collection Name is same as primitive scorer name.
//
//
// The resultant information is kept inside B01Run objects as
// data members.
// std::vector<G4String> fCollName; // Collection Name,
@@ -57,16 +57,16 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "B01Run.hh"
#include "G4SDManager.hh"
#include "G4MultiFunctionalDetector.hh"
#include "G4SDManager.hh"
#include "G4VPrimitiveScorer.hh"
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// Constructor.
// Constructor.
// (The vector of MultiFunctionalDetector name has to given.)
B01Run::B01Run(const std::vector<G4String> mfdName): G4Run()
B01Run::B01Run(const std::vector<G4String> mfdName) : G4Run()
{
G4SDManager* SDman = G4SDManager::GetSDMpointer();
//=================================================
@@ -74,38 +74,36 @@ B01Run::B01Run(const std::vector<G4String> mfdName): G4Run()
// Get CollectionIDs for HitCollections.
//=================================================
G4int Nmfd = mfdName.size();
for ( G4int idet = 0; idet < Nmfd ; idet++){ // Loop for all MFD.
for (G4int idet = 0; idet < Nmfd; idet++) { // Loop for all MFD.
G4String detName = mfdName[idet];
//--- Seek and Obtain MFD objects from SDmanager.
G4MultiFunctionalDetector* mfd =
(G4MultiFunctionalDetector*)(SDman->FindSensitiveDetector(detName));
//
if ( mfd ){
//--- Loop over the registered primitive scorers.
for (G4int icol = 0; icol < mfd->GetNumberOfPrimitives(); icol++){
// Get Primitive Scorer object.
G4VPrimitiveScorer* scorer=mfd->GetPrimitive(icol);
// collection name and collectionID for HitsCollection,
// where type of HitsCollection is G4THitsMap in case of primitive scorer.
// The collection name is given by <MFD name>/<Primitive Scorer name>.
G4String collectionName = scorer->GetName();
G4String fullCollectionName = detName+"/"+collectionName;
G4int collectionID = SDman->GetCollectionID(fullCollectionName);
if (mfd) {
//--- Loop over the registered primitive scorers.
for (G4int icol = 0; icol < mfd->GetNumberOfPrimitives(); icol++) {
// Get Primitive Scorer object.
G4VPrimitiveScorer* scorer = mfd->GetPrimitive(icol);
// collection name and collectionID for HitsCollection,
// where type of HitsCollection is G4THitsMap in case of primitive scorer.
// The collection name is given by <MFD name>/<Primitive Scorer name>.
G4String collectionName = scorer->GetName();
G4String fullCollectionName = detName + "/" + collectionName;
G4int collectionID = SDman->GetCollectionID(fullCollectionName);
if ( collectionID >= 0 ){
G4cout << "++ "<<fullCollectionName<< " id " << collectionID
<< G4endl;
// Store obtained HitsCollection information into data members.
// And, creates new G4THitsMap for accumulating quantities during RUN.
fCollName.push_back(fullCollectionName);
fCollID.push_back(collectionID);
fRunMap.push_back(new G4THitsMap<G4double>(detName
,collectionName));
}else{
G4cout << "** collection " << fullCollectionName
<< " not found. "<<G4endl;
}
if (collectionID >= 0) {
G4cout << "++ " << fullCollectionName << " id " << collectionID << G4endl;
// Store obtained HitsCollection information into data members.
// And, creates new G4THitsMap for accumulating quantities during RUN.
fCollName.push_back(fullCollectionName);
fCollID.push_back(collectionID);
fRunMap.push_back(new G4THitsMap<G4double>(detName, collectionName));
}
else {
G4cout << "** collection " << fullCollectionName << " not found. " << G4endl;
}
}
}
}
}
@@ -118,8 +116,8 @@ B01Run::~B01Run()
{
//--- Clear HitsMap for RUN
G4int Nmap = fRunMap.size();
for ( G4int i = 0; i < Nmap; i++){
if(fRunMap[i] ) fRunMap[i]->clear();
for (G4int i = 0; i < Nmap; i++) {
if (fRunMap[i]) fRunMap[i]->clear();
}
fCollName.clear();
fCollID.clear();
@@ -145,21 +143,20 @@ void B01Run::RecordEvent(const G4Event* aEvent)
// Sum up HitsMap of this Event into HitsMap of this RUN
//=======================================================
G4int Ncol = fCollID.size();
for ( G4int i = 0; i < Ncol ; i++ ){ // Loop over HitsCollection
G4THitsMap<G4double>* EvtMap=0;
if ( fCollID[i] >= 0 ){ // Collection is attached to HCE
for (G4int i = 0; i < Ncol; i++) { // Loop over HitsCollection
G4THitsMap<G4double>* EvtMap = 0;
if (fCollID[i] >= 0) { // Collection is attached to HCE
EvtMap = (G4THitsMap<G4double>*)(HCE->GetHC(fCollID[i]));
}else{
G4cout <<" Error EvtMap Not Found "<< i << G4endl;
}
if ( EvtMap ) {
else {
G4cout << " Error EvtMap Not Found " << i << G4endl;
}
if (EvtMap) {
//=== Sum up HitsMap of this event to HitsMap of RUN.===
*fRunMap[i] += *EvtMap;
//======================================================
}
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -169,46 +166,45 @@ void B01Run::RecordEvent(const G4Event* aEvent)
//-----
// Access HitsMap.
// By MultiFunctionalDetector name and Collection Name.
G4THitsMap<G4double>* B01Run::GetHitsMap(const G4String& detName,
const G4String& colName){
G4String fullName = detName+"/"+colName;
return GetHitsMap(fullName);
G4THitsMap<G4double>* B01Run::GetHitsMap(const G4String& detName, const G4String& colName)
{
G4String fullName = detName + "/" + colName;
return GetHitsMap(fullName);
}
//-----
// Access HitsMap.
// By full description of collection name, that is
// <MultiFunctional Detector Name>/<Primitive Scorer Name>
G4THitsMap<G4double>* B01Run::GetHitsMap(const G4String& fullName){
G4int Ncol = fCollName.size();
for ( G4int i = 0; i < Ncol; i++){
if ( fCollName[i] == fullName ){
return fRunMap[i];
}
G4THitsMap<G4double>* B01Run::GetHitsMap(const G4String& fullName)
{
G4int Ncol = fCollName.size();
for (G4int i = 0; i < Ncol; i++) {
if (fCollName[i] == fullName) {
return fRunMap[i];
}
return NULL;
}
return NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// - Dump All HitsMap of this RUN. (for debuging and monitoring of quantity).
// This method calls G4THisMap::PrintAll() for individual HitsMap.
void B01Run::DumpAllScorer(){
void B01Run::DumpAllScorer()
{
// - Number of HitsMap in this RUN.
G4int n = GetNumberOfHitsMap();
// - GetHitsMap and dump values.
for ( G4int i = 0; i < n ; i++ ){
G4THitsMap<G4double>* RunMap =GetHitsMap(i);
if ( RunMap ) {
G4cout << " PrimitiveScorer RUN "
<< RunMap->GetSDname() <<","<< RunMap->GetName() << G4endl;
for (G4int i = 0; i < n; i++) {
G4THitsMap<G4double>* RunMap = GetHitsMap(i);
if (RunMap) {
G4cout << " PrimitiveScorer RUN " << RunMap->GetSDname() << "," << RunMap->GetName()
<< G4endl;
G4cout << " Number of entries " << RunMap->entries() << G4endl;
std::map<G4int,G4double*>::iterator itr = RunMap->GetMap()->begin();
for(; itr != RunMap->GetMap()->end(); itr++) {
G4cout << " copy no.: " << itr->first
<< " Run Value : " << *(itr->second)
<< G4endl;
std::map<G4int, G4double*>::iterator itr = RunMap->GetMap()->begin();
for (; itr != RunMap->GetMap()->end(); itr++) {
G4cout << " copy no.: " << itr->first << " Run Value : " << *(itr->second) << G4endl;
}
}
}
@@ -218,19 +214,18 @@ void B01Run::DumpAllScorer(){
void B01Run::Merge(const G4Run* aRun)
{
const B01Run * localRun = static_cast<const B01Run *>(aRun);
const B01Run* localRun = static_cast<const B01Run*>(aRun);
//=======================================================
// Merge HitsMap of working threads
//=======================================================
G4int nCol = localRun->fCollID.size();
for ( G4int i = 0; i < nCol ; i++ ){ // Loop over HitsCollection
if ( localRun->fCollID[i] >= 0 ){
for (G4int i = 0; i < nCol; i++) { // Loop over HitsCollection
if (localRun->fCollID[i] >= 0) {
*fRunMap[i] += *localRun->fRunMap[i];
}
}
G4Run::Merge(aRun);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+83 -105
View File
@@ -27,30 +27,31 @@
/// \brief Implementation of the B01RunAction class
//
//
//
//
#include "B01RunAction.hh"
#include "B01Run.hh"
//-- In order to obtain detector information.
#include "G4RunManager.hh"
#include "B01DetectorConstruction.hh"
#include "G4THitsMap.hh"
#include "G4RunManager.hh"
#include "G4THitsMap.hh"
#include "G4UnitsTable.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// B01RunAction
//
//
//
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// Constructor
B01RunAction::B01RunAction():
G4UserRunAction(),
// fFieldName(15),
fFieldValue(14)
B01RunAction::B01RunAction()
: G4UserRunAction(),
// fFieldName(15),
fFieldValue(14)
{
// - Prepare data member for B01Run.
// vector represents a list of MultiFunctionalDetector names.
@@ -86,7 +87,7 @@ void B01RunAction::BeginOfRunAction(const G4Run* aRun)
void B01RunAction::EndOfRunAction(const G4Run* aRun)
{
G4cout << " ###### EndOfRunAction " <<G4endl;
G4cout << " ###### EndOfRunAction " << G4endl;
//- B01Run object.
B01Run* b01Run = (B01Run*)aRun;
//--- Dump all socred quantities involved in B01Run.
@@ -94,13 +95,12 @@ void B01RunAction::EndOfRunAction(const G4Run* aRun)
//---
G4RunManager* mgr = G4RunManager::GetRunManager();
//
for ( G4int i = 0; i < (G4int)fSDName.size(); i++ ){
const G4VUserDetectorConstruction* vdet =
mgr->GetUserDetectorConstruction();
for (G4int i = 0; i < (G4int)fSDName.size(); i++) {
const G4VUserDetectorConstruction* vdet = mgr->GetUserDetectorConstruction();
B01DetectorConstruction* bdet = (B01DetectorConstruction*)vdet;
//
//---------------------------------------------
// Dump accumulated quantities for this RUN.
// (Display only central region of x-y plane)
@@ -114,94 +114,73 @@ void B01RunAction::EndOfRunAction(const G4Run* aRun)
// 7 ConcreteSD/SLW_V
// 8 ConcreteSD/SLWE_V
//---------------------------------------------
G4THitsMap<G4double>* Collisions =
b01Run->GetHitsMap(fSDName[i]+"/Collisions");
G4THitsMap<G4double>* CollWeight =
b01Run->GetHitsMap(fSDName[i]+"/CollWeight");
G4THitsMap<G4double>* Population =
b01Run->GetHitsMap(fSDName[i]+"/Population");
G4THitsMap<G4double>* TrackEnter =
b01Run->GetHitsMap(fSDName[i]+"/TrackEnter");
G4THitsMap<G4double>* SL = b01Run->GetHitsMap(fSDName[i]+"/SL");
G4THitsMap<G4double>* SLW = b01Run->GetHitsMap(fSDName[i]+"/SLW");
G4THitsMap<G4double>* SLWE = b01Run->GetHitsMap(fSDName[i]+"/SLWE");
G4THitsMap<G4double>* SLW_V = b01Run->GetHitsMap(fSDName[i]+"/SLW_V");
G4THitsMap<G4double>* SLWE_V = b01Run->GetHitsMap(fSDName[i]+"/SLWE_V");
G4THitsMap<G4double>* Collisions = b01Run->GetHitsMap(fSDName[i] + "/Collisions");
G4THitsMap<G4double>* CollWeight = b01Run->GetHitsMap(fSDName[i] + "/CollWeight");
G4THitsMap<G4double>* Population = b01Run->GetHitsMap(fSDName[i] + "/Population");
G4THitsMap<G4double>* TrackEnter = b01Run->GetHitsMap(fSDName[i] + "/TrackEnter");
G4THitsMap<G4double>* SL = b01Run->GetHitsMap(fSDName[i] + "/SL");
G4THitsMap<G4double>* SLW = b01Run->GetHitsMap(fSDName[i] + "/SLW");
G4THitsMap<G4double>* SLWE = b01Run->GetHitsMap(fSDName[i] + "/SLWE");
G4THitsMap<G4double>* SLW_V = b01Run->GetHitsMap(fSDName[i] + "/SLW_V");
G4THitsMap<G4double>* SLWE_V = b01Run->GetHitsMap(fSDName[i] + "/SLWE_V");
if (IsMaster())
{
G4cout <<
"\n--------------------End of Global Run-----------------------" <<
G4endl;
G4cout <<
" Number of event processed : "<< aRun->GetNumberOfEvent() << G4endl;
}
else
{
G4cout <<
"\n--------------------End of Local Run------------------------" <<
G4endl;
G4cout <<
" Number of event processed : "<< aRun->GetNumberOfEvent() << G4endl;
}
G4cout << "============================================================="
<<G4endl;
G4cout << "============================================================="
<<G4endl;
if (IsMaster()) {
G4cout << "\n--------------------End of Global Run-----------------------" << G4endl;
G4cout << " Number of event processed : " << aRun->GetNumberOfEvent() << G4endl;
}
else {
G4cout << "\n--------------------End of Local Run------------------------" << G4endl;
G4cout << " Number of event processed : " << aRun->GetNumberOfEvent() << G4endl;
}
std::ostream *myout = &G4cout;
G4cout << "=============================================================" << G4endl;
G4cout << "=============================================================" << G4endl;
std::ostream* myout = &G4cout;
PrintHeader(myout);
for ( G4int iz = 0; iz < 20; iz++){
for (G4int iz = 0; iz < 20; iz++) {
G4double* SumCollisions = (*Collisions)[iz];
G4double* SumCollWeight = (*CollWeight)[iz];
G4double* Populations = (*Population)[iz];
G4double* TrackEnters = (*TrackEnter)[iz];
G4double* SLs = (*SL)[iz];
G4double* SLWs = (*SLW)[iz];
G4double* SLWEs = (*SLWE)[iz];
G4double* SLW_Vs = (*SLW_V)[iz];
G4double* SLWE_Vs = (*SLWE_V)[iz];
if ( !SumCollisions ) SumCollisions = new G4double(0.0);
if ( !SumCollWeight ) SumCollWeight = new G4double(0.0);
if ( !Populations ) Populations = new G4double(0.0);
if ( !TrackEnters ) TrackEnters = new G4double(0.0);
if ( !SLs ) SLs = new G4double(0.0);
if ( !SLWs ) SLWs = new G4double(0.0);
if ( !SLWEs ) SLWEs = new G4double(0.0);
if ( !SLW_Vs ) SLW_Vs = new G4double(0.0);
if ( !SLWE_Vs ) SLWE_Vs = new G4double(0.0);
G4double NumWeightedEnergy =0.0;
G4double FluxWeightedEnergy=0.0;
G4double AverageTrackWeight=0.0;
if ( *SLW_Vs !=0. ) NumWeightedEnergy = (*SLWE_Vs)/(*SLW_Vs);
if ( *SLWs !=0. ) FluxWeightedEnergy = (*SLWEs)/(*SLWs);
if ( *SLs !=0. ) AverageTrackWeight = (*SLWs)/(*SLs);
G4double* Populations = (*Population)[iz];
G4double* TrackEnters = (*TrackEnter)[iz];
G4double* SLs = (*SL)[iz];
G4double* SLWs = (*SLW)[iz];
G4double* SLWEs = (*SLWE)[iz];
G4double* SLW_Vs = (*SLW_V)[iz];
G4double* SLWE_Vs = (*SLWE_V)[iz];
if (!SumCollisions) SumCollisions = new G4double(0.0);
if (!SumCollWeight) SumCollWeight = new G4double(0.0);
if (!Populations) Populations = new G4double(0.0);
if (!TrackEnters) TrackEnters = new G4double(0.0);
if (!SLs) SLs = new G4double(0.0);
if (!SLWs) SLWs = new G4double(0.0);
if (!SLWEs) SLWEs = new G4double(0.0);
if (!SLW_Vs) SLW_Vs = new G4double(0.0);
if (!SLWE_Vs) SLWE_Vs = new G4double(0.0);
G4double NumWeightedEnergy = 0.0;
G4double FluxWeightedEnergy = 0.0;
G4double AverageTrackWeight = 0.0;
if (*SLW_Vs != 0.) NumWeightedEnergy = (*SLWE_Vs) / (*SLW_Vs);
if (*SLWs != 0.) FluxWeightedEnergy = (*SLWEs) / (*SLWs);
if (*SLs != 0.) AverageTrackWeight = (*SLWs) / (*SLs);
G4String cname = bdet->GetCellName(iz);
G4cout
<< std::setw(fFieldValue) << cname << " |"
<< std::setw(fFieldValue) << (*TrackEnters) << " |"
<< std::setw(fFieldValue) << (*Populations) << " |"
<< std::setw(fFieldValue) << (*SumCollisions) << " |"
<< std::setw(fFieldValue) << (*SumCollWeight) << " |"
<< std::setw(fFieldValue) << NumWeightedEnergy << " |"
<< std::setw(fFieldValue) << FluxWeightedEnergy << " |"
<< std::setw(fFieldValue) << AverageTrackWeight << " |"
<< std::setw(fFieldValue) << (*SLs) << " |"
<< std::setw(fFieldValue) << (*SLWs) << " |"
<< std::setw(fFieldValue) << (*SLW_Vs) << " |"
<< std::setw(fFieldValue) << (*SLWEs) << " |"
<< std::setw(fFieldValue) << (*SLWE_Vs) << " |"
<< G4endl;
G4cout << std::setw(fFieldValue) << cname << " |" << std::setw(fFieldValue) << (*TrackEnters)
<< " |" << std::setw(fFieldValue) << (*Populations) << " |" << std::setw(fFieldValue)
<< (*SumCollisions) << " |" << std::setw(fFieldValue) << (*SumCollWeight) << " |"
<< std::setw(fFieldValue) << NumWeightedEnergy << " |" << std::setw(fFieldValue)
<< FluxWeightedEnergy << " |" << std::setw(fFieldValue) << AverageTrackWeight << " |"
<< std::setw(fFieldValue) << (*SLs) << " |" << std::setw(fFieldValue) << (*SLWs)
<< " |" << std::setw(fFieldValue) << (*SLW_Vs) << " |" << std::setw(fFieldValue)
<< (*SLWEs) << " |" << std::setw(fFieldValue) << (*SLWE_Vs) << " |" << G4endl;
}
G4cout << "============================================="<<G4endl;
G4cout << "=============================================" << G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void B01RunAction::PrintHeader(std::ostream *out)
void B01RunAction::PrintHeader(std::ostream* out)
{
std::vector<G4String> vecScoreName;
vecScoreName.push_back("Tr.Entering");
@@ -218,36 +197,35 @@ void B01RunAction::PrintHeader(std::ostream *out)
vecScoreName.push_back("SLWE_v");
// head line
// std::string vname;
// vname = FillString("Volume", ' ', fFieldName+1);
// std::string vname;
// vname = FillString("Volume", ' ', fFieldName+1);
//*out << vname << '|';
*out << std::setw(fFieldValue) << "Volume" << " |";
for (std::vector<G4String>::iterator it = vecScoreName.begin();
it != vecScoreName.end(); it++) {
// vname = FillString((*it),
// ' ',
// fFieldValue+1,
// false);
// *out << vname << '|';
*out << std::setw(fFieldValue) << (*it) << " |";
*out << std::setw(fFieldValue) << "Volume"
<< " |";
for (std::vector<G4String>::iterator it = vecScoreName.begin(); it != vecScoreName.end(); it++) {
// vname = FillString((*it),
// ' ',
// fFieldValue+1,
// false);
// *out << vname << '|';
*out << std::setw(fFieldValue) << (*it) << " |";
}
*out << G4endl;
*out << G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
std::string B01RunAction::FillString(const std::string &name,
char c, G4int n, G4bool back)
std::string B01RunAction::FillString(const std::string& name, char c, G4int n, G4bool back)
{
std::string fname("");
G4int k = n - name.size();
if (k > 0) {
if (back) {
fname = name;
fname += std::string(k,c);
fname += std::string(k, c);
}
else {
fname = std::string(k,c);
fname = std::string(k, c);
fname += name;
}
}