Import Geant4 10.7.0 source tree
This commit is contained in:
@@ -28,21 +28,22 @@
|
||||
/// \brief Implementation of the OpNoviceActionInitialization class
|
||||
|
||||
#include "OpNoviceActionInitialization.hh"
|
||||
|
||||
#include "OpNoviceEventAction.hh"
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
#include "OpNoviceRunAction.hh"
|
||||
#include "OpNoviceSteppingAction.hh"
|
||||
#include "OpNoviceStackingAction.hh"
|
||||
#include "OpNoviceSteppingAction.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceActionInitialization::OpNoviceActionInitialization()
|
||||
: G4VUserActionInitialization()
|
||||
: G4VUserActionInitialization()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceActionInitialization::~OpNoviceActionInitialization()
|
||||
{}
|
||||
OpNoviceActionInitialization::~OpNoviceActionInitialization() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -55,8 +56,12 @@ void OpNoviceActionInitialization::BuildForMaster() const
|
||||
|
||||
void OpNoviceActionInitialization::Build() const
|
||||
{
|
||||
SetUserAction(new OpNovicePrimaryGeneratorAction());
|
||||
SetUserAction(new OpNoviceRunAction());
|
||||
SetUserAction(new OpNoviceSteppingAction());
|
||||
OpNovicePrimaryGeneratorAction* primary =
|
||||
new OpNovicePrimaryGeneratorAction();
|
||||
SetUserAction(primary);
|
||||
SetUserAction(new OpNoviceRunAction(primary));
|
||||
OpNoviceEventAction* event = new OpNoviceEventAction();
|
||||
SetUserAction(event);
|
||||
SetUserAction(new OpNoviceSteppingAction(event));
|
||||
SetUserAction(new OpNoviceStackingAction());
|
||||
}
|
||||
|
||||
@@ -33,323 +33,264 @@
|
||||
|
||||
#include "OpNoviceDetectorConstruction.hh"
|
||||
|
||||
#include "G4Material.hh"
|
||||
#include "G4Box.hh"
|
||||
#include "G4Element.hh"
|
||||
#include "G4LogicalBorderSurface.hh"
|
||||
#include "G4LogicalSkinSurface.hh"
|
||||
#include "G4OpticalSurface.hh"
|
||||
#include "G4Box.hh"
|
||||
#include "G4LogicalVolume.hh"
|
||||
#include "G4ThreeVector.hh"
|
||||
#include "G4Material.hh"
|
||||
#include "G4OpticalSurface.hh"
|
||||
#include "G4PVPlacement.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4ThreeVector.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceDetectorConstruction::OpNoviceDetectorConstruction()
|
||||
: G4VUserDetectorConstruction()
|
||||
: G4VUserDetectorConstruction()
|
||||
{
|
||||
fExpHall_x = fExpHall_y = fExpHall_z = 10.0*m;
|
||||
fTank_x = fTank_y = fTank_z = 5.0*m;
|
||||
fBubble_x = fBubble_y = fBubble_z = 0.5*m;
|
||||
fExpHall_x = fExpHall_y = fExpHall_z = 10.0 * m;
|
||||
fTank_x = fTank_y = fTank_z = 5.0 * m;
|
||||
fBubble_x = fBubble_y = fBubble_z = 0.5 * m;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceDetectorConstruction::~OpNoviceDetectorConstruction(){;}
|
||||
OpNoviceDetectorConstruction::~OpNoviceDetectorConstruction() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4VPhysicalVolume* OpNoviceDetectorConstruction::Construct()
|
||||
{
|
||||
|
||||
// ------------- Materials -------------
|
||||
// ------------- Materials -------------
|
||||
|
||||
G4double a, z, density;
|
||||
G4int nelements;
|
||||
|
||||
// Air
|
||||
//
|
||||
G4Element* N = new G4Element("Nitrogen", "N", z=7 , a=14.01*g/mole);
|
||||
G4Element* O = new G4Element("Oxygen" , "O", z=8 , a=16.00*g/mole);
|
||||
// Air
|
||||
//
|
||||
G4Element* N = new G4Element("Nitrogen", "N", z = 7, a = 14.01 * g / mole);
|
||||
G4Element* O = new G4Element("Oxygen", "O", z = 8, a = 16.00 * g / mole);
|
||||
|
||||
G4Material* air = new G4Material("Air", density=1.29*mg/cm3, nelements=2);
|
||||
air->AddElement(N, 70.*perCent);
|
||||
air->AddElement(O, 30.*perCent);
|
||||
G4Material* air =
|
||||
new G4Material("Air", density = 1.29 * mg / cm3, nelements = 2);
|
||||
air->AddElement(N, 70. * perCent);
|
||||
air->AddElement(O, 30. * perCent);
|
||||
|
||||
// Water
|
||||
//
|
||||
G4Element* H = new G4Element("Hydrogen", "H", z=1 , a=1.01*g/mole);
|
||||
// Water
|
||||
//
|
||||
G4Element* H = new G4Element("Hydrogen", "H", z = 1, a = 1.01 * g / mole);
|
||||
|
||||
G4Material* water = new G4Material("Water", density= 1.0*g/cm3, nelements=2);
|
||||
G4Material* water =
|
||||
new G4Material("Water", density = 1.0 * g / cm3, nelements = 2);
|
||||
water->AddElement(H, 2);
|
||||
water->AddElement(O, 1);
|
||||
|
||||
//
|
||||
// ------------ Generate & Add Material Properties Table ------------
|
||||
//
|
||||
G4double photonEnergy[] =
|
||||
{ 2.034*eV, 2.068*eV, 2.103*eV, 2.139*eV,
|
||||
2.177*eV, 2.216*eV, 2.256*eV, 2.298*eV,
|
||||
2.341*eV, 2.386*eV, 2.433*eV, 2.481*eV,
|
||||
2.532*eV, 2.585*eV, 2.640*eV, 2.697*eV,
|
||||
2.757*eV, 2.820*eV, 2.885*eV, 2.954*eV,
|
||||
3.026*eV, 3.102*eV, 3.181*eV, 3.265*eV,
|
||||
3.353*eV, 3.446*eV, 3.545*eV, 3.649*eV,
|
||||
3.760*eV, 3.877*eV, 4.002*eV, 4.136*eV };
|
||||
// ------------ Generate & Add Material Properties Table ------------
|
||||
//
|
||||
std::vector<G4double> photonEnergy = {
|
||||
2.034 * eV, 2.068 * eV, 2.103 * eV, 2.139 * eV, 2.177 * eV, 2.216 * eV,
|
||||
2.256 * eV, 2.298 * eV, 2.341 * eV, 2.386 * eV, 2.433 * eV, 2.481 * eV,
|
||||
2.532 * eV, 2.585 * eV, 2.640 * eV, 2.697 * eV, 2.757 * eV, 2.820 * eV,
|
||||
2.885 * eV, 2.954 * eV, 3.026 * eV, 3.102 * eV, 3.181 * eV, 3.265 * eV,
|
||||
3.353 * eV, 3.446 * eV, 3.545 * eV, 3.649 * eV, 3.760 * eV, 3.877 * eV,
|
||||
4.002 * eV, 4.136 * eV
|
||||
};
|
||||
|
||||
const G4int nEntries = sizeof(photonEnergy)/sizeof(G4double);
|
||||
// Water
|
||||
//
|
||||
std::vector<G4double> refractiveIndex1 = {
|
||||
1.3435, 1.344, 1.3445, 1.345, 1.3455, 1.346, 1.3465, 1.347,
|
||||
1.3475, 1.348, 1.3485, 1.3492, 1.35, 1.3505, 1.351, 1.3518,
|
||||
1.3522, 1.3530, 1.3535, 1.354, 1.3545, 1.355, 1.3555, 1.356,
|
||||
1.3568, 1.3572, 1.358, 1.3585, 1.359, 1.3595, 1.36, 1.3608
|
||||
};
|
||||
|
||||
//
|
||||
// Water
|
||||
//
|
||||
G4double refractiveIndex1[] =
|
||||
{ 1.3435, 1.344, 1.3445, 1.345, 1.3455,
|
||||
1.346, 1.3465, 1.347, 1.3475, 1.348,
|
||||
1.3485, 1.3492, 1.35, 1.3505, 1.351,
|
||||
1.3518, 1.3522, 1.3530, 1.3535, 1.354,
|
||||
1.3545, 1.355, 1.3555, 1.356, 1.3568,
|
||||
1.3572, 1.358, 1.3585, 1.359, 1.3595,
|
||||
1.36, 1.3608};
|
||||
std::vector<G4double> absorption = {
|
||||
3.448 * m, 4.082 * m, 6.329 * m, 9.174 * m, 12.346 * m, 13.889 * m,
|
||||
15.152 * m, 17.241 * m, 18.868 * m, 20.000 * m, 26.316 * m, 35.714 * m,
|
||||
45.455 * m, 47.619 * m, 52.632 * m, 52.632 * m, 55.556 * m, 52.632 * m,
|
||||
52.632 * m, 47.619 * m, 45.455 * m, 41.667 * m, 37.037 * m, 33.333 * m,
|
||||
30.000 * m, 28.500 * m, 27.000 * m, 24.500 * m, 22.000 * m, 19.500 * m,
|
||||
17.500 * m, 14.500 * m
|
||||
};
|
||||
|
||||
assert(sizeof(refractiveIndex1) == sizeof(photonEnergy));
|
||||
std::vector<G4double> scintilFast = {
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00
|
||||
};
|
||||
|
||||
G4double absorption[] =
|
||||
{3.448*m, 4.082*m, 6.329*m, 9.174*m, 12.346*m, 13.889*m,
|
||||
15.152*m, 17.241*m, 18.868*m, 20.000*m, 26.316*m, 35.714*m,
|
||||
45.455*m, 47.619*m, 52.632*m, 52.632*m, 55.556*m, 52.632*m,
|
||||
52.632*m, 47.619*m, 45.455*m, 41.667*m, 37.037*m, 33.333*m,
|
||||
30.000*m, 28.500*m, 27.000*m, 24.500*m, 22.000*m, 19.500*m,
|
||||
17.500*m, 14.500*m };
|
||||
|
||||
assert(sizeof(absorption) == sizeof(photonEnergy));
|
||||
|
||||
G4double scintilFast[] =
|
||||
{ 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00 };
|
||||
|
||||
assert(sizeof(scintilFast) == sizeof(photonEnergy));
|
||||
|
||||
G4double scintilSlow[] =
|
||||
{ 0.01, 1.00, 2.00, 3.00, 4.00, 5.00, 6.00,
|
||||
7.00, 8.00, 9.00, 8.00, 7.00, 6.00, 4.00,
|
||||
3.00, 2.00, 1.00, 0.01, 1.00, 2.00, 3.00,
|
||||
4.00, 5.00, 6.00, 7.00, 8.00, 9.00, 8.00,
|
||||
7.00, 6.00, 5.00, 4.00 };
|
||||
|
||||
assert(sizeof(scintilSlow) == sizeof(photonEnergy));
|
||||
std::vector<G4double> scintilSlow = {
|
||||
0.01, 1.00, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00, 9.00, 8.00,
|
||||
7.00, 6.00, 4.00, 3.00, 2.00, 1.00, 0.01, 1.00, 2.00, 3.00, 4.00,
|
||||
5.00, 6.00, 7.00, 8.00, 9.00, 8.00, 7.00, 6.00, 5.00, 4.00
|
||||
};
|
||||
|
||||
G4MaterialPropertiesTable* myMPT1 = new G4MaterialPropertiesTable();
|
||||
|
||||
myMPT1->AddProperty("RINDEX", photonEnergy, refractiveIndex1,nEntries)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddProperty("ABSLENGTH", photonEnergy, absorption, nEntries)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddProperty("FASTCOMPONENT",photonEnergy, scintilFast, nEntries)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddProperty("SLOWCOMPONENT",photonEnergy, scintilSlow, nEntries)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddProperty("RINDEX", photonEnergy, refractiveIndex1)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddProperty("ABSLENGTH", photonEnergy, absorption)->SetSpline(true);
|
||||
myMPT1->AddProperty("FASTCOMPONENT", photonEnergy, scintilFast)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddProperty("SLOWCOMPONENT", photonEnergy, scintilSlow)
|
||||
->SetSpline(true);
|
||||
|
||||
myMPT1->AddConstProperty("SCINTILLATIONYIELD",50./MeV);
|
||||
myMPT1->AddConstProperty("RESOLUTIONSCALE",1.0);
|
||||
myMPT1->AddConstProperty("FASTTIMECONSTANT", 1.*ns);
|
||||
myMPT1->AddConstProperty("SLOWTIMECONSTANT",10.*ns);
|
||||
myMPT1->AddConstProperty("YIELDRATIO",0.8);
|
||||
myMPT1->AddConstProperty("SCINTILLATIONYIELD", 50. / MeV);
|
||||
myMPT1->AddConstProperty("RESOLUTIONSCALE", 1.0);
|
||||
myMPT1->AddConstProperty("FASTTIMECONSTANT", 1. * ns);
|
||||
myMPT1->AddConstProperty("SLOWTIMECONSTANT", 10. * ns);
|
||||
myMPT1->AddConstProperty("YIELDRATIO", 0.8);
|
||||
|
||||
G4double energy_water[] = {
|
||||
1.56962*eV, 1.58974*eV, 1.61039*eV, 1.63157*eV,
|
||||
1.65333*eV, 1.67567*eV, 1.69863*eV, 1.72222*eV,
|
||||
1.74647*eV, 1.77142*eV, 1.7971 *eV, 1.82352*eV,
|
||||
1.85074*eV, 1.87878*eV, 1.90769*eV, 1.93749*eV,
|
||||
1.96825*eV, 1.99999*eV, 2.03278*eV, 2.06666*eV,
|
||||
2.10169*eV, 2.13793*eV, 2.17543*eV, 2.21428*eV,
|
||||
2.25454*eV, 2.29629*eV, 2.33962*eV, 2.38461*eV,
|
||||
2.43137*eV, 2.47999*eV, 2.53061*eV, 2.58333*eV,
|
||||
2.63829*eV, 2.69565*eV, 2.75555*eV, 2.81817*eV,
|
||||
2.88371*eV, 2.95237*eV, 3.02438*eV, 3.09999*eV,
|
||||
3.17948*eV, 3.26315*eV, 3.35134*eV, 3.44444*eV,
|
||||
3.54285*eV, 3.64705*eV, 3.75757*eV, 3.87499*eV,
|
||||
3.99999*eV, 4.13332*eV, 4.27585*eV, 4.42856*eV,
|
||||
4.59258*eV, 4.76922*eV, 4.95999*eV, 5.16665*eV,
|
||||
5.39129*eV, 5.63635*eV, 5.90475*eV, 6.19998*eV
|
||||
std::vector<G4double> energy_water = {
|
||||
1.56962 * eV, 1.58974 * eV, 1.61039 * eV, 1.63157 * eV, 1.65333 * eV,
|
||||
1.67567 * eV, 1.69863 * eV, 1.72222 * eV, 1.74647 * eV, 1.77142 * eV,
|
||||
1.7971 * eV, 1.82352 * eV, 1.85074 * eV, 1.87878 * eV, 1.90769 * eV,
|
||||
1.93749 * eV, 1.96825 * eV, 1.99999 * eV, 2.03278 * eV, 2.06666 * eV,
|
||||
2.10169 * eV, 2.13793 * eV, 2.17543 * eV, 2.21428 * eV, 2.25454 * eV,
|
||||
2.29629 * eV, 2.33962 * eV, 2.38461 * eV, 2.43137 * eV, 2.47999 * eV,
|
||||
2.53061 * eV, 2.58333 * eV, 2.63829 * eV, 2.69565 * eV, 2.75555 * eV,
|
||||
2.81817 * eV, 2.88371 * eV, 2.95237 * eV, 3.02438 * eV, 3.09999 * eV,
|
||||
3.17948 * eV, 3.26315 * eV, 3.35134 * eV, 3.44444 * eV, 3.54285 * eV,
|
||||
3.64705 * eV, 3.75757 * eV, 3.87499 * eV, 3.99999 * eV, 4.13332 * eV,
|
||||
4.27585 * eV, 4.42856 * eV, 4.59258 * eV, 4.76922 * eV, 4.95999 * eV,
|
||||
5.16665 * eV, 5.39129 * eV, 5.63635 * eV, 5.90475 * eV, 6.19998 * eV
|
||||
};
|
||||
|
||||
const G4int numentries_water = sizeof(energy_water)/sizeof(G4double);
|
||||
// Rayleigh scattering length calculated by G4OpRayleigh
|
||||
|
||||
//assume 100 times larger than the rayleigh scattering for now.
|
||||
G4double mie_water[] = {
|
||||
167024.4*m, 158726.7*m, 150742 *m,
|
||||
143062.5*m, 135680.2*m, 128587.4*m,
|
||||
121776.3*m, 115239.5*m, 108969.5*m,
|
||||
102958.8*m, 97200.35*m, 91686.86*m,
|
||||
86411.33*m, 81366.79*m, 76546.42*m,
|
||||
71943.46*m, 67551.29*m, 63363.36*m,
|
||||
59373.25*m, 55574.61*m, 51961.24*m,
|
||||
48527.00*m, 45265.87*m, 42171.94*m,
|
||||
39239.39*m, 36462.50*m, 33835.68*m,
|
||||
31353.41*m, 29010.30*m, 26801.03*m,
|
||||
24720.42*m, 22763.36*m, 20924.88*m,
|
||||
19200.07*m, 17584.16*m, 16072.45*m,
|
||||
14660.38*m, 13343.46*m, 12117.33*m,
|
||||
10977.70*m, 9920.416*m, 8941.407*m,
|
||||
8036.711*m, 7202.470*m, 6434.927*m,
|
||||
5730.429*m, 5085.425*m, 4496.467*m,
|
||||
3960.210*m, 3473.413*m, 3032.937*m,
|
||||
2635.746*m, 2278.907*m, 1959.588*m,
|
||||
1675.064*m, 1422.710*m, 1200.004*m,
|
||||
1004.528*m, 833.9666*m, 686.1063*m
|
||||
// assume 100 times larger than the rayleigh scattering for now.
|
||||
std::vector<G4double> mie_water = {
|
||||
167024.4 * m, 158726.7 * m, 150742 * m, 143062.5 * m, 135680.2 * m,
|
||||
128587.4 * m, 121776.3 * m, 115239.5 * m, 108969.5 * m, 102958.8 * m,
|
||||
97200.35 * m, 91686.86 * m, 86411.33 * m, 81366.79 * m, 76546.42 * m,
|
||||
71943.46 * m, 67551.29 * m, 63363.36 * m, 59373.25 * m, 55574.61 * m,
|
||||
51961.24 * m, 48527.00 * m, 45265.87 * m, 42171.94 * m, 39239.39 * m,
|
||||
36462.50 * m, 33835.68 * m, 31353.41 * m, 29010.30 * m, 26801.03 * m,
|
||||
24720.42 * m, 22763.36 * m, 20924.88 * m, 19200.07 * m, 17584.16 * m,
|
||||
16072.45 * m, 14660.38 * m, 13343.46 * m, 12117.33 * m, 10977.70 * m,
|
||||
9920.416 * m, 8941.407 * m, 8036.711 * m, 7202.470 * m, 6434.927 * m,
|
||||
5730.429 * m, 5085.425 * m, 4496.467 * m, 3960.210 * m, 3473.413 * m,
|
||||
3032.937 * m, 2635.746 * m, 2278.907 * m, 1959.588 * m, 1675.064 * m,
|
||||
1422.710 * m, 1200.004 * m, 1004.528 * m, 833.9666 * m, 686.1063 * m
|
||||
};
|
||||
|
||||
assert(sizeof(mie_water) == sizeof(energy_water));
|
||||
|
||||
// gforward, gbackward, forward backward ratio
|
||||
G4double mie_water_const[3]={0.99,0.99,0.8};
|
||||
G4double mie_water_const[3] = { 0.99, 0.99, 0.8 };
|
||||
|
||||
myMPT1->AddProperty("MIEHG",energy_water,mie_water,numentries_water)
|
||||
->SetSpline(true);
|
||||
myMPT1->AddConstProperty("MIEHG_FORWARD",mie_water_const[0]);
|
||||
myMPT1->AddConstProperty("MIEHG_BACKWARD",mie_water_const[1]);
|
||||
myMPT1->AddConstProperty("MIEHG_FORWARD_RATIO",mie_water_const[2]);
|
||||
myMPT1->AddProperty("MIEHG", energy_water, mie_water)->SetSpline(true);
|
||||
myMPT1->AddConstProperty("MIEHG_FORWARD", mie_water_const[0]);
|
||||
myMPT1->AddConstProperty("MIEHG_BACKWARD", mie_water_const[1]);
|
||||
myMPT1->AddConstProperty("MIEHG_FORWARD_RATIO", mie_water_const[2]);
|
||||
|
||||
G4cout << "Water G4MaterialPropertiesTable" << G4endl;
|
||||
G4cout << "Water G4MaterialPropertiesTable:" << G4endl;
|
||||
myMPT1->DumpTable();
|
||||
|
||||
water->SetMaterialPropertiesTable(myMPT1);
|
||||
|
||||
// Set the Birks Constant for the Water scintillator
|
||||
water->GetIonisation()->SetBirksConstant(0.126 * mm / MeV);
|
||||
|
||||
water->GetIonisation()->SetBirksConstant(0.126*mm/MeV);
|
||||
|
||||
//
|
||||
// Air
|
||||
//
|
||||
G4double refractiveIndex2[] =
|
||||
{ 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00 };
|
||||
// Air
|
||||
//
|
||||
std::vector<G4double> refractiveIndex2 = {
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
|
||||
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00
|
||||
};
|
||||
|
||||
G4MaterialPropertiesTable* myMPT2 = new G4MaterialPropertiesTable();
|
||||
myMPT2->AddProperty("RINDEX", photonEnergy, refractiveIndex2, nEntries);
|
||||
myMPT2->AddProperty("RINDEX", photonEnergy, refractiveIndex2);
|
||||
|
||||
G4cout << "Air G4MaterialPropertiesTable" << G4endl;
|
||||
G4cout << "Air G4MaterialPropertiesTable:" << G4endl;
|
||||
myMPT2->DumpTable();
|
||||
|
||||
air->SetMaterialPropertiesTable(myMPT2);
|
||||
|
||||
//
|
||||
// ------------- Volumes --------------
|
||||
// ------------- Volumes --------------
|
||||
|
||||
// The experimental Hall
|
||||
//
|
||||
G4Box* expHall_box = new G4Box("World",fExpHall_x,fExpHall_y,fExpHall_z);
|
||||
// The experimental Hall
|
||||
//
|
||||
G4Box* expHall_box = new G4Box("World", fExpHall_x, fExpHall_y, fExpHall_z);
|
||||
|
||||
G4LogicalVolume* expHall_log
|
||||
= new G4LogicalVolume(expHall_box,air,"World",0,0,0);
|
||||
G4LogicalVolume* expHall_log =
|
||||
new G4LogicalVolume(expHall_box, air, "World", 0, 0, 0);
|
||||
|
||||
G4VPhysicalVolume* expHall_phys
|
||||
= new G4PVPlacement(0,G4ThreeVector(),expHall_log,"World",0,false,0);
|
||||
G4VPhysicalVolume* expHall_phys =
|
||||
new G4PVPlacement(0, G4ThreeVector(), expHall_log, "World", 0, false, 0);
|
||||
|
||||
// The Water Tank
|
||||
//
|
||||
G4Box* waterTank_box = new G4Box("Tank",fTank_x,fTank_y,fTank_z);
|
||||
// The Water Tank
|
||||
//
|
||||
G4Box* waterTank_box = new G4Box("Tank", fTank_x, fTank_y, fTank_z);
|
||||
|
||||
G4LogicalVolume* waterTank_log
|
||||
= new G4LogicalVolume(waterTank_box,water,"Tank",0,0,0);
|
||||
G4LogicalVolume* waterTank_log =
|
||||
new G4LogicalVolume(waterTank_box, water, "Tank", 0, 0, 0);
|
||||
|
||||
G4VPhysicalVolume* waterTank_phys
|
||||
= new G4PVPlacement(0,G4ThreeVector(),waterTank_log,"Tank",
|
||||
expHall_log,false,0);
|
||||
G4VPhysicalVolume* waterTank_phys = new G4PVPlacement(
|
||||
0, G4ThreeVector(), waterTank_log, "Tank", expHall_log, false, 0);
|
||||
|
||||
// The Air Bubble
|
||||
//
|
||||
G4Box* bubbleAir_box = new G4Box("Bubble",fBubble_x,fBubble_y,fBubble_z);
|
||||
// The Air Bubble
|
||||
//
|
||||
G4Box* bubbleAir_box = new G4Box("Bubble", fBubble_x, fBubble_y, fBubble_z);
|
||||
|
||||
G4LogicalVolume* bubbleAir_log
|
||||
= new G4LogicalVolume(bubbleAir_box,air,"Bubble",0,0,0);
|
||||
G4LogicalVolume* bubbleAir_log =
|
||||
new G4LogicalVolume(bubbleAir_box, air, "Bubble", 0, 0, 0);
|
||||
|
||||
//G4VPhysicalVolume* bubbleAir_phys =
|
||||
new G4PVPlacement(0,G4ThreeVector(0,2.5*m,0),bubbleAir_log,"Bubble",
|
||||
waterTank_log,false,0);
|
||||
new G4PVPlacement(0, G4ThreeVector(0, 2.5 * m, 0), bubbleAir_log, "Bubble",
|
||||
waterTank_log, false, 0);
|
||||
|
||||
// ------------- Surfaces --------------
|
||||
//
|
||||
// Water Tank
|
||||
//
|
||||
// ------------- Surfaces --------------
|
||||
|
||||
// Water Tank
|
||||
//
|
||||
G4OpticalSurface* opWaterSurface = new G4OpticalSurface("WaterSurface");
|
||||
// opWaterSurface->SetType(dielectric_dielectric);
|
||||
// opWaterSurface->SetFinish(ground);
|
||||
// opWaterSurface->SetModel(unified);
|
||||
opWaterSurface->SetType(dielectric_LUTDAVIS);
|
||||
opWaterSurface->SetFinish(Rough_LUT);
|
||||
opWaterSurface->SetModel(DAVIS);
|
||||
|
||||
G4LogicalBorderSurface* waterSurface =
|
||||
new G4LogicalBorderSurface("WaterSurface",
|
||||
waterTank_phys,expHall_phys,opWaterSurface);
|
||||
G4LogicalBorderSurface* waterSurface = new G4LogicalBorderSurface(
|
||||
"WaterSurface", waterTank_phys, expHall_phys, opWaterSurface);
|
||||
|
||||
G4OpticalSurface* opticalSurface = dynamic_cast <G4OpticalSurface*>
|
||||
(waterSurface->GetSurface(waterTank_phys,expHall_phys)->
|
||||
GetSurfaceProperty());
|
||||
if (opticalSurface) opticalSurface->DumpInfo();
|
||||
G4OpticalSurface* opticalSurface = dynamic_cast<G4OpticalSurface*>(
|
||||
waterSurface->GetSurface(waterTank_phys, expHall_phys)
|
||||
->GetSurfaceProperty());
|
||||
if(opticalSurface)
|
||||
opticalSurface->DumpInfo();
|
||||
|
||||
// Air Bubble
|
||||
//
|
||||
// Air Bubble
|
||||
//
|
||||
G4OpticalSurface* opAirSurface = new G4OpticalSurface("AirSurface");
|
||||
opAirSurface->SetType(dielectric_dielectric);
|
||||
opAirSurface->SetFinish(polished);
|
||||
opAirSurface->SetModel(glisur);
|
||||
|
||||
G4LogicalSkinSurface* airSurface =
|
||||
new G4LogicalSkinSurface("AirSurface", bubbleAir_log, opAirSurface);
|
||||
new G4LogicalSkinSurface("AirSurface", bubbleAir_log, opAirSurface);
|
||||
|
||||
opticalSurface = dynamic_cast <G4OpticalSurface*>
|
||||
(airSurface->GetSurface(bubbleAir_log)->GetSurfaceProperty());
|
||||
if (opticalSurface) opticalSurface->DumpInfo();
|
||||
opticalSurface = dynamic_cast<G4OpticalSurface*>(
|
||||
airSurface->GetSurface(bubbleAir_log)->GetSurfaceProperty());
|
||||
if(opticalSurface)
|
||||
opticalSurface->DumpInfo();
|
||||
|
||||
//
|
||||
// Generate & Add Material Properties Table attached to the optical surfaces
|
||||
//
|
||||
const G4int num = 2;
|
||||
G4double ephoton[num] = {2.034*eV, 4.136*eV};
|
||||
// Generate & Add Material Properties Table attached to the optical surfaces
|
||||
//
|
||||
std::vector<G4double> ephoton = { 2.034 * eV, 4.136 * eV };
|
||||
|
||||
//OpticalWaterSurface
|
||||
// if surface model is unified we can set parameters
|
||||
// G4double refractiveIndex[num] = {1.35, 1.40};
|
||||
// G4double specularLobe[num] = {0.3, 0.3};
|
||||
// G4double specularSpike[num] = {0.2, 0.2};
|
||||
// G4double backScatter[num] = {0.2, 0.2};
|
||||
//
|
||||
// G4MaterialPropertiesTable* myST1 = new G4MaterialPropertiesTable();
|
||||
// myST1->AddProperty("RINDEX", ephoton, refractiveIndex, num);
|
||||
// myST1->AddProperty("SPECULARLOBECONSTANT", ephoton, specularLobe, num);
|
||||
// myST1->AddProperty("SPECULARSPIKECONSTANT", ephoton, specularSpike, num);
|
||||
// myST1->AddProperty("BACKSCATTERCONSTANT", ephoton, backScatter, num);
|
||||
//
|
||||
// G4cout << "Water Surface G4MaterialPropertiesTable" << G4endl;
|
||||
// myST1->DumpTable();
|
||||
// OpticalAirSurface
|
||||
std::vector<G4double> reflectivity = { 0.3, 0.5 };
|
||||
std::vector<G4double> efficiency = { 0.8, 1.0 };
|
||||
|
||||
// opWaterSurface->SetMaterialPropertiesTable(myST1);
|
||||
G4MaterialPropertiesTable* myST2 = new G4MaterialPropertiesTable();
|
||||
|
||||
//OpticalAirSurface
|
||||
G4double reflectivity[num] = {0.3, 0.5};
|
||||
G4double efficiency[num] = {0.8, 1.0};
|
||||
myST2->AddProperty("REFLECTIVITY", ephoton, reflectivity);
|
||||
myST2->AddProperty("EFFICIENCY", ephoton, efficiency);
|
||||
|
||||
G4MaterialPropertiesTable *myST2 = new G4MaterialPropertiesTable();
|
||||
|
||||
myST2->AddProperty("REFLECTIVITY", ephoton, reflectivity, num);
|
||||
myST2->AddProperty("EFFICIENCY", ephoton, efficiency, num);
|
||||
|
||||
G4cout << "Air Surface G4MaterialPropertiesTable" << G4endl;
|
||||
G4cout << "Air Surface G4MaterialPropertiesTable:" << G4endl;
|
||||
myST2->DumpTable();
|
||||
|
||||
opAirSurface->SetMaterialPropertiesTable(myST2);
|
||||
|
||||
//always return the physical World
|
||||
return expHall_phys;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file optical/OpNovice/src/OpNoviceEventAction.cc
|
||||
/// \brief Implementation of the OpNoviceEventAction class
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNoviceEventAction.hh"
|
||||
|
||||
#include "OpNoviceRun.hh"
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4RunManager.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceEventAction::OpNoviceEventAction()
|
||||
: G4UserEventAction()
|
||||
{
|
||||
fRayleigh = 0;
|
||||
fAbsorption = 0;
|
||||
fMie = 0;
|
||||
fBoundary = 0;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceEventAction::~OpNoviceEventAction() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceEventAction::BeginOfEventAction(const G4Event*)
|
||||
{
|
||||
fRayleigh = 0;
|
||||
fAbsorption = 0;
|
||||
fMie = 0;
|
||||
fBoundary = 0;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceEventAction::EndOfEventAction(const G4Event*)
|
||||
{
|
||||
OpNoviceRun* run = static_cast<OpNoviceRun*>(
|
||||
G4RunManager::GetRunManager()->GetNonConstCurrentRun());
|
||||
|
||||
run->AddRayleigh(fRayleigh);
|
||||
run->AddAbsorption(fAbsorption);
|
||||
run->AddMie(fMie);
|
||||
run->AddBoundary(fBoundary);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -32,38 +32,38 @@
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
|
||||
#include "OpNovicePrimaryGeneratorMessenger.hh"
|
||||
|
||||
#include "Randomize.hh"
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4ParticleGun.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "Randomize.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePrimaryGeneratorAction::OpNovicePrimaryGeneratorAction()
|
||||
: G4VUserPrimaryGeneratorAction(),
|
||||
fParticleGun(0)
|
||||
: G4VUserPrimaryGeneratorAction()
|
||||
, fParticleGun(nullptr)
|
||||
{
|
||||
G4int n_particle = 1;
|
||||
fParticleGun = new G4ParticleGun(n_particle);
|
||||
fParticleGun = new G4ParticleGun(n_particle);
|
||||
|
||||
//create a messenger for this class
|
||||
// create a messenger for this class
|
||||
fGunMessenger = new OpNovicePrimaryGeneratorMessenger(this);
|
||||
|
||||
//default kinematic
|
||||
// default kinematic
|
||||
//
|
||||
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
|
||||
G4ParticleDefinition* particle = particleTable->FindParticle("e+");
|
||||
|
||||
fParticleGun->SetParticleDefinition(particle);
|
||||
fParticleGun->SetParticleTime(0.0*ns);
|
||||
fParticleGun->SetParticlePosition(G4ThreeVector(0.0*cm,0.0*cm,0.0*cm));
|
||||
fParticleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.));
|
||||
fParticleGun->SetParticleEnergy(500.0*keV);
|
||||
fParticleGun->SetParticleTime(0.0 * ns);
|
||||
fParticleGun->SetParticlePosition(G4ThreeVector(0., 0., 0.));
|
||||
fParticleGun->SetParticleMomentumDirection(G4ThreeVector(1., 0., 0.));
|
||||
fParticleGun->SetParticleEnergy(500.0 * keV);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -85,32 +85,37 @@ void OpNovicePrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
|
||||
|
||||
void OpNovicePrimaryGeneratorAction::SetOptPhotonPolar()
|
||||
{
|
||||
G4double angle = G4UniformRand() * 360.0*deg;
|
||||
SetOptPhotonPolar(angle);
|
||||
G4double angle = G4UniformRand() * 360.0 * deg;
|
||||
SetOptPhotonPolar(angle);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePrimaryGeneratorAction::SetOptPhotonPolar(G4double angle)
|
||||
{
|
||||
if (fParticleGun->GetParticleDefinition()->GetParticleName()!="opticalphoton")
|
||||
{
|
||||
G4cout << "--> warning from PrimaryGeneratorAction::SetOptPhotonPolar() :"
|
||||
"the particleGun is not an opticalphoton" << G4endl;
|
||||
return;
|
||||
}
|
||||
if(fParticleGun->GetParticleDefinition()->GetParticleName() !=
|
||||
"opticalphoton")
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Warning: the particleGun is not an opticalphoton";
|
||||
G4Exception("OpNovicePrimaryGeneratorAction::SetOptPhotonPolar()",
|
||||
"OpNovice_010", JustWarning, ed);
|
||||
return;
|
||||
}
|
||||
|
||||
G4ThreeVector normal (1., 0., 0.);
|
||||
G4ThreeVector kphoton = fParticleGun->GetParticleMomentumDirection();
|
||||
G4ThreeVector product = normal.cross(kphoton);
|
||||
G4double modul2 = product*product;
|
||||
|
||||
G4ThreeVector e_perpend (0., 0., 1.);
|
||||
if (modul2 > 0.) e_perpend = (1./std::sqrt(modul2))*product;
|
||||
G4ThreeVector e_paralle = e_perpend.cross(kphoton);
|
||||
|
||||
G4ThreeVector polar = std::cos(angle)*e_paralle + std::sin(angle)*e_perpend;
|
||||
fParticleGun->SetParticlePolarization(polar);
|
||||
G4ThreeVector normal(1., 0., 0.);
|
||||
G4ThreeVector kphoton = fParticleGun->GetParticleMomentumDirection();
|
||||
G4ThreeVector product = normal.cross(kphoton);
|
||||
G4double modul2 = product * product;
|
||||
|
||||
G4ThreeVector e_perpend(0., 0., 1.);
|
||||
if(modul2 > 0.)
|
||||
e_perpend = (1. / std::sqrt(modul2)) * product;
|
||||
G4ThreeVector e_paralle = e_perpend.cross(kphoton);
|
||||
|
||||
G4ThreeVector polar =
|
||||
std::cos(angle) * e_paralle + std::sin(angle) * e_perpend;
|
||||
fParticleGun->SetParticlePolarization(polar);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -28,33 +28,32 @@
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNovicePrimaryGeneratorMessenger.hh"
|
||||
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
#include "G4UIdirectory.hh"
|
||||
#include "G4UIcmdWithADoubleAndUnit.hh"
|
||||
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4UIcmdWithADoubleAndUnit.hh"
|
||||
#include "G4UIdirectory.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePrimaryGeneratorMessenger::
|
||||
OpNovicePrimaryGeneratorMessenger(OpNovicePrimaryGeneratorAction* OpNoviceGun)
|
||||
: G4UImessenger(),
|
||||
fOpNoviceAction(OpNoviceGun)
|
||||
OpNovicePrimaryGeneratorMessenger::OpNovicePrimaryGeneratorMessenger(
|
||||
OpNovicePrimaryGeneratorAction* OpNoviceGun)
|
||||
: G4UImessenger()
|
||||
, fOpNoviceAction(OpNoviceGun)
|
||||
{
|
||||
fGunDir = new G4UIdirectory("/OpNovice/gun/");
|
||||
fGunDir->SetGuidance("PrimaryGenerator control");
|
||||
|
||||
fPolarCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/OpNovice/gun/optPhotonPolar",this);
|
||||
new G4UIcmdWithADoubleAndUnit("/OpNovice/gun/optPhotonPolar", this);
|
||||
fPolarCmd->SetGuidance("Set linear polarization");
|
||||
fPolarCmd->SetGuidance(" angle w.r.t. (k,n) plane");
|
||||
fPolarCmd->SetParameterName("angle",true);
|
||||
fPolarCmd->SetParameterName("angle", true);
|
||||
fPolarCmd->SetUnitCategory("Angle");
|
||||
fPolarCmd->SetDefaultValue(-360.0);
|
||||
fPolarCmd->SetDefaultUnit("deg");
|
||||
@@ -71,16 +70,20 @@ OpNovicePrimaryGeneratorMessenger::~OpNovicePrimaryGeneratorMessenger()
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePrimaryGeneratorMessenger::SetNewValue(
|
||||
G4UIcommand* command, G4String newValue)
|
||||
void OpNovicePrimaryGeneratorMessenger::SetNewValue(G4UIcommand* command,
|
||||
G4String newValue)
|
||||
{
|
||||
if( command == fPolarCmd ) {
|
||||
G4double angle = fPolarCmd->GetNewDoubleValue(newValue);
|
||||
if ( angle == -360.0*deg ) {
|
||||
fOpNoviceAction->SetOptPhotonPolar();
|
||||
} else {
|
||||
fOpNoviceAction->SetOptPhotonPolar(angle);
|
||||
}
|
||||
if(command == fPolarCmd)
|
||||
{
|
||||
G4double angle = fPolarCmd->GetNewDoubleValue(newValue);
|
||||
if(angle == -360.0 * deg)
|
||||
{
|
||||
fOpNoviceAction->SetOptPhotonPolar();
|
||||
}
|
||||
else
|
||||
{
|
||||
fOpNoviceAction->SetOptPhotonPolar(angle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file OpNovice/src/OpNoviceRun.cc
|
||||
/// \brief Implementation of the OpNoviceRun class
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNoviceRun.hh"
|
||||
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4Run.hh"
|
||||
#include "G4UnitsTable.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRun::OpNoviceRun()
|
||||
: G4Run()
|
||||
{
|
||||
fParticle = nullptr;
|
||||
fEnergy = -1.;
|
||||
fCerenkovCounter = 0.;
|
||||
fCerenkov2 = 0.;
|
||||
fScintillationCounter = 0.;
|
||||
fScintillation2 = 0.;
|
||||
fRayleighCounter = 0.;
|
||||
fRayleigh2 = 0.;
|
||||
fAbsorptionCounter = 0.;
|
||||
fAbsorption2 = 0.;
|
||||
fMieCounter = 0.;
|
||||
fMie2 = 0.;
|
||||
fBoundaryCounter = 0.;
|
||||
fBoundary2 = 0.;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRun::~OpNoviceRun() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceRun::SetPrimary(G4ParticleDefinition* particle, G4double energy)
|
||||
{
|
||||
fParticle = particle;
|
||||
fEnergy = energy;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceRun::Merge(const G4Run* run)
|
||||
{
|
||||
const OpNoviceRun* localRun = static_cast<const OpNoviceRun*>(run);
|
||||
|
||||
fParticle = localRun->fParticle;
|
||||
fEnergy = localRun->fEnergy;
|
||||
|
||||
fCerenkovCounter += localRun->fCerenkovCounter;
|
||||
fCerenkov2 += localRun->fCerenkov2;
|
||||
fScintillationCounter += localRun->fScintillationCounter;
|
||||
fScintillation2 += localRun->fScintillation2;
|
||||
|
||||
fRayleighCounter += localRun->fRayleighCounter;
|
||||
fRayleigh2 += localRun->fRayleigh2;
|
||||
fAbsorptionCounter += localRun->fAbsorptionCounter;
|
||||
fAbsorption2 += localRun->fAbsorption2;
|
||||
fMieCounter += localRun->fMieCounter;
|
||||
fMie2 += localRun->fMie2;
|
||||
fBoundaryCounter += localRun->fBoundaryCounter;
|
||||
fBoundary2 += localRun->fBoundary2;
|
||||
|
||||
G4Run::Merge(run);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
void OpNoviceRun::EndOfRun()
|
||||
{
|
||||
if(numberOfEvent == 0)
|
||||
return;
|
||||
G4double TotNbofEvents = G4double(numberOfEvent);
|
||||
|
||||
fCerenkovCounter /= TotNbofEvents;
|
||||
fCerenkov2 /= TotNbofEvents;
|
||||
G4double rmsCerenkov = fCerenkov2 - fCerenkovCounter * fCerenkovCounter;
|
||||
if(rmsCerenkov > 0.)
|
||||
rmsCerenkov = std::sqrt(rmsCerenkov);
|
||||
else
|
||||
rmsCerenkov = 0.;
|
||||
|
||||
fScintillationCounter /= TotNbofEvents;
|
||||
fScintillation2 /= TotNbofEvents;
|
||||
G4double rmsScint =
|
||||
fScintillation2 - fScintillationCounter * fScintillationCounter;
|
||||
if(rmsScint > 0.)
|
||||
rmsScint = std::sqrt(rmsScint);
|
||||
else
|
||||
rmsScint = 0.;
|
||||
|
||||
fRayleighCounter /= TotNbofEvents;
|
||||
fRayleigh2 /= TotNbofEvents;
|
||||
G4double rmsRayleigh = fRayleigh2 - fRayleighCounter * fRayleighCounter;
|
||||
if(rmsRayleigh > 0.)
|
||||
rmsRayleigh = std::sqrt(rmsRayleigh);
|
||||
else
|
||||
rmsRayleigh = 0.;
|
||||
|
||||
fAbsorptionCounter /= TotNbofEvents;
|
||||
fAbsorption2 /= TotNbofEvents;
|
||||
G4double rmsAbsorption =
|
||||
fAbsorption2 - fAbsorptionCounter * fAbsorptionCounter;
|
||||
if(rmsAbsorption > 0.)
|
||||
rmsAbsorption = std::sqrt(rmsAbsorption);
|
||||
else
|
||||
rmsAbsorption = 0.;
|
||||
|
||||
fMieCounter /= TotNbofEvents;
|
||||
fMie2 /= TotNbofEvents;
|
||||
G4double rmsMie = fMie2 - fMieCounter * fMieCounter;
|
||||
if(rmsMie > 0.)
|
||||
rmsMie = std::sqrt(rmsMie);
|
||||
else
|
||||
rmsMie = 0.;
|
||||
|
||||
fBoundaryCounter /= TotNbofEvents;
|
||||
fBoundary2 /= TotNbofEvents;
|
||||
G4double rmsBoundary = fBoundary2 - fBoundaryCounter * fBoundaryCounter;
|
||||
if(rmsBoundary > 0.)
|
||||
rmsBoundary = std::sqrt(rmsBoundary);
|
||||
else
|
||||
rmsBoundary = 0.;
|
||||
|
||||
G4int prec = G4cout.precision(3);
|
||||
G4cout << "\n ======================== run summary ======================\n";
|
||||
|
||||
G4cout << "Primary particle was: " << fParticle->GetParticleName()
|
||||
<< " with energy " << G4BestUnit(fEnergy, "Energy") << "." << G4endl;
|
||||
G4cout << "Number of events: " << numberOfEvent << G4endl;
|
||||
|
||||
G4cout << "Average number of Cerenkov photons created per event: "
|
||||
<< fCerenkovCounter << " +- " << rmsCerenkov << G4endl;
|
||||
G4cout << "Average number of scintillation photons created per event: "
|
||||
<< fScintillationCounter << " +- " << rmsScint << G4endl;
|
||||
|
||||
G4cout << "Average number of optical Rayleigh interactions per event: "
|
||||
<< fRayleighCounter << " +- " << rmsRayleigh << G4endl;
|
||||
G4cout << "Average number of optical absorption interactions per event: "
|
||||
<< fAbsorptionCounter << " +- " << rmsAbsorption << G4endl;
|
||||
G4cout << "Average number of optical Mie interactions per event: "
|
||||
<< fMieCounter << " +- " << rmsMie << G4endl;
|
||||
G4cout << "Average number of optical boundary interactions per event: "
|
||||
<< fBoundaryCounter << " +- " << rmsBoundary << G4endl;
|
||||
|
||||
G4cout << G4endl;
|
||||
G4cout.precision(prec);
|
||||
}
|
||||
@@ -27,48 +27,55 @@
|
||||
/// \brief Implementation of the OpNoviceRunAction class
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
// Make this appear first!
|
||||
#include "G4Timer.hh"
|
||||
|
||||
#include "OpNoviceRunAction.hh"
|
||||
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
#include "OpNoviceRun.hh"
|
||||
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4Run.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRunAction::OpNoviceRunAction()
|
||||
: G4UserRunAction(),
|
||||
fTimer(0)
|
||||
OpNoviceRunAction::OpNoviceRunAction(OpNovicePrimaryGeneratorAction* prim)
|
||||
: G4UserRunAction()
|
||||
, fRun(nullptr)
|
||||
, fPrimary(prim)
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRunAction::~OpNoviceRunAction() {}
|
||||
|
||||
G4Run* OpNoviceRunAction::GenerateRun()
|
||||
{
|
||||
fTimer = new G4Timer;
|
||||
fRun = new OpNoviceRun();
|
||||
return fRun;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRunAction::~OpNoviceRunAction()
|
||||
void OpNoviceRunAction::BeginOfRunAction(const G4Run*)
|
||||
{
|
||||
delete fTimer;
|
||||
if(fPrimary)
|
||||
{
|
||||
G4ParticleDefinition* particle =
|
||||
fPrimary->GetParticleGun()->GetParticleDefinition();
|
||||
G4double energy = fPrimary->GetParticleGun()->GetParticleEnergy();
|
||||
fRun->SetPrimary(particle, energy);
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceRunAction::BeginOfRunAction(const G4Run* aRun)
|
||||
void OpNoviceRunAction::EndOfRunAction(const G4Run*)
|
||||
{
|
||||
G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl;
|
||||
fTimer->Start();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceRunAction::EndOfRunAction(const G4Run* aRun)
|
||||
{
|
||||
fTimer->Stop();
|
||||
G4cout << "number of event = " << aRun->GetNumberOfEvent()
|
||||
<< " " << *fTimer << G4endl;
|
||||
if(isMaster)
|
||||
fRun->EndOfRun();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -32,38 +32,40 @@
|
||||
|
||||
#include "OpNoviceStackingAction.hh"
|
||||
|
||||
#include "G4VProcess.hh"
|
||||
#include "OpNoviceRun.hh"
|
||||
|
||||
#include "G4ios.hh"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4ParticleTypes.hh"
|
||||
#include "G4RunManager.hh"
|
||||
#include "G4Track.hh"
|
||||
#include "G4ios.hh"
|
||||
#include "G4VProcess.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceStackingAction::OpNoviceStackingAction()
|
||||
: G4UserStackingAction(),
|
||||
fScintillationCounter(0), fCerenkovCounter(0)
|
||||
: G4UserStackingAction()
|
||||
, fScintillationCounter(0)
|
||||
, fCerenkovCounter(0)
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceStackingAction::~OpNoviceStackingAction()
|
||||
{}
|
||||
OpNoviceStackingAction::~OpNoviceStackingAction() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ClassificationOfNewTrack
|
||||
OpNoviceStackingAction::ClassifyNewTrack(const G4Track * aTrack)
|
||||
G4ClassificationOfNewTrack OpNoviceStackingAction::ClassifyNewTrack(
|
||||
const G4Track* aTrack)
|
||||
{
|
||||
if(aTrack->GetDefinition() == G4OpticalPhoton::OpticalPhotonDefinition())
|
||||
{ // particle is optical photon
|
||||
if(aTrack->GetParentID()>0)
|
||||
{ // particle is secondary
|
||||
{ // particle is optical photon
|
||||
if(aTrack->GetParentID() > 0)
|
||||
{ // particle is secondary
|
||||
if(aTrack->GetCreatorProcess()->GetProcessName() == "Scintillation")
|
||||
fScintillationCounter++;
|
||||
if(aTrack->GetCreatorProcess()->GetProcessName() == "Cerenkov")
|
||||
fCerenkovCounter++;
|
||||
++fScintillationCounter;
|
||||
else if(aTrack->GetCreatorProcess()->GetProcessName() == "Cerenkov")
|
||||
++fCerenkovCounter;
|
||||
}
|
||||
}
|
||||
return fUrgent;
|
||||
@@ -73,10 +75,15 @@ OpNoviceStackingAction::ClassifyNewTrack(const G4Track * aTrack)
|
||||
|
||||
void OpNoviceStackingAction::NewStage()
|
||||
{
|
||||
G4cout << "Number of Scintillation photons produced in this event : "
|
||||
<< fScintillationCounter << G4endl;
|
||||
G4cout << "Number of Cerenkov photons produced in this event : "
|
||||
<< fCerenkovCounter << G4endl;
|
||||
// G4cout << "Number of Scintillation photons produced in this event : "
|
||||
// << fScintillationCounter << G4endl;
|
||||
// G4cout << "Number of Cerenkov photons produced in this event : "
|
||||
// << fCerenkovCounter << G4endl;
|
||||
|
||||
OpNoviceRun* run = static_cast<OpNoviceRun*>(
|
||||
G4RunManager::GetRunManager()->GetNonConstCurrentRun());
|
||||
run->AddScintillation((G4double) fScintillationCounter);
|
||||
run->AddCerenkov((G4double) fCerenkovCounter);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -84,7 +91,7 @@ void OpNoviceStackingAction::NewStage()
|
||||
void OpNoviceStackingAction::PrepareNewEvent()
|
||||
{
|
||||
fScintillationCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -29,63 +29,72 @@
|
||||
|
||||
#include "OpNoviceSteppingAction.hh"
|
||||
|
||||
#include "G4Step.hh"
|
||||
#include "G4Track.hh"
|
||||
#include "G4OpticalPhoton.hh"
|
||||
#include "OpNoviceRun.hh"
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4OpBoundaryProcess.hh"
|
||||
#include "G4OpticalPhoton.hh"
|
||||
#include "G4RunManager.hh"
|
||||
#include "G4Step.hh"
|
||||
#include "G4Track.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceSteppingAction::OpNoviceSteppingAction()
|
||||
: G4UserSteppingAction()
|
||||
{
|
||||
fScintillationCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
fEventNumber = -1;
|
||||
}
|
||||
OpNoviceSteppingAction::OpNoviceSteppingAction(OpNoviceEventAction* event)
|
||||
: G4UserSteppingAction()
|
||||
, fEventAction(event)
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceSteppingAction::~OpNoviceSteppingAction()
|
||||
{ ; }
|
||||
OpNoviceSteppingAction::~OpNoviceSteppingAction() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceSteppingAction::UserSteppingAction(const G4Step* step)
|
||||
{
|
||||
G4int eventNumber = G4RunManager::GetRunManager()->
|
||||
GetCurrentEvent()->GetEventID();
|
||||
static G4ParticleDefinition* opticalphoton =
|
||||
G4OpticalPhoton::OpticalPhotonDefinition();
|
||||
|
||||
if (eventNumber != fEventNumber) {
|
||||
fEventNumber = eventNumber;
|
||||
fScintillationCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
}
|
||||
const G4ParticleDefinition* particleDef =
|
||||
step->GetTrack()->GetDynamicParticle()->GetParticleDefinition();
|
||||
|
||||
G4Track* track = step->GetTrack();
|
||||
if(particleDef == opticalphoton)
|
||||
{
|
||||
G4StepPoint* endPoint = step->GetPostStepPoint();
|
||||
const G4VProcess* pds = endPoint->GetProcessDefinedStep();
|
||||
G4String procname = pds->GetProcessName();
|
||||
if(procname.compare("OpRayleigh") == 0)
|
||||
fEventAction->AddRayleigh();
|
||||
else if(procname.compare("OpAbsorption") == 0)
|
||||
fEventAction->AddAbsorption();
|
||||
else if(procname.compare("OpMieHG") == 0)
|
||||
fEventAction->AddMie();
|
||||
|
||||
G4String ParticleName = track->GetDynamicParticle()->
|
||||
GetParticleDefinition()->GetParticleName();
|
||||
// for boundary scattering, process name in 'transportation'.
|
||||
// Need to check differently:
|
||||
if(endPoint->GetStepStatus() == fGeomBoundary)
|
||||
{
|
||||
G4OpBoundaryProcessStatus theStatus = Undefined;
|
||||
G4ProcessManager* opManager = opticalphoton->GetProcessManager();
|
||||
G4int n_proc = opManager->GetPostStepProcessVector(typeDoIt)->entries();
|
||||
G4ProcessVector* postStepDoItVector =
|
||||
opManager->GetPostStepProcessVector(typeDoIt);
|
||||
for(G4int i = 0; i < n_proc; ++i)
|
||||
{
|
||||
G4VProcess* currentProcess = (*postStepDoItVector)[i];
|
||||
|
||||
if (ParticleName == "opticalphoton") return;
|
||||
|
||||
const std::vector<const G4Track*>* secondaries =
|
||||
step->GetSecondaryInCurrentStep();
|
||||
|
||||
if (secondaries->size()>0) {
|
||||
for(unsigned int i=0; i<secondaries->size(); ++i) {
|
||||
if (secondaries->at(i)->GetParentID()>0) {
|
||||
if(secondaries->at(i)->GetDynamicParticle()->GetParticleDefinition()
|
||||
== G4OpticalPhoton::OpticalPhotonDefinition()){
|
||||
if (secondaries->at(i)->GetCreatorProcess()->GetProcessName()
|
||||
== "Scintillation")fScintillationCounter++;
|
||||
if (secondaries->at(i)->GetCreatorProcess()->GetProcessName()
|
||||
== "Cerenkov")fCerenkovCounter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
G4OpBoundaryProcess* opProc =
|
||||
dynamic_cast<G4OpBoundaryProcess*>(currentProcess);
|
||||
if(opProc)
|
||||
theStatus = opProc->GetStatus();
|
||||
}
|
||||
if(theStatus != Undefined && theStatus != NotAtBoundary &&
|
||||
theStatus != StepTooSmall)
|
||||
{
|
||||
fEventAction->AddBoundary();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user