46 #include "DetectorConstruction.hh"
47 #include "DetectorMessenger.hh"
49 #include "TargetSD.hh"
50 #include "CheckVolumeSD.hh"
89 fTargetSD =
new TargetSD(
"targetSD");
92 fDistanceVacuumTarget = 30.*
mm,
96 fTargetRadius = 100.*
mm;
100 fGasVolumeRadius = 210.*
mm;
101 fGasVolumeZ = 690.*
mm;
102 fMylarVolumeZ = 0.02*
mm;
104 fCheckVolumeZ = 0.1*
mm;
105 fCheckShiftZ = 200.*
mm;
107 fAbsorberRadius = 200.*
mm;
108 fPhantomRadius = 300.*
mm;
112 fAbsorberShiftZ = 70.*
mm;
119 fWindowMaterial = fTarget1Material;
136 void DetectorConstruction::InitialiseGeometryParameters()
142 fWorldXY = factor*
std::max(fPhantomRadius,fGasVolumeRadius);
144 fAbsorberZ = fPhantomZ/nz;
145 fGasVolumeZ = 1000.*
mm - fAbsorberShiftZ - fAirZ - fTarget1Z - fTarget2Z;
147 G4double ztot = fGasVolumeZ + fAirZ + fPhantomZ + fDistanceVacuumTarget;
148 fTargetVolumeZ = fDistanceVacuumTarget + fTarget2Z + fTarget1Z + fDelta;
149 fWorldZ = factor*ztot*0.5;
151 if(fCheckShiftZ < fDelta) { fCheckShiftZ = fDelta; }
152 if(fCheckShiftZ > fAirZ - fCheckVolumeZ -fDelta) {
153 fCheckShiftZ = fAirZ - fCheckVolumeZ -fDelta;
158 fWindowPosZ = -(ztot + fWindowZ)*0.5;
159 fGeneratorPosZ = fWindowPosZ - 0.5*fWindowZ - fDelta;
161 fTargetVolumePosZ= -0.5*(ztot - fTargetVolumeZ);
162 fTarget1PosZ = -0.5*(fTargetVolumeZ - fTarget1Z) + fDistanceVacuumTarget;
163 fTarget2PosZ = fTarget1PosZ + 0.5*(fTarget2Z + fTarget1Z);
165 fGasVolumePosZ = fTargetVolumePosZ + 0.5*(fTargetVolumeZ + fGasVolumeZ);
166 fCheckVolumePosZ = fGasVolumePosZ + 0.5*(fGasVolumeZ + fCheckVolumeZ)
168 fMylarPosZ = fGasVolumePosZ + 0.5*(fGasVolumeZ + fMylarVolumeZ) + fDelta;
170 fPhantomPosZ = fGasVolumePosZ + 0.5*(fGasVolumeZ + fPhantomZ) + fAirZ;
171 fAbsorberPosZ = fAbsorberShiftZ - 0.5*(fPhantomZ - fAbsorberZ);
175 G4double shiftZPh = fPhantomPosZ-0.5*fPhantomZ;
178 G4cout <<
"===================================================" <<
G4endl;
180 G4cout <<
"===================================================" <<
G4endl;
182 G4cout <<
" Window width= " << fWindowZ/
mm <<
" mm position = "
183 << fWindowPosZ/
mm <<
" mm:" <<
G4endl;
184 G4cout <<
" TargetV width= " << fTargetVolumeZ/
mm <<
" mm position = "
185 << fTargetVolumePosZ/
mm <<
" mm:" <<
G4endl;
186 G4cout <<
" Target1 width= " << fTarget1Z/
mm <<
" mm position = "
187 << fTarget1PosZ/
mm <<
" mm:" <<
G4endl;
188 G4cout <<
" Target2 width= " << fTarget2Z/
mm <<
" mm position = "
189 << fTarget2PosZ/
mm <<
" mm:" <<
G4endl;
190 G4cout <<
" Gas width= " << fGasVolumeZ/
mm <<
" mm position = "
191 << fGasVolumePosZ/
mm <<
" mm:" <<
G4endl;
192 G4cout <<
" Mylar width= " << fMylarVolumeZ/
mm <<
" mm position = "
193 << fMylarPosZ/
mm <<
" mm:" <<
G4endl;
194 G4cout <<
" Check width= " << fCheckVolumeZ/
mm <<
" mm position = "
195 << fCheckVolumePosZ/
mm <<
" mm:" <<
G4endl;
197 G4cout <<
" Phantom width= " << fPhantomZ/
mm <<
" mm position = "
198 << fPhantomPosZ/
mm <<
" mm:" <<
G4endl;
199 G4cout <<
" Absorb width= " << fAbsorberZ/
mm <<
" mm position = "
200 << fAbsorberPosZ/
mm <<
" mm:" <<
G4endl;
205 G4cout <<
"===================================================" <<
G4endl;
212 InitialiseGeometryParameters();
219 G4Box* solidWorld =
new G4Box(
"World",fWorldXY,fWorldXY,fWorldZ);
221 fWorldMaterial,
"World");
223 logicWorld,0,
false,0);
226 G4Tubs* solidWin =
new G4Tubs(
"Window",0.,fTargetRadius*0.25,0.5*fWindowZ,
229 fWindowMaterial,
"Window");
234 G4Tubs* solidTGVolume =
new G4Tubs(
"TargetVolume",0.,fTargetRadius,
235 0.5*fTargetVolumeZ,0.,
twopi);
240 logicTGVolume,
"TargetVolume",
244 G4Tubs* solidTarget1 =
new G4Tubs(
"Target1",0.,fTargetRadius*0.5,
245 0.5*fTarget1Z,0.,
twopi);
246 fLogicTarget1 =
new G4LogicalVolume(solidTarget1,fTarget1Material,
"Target1");
248 fLogicTarget1,
"Target1",
249 logicTGVolume,
false,0);
254 G4Tubs* solidTarget2 =
new G4Tubs(
"Target2",0.,fTargetRadius*0.5,
255 0.5*fTarget2Z,0.,
twopi);
256 fLogicTarget2 =
new G4LogicalVolume(solidTarget2,fTarget2Material,
"Target2");
258 fLogicTarget2,
"Target2",
259 logicTGVolume,
false,0);
265 G4Tubs* solidGasVolume =
new G4Tubs(
"GasVolume",0.,fGasVolumeRadius,
266 0.5*fGasVolumeZ,0.,
twopi);
271 "GasVolume",logicGasVolume,
276 G4Tubs* sMylarVolume =
new G4Tubs(
"Mylar",0.,fGasVolumeRadius,
277 0.5*fMylarVolumeZ,0.,
twopi);
284 G4Tubs* solidCheckVolume =
new G4Tubs(
"CheckVolume",0.,fGasVolumeRadius,
285 0.5*fCheckVolumeZ,0.,
twopi);
290 "CheckVolume",logicCheckVolume,
296 G4Box* solidPhantom =
new G4Box(
"Phantom",fPhantomRadius,fPhantomRadius,
303 "Phantom",logicPhantom,
306 G4Tubs* solidPh =
new G4Tubs(
"PhantomSD",0.,fAbsorberRadius,
307 0.5*fPhantomZ,0.,
twopi);
309 fAbsorberMaterial,
"PhantomSD");
312 physPhantom,
false,0);
313 G4cout <<
"Phantom R= " << fAbsorberRadius <<
" dz= " << 0.5*fPhantomZ
318 G4Tubs* solidAbsorber =
new G4Tubs(
"Absorber",0.,fAbsorberRadius,absWidth,
323 G4cout <<
"Absorber R= " << fAbsorberRadius <<
" dz= " << absWidth
324 <<
" posZ= " << fAbsorberPosZ<<
G4endl;
327 logicAbsorber,physPh,
false,0);
337 for(
G4int k=0; k<numR; k++) {
339 if(k == numR-1) r2 = fAbsorberRadius;
342 solidRing =
new G4Tubs(
"Ring",r1,r2,absWidth,0.,
twopi);
347 logicAbsorber,
false,k);
400 G4cout <<
"Material " << mat <<
" is not found out!" <<
G4endl;
401 }
else if (pttoMaterial != fTarget1Material) {
403 if(fLogicTarget1) { fLogicTarget1->
SetMaterial(fTarget1Material); }
417 G4cout <<
"Material " << mat <<
" is not found out!" <<
G4endl;
418 }
else if (pttoMaterial != fTarget2Material) {
419 fTarget2Material = pttoMaterial;
421 if(fLogicTarget2) { fLogicTarget2->
SetMaterial(fTarget2Material); }
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
void SetShiftZ(G4double val)
static Histo * GetPointer()
static constexpr double mm
CLHEP::Hep3Vector G4ThreeVector
const G4String & GetName() const
G4VPhysicalVolume * Construct()
static G4MaterialTable * GetMaterialTable()
static G4NistManager * Instance()
void SetTarget2Material(const G4String &m)
static constexpr double twopi
G4GLOB_DLL std::ostream G4cout
void SetAbsorberZ(G4double val)
void PhysicsHasBeenModified()
void SetVisibility(G4bool=true)
static G4RunManager * GetRunManager()
Definition of the PhantomSD class.
T max(const T t1, const T t2)
brief Return the largest of the two arguments
static G4SDManager * GetSDMpointer()
void SetTarget1Material(const G4String &m)
void SetMaterial(G4Material *pMaterial)
static const G4VisAttributes & GetInvisible()
void SetVisAttributes(const G4VisAttributes *pVA)
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)