Import Geant4 10.0.0 source tree
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: OpNoviceActionInitialization.cc 68058 2013-03-13 14:47:43Z gcosmo $
|
||||
//
|
||||
/// \file OpNoviceActionInitialization.cc
|
||||
/// \brief Implementation of the OpNoviceActionInitialization class
|
||||
|
||||
#include "OpNoviceActionInitialization.hh"
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
#include "OpNoviceRunAction.hh"
|
||||
#include "OpNoviceSteppingAction.hh"
|
||||
#include "OpNoviceStackingAction.hh"
|
||||
#include "OpNoviceSteppingVerbose.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceActionInitialization::OpNoviceActionInitialization()
|
||||
: G4VUserActionInitialization()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceActionInitialization::~OpNoviceActionInitialization()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceActionInitialization::BuildForMaster() const
|
||||
{
|
||||
SetUserAction(new OpNoviceRunAction());
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceActionInitialization::Build() const
|
||||
{
|
||||
SetUserAction(new OpNovicePrimaryGeneratorAction());
|
||||
SetUserAction(new OpNoviceRunAction());
|
||||
SetUserAction(new OpNoviceSteppingAction());
|
||||
SetUserAction(new OpNoviceStackingAction());
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4VSteppingVerbose*
|
||||
OpNoviceActionInitialization::InitializeSteppingVerbose() const
|
||||
{
|
||||
return new OpNoviceSteppingVerbose();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,321 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNoviceDetectorConstruction.hh"
|
||||
|
||||
#include "G4Material.hh"
|
||||
#include "G4Element.hh"
|
||||
#include "G4LogicalBorderSurface.hh"
|
||||
#include "G4LogicalSkinSurface.hh"
|
||||
#include "G4OpticalSurface.hh"
|
||||
#include "G4Box.hh"
|
||||
#include "G4LogicalVolume.hh"
|
||||
#include "G4ThreeVector.hh"
|
||||
#include "G4PVPlacement.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceDetectorConstruction::OpNoviceDetectorConstruction()
|
||||
: 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;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceDetectorConstruction::~OpNoviceDetectorConstruction(){;}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4VPhysicalVolume* OpNoviceDetectorConstruction::Construct()
|
||||
{
|
||||
|
||||
// ------------- 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);
|
||||
|
||||
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);
|
||||
|
||||
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 ------------
|
||||
//
|
||||
const G4int nEntries = 32;
|
||||
|
||||
G4double photonEnergy[nEntries] =
|
||||
{ 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 };
|
||||
//
|
||||
// Water
|
||||
//
|
||||
G4double refractiveIndex1[nEntries] =
|
||||
{ 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};
|
||||
|
||||
G4double absorption[nEntries] =
|
||||
{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 };
|
||||
|
||||
G4double scintilFast[nEntries] =
|
||||
{ 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 scintilSlow[nEntries] =
|
||||
{ 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->AddConstProperty("SCINTILLATIONYIELD",50./MeV);
|
||||
myMPT1->AddConstProperty("RESOLUTIONSCALE",1.0);
|
||||
myMPT1->AddConstProperty("FASTTIMECONSTANT", 1.*ns);
|
||||
myMPT1->AddConstProperty("SLOWTIMECONSTANT",10.*ns);
|
||||
myMPT1->AddConstProperty("YIELDRATIO",0.8);
|
||||
|
||||
const G4int numentries_water = 60;
|
||||
|
||||
G4double energy_water[numentries_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
|
||||
};
|
||||
|
||||
//assume 100 times larger than the rayleigh scattering for now.
|
||||
G4double mie_water[numentries_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
|
||||
};
|
||||
|
||||
// gforward, gbackward, forward backward ratio
|
||||
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]);
|
||||
|
||||
water->SetMaterialPropertiesTable(myMPT1);
|
||||
|
||||
// Set the Birks Constant for the Water scintillator
|
||||
|
||||
water->GetIonisation()->SetBirksConstant(0.126*mm/MeV);
|
||||
|
||||
//
|
||||
// Air
|
||||
//
|
||||
G4double refractiveIndex2[nEntries] =
|
||||
{ 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);
|
||||
|
||||
air->SetMaterialPropertiesTable(myMPT2);
|
||||
|
||||
//
|
||||
// ------------- Volumes --------------
|
||||
|
||||
// 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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
// 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);
|
||||
|
||||
//G4VPhysicalVolume* bubbleAir_phys =
|
||||
new G4PVPlacement(0,G4ThreeVector(0,2.5*m,0),bubbleAir_log,"Bubble",
|
||||
waterTank_log,false,0);
|
||||
|
||||
// ------------- Surfaces --------------
|
||||
//
|
||||
// Water Tank
|
||||
//
|
||||
G4OpticalSurface* opWaterSurface = new G4OpticalSurface("WaterSurface");
|
||||
opWaterSurface->SetType(dielectric_dielectric);
|
||||
opWaterSurface->SetFinish(ground);
|
||||
opWaterSurface->SetModel(unified);
|
||||
|
||||
new G4LogicalBorderSurface("WaterSurface",
|
||||
waterTank_phys,expHall_phys,opWaterSurface);
|
||||
|
||||
// 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);
|
||||
|
||||
G4OpticalSurface* 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};
|
||||
|
||||
//OpticalWaterSurface
|
||||
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);
|
||||
|
||||
opWaterSurface->SetMaterialPropertiesTable(myST1);
|
||||
|
||||
//OpticalAirSurface
|
||||
G4double reflectivity[num] = {0.3, 0.5};
|
||||
G4double efficiency[num] = {0.8, 1.0};
|
||||
|
||||
G4MaterialPropertiesTable *myST2 = new G4MaterialPropertiesTable();
|
||||
|
||||
myST2->AddProperty("REFLECTIVITY", ephoton, reflectivity, num);
|
||||
myST2->AddProperty("EFFICIENCY", ephoton, efficiency, num);
|
||||
|
||||
opAirSurface->SetMaterialPropertiesTable(myST2);
|
||||
|
||||
//always return the physical World
|
||||
return expHall_phys;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,293 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "globals.hh"
|
||||
#include "OpNovicePhysicsList.hh"
|
||||
#include "OpNovicePhysicsListMessenger.hh"
|
||||
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4ParticleTypes.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
|
||||
#include "G4BosonConstructor.hh"
|
||||
#include "G4LeptonConstructor.hh"
|
||||
#include "G4MesonConstructor.hh"
|
||||
#include "G4BaryonConstructor.hh"
|
||||
#include "G4IonConstructor.hh"
|
||||
#include "G4ShortLivedConstructor.hh"
|
||||
|
||||
#include "G4ProcessManager.hh"
|
||||
|
||||
#include "G4Cerenkov.hh"
|
||||
#include "G4Scintillation.hh"
|
||||
#include "G4OpAbsorption.hh"
|
||||
#include "G4OpRayleigh.hh"
|
||||
#include "G4OpMieHG.hh"
|
||||
#include "G4OpBoundaryProcess.hh"
|
||||
|
||||
#include "G4LossTableManager.hh"
|
||||
#include "G4EmSaturation.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePhysicsList::OpNovicePhysicsList()
|
||||
: G4VUserPhysicsList(),
|
||||
fCerenkovProcess(NULL),
|
||||
fScintillationProcess(NULL),
|
||||
fAbsorptionProcess(NULL),
|
||||
fRayleighScatteringProcess(NULL),
|
||||
fMieHGScatteringProcess(NULL),
|
||||
fBoundaryProcess(NULL),
|
||||
fMessenger(0)
|
||||
{
|
||||
fMessenger = new OpNovicePhysicsListMessenger(this);
|
||||
SetVerboseLevel(0);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePhysicsList::~OpNovicePhysicsList() { delete fMessenger; }
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::ConstructParticle()
|
||||
{
|
||||
// In this method, static member functions should be called
|
||||
// for all particles which you want to use.
|
||||
// This ensures that objects of these particle types will be
|
||||
// created in the program.
|
||||
|
||||
G4BosonConstructor bConstructor;
|
||||
bConstructor.ConstructParticle();
|
||||
|
||||
G4LeptonConstructor lConstructor;
|
||||
lConstructor.ConstructParticle();
|
||||
|
||||
G4MesonConstructor mConstructor;
|
||||
mConstructor.ConstructParticle();
|
||||
|
||||
G4BaryonConstructor rConstructor;
|
||||
rConstructor.ConstructParticle();
|
||||
|
||||
G4IonConstructor iConstructor;
|
||||
iConstructor.ConstructParticle();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::ConstructProcess()
|
||||
{
|
||||
AddTransportation();
|
||||
ConstructDecay();
|
||||
ConstructEM();
|
||||
ConstructOp();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "G4Decay.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::ConstructDecay()
|
||||
{
|
||||
// Add Decay Process
|
||||
G4Decay* theDecayProcess = new G4Decay();
|
||||
theParticleIterator->reset();
|
||||
while( (*theParticleIterator)() ){
|
||||
G4ParticleDefinition* particle = theParticleIterator->value();
|
||||
G4ProcessManager* pmanager = particle->GetProcessManager();
|
||||
if (theDecayProcess->IsApplicable(*particle)) {
|
||||
pmanager ->AddProcess(theDecayProcess);
|
||||
// set ordering for PostStepDoIt and AtRestDoIt
|
||||
pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep);
|
||||
pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "G4ComptonScattering.hh"
|
||||
#include "G4GammaConversion.hh"
|
||||
#include "G4PhotoElectricEffect.hh"
|
||||
|
||||
#include "G4eMultipleScattering.hh"
|
||||
#include "G4MuMultipleScattering.hh"
|
||||
#include "G4hMultipleScattering.hh"
|
||||
|
||||
#include "G4eIonisation.hh"
|
||||
#include "G4eBremsstrahlung.hh"
|
||||
#include "G4eplusAnnihilation.hh"
|
||||
|
||||
#include "G4MuIonisation.hh"
|
||||
#include "G4MuBremsstrahlung.hh"
|
||||
#include "G4MuPairProduction.hh"
|
||||
|
||||
#include "G4hIonisation.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::ConstructEM()
|
||||
{
|
||||
theParticleIterator->reset();
|
||||
while( (*theParticleIterator)() ){
|
||||
G4ParticleDefinition* particle = theParticleIterator->value();
|
||||
G4ProcessManager* pmanager = particle->GetProcessManager();
|
||||
G4String particleName = particle->GetParticleName();
|
||||
|
||||
if (particleName == "gamma") {
|
||||
// gamma
|
||||
// Construct processes for gamma
|
||||
pmanager->AddDiscreteProcess(new G4GammaConversion());
|
||||
pmanager->AddDiscreteProcess(new G4ComptonScattering());
|
||||
pmanager->AddDiscreteProcess(new G4PhotoElectricEffect());
|
||||
|
||||
} else if (particleName == "e-") {
|
||||
//electron
|
||||
// Construct processes for electron
|
||||
pmanager->AddProcess(new G4eMultipleScattering(),-1, 1, 1);
|
||||
pmanager->AddProcess(new G4eIonisation(), -1, 2, 2);
|
||||
pmanager->AddProcess(new G4eBremsstrahlung(), -1, 3, 3);
|
||||
|
||||
} else if (particleName == "e+") {
|
||||
//positron
|
||||
// Construct processes for positron
|
||||
pmanager->AddProcess(new G4eMultipleScattering(),-1, 1, 1);
|
||||
pmanager->AddProcess(new G4eIonisation(), -1, 2, 2);
|
||||
pmanager->AddProcess(new G4eBremsstrahlung(), -1, 3, 3);
|
||||
pmanager->AddProcess(new G4eplusAnnihilation(), 0,-1, 4);
|
||||
|
||||
} else if( particleName == "mu+" ||
|
||||
particleName == "mu-" ) {
|
||||
//muon
|
||||
// Construct processes for muon
|
||||
pmanager->AddProcess(new G4MuMultipleScattering(),-1, 1, 1);
|
||||
pmanager->AddProcess(new G4MuIonisation(), -1, 2, 2);
|
||||
pmanager->AddProcess(new G4MuBremsstrahlung(), -1, 3, 3);
|
||||
pmanager->AddProcess(new G4MuPairProduction(), -1, 4, 4);
|
||||
|
||||
} else {
|
||||
if ((particle->GetPDGCharge() != 0.0) &&
|
||||
(particle->GetParticleName() != "chargedgeantino") &&
|
||||
!particle->IsShortLived()) {
|
||||
// all others charged particles except geantino
|
||||
pmanager->AddProcess(new G4hMultipleScattering(),-1,1,1);
|
||||
pmanager->AddProcess(new G4hIonisation(), -1,2,2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::ConstructOp()
|
||||
{
|
||||
fCerenkovProcess = new G4Cerenkov("Cerenkov");
|
||||
fScintillationProcess = new G4Scintillation("Scintillation");
|
||||
fAbsorptionProcess = new G4OpAbsorption();
|
||||
fRayleighScatteringProcess = new G4OpRayleigh();
|
||||
fMieHGScatteringProcess = new G4OpMieHG();
|
||||
fBoundaryProcess = new G4OpBoundaryProcess();
|
||||
|
||||
// fCerenkovProcess->DumpPhysicsTable();
|
||||
// fScintillationProcess->DumpPhysicsTable();
|
||||
// fRayleighScatteringProcess->DumpPhysicsTable();
|
||||
|
||||
SetVerbose(1);
|
||||
|
||||
fCerenkovProcess->SetMaxNumPhotonsPerStep(20);
|
||||
fCerenkovProcess->SetMaxBetaChangePerStep(10.0);
|
||||
fCerenkovProcess->SetTrackSecondariesFirst(true);
|
||||
|
||||
fScintillationProcess->SetScintillationYieldFactor(1.);
|
||||
fScintillationProcess->SetTrackSecondariesFirst(true);
|
||||
|
||||
// Use Birks Correction in the Scintillation process
|
||||
|
||||
G4EmSaturation* emSaturation =
|
||||
G4LossTableManager::Instance()->EmSaturation();
|
||||
fScintillationProcess->AddSaturation(emSaturation);
|
||||
|
||||
theParticleIterator->reset();
|
||||
while( (*theParticleIterator)() ){
|
||||
G4ParticleDefinition* particle = theParticleIterator->value();
|
||||
G4ProcessManager* pmanager = particle->GetProcessManager();
|
||||
G4String particleName = particle->GetParticleName();
|
||||
if (fCerenkovProcess->IsApplicable(*particle)) {
|
||||
pmanager->AddProcess(fCerenkovProcess);
|
||||
pmanager->SetProcessOrdering(fCerenkovProcess,idxPostStep);
|
||||
}
|
||||
if (fScintillationProcess->IsApplicable(*particle)) {
|
||||
pmanager->AddProcess(fScintillationProcess);
|
||||
pmanager->SetProcessOrderingToLast(fScintillationProcess, idxAtRest);
|
||||
pmanager->SetProcessOrderingToLast(fScintillationProcess, idxPostStep);
|
||||
}
|
||||
if (particleName == "opticalphoton") {
|
||||
G4cout << " AddDiscreteProcess to OpticalPhoton " << G4endl;
|
||||
pmanager->AddDiscreteProcess(fAbsorptionProcess);
|
||||
pmanager->AddDiscreteProcess(fRayleighScatteringProcess);
|
||||
pmanager->AddDiscreteProcess(fMieHGScatteringProcess);
|
||||
pmanager->AddDiscreteProcess(fBoundaryProcess);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::SetVerbose(G4int verbose)
|
||||
{
|
||||
fCerenkovProcess->SetVerboseLevel(verbose);
|
||||
fScintillationProcess->SetVerboseLevel(verbose);
|
||||
fAbsorptionProcess->SetVerboseLevel(verbose);
|
||||
fRayleighScatteringProcess->SetVerboseLevel(verbose);
|
||||
fMieHGScatteringProcess->SetVerboseLevel(verbose);
|
||||
fBoundaryProcess->SetVerboseLevel(verbose);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::SetNbOfPhotonsCerenkov(G4int MaxNumber)
|
||||
{
|
||||
fCerenkovProcess->SetMaxNumPhotonsPerStep(MaxNumber);
|
||||
}
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsList::SetCuts()
|
||||
{
|
||||
// " G4VUserPhysicsList::SetCutsWithDefault" method sets
|
||||
// the default cut value for all particle types
|
||||
//
|
||||
SetCutsWithDefault();
|
||||
|
||||
if (verboseLevel>0) DumpCutValuesTable();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,90 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNovicePhysicsListMessenger.hh"
|
||||
|
||||
#include "OpNovicePhysicsList.hh"
|
||||
#include "G4UIdirectory.hh"
|
||||
#include "G4UIcmdWithAnInteger.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePhysicsListMessenger::
|
||||
OpNovicePhysicsListMessenger(OpNovicePhysicsList* pPhys)
|
||||
: G4UImessenger(),
|
||||
fPhysicsList(pPhys)
|
||||
{
|
||||
fOpNoviceDir = new G4UIdirectory("/OpNovice/");
|
||||
fOpNoviceDir->SetGuidance("UI commands of this example");
|
||||
|
||||
fPhysDir = new G4UIdirectory("/OpNovice/phys/");
|
||||
fPhysDir->SetGuidance("PhysicsList control");
|
||||
|
||||
fVerboseCmd = new G4UIcmdWithAnInteger("/OpNovice/phys/verbose",this);
|
||||
fVerboseCmd->SetGuidance("set verbose for physics processes");
|
||||
fVerboseCmd->SetParameterName("verbose",true);
|
||||
fVerboseCmd->SetDefaultValue(1);
|
||||
fVerboseCmd->SetRange("verbose>=0");
|
||||
fVerboseCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fCerenkovCmd =
|
||||
new G4UIcmdWithAnInteger("/OpNovice/phys/cerenkovMaxPhotons",this);
|
||||
fCerenkovCmd->SetGuidance("set max nb of photons per step");
|
||||
fCerenkovCmd->SetParameterName("MaxNumber",false);
|
||||
fCerenkovCmd->SetRange("MaxNumber>=0");
|
||||
fCerenkovCmd->AvailableForStates(G4State_Idle);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePhysicsListMessenger::~OpNovicePhysicsListMessenger()
|
||||
{
|
||||
delete fVerboseCmd;
|
||||
delete fCerenkovCmd;
|
||||
delete fPhysDir;
|
||||
delete fOpNoviceDir;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePhysicsListMessenger::SetNewValue(G4UIcommand* command,
|
||||
G4String newValue)
|
||||
{
|
||||
if( command == fVerboseCmd )
|
||||
{fPhysicsList->SetVerbose(fVerboseCmd->GetNewIntValue(newValue));}
|
||||
|
||||
if( command == fCerenkovCmd )
|
||||
{fPhysicsList->
|
||||
SetNbOfPhotonsCerenkov(fCerenkovCmd->GetNewIntValue(newValue));}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,113 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
#include "OpNovicePrimaryGeneratorMessenger.hh"
|
||||
|
||||
#include "Randomize.hh"
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4ParticleGun.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePrimaryGeneratorAction::OpNovicePrimaryGeneratorAction()
|
||||
: G4VUserPrimaryGeneratorAction(),
|
||||
fParticleGun(0)
|
||||
{
|
||||
G4int n_particle = 1;
|
||||
fParticleGun = new G4ParticleGun(n_particle);
|
||||
|
||||
//create a messenger for this class
|
||||
fGunMessenger = new OpNovicePrimaryGeneratorMessenger(this);
|
||||
|
||||
//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);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePrimaryGeneratorAction::~OpNovicePrimaryGeneratorAction()
|
||||
{
|
||||
delete fParticleGun;
|
||||
delete fGunMessenger;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
|
||||
{
|
||||
fParticleGun->GeneratePrimaryVertex(anEvent);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNovicePrimaryGeneratorAction::SetOptPhotonPolar()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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......
|
||||
@@ -0,0 +1,84 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNovicePrimaryGeneratorMessenger.hh"
|
||||
|
||||
#include "OpNovicePrimaryGeneratorAction.hh"
|
||||
#include "G4UIdirectory.hh"
|
||||
#include "G4UIcmdWithADoubleAndUnit.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePrimaryGeneratorMessenger::
|
||||
OpNovicePrimaryGeneratorMessenger(OpNovicePrimaryGeneratorAction* OpNoviceGun)
|
||||
: G4UImessenger(),
|
||||
fOpNoviceAction(OpNoviceGun)
|
||||
{
|
||||
fGunDir = new G4UIdirectory("/OpNovice/gun/");
|
||||
fGunDir->SetGuidance("PrimaryGenerator control");
|
||||
|
||||
fPolarCmd =
|
||||
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->SetUnitCategory("Angle");
|
||||
fPolarCmd->SetDefaultValue(-360.0);
|
||||
fPolarCmd->SetDefaultUnit("deg");
|
||||
fPolarCmd->AvailableForStates(G4State_Idle);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNovicePrimaryGeneratorMessenger::~OpNovicePrimaryGeneratorMessenger()
|
||||
{
|
||||
delete fPolarCmd;
|
||||
delete fGunDir;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
// Make this appear first!
|
||||
#include "G4Timer.hh"
|
||||
|
||||
#include "OpNoviceRunAction.hh"
|
||||
|
||||
#include "G4Run.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRunAction::OpNoviceRunAction()
|
||||
: G4UserRunAction(),
|
||||
fTimer(0)
|
||||
{
|
||||
fTimer = new G4Timer;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceRunAction::~OpNoviceRunAction()
|
||||
{
|
||||
delete fTimer;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceRunAction::BeginOfRunAction(const G4Run* aRun)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,87 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNoviceStackingAction.hh"
|
||||
|
||||
#include "G4VProcess.hh"
|
||||
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4ParticleTypes.hh"
|
||||
#include "G4Track.hh"
|
||||
#include "G4ios.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceStackingAction::OpNoviceStackingAction()
|
||||
: G4UserStackingAction(),
|
||||
fScintillationCounter(0), fCerenkovCounter(0)
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceStackingAction::~OpNoviceStackingAction()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ClassificationOfNewTrack
|
||||
OpNoviceStackingAction::ClassifyNewTrack(const G4Track * aTrack)
|
||||
{
|
||||
if(aTrack->GetDefinition() == G4OpticalPhoton::OpticalPhotonDefinition())
|
||||
{ // particle is optical photon
|
||||
if(aTrack->GetParentID()>0)
|
||||
{ // particle is secondary
|
||||
if(aTrack->GetCreatorProcess()->GetProcessName() == "Scintillation")
|
||||
fScintillationCounter++;
|
||||
if(aTrack->GetCreatorProcess()->GetProcessName() == "Cerenkov")
|
||||
fCerenkovCounter++;
|
||||
}
|
||||
}
|
||||
return fUrgent;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceStackingAction::PrepareNewEvent()
|
||||
{
|
||||
fScintillationCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,98 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: OpNoviceSteppingAction.cc 71007 2013-06-09 16:14:59Z maire $
|
||||
//
|
||||
/// \file OpNoviceSteppingAction.cc
|
||||
/// \brief Implementation of the OpNoviceSteppingAction class
|
||||
|
||||
#include "OpNoviceSteppingAction.hh"
|
||||
|
||||
#include "G4Step.hh"
|
||||
#include "G4Track.hh"
|
||||
#include "G4OpticalPhoton.hh"
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4RunManager.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
|
||||
OpNoviceSteppingAction::OpNoviceSteppingAction()
|
||||
: G4UserSteppingAction()
|
||||
{
|
||||
fScintillationCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
fEventNumber = -1;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceSteppingAction::~OpNoviceSteppingAction()
|
||||
{ ; }
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceSteppingAction::UserSteppingAction(const G4Step* step)
|
||||
{
|
||||
G4int eventNumber = G4RunManager::GetRunManager()->
|
||||
GetCurrentEvent()->GetEventID();
|
||||
|
||||
if (eventNumber != fEventNumber) {
|
||||
G4cout << " Number of Scintillation Photons in previous event: "
|
||||
<< fScintillationCounter << G4endl;
|
||||
G4cout << " Number of Cerenkov Photons in previous event: "
|
||||
<< fCerenkovCounter << G4endl;
|
||||
fEventNumber = eventNumber;
|
||||
fScintillationCounter = 0;
|
||||
fCerenkovCounter = 0;
|
||||
}
|
||||
|
||||
G4Track* track = step->GetTrack();
|
||||
|
||||
G4String ParticleName = track->GetDynamicParticle()->
|
||||
GetParticleDefinition()->GetParticleName();
|
||||
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,181 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "OpNoviceSteppingVerbose.hh"
|
||||
|
||||
#include "G4SteppingManager.hh"
|
||||
#include "G4UnitsTable.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceSteppingVerbose::OpNoviceSteppingVerbose()
|
||||
: G4SteppingVerbose()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
OpNoviceSteppingVerbose::~OpNoviceSteppingVerbose()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceSteppingVerbose::StepInfo()
|
||||
{
|
||||
CopyState();
|
||||
|
||||
G4int prec = G4cout.precision(3);
|
||||
|
||||
if( verboseLevel >= 1 ){
|
||||
if( verboseLevel >= 4 ) VerboseTrack();
|
||||
if( verboseLevel >= 3 ){
|
||||
G4cout << G4endl;
|
||||
G4cout << std::setw( 5) << "#Step#" << " "
|
||||
<< std::setw( 6) << "X" << " "
|
||||
<< std::setw( 6) << "Y" << " "
|
||||
<< std::setw( 6) << "Z" << " "
|
||||
<< std::setw( 9) << "KineE" << " "
|
||||
<< std::setw( 9) << "dEStep" << " "
|
||||
<< std::setw(10) << "StepLeng"
|
||||
<< std::setw(10) << "TrakLeng"
|
||||
<< std::setw(10) << "Volume" << " "
|
||||
<< std::setw(10) << "Process" << G4endl;
|
||||
}
|
||||
|
||||
G4cout << std::setw(5) << fTrack->GetCurrentStepNumber() << " "
|
||||
<< std::setw(6) << G4BestUnit(fTrack->GetPosition().x(),"Length")
|
||||
<< std::setw(6) << G4BestUnit(fTrack->GetPosition().y(),"Length")
|
||||
<< std::setw(6) << G4BestUnit(fTrack->GetPosition().z(),"Length")
|
||||
<< std::setw(6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy")
|
||||
<< std::setw(6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy")
|
||||
<< std::setw(6) << G4BestUnit(fStep->GetStepLength(),"Length")
|
||||
<< std::setw(6) << G4BestUnit(fTrack->GetTrackLength(),"Length")
|
||||
<< " ";
|
||||
|
||||
// if( fStepStatus != fWorldBoundary){
|
||||
if( fTrack->GetNextVolume() != 0 ) {
|
||||
G4cout << std::setw(10) << fTrack->GetVolume()->GetName();
|
||||
} else {
|
||||
G4cout << std::setw(10) << "OutOfWorld";
|
||||
}
|
||||
|
||||
if(fStep->GetPostStepPoint()->GetProcessDefinedStep() != 0){
|
||||
G4cout << " "
|
||||
<< std::setw(10)
|
||||
<< fStep->GetPostStepPoint()->GetProcessDefinedStep()
|
||||
->GetProcessName();
|
||||
} else {
|
||||
G4cout << " UserLimit";
|
||||
}
|
||||
|
||||
G4cout << G4endl;
|
||||
|
||||
if( verboseLevel == 2 ){
|
||||
G4int tN2ndariesTot = fN2ndariesAtRestDoIt +
|
||||
fN2ndariesAlongStepDoIt +
|
||||
fN2ndariesPostStepDoIt;
|
||||
if(tN2ndariesTot>0){
|
||||
G4cout << " :----- List of 2ndaries - "
|
||||
<< "#SpawnInStep=" << std::setw(3) << tN2ndariesTot
|
||||
<< "(Rest=" << std::setw(2) << fN2ndariesAtRestDoIt
|
||||
<< ",Along=" << std::setw(2) << fN2ndariesAlongStepDoIt
|
||||
<< ",Post=" << std::setw(2) << fN2ndariesPostStepDoIt
|
||||
<< "), "
|
||||
<< "#SpawnTotal=" << std::setw(3) << (*fSecondary).size()
|
||||
<< " ---------------"
|
||||
<< G4endl;
|
||||
|
||||
for(size_t lp1=(*fSecondary).size()-tN2ndariesTot;
|
||||
lp1<(*fSecondary).size(); lp1++){
|
||||
G4cout << " : "
|
||||
<< std::setw(6)
|
||||
<< G4BestUnit((*fSecondary)[lp1]->GetPosition().x(),"Length")
|
||||
<< std::setw(6)
|
||||
<< G4BestUnit((*fSecondary)[lp1]->GetPosition().y(),"Length")
|
||||
<< std::setw(6)
|
||||
<< G4BestUnit((*fSecondary)[lp1]->GetPosition().z(),"Length")
|
||||
<< std::setw(6)
|
||||
<< G4BestUnit((*fSecondary)[lp1]->GetKineticEnergy(),"Energy")
|
||||
<< std::setw(10)
|
||||
<< (*fSecondary)[lp1]->GetDefinition()->GetParticleName();
|
||||
G4cout << G4endl;
|
||||
}
|
||||
|
||||
G4cout << " :-----------------------------"
|
||||
<< "----------------------------------"
|
||||
<< "-- EndOf2ndaries Info ---------------"
|
||||
<< G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
G4cout.precision(prec);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void OpNoviceSteppingVerbose::TrackingStarted()
|
||||
{
|
||||
|
||||
CopyState();
|
||||
G4int prec = G4cout.precision(3);
|
||||
if( verboseLevel > 0 ){
|
||||
|
||||
G4cout << std::setw( 5) << "Step#" << " "
|
||||
<< std::setw( 6) << "X" << " "
|
||||
<< std::setw( 6) << "Y" << " "
|
||||
<< std::setw( 6) << "Z" << " "
|
||||
<< std::setw( 9) << "KineE" << " "
|
||||
<< std::setw( 9) << "dEStep" << " "
|
||||
<< std::setw(10) << "StepLeng"
|
||||
<< std::setw(10) << "TrakLeng"
|
||||
<< std::setw(10) << "Volume" << " "
|
||||
<< std::setw(10) << "Process" << G4endl;
|
||||
|
||||
G4cout << std::setw( 5) << fTrack->GetCurrentStepNumber() << " "
|
||||
<< std::setw( 6) << G4BestUnit(fTrack->GetPosition().x(),"Length")
|
||||
<< std::setw( 6) << G4BestUnit(fTrack->GetPosition().y(),"Length")
|
||||
<< std::setw( 6) << G4BestUnit(fTrack->GetPosition().z(),"Length")
|
||||
<< std::setw( 6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy")
|
||||
<< std::setw( 6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy")
|
||||
<< std::setw( 6) << G4BestUnit(fStep->GetStepLength(),"Length")
|
||||
<< std::setw( 6) << G4BestUnit(fTrack->GetTrackLength(),"Length")
|
||||
<< " ";
|
||||
|
||||
if(fTrack->GetNextVolume()){
|
||||
G4cout << std::setw(10) << fTrack->GetVolume()->GetName();
|
||||
} else {
|
||||
G4cout << "OutOfWorld";
|
||||
}
|
||||
G4cout << " initStep" << G4endl;
|
||||
}
|
||||
G4cout.precision(prec);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
Reference in New Issue
Block a user