44 #include "DetectorConstruction.hh"
45 #include "DetectorMessenger.hh"
47 #include "TargetSD.hh"
48 #include "CheckVolumeSD.hh"
87 fTargetSD =
new TargetSD(
"targetSD");
90 fDistanceVacuumTarget = 30.*
mm,
94 fTargetRadius = 100.*
mm;
98 fGasVolumeRadius = 210.*
mm;
99 fGasVolumeZ = 690.*
mm;
100 fMylarVolumeZ = 0.02*
mm;
102 fCheckVolumeZ = 0.1*
mm;
103 fCheckShiftZ = 200.*
mm;
105 fAbsorberRadius = 200.*
mm;
106 fPhantomRadius = 300.*
mm;
110 fAbsorberShiftZ = 70.*
mm;
117 fWindowMaterial = fTarget1Material;
134 void DetectorConstruction::InitialiseGeometryParameters()
140 fWorldXY = factor*std::max(fPhantomRadius,fGasVolumeRadius);
142 fAbsorberZ = fPhantomZ/nz;
143 fGasVolumeZ = 1000.*
mm - fAbsorberShiftZ - fAirZ - fTarget1Z - fTarget2Z;
145 G4double ztot = fGasVolumeZ + fAirZ + fPhantomZ + fDistanceVacuumTarget;
146 fTargetVolumeZ = fDistanceVacuumTarget + fTarget2Z + fTarget1Z + fDelta;
147 fWorldZ = factor*ztot*0.5;
149 if(fCheckShiftZ < fDelta) { fCheckShiftZ = fDelta; }
150 if(fCheckShiftZ > fAirZ - fCheckVolumeZ -fDelta) {
151 fCheckShiftZ = fAirZ - fCheckVolumeZ -fDelta;
156 fWindowPosZ = -(ztot + fWindowZ)*0.5;
157 fGeneratorPosZ = fWindowPosZ - 0.5*fWindowZ - fDelta;
159 fTargetVolumePosZ= -0.5*(ztot - fTargetVolumeZ);
160 fTarget1PosZ = -0.5*(fTargetVolumeZ - fTarget1Z) + fDistanceVacuumTarget;
161 fTarget2PosZ = fTarget1PosZ + 0.5*(fTarget2Z + fTarget1Z);
163 fGasVolumePosZ = fTargetVolumePosZ + 0.5*(fTargetVolumeZ + fGasVolumeZ);
164 fCheckVolumePosZ = fGasVolumePosZ + 0.5*(fGasVolumeZ + fCheckVolumeZ)
166 fMylarPosZ = fGasVolumePosZ + 0.5*(fGasVolumeZ + fMylarVolumeZ) + fDelta;
168 fPhantomPosZ = fGasVolumePosZ + 0.5*(fGasVolumeZ + fPhantomZ) + fAirZ;
169 fAbsorberPosZ = fAbsorberShiftZ - 0.5*(fPhantomZ - fAbsorberZ);
173 G4double shiftZPh = fPhantomPosZ-0.5*fPhantomZ;
176 G4cout <<
"===================================================" <<
G4endl;
178 G4cout <<
"===================================================" <<
G4endl;
180 G4cout <<
" Window width= " << fWindowZ/
mm <<
" mm position = "
181 << fWindowPosZ/
mm <<
" mm:" <<
G4endl;
182 G4cout <<
" TargetV width= " << fTargetVolumeZ/
mm <<
" mm position = "
183 << fTargetVolumePosZ/
mm <<
" mm:" <<
G4endl;
184 G4cout <<
" Target1 width= " << fTarget1Z/
mm <<
" mm position = "
185 << fTarget1PosZ/
mm <<
" mm:" <<
G4endl;
186 G4cout <<
" Target2 width= " << fTarget2Z/
mm <<
" mm position = "
187 << fTarget2PosZ/
mm <<
" mm:" <<
G4endl;
188 G4cout <<
" Gas width= " << fGasVolumeZ/
mm <<
" mm position = "
189 << fGasVolumePosZ/
mm <<
" mm:" <<
G4endl;
190 G4cout <<
" Mylar width= " << fMylarVolumeZ/
mm <<
" mm position = "
191 << fMylarPosZ/
mm <<
" mm:" <<
G4endl;
192 G4cout <<
" Check width= " << fCheckVolumeZ/
mm <<
" mm position = "
193 << fCheckVolumePosZ/
mm <<
" mm:" <<
G4endl;
195 G4cout <<
" Phantom width= " << fPhantomZ/
mm <<
" mm position = "
196 << fPhantomPosZ/
mm <<
" mm:" <<
G4endl;
197 G4cout <<
" Absorb width= " << fAbsorberZ/
mm <<
" mm position = "
198 << fAbsorberPosZ/
mm <<
" mm:" <<
G4endl;
203 G4cout <<
"===================================================" <<
G4endl;
216 InitialiseGeometryParameters();
223 G4Box* solidWorld =
new G4Box(
"World",fWorldXY,fWorldXY,fWorldZ);
225 fWorldMaterial,
"World");
227 logicWorld,0,
false,0);
230 G4Tubs* solidWin =
new G4Tubs(
"Window",0.,fTargetRadius*0.25,0.5*fWindowZ,
233 fWindowMaterial,
"Window");
238 G4Tubs* solidTGVolume =
new G4Tubs(
"TargetVolume",0.,fTargetRadius,
239 0.5*fTargetVolumeZ,0.,
twopi);
244 logicTGVolume,
"TargetVolume",
248 G4Tubs* solidTarget1 =
new G4Tubs(
"Target1",0.,fTargetRadius*0.5,
249 0.5*fTarget1Z,0.,
twopi);
250 fLogicTarget1 =
new G4LogicalVolume(solidTarget1,fTarget1Material,
"Target1");
252 fLogicTarget1,
"Target1",
253 logicTGVolume,
false,0);
258 G4Tubs* solidTarget2 =
new G4Tubs(
"Target2",0.,fTargetRadius*0.5,
259 0.5*fTarget2Z,0.,
twopi);
260 fLogicTarget2 =
new G4LogicalVolume(solidTarget2,fTarget2Material,
"Target2");
262 fLogicTarget2,
"Target2",
263 logicTGVolume,
false,0);
269 G4Tubs* solidGasVolume =
new G4Tubs(
"GasVolume",0.,fGasVolumeRadius,
270 0.5*fGasVolumeZ,0.,
twopi);
275 "GasVolume",logicGasVolume,
280 G4Tubs* sMylarVolume =
new G4Tubs(
"Mylar",0.,fGasVolumeRadius,
281 0.5*fMylarVolumeZ,0.,
twopi);
288 G4Tubs* solidCheckVolume =
new G4Tubs(
"CheckVolume",0.,fGasVolumeRadius,
289 0.5*fCheckVolumeZ,0.,
twopi);
294 "CheckVolume",logicCheckVolume,
300 G4Box* solidPhantom =
new G4Box(
"Phantom",fPhantomRadius,fPhantomRadius,
307 "Phantom",logicPhantom,
310 G4Tubs* solidPh =
new G4Tubs(
"PhantomSD",0.,fAbsorberRadius,
311 0.5*fPhantomZ,0.,
twopi);
313 fAbsorberMaterial,
"PhantomSD");
316 physPhantom,
false,0);
317 G4cout <<
"Phantom R= " << fAbsorberRadius <<
" dz= " << 0.5*fPhantomZ
322 G4Tubs* solidAbsorber =
new G4Tubs(
"Absorber",0.,fAbsorberRadius,absWidth,
327 G4cout <<
"Absorber R= " << fAbsorberRadius <<
" dz= " << absWidth
328 <<
" posZ= " << fAbsorberPosZ<<
G4endl;
331 logicAbsorber,physPh,
false,0);
341 for(
G4int k=0; k<numR; k++) {
343 if(k == numR-1) r2 = fAbsorberRadius;
346 solidRing =
new G4Tubs(
"Ring",r1,r2,absWidth,0.,
twopi);
351 logicAbsorber,
false,k);
404 G4cout <<
"Material " << mat <<
" is not found out!" <<
G4endl;
405 }
else if (pttoMaterial != fTarget1Material) {
407 if(fLogicTarget1) { fLogicTarget1->
SetMaterial(fTarget1Material); }
421 G4cout <<
"Material " << mat <<
" is not found out!" <<
G4endl;
422 }
else if (pttoMaterial != fTarget2Material) {
423 fTarget2Material = pttoMaterial;
425 if(fLogicTarget2) { fLogicTarget2->
SetMaterial(fTarget2Material); }