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;
218 InitialiseGeometryParameters();
225 G4Box* solidWorld =
new G4Box(
"World",fWorldXY,fWorldXY,fWorldZ);
227 fWorldMaterial,
"World");
229 logicWorld,0,
false,0);
232 G4Tubs* solidWin =
new G4Tubs(
"Window",0.,fTargetRadius*0.25,0.5*fWindowZ,
235 fWindowMaterial,
"Window");
240 G4Tubs* solidTGVolume =
new G4Tubs(
"TargetVolume",0.,fTargetRadius,
241 0.5*fTargetVolumeZ,0.,
twopi);
246 logicTGVolume,
"TargetVolume",
250 G4Tubs* solidTarget1 =
new G4Tubs(
"Target1",0.,fTargetRadius*0.5,
251 0.5*fTarget1Z,0.,
twopi);
252 fLogicTarget1 =
new G4LogicalVolume(solidTarget1,fTarget1Material,
"Target1");
254 fLogicTarget1,
"Target1",
255 logicTGVolume,
false,0);
260 G4Tubs* solidTarget2 =
new G4Tubs(
"Target2",0.,fTargetRadius*0.5,
261 0.5*fTarget2Z,0.,
twopi);
262 fLogicTarget2 =
new G4LogicalVolume(solidTarget2,fTarget2Material,
"Target2");
264 fLogicTarget2,
"Target2",
265 logicTGVolume,
false,0);
271 G4Tubs* solidGasVolume =
new G4Tubs(
"GasVolume",0.,fGasVolumeRadius,
272 0.5*fGasVolumeZ,0.,
twopi);
277 "GasVolume",logicGasVolume,
282 G4Tubs* sMylarVolume =
new G4Tubs(
"Mylar",0.,fGasVolumeRadius,
283 0.5*fMylarVolumeZ,0.,
twopi);
290 G4Tubs* solidCheckVolume =
new G4Tubs(
"CheckVolume",0.,fGasVolumeRadius,
291 0.5*fCheckVolumeZ,0.,
twopi);
296 "CheckVolume",logicCheckVolume,
302 G4Box* solidPhantom =
new G4Box(
"Phantom",fPhantomRadius,fPhantomRadius,
309 "Phantom",logicPhantom,
312 G4Tubs* solidPh =
new G4Tubs(
"PhantomSD",0.,fAbsorberRadius,
313 0.5*fPhantomZ,0.,
twopi);
315 fAbsorberMaterial,
"PhantomSD");
318 physPhantom,
false,0);
319 G4cout <<
"Phantom R= " << fAbsorberRadius <<
" dz= " << 0.5*fPhantomZ
324 G4Tubs* solidAbsorber =
new G4Tubs(
"Absorber",0.,fAbsorberRadius,absWidth,
329 G4cout <<
"Absorber R= " << fAbsorberRadius <<
" dz= " << absWidth
330 <<
" posZ= " << fAbsorberPosZ<<
G4endl;
333 logicAbsorber,physPh,
false,0);
343 for(
G4int k=0; k<numR; k++) {
345 if(k == numR-1) r2 = fAbsorberRadius;
348 solidRing =
new G4Tubs(
"Ring",r1,r2,absWidth,0.,
twopi);
353 logicAbsorber,
false,k);
406 G4cout <<
"Material " << mat <<
" is not found out!" <<
G4endl;
407 }
else if (pttoMaterial != fTarget1Material) {
409 if(fLogicTarget1) { fLogicTarget1->
SetMaterial(fTarget1Material); }
423 G4cout <<
"Material " << mat <<
" is not found out!" <<
G4endl;
424 }
else if (pttoMaterial != fTarget2Material) {
425 fTarget2Material = pttoMaterial;
427 if(fLogicTarget2) { fLogicTarget2->
SetMaterial(fTarget2Material); }
void GeometryHasBeenModified(G4bool prop=true)
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
void SetShiftZ(G4double val)
static Histo * GetPointer()
CLHEP::Hep3Vector G4ThreeVector
const G4String & GetName() const
G4VPhysicalVolume * Construct()
void SetVisibility(G4bool)
static G4MaterialTable * GetMaterialTable()
static G4NistManager * Instance()
void SetTarget2Material(const G4String &m)
static G4PhysicalVolumeStore * GetInstance()
G4GLOB_DLL std::ostream G4cout
void SetAbsorberZ(G4double val)
void PhysicsHasBeenModified()
static G4LogicalVolumeStore * GetInstance()
static G4SolidStore * GetInstance()
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()
static const G4VisAttributes Invisible
void SetTarget1Material(const G4String &m)
void SetMaterial(G4Material *pMaterial)
void SetVisAttributes(const G4VisAttributes *pVA)
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)