Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // ------------------------------------------- 28 // GEANT 4 - Underground Dark Matter Detecto 29 // 30 // For information related to this code c 31 // e-mail: alexander.howard@cern.ch 32 // ------------------------------------------- 33 // Comments 34 // 35 // Underground Advanced 36 // by A. Howard and H. Araujo 37 // (27th November 2001) 38 // 39 // DetectorConstruction program 40 // ------------------------------------------- 41 42 #include "DMXDetectorConstruction.hh" 43 #include "DMXDetectorMessenger.hh" 44 45 #include "DMXScintSD.hh" 46 #include "DMXPmtSD.hh" 47 48 49 #include "G4Material.hh" 50 #include "G4MaterialTable.hh" 51 #include "G4Element.hh" 52 #include "G4Isotope.hh" 53 #include "G4UnitsTable.hh" 54 #include "G4Box.hh" 55 #include "G4Tubs.hh" 56 #include "G4Sphere.hh" 57 #include "G4UnionSolid.hh" 58 #include "G4SubtractionSolid.hh" 59 60 #include "G4LogicalVolume.hh" 61 #include "G4PVPlacement.hh" 62 #include "G4ThreeVector.hh" 63 #include "G4RotationMatrix.hh" 64 #include "G4Transform3D.hh" 65 #include "G4LogicalBorderSurface.hh" 66 #include "G4LogicalSkinSurface.hh" 67 #include "G4OpBoundaryProcess.hh" 68 69 #include "G4FieldManager.hh" 70 #include "G4UniformElectricField.hh" 71 #include "G4TransportationManager.hh" 72 #include "G4MagIntegratorStepper.hh" 73 #include "G4EqMagElectricField.hh" 74 #include "G4ClassicalRK4.hh" 75 #include "G4ChordFinder.hh" 76 77 #include "G4SDManager.hh" 78 79 #include "G4VisAttributes.hh" 80 #include "G4Colour.hh" 81 82 #include "G4UserLimits.hh" 83 84 #include "G4RunManager.hh" 85 #include "G4SystemOfUnits.hh" 86 87 //....oooOO0OOooo........oooOO0OOooo........oo 88 DMXDetectorConstruction::DMXDetectorConstructi 89 { 90 // create commands for interactive definitio 91 detectorMessenger = new DMXDetectorMessenger 92 93 theUserLimitsForRoom = 0; 94 theUserLimitsForDetector = 0; 95 // default time cut = infinite 96 // - note also number of steps cut in stepp 97 theMaxTimeCuts = DBL_MAX; 98 theMaxStepSize = DBL_MAX; 99 theDetectorStepSize = DBL_MAX; 100 theRoomTimeCut = 1000. * nanosecond; 101 theMinEkine = 250.0*eV; // minimum k 102 theRoomMinEkine = 250.0*eV; // minimum k 103 104 //Zero the G4Cache objects to contain logica 105 LXeSD.Put(0); 106 pmtSD.Put(0); 107 } 108 109 110 //....oooOO0OOooo........oooOO0OOooo........oo 111 DMXDetectorConstruction::~DMXDetectorConstruct 112 { 113 delete theUserLimitsForRoom; 114 delete theUserLimitsForDetector; 115 delete detectorMessenger; 116 } 117 118 119 120 //....oooOO0OOooo........oooOO0OOooo........oo 121 void DMXDetectorConstruction::DefineMaterials( 122 { 123 124 #include "DMXDetectorMaterial.icc" 125 126 } 127 128 //....oooOO0OOooo........oooOO0OOooo........oo 129 G4VPhysicalVolume* DMXDetectorConstruction::Co 130 131 DefineMaterials(); 132 133 // DefineField(); 134 135 // make colours 136 G4Colour white (1.0, 1.0, 1.0) ; 137 G4Colour grey (0.5, 0.5, 0.5) ; 138 G4Colour lgrey (.85, .85, .85) ; 139 G4Colour red (1.0, 0.0, 0.0) ; 140 G4Colour blue (0.0, 0.0, 1.0) ; 141 G4Colour cyan (0.0, 1.0, 1.0) ; 142 G4Colour magenta (1.0, 0.0, 1.0) ; 143 G4Colour yellow (1.0, 1.0, 0.0) ; 144 G4Colour orange (.75, .55, 0.0) ; 145 G4Colour lblue (0.0, 0.0, .75) ; 146 G4Colour lgreen (0.0, .75, 0.0) ; 147 G4Colour green (0.0, 1.0, 0.0) ; 148 G4Colour brown (0.7, 0.4, 0.1) ; 149 150 151 // un-used colours: 152 // G4Colour black (0.0, 0.0, 0.0) ; 153 154 155 156 // Universe - room wall - CONCRETE ********* 157 158 //NB: measured INSIDE of lab, therefore have 159 G4double wallThick = 24.*cm; 160 G4double worldWidth = 470.0*cm + 2.*wallThi 161 G4double worldLength = 690.0*cm + 2.*wallThi 162 G4double worldHeight = 280.0*cm + 2.*wallThi 163 164 G4Box* world_box = new G4Box 165 ("world_box", 0.5*worldWidth, 0.5*worldLe 166 world_log = new G4LogicalVolume(world_box, 167 world_phys = new G4PVPlacement(0, G4ThreeVec 168 "world_phys", world_log, NULL, false,0); 169 170 // G4VisAttributes* world_vat= new G4VisAtt 171 world_log->SetVisAttributes(G4VisAttributes: 172 //world_vat->SetVisibility(true); 173 //world_vat->SetVisibility(false); 174 //world_log->SetVisAttributes(world_vat); 175 176 177 // Lab Space - AIR ************************* 178 179 G4double labWidth = worldWidth - 2.*wallTh 180 G4double labLength = worldLength - 2.*wallTh 181 G4double labHeight = worldHeight - 2.*wallTh 182 183 G4Box* lab_box = new G4Box 184 ("lab_box", 0.5*labWidth, 0.5*labLength, 185 lab_log = new G4LogicalVolume(lab_box, lab_ 186 lab_phys = new G4PVPlacement(0, G4ThreeVecto 187 lab_log, world_phys, false,0); 188 189 G4VisAttributes* lab_vat= new G4VisAttribute 190 // lab_log->SetVisAttributes(G4VisAttribute 191 // lab_vat->SetVisibility(true); 192 lab_vat->SetVisibility(false); 193 lab_log->SetVisAttributes(lab_vat); 194 195 // include room furniture: ******************* 196 197 #include "DMXDetectorRoom.icc" 198 199 // Now start with detector assembly: 200 201 // first LN2 cooling container: ************ 202 203 G4double PosZ = -25.3*cm; // extra z-pos to 204 205 G4double LN2jacketRadius = 107.5*mm; 206 G4double LN2jacketHeight = 590.0*mm; 207 G4double jacketHeight = 680.0*mm; 208 G4double jacketflangeHeight = 53.0*mm; 209 G4double LN2PosZ = 0.5*jacketHeig 210 + jacketflange 211 212 G4Tubs* LN2jacket_tube = new G4Tubs("LN2jack 213 0.*cm, LN2jacketRadius, 0.5*LN2jacketHeig 214 LN2jacket_log = new G4LogicalVolume 215 (LN2jacket_tube, LN2jacket_mat, "LN2jacket 216 LN2jacket_phys = new G4PVPlacement(0, G4Thre 217 "LN2jacket_phys", LN2jacket_log, lab_phys 218 219 G4VisAttributes* LN2jacket_vat = new G4VisAt 220 // LN2jacket_log->SetVisAttributes(G4VisAttr 221 // LN2jacket_vat->SetVisibility(true); 222 LN2jacket_log->SetVisAttributes(LN2jacket_va 223 224 // LN2jacket vacuum: ********************** 225 226 G4double LN2jacketMetalThick = 2.0*mm; 227 G4double LN2vacuumRadius = LN2jacketRadi 228 G4double LN2vacuumHeight = LN2jacketHeig 229 230 G4Tubs* LN2vacuum_tube = new G4Tubs("LN2vacu 231 0.*cm, LN2vacuumRadius, 0.5*LN2vacuumHeig 232 LN2vacuum_log = new G4LogicalVolume 233 (LN2vacuum_tube, vacuum_mat, "LN2vacuum_lo 234 LN2vacuum_phys = new G4PVPlacement(0, G4Thre 235 "LN2vacuum_phys", LN2vacuum_log, LN2jacke 236 237 LN2vacuum_log->SetVisAttributes(G4VisAttribu 238 239 // LN2 vessel: ***************************** 240 241 G4double LN2Radius = 76.0*mm; 242 G4double LN2Height = 590.0*mm - 2.*LN2 243 G4double LN2vesselRadius = LN2Radius + LN2ja 244 G4double LN2vesselHeight = LN2Height; 245 G4double LN2vesselPosZ = 0.5*LN2vacuumHeig 246 247 G4Tubs* LN2vessel_tube = new G4Tubs("LN2vess 248 0.*cm, LN2vesselRadius, 0.5*LN2vesselHeig 249 LN2vessel_log = new G4LogicalVolume 250 (LN2vessel_tube, LN2jacket_mat, "LN2vessel 251 LN2vessel_phys = new G4PVPlacement(0, G4Thre 252 "LN2vessel_phys", LN2vessel_log, LN2vacuu 253 254 G4VisAttributes* LN2vessel_vat = new G4VisAt 255 // LN2vessel_log->SetVisAttributes(G4VisAttr 256 // LN2vessel_vat->SetVisibility(true); 257 LN2vessel_log->SetVisAttributes(LN2vessel_va 258 259 260 // and finally LN2: ************************ 261 262 G4Tubs* LN2_tube = new G4Tubs("LN2_tube", 263 0.*cm, LN2Radius, 0.5*LN2Height, 0.*deg, 264 LN2_log = new G4LogicalVolume(LN2_tube, LN2 265 LN2_phys = new G4PVPlacement(0, G4ThreeVecto 266 "LN2_phys", LN2_log, LN2vessel_phys, fals 267 268 G4VisAttributes* LN2_vat = new G4VisAttribut 269 LN2_vat->SetVisibility(true); 270 LN2_log->SetVisAttributes(LN2_vat); 271 272 273 // outer vacuum jacket volume: stainless ste 274 275 G4double jacketRadius = 127.5*mm; 276 // G4double jacketHeight = 680.0*mm; // 277 G4double jacketMetalThick = LN2jacketMetalTh 278 279 G4Tubs* jacket_tube = new G4Tubs("jacket_tub 280 0.*cm, jacketRadius, 0.5*jacketHeight, 0. 281 jacket_log = new G4LogicalVolume(jacket_tub 282 jacket_phys = new G4PVPlacement(0, G4ThreeVe 283 "jacket_phys", jacket_log, lab_phys, fals 284 285 G4VisAttributes* jacket_vat = new G4VisAttri 286 // jacket_log->SetVisAttributes(G4VisAttribu 287 jacket_log->SetVisAttributes(jacket_vat); 288 289 290 // outer vacuum jacket flanges: stainless st 291 292 G4double jacketflangeRadius = 127.5*mm; 293 // G4double jacketflangeHeight = 53.0*mm; // 294 G4double topjacketflangePosZ = 0.5*(jacketHe 295 296 G4Tubs* jacketflange_tube = new G4Tubs("jack 297 0.*cm, jacketflangeRadius, 0.5*jacketflan 298 jacketflange_log = new G4LogicalVolume 299 (jacketflange_tube, jacketflange_mat, "jac 300 topjacketflange_phys = new G4PVPlacement 301 (0, G4ThreeVector(0.,0.,topjacketflangePos 302 "topjacketflange_phys", jacketflange_log, 303 bottomjacketflange_phys = new G4PVPlacement 304 (0, G4ThreeVector(0.,0.,-topjacketflangePo 305 "bottomjacketflange_phys", jacketflange_l 306 307 // jacketflange_log->SetVisAttributes(G4VisA 308 jacketflange_log->SetVisAttributes(jacket_va 309 310 // vacuum ********************************** 311 312 G4double vacuumRadius = jacketRadius - jacke 313 G4double vacuumHeight = jacketHeight - jacke 314 315 G4Tubs* vacuum_tube = new G4Tubs("vacuum_tub 316 0.*cm, vacuumRadius, 0.5*vacuumHeight, 0. 317 vacuum_log = new G4LogicalVolume(vacuum_tub 318 vacuum_phys = new G4PVPlacement(0, G4ThreeVe 319 "vacuum_phys", vacuum_log, jacket_phys, f 320 321 // G4VisAttributes* vacuum_vat= new G4VisAtt 322 vacuum_log->SetVisAttributes(G4VisAttributes 323 324 325 // copper cooling jacket volume: *********** 326 327 G4double copperMetalThick = 3.0*mm; 328 G4double copperRadius = 103.5*mm + coppe 329 G4double copperHeight = 420.0*mm; 330 G4double copperInner = copperRadius - c 331 G4double vesselHeight = 320.0*mm; 332 G4double copperVPos = 0.5*(vesselHeigh 333 G4double coppertopThick = 1.0*cm; 334 G4double coppertopVPos = copperVPos + 0.5 335 336 G4Tubs* copper_tube = new G4Tubs("copper_tub 337 copperInner, copperRadius, 0.5*copperHeig 338 copper_log = new G4LogicalVolume(copper_tub 339 copper_phys = new G4PVPlacement(0, G4ThreeVe 340 "copper_phys", copper_log, vacuum_phys, f 341 342 G4Tubs* coppertop_tube = new G4Tubs("coppert 343 0.*cm, copperRadius, 0.5*coppertopThick, 344 coppertop_log = new G4LogicalVolume 345 (coppertop_tube, copper_mat, "coppertop_lo 346 coppertop_phys = new G4PVPlacement(0,G4Three 347 "coppertop_phys", coppertop_log, vacuum_p 348 349 G4VisAttributes* copper_vat = new G4VisAttri 350 // copper_log->SetVisAttributes(G4VisAttrib 351 copper_log->SetVisAttributes(copper_vat); 352 coppertop_log->SetVisAttributes(copper_vat); 353 354 // inner vessel jacket volume: stainless ste 355 356 // G4double vesselHeight = 320.0*mm; // - m 357 G4double vesselMetalThick = jacketMetal 358 G4double vesselRadius = 75.0*mm + v 359 G4double vesselflangeRadius = 101.5*mm; 360 G4double vesselflangeThick = 40.0*mm; 361 G4double PMTvesselRadius = 31.0*mm + v 362 G4double PMTvesselHeight = 152.0*mm; 363 G4double pmtvesselflangeRadius = 52.0*mm; 364 G4double pmtvesselflangeThick = 32.0*mm; 365 G4double vesselVPos = 7.0*cm; 366 G4double TotalvesselHeight = PMTvesselHe 367 368 G4Tubs* vessel_tube = new G4Tubs("vessel_ 369 0.*cm, vesselRadius, 0.5*vesselHeight, 0. 370 G4Tubs* PMTvessel_tube = new G4Tubs("PMTvess 371 0.*cm, PMTvesselRadius, 0.5*PMTvesselHeig 372 373 G4UnionSolid* vessel_sol = new G4UnionSolid 374 ("vessel_sol", vessel_tube, PMTvessel_tube 375 G4Transform3D(G4RotationMatrix(), 376 G4ThreeVector(0,0,-0.5*(vesselHeight+PM 377 378 vessel_log = new G4LogicalVolume(vessel_sol 379 vessel_phys = new G4PVPlacement(0, G4ThreeVe 380 "vessel_phys", vessel_log, vacuum_phys, f 381 382 383 // flanges: 1=upper half (diff. inner diam.) 384 G4Tubs* vesseltop_flange1 = new G4Tubs("vess 385 0.*cm, vesselflangeRadius, 0.25*vesselfla 386 vesseltop_log1 = new G4LogicalVolume 387 (vesseltop_flange1, vessel_mat, "vesseltop 388 vesseltop_phys1 = new G4PVPlacement 389 (0, 390 G4ThreeVector(0.,0.,0.5*(vesselHeight+0.5 391 "vesseltop_phys1", vesseltop_log1, vacuum 392 393 G4Tubs* vesseltop_flange2 = new G4Tubs("vess 394 vesselflangeRadius, 0.25*vesselflangeThick 395 vesseltop_log2 = new G4LogicalVolume 396 (vesseltop_flange2, vessel_mat, "vesseltop 397 vesseltop_phys2 = new G4PVPlacement 398 (0, 399 G4ThreeVector(0.,0.,0.5*(vesselHeight-0.5 400 "vesseltop_phys2", vesseltop_log2, vacuum 401 402 403 G4Tubs* vesselbottom_flange1 = new G4Tubs 404 ("vesselbottom_flange1",vesselRadius, vess 405 0.25*vesselflangeThick, 0.*deg, 360.*deg) 406 vesselbottom_log1 = new G4LogicalVolume 407 (vesselbottom_flange1, vessel_mat, "vessel 408 vesselbottom_phys1 = new G4PVPlacement(0, 409 G4ThreeVector(0.,0.,-0.5*(vesselHeight-0. 410 "vesselbottom_phys1", vesselbottom_log1, 411 412 G4Tubs* vesselbottom_flange2 = new G4Tubs 413 ("vesselbottom_flange2",PMTvesselRadius, v 414 0.25*vesselflangeThick, 0.*deg, 360.*deg) 415 vesselbottom_log2 = new G4LogicalVolume 416 (vesselbottom_flange2, vessel_mat, "vessel 417 vesselbottom_phys2 = new G4PVPlacement(0, 418 G4ThreeVector(0.,0.,-0.5*(vesselHeight+0. 419 "vesselbottom_phys2", vesselbottom_log2, 420 421 422 G4Tubs* pmtvesselbottom_flange1 = new G4Tubs 423 ("pmtvesselbottom_flange1", PMTvesselRadiu 424 0.25*pmtvesselflangeThick, 0.*deg, 360.*d 425 pmtvesselbottom_log1 = new G4LogicalVolume 426 (pmtvesselbottom_flange1, vessel_mat, "pmt 427 pmtvesselbottom_phys1 = new G4PVPlacement(0, 428 (-0.5*vesselHeight-PMTvesselHeight+vesselV 429 "pmtvesselbottom_phys1", pmtvesselbottom_ 430 431 G4Tubs* pmtvesselbottom_flange2 = new G4Tubs 432 ("pmtvesselbottom_flange2", 0.*cm, pmtvess 433 0.25*pmtvesselflangeThick, 0.*deg, 360.*d 434 pmtvesselbottom_log2 = new G4LogicalVolume 435 (pmtvesselbottom_flange2, vessel_mat, "pmt 436 pmtvesselbottom_phys2 = new G4PVPlacement(0, 437 -0.5*vesselHeight-PMTvesselHeight+vesselV 438 "pmtvesselbottom_phys2", pmtvesselbottom_ 439 440 441 G4VisAttributes* vessel_vat = new G4VisA 442 G4VisAttributes* pmtvessel_vat = new G4VisA 443 G4VisAttributes* pmtvessel_vat2 = new G4VisA 444 // vessel_log->SetVisAttributes(G4VisAttrib 445 // vessel_vat->SetForceSolid(true); 446 // pmtvessel_vat->SetForceSolid(true); 447 // pmtvessel_vat2->SetForceSolid(true); 448 vessel_log->SetVisAttributes(vessel_vat); 449 vesseltop_log1->SetVisAttributes(vessel_vat) 450 vesselbottom_log1->SetVisAttributes(vessel_v 451 vesseltop_log2->SetVisAttributes(pmtvessel_v 452 vesselbottom_log2->SetVisAttributes(pmtvesse 453 // pmtvesselbottom_log->SetVisAttributes(ve 454 pmtvesselbottom_log1->SetVisAttributes(vesse 455 pmtvesselbottom_log2->SetVisAttributes(pmtve 456 457 458 459 // ***************************************** 460 // grid#1 to mirror surface: 21.75 mm 461 // LXe height = 15.75 mm, gXe height = 6.00 462 // NB: Increased liquid height by 1mm - to t 463 // over-lapping volumes/ring pronounced from 464 // ***************************************** 465 466 // detector volume: gas phase ************** 467 468 G4double mirrorVPos = 21.3*cm; 469 G4double gasGap = 6.0*mm; 470 G4double DetectorRadius = vesselRadius - ves 471 G4double GXeHeight = TotalvesselHeight 472 G4double GXeVPos = 0.5*vesselHeight - 473 474 G4Tubs* GXe_tube = new G4Tubs("GXe_tube", 475 0.*cm, DetectorRadius, 0.5*GXeHeight, 0.* 476 GXe_log = new G4LogicalVolume(GXe_tube, GXe 477 GXe_phys = new G4PVPlacement(0, G4ThreeVecto 478 "GXe_phys", GXe_log, vessel_phys, false,0 479 480 G4VisAttributes* GXe_vat = new G4VisAttribut 481 // GXe_vat->SetForceSolid(true); 482 GXe_vat->SetVisibility(true); 483 GXe_log->SetVisAttributes(GXe_vat); 484 485 486 // liquid phase **************************** 487 488 G4double LXeHeight = mirrorVPos - ga 489 G4double PMTDetectorRadius = PMTvesselRadius 490 G4double PMTDetectorHeight = PMTvesselHeight 491 G4double LXeTubeHeight = LXeHeight - PMT 492 G4double LXe_solVPos = -0.5*(LXeTubeHe 493 G4double LXeVPos = -0.5*Totalvesse 494 495 G4Tubs* LXe_tube = new G4Tubs("GXe_tube", 496 0.*cm, DetectorRadius, 0.5*LXeTubeHeight, 497 G4Tubs* PMTdetector_tube = new G4Tubs("PMTde 498 0.*cm, PMTDetectorRadius, 0.5*PMTDetectorHe 499 500 G4UnionSolid* LXe_sol = new G4UnionSolid 501 ("LXe_sol", LXe_tube, PMTdetector_tube, 502 G4Transform3D(G4RotationMatrix(), G4ThreeV 503 504 LXe_log = new G4LogicalVolume(LXe_sol, LXe_ 505 LXe_phys = new G4PVPlacement(0, G4ThreeVecto 506 "LXe_phys", LXe_log, vessel_phys, false, 0 507 508 // attributes 509 G4VisAttributes* LXe_vat = new G4VisAttribut 510 // LXe_vat->SetForceSolid(true); 511 LXe_vat->SetVisibility(true); 512 LXe_log->SetVisAttributes(LXe_vat); 513 514 515 // Gas phase vessel lagging - for optical pr 516 517 G4double laggingThickness = 10.*micrometer; 518 G4double laggingRadius = DetectorRadius - 519 520 G4Tubs* gaslag_tube = new G4Tubs("gaslag_tub 521 DetectorRadius, 0.5*GXeHeight, 0.*deg, 36 522 gaslag_log = new G4LogicalVolume(gaslag_tub 523 gaslag_phys = new G4PVPlacement(0, G4ThreeVe 524 "gaslag_phys", gaslag_log, GXe_phys, false 525 526 // attributes 527 G4VisAttributes* gaslag_vat = new G4VisAttri 528 // gaslag_vat->SetForceSolid(true); 529 gaslag_vat->SetVisibility(true); 530 gaslag_log->SetVisAttributes(gaslag_vat); 531 532 533 // liquid phase vessel lagging - for optical 534 535 G4double lagTubeRadius = DetectorRadius - la 536 G4double lagTubeHeight = LXeHeight - PMTDete 537 G4double lagPMTRadius = PMTDetectorRadius - 538 G4double lagPMTHeight = PMTDetectorHeight; 539 540 G4Tubs* liqLag_tube = new G4Tubs("liqlag_tub 541 DetectorRadius, 0.5*lagTubeHeight, 0.*deg 542 G4Tubs* lagPMT_tube = new G4Tubs("lagPMT_tub 543 PMTDetectorRadius, 0.5*lagPMTHeight, 0.*d 544 545 G4UnionSolid* liqLag_sol = new G4UnionSolid 546 ("liqLag_sol", liqLag_tube, lagPMT_tube, 547 G4Transform3D(G4RotationMatrix(),G4ThreeVe 548 549 liqLag_log = new G4LogicalVolume(liqLag_sol 550 liqLag_phys = new G4PVPlacement(0, G4ThreeVe 551 "liqLag_phys", liqLag_log, LXe_phys, false 552 553 // attributes 554 G4VisAttributes* liqLag_vat = new G4VisAttri 555 // liqLag_vat->SetForceSolid(true); 556 liqLag_vat->SetVisibility(true); 557 liqLag_log->SetVisAttributes(liqLag_vat); 558 559 560 // Vessel Wall Optical Surface definition: 561 G4OpticalSurface* OpVesselSurface = new G4Op 562 ("VesselSurface", unified, polished, diele 563 564 // created optical lagging onto vessel - to 565 // liquid and gas phase - so removed below: 566 /* 567 G4LogicalBorderSurface* VesselSurface; 568 VesselSurface = new G4LogicalBorderSurface 569 ("Vessel", liqPhase_phys, vessel_phys, OpV 570 */ 571 572 std::vector<G4double> vessel_PP = { 6.5*eV 573 std::vector<G4double> vessel_REFL = { 0.2, 0 574 G4MaterialPropertiesTable* vessel_mt = new G 575 vessel_mt->AddProperty("REFLECTIVITY", vesse 576 OpVesselSurface->SetMaterialPropertiesTable( 577 578 // G4LogicalBorderSurface* VesselTopSurface 579 new G4LogicalBorderSurface 580 ("VesselTop", GXe_phys, vesseltop_phys1, O 581 582 //G4LogicalBorderSurface* VesselBottomSurfac 583 new G4LogicalBorderSurface 584 ("VesselBottom", LXe_phys, vesselbottom_ph 585 586 //G4LogicalBorderSurface* GasVesselSurface = 587 new G4LogicalBorderSurface 588 ("GasVessel", GXe_phys, gaslag_phys, OpVes 589 590 //G4LogicalBorderSurface* LiquidVesselSurfac 591 new G4LogicalBorderSurface 592 ("LiquidVessel", LXe_phys, liqLag_phys, Op 593 594 595 596 // Cu Shield ******************************* 597 598 G4double CuShieldHeight = 17.7*cm; 599 G4double CuShieldThickness = 2.4*mm; 600 G4double CuShieldOuterRadius = 3.0*cm; 601 G4double CuShieldInnerRadius = CuShieldOuter 602 G4double CuShieldVPosition = -0.5*LXeTubeH 603 + 0.5*CuShield 604 605 // Zero co-ordinate of the union is the zero 606 // i.e. the offset is still present 607 608 G4Tubs* CuShield_tube = new G4Tubs("CuShield 609 CuShieldOuterRadius, 0.5*CuShieldHeight, 610 CuShield_log = new G4LogicalVolume(CuShield 611 "CuShield_log"); 612 CuShield_phys = new G4PVPlacement(0, 613 G4ThreeVector(0.*cm, 0.*cm, CuShieldVPosi 614 "CuShield_phys", CuShield_log, LXe_phys, 615 616 // G4VisAttributes* CuShield_vat= new G4Vis 617 G4VisAttributes* CuShield_vat = new G4VisAtt 618 // CuShield_vat->SetForceSolid(true); 619 CuShield_vat->SetVisibility(true); 620 CuShield_log->SetVisAttributes(CuShield_vat) 621 622 // Cu shield surface 623 G4double sigalpha; 624 G4OpticalSurface* OpCuShieldSurface = new G4 625 ("ShieldSurface", unified, ground, dielect 626 //G4LogicalBorderSurface* ShieldSurface = 627 new G4LogicalBorderSurface 628 ("Shield", LXe_phys, CuShield_phys, OpCuSh 629 630 std::vector<G4double> CuShield_PP = { 7.0* 631 std::vector<G4double> CuShield_REFL = { 0.3, 632 G4MaterialPropertiesTable *CuShield_mt = new 633 CuShield_mt->AddProperty("REFLECTIVITY", CuS 634 OpCuShieldSurface->SetMaterialPropertiesTabl 635 636 // rings *********************************** 637 638 G4double ringHeight = 4.*mm; 639 G4double ringOuterRadius = 4.0*cm; 640 G4double ringInnerRadius = CuShieldOuterRad 641 G4double ringVOffset = 0.5*ringHeight; 642 G4double ringVPosition = -0.5*GXeHeight + 643 644 G4Tubs* ring_tube=new G4Tubs("ring_tube", ri 645 ringOuterRadius, 0.5*ringHeight, 0.*deg, 646 ring_log = new G4LogicalVolume(ring_tube, ri 647 648 // optical surface: ring materials table 649 std::vector<G4double> ring_PP = { 6.00*eV, 650 std::vector<G4double> ring_REFL = { 0.7, 0.6 651 G4MaterialPropertiesTable *ring_mt = new G4M 652 ring_mt->AddProperty("REFLECTIVITY", ring_PP 653 654 G4OpticalSurface* OpRingSurface = new G4Opti 655 ("RingSurface", unified, ground, dielectri 656 // last argument is surface roughness if it' 657 OpRingSurface->SetMaterialPropertiesTable(ri 658 659 // rings inside gas phase 660 ring_phys_gas[0] = new G4PVPlacement(0, G4Th 661 (0.*cm, 0.*cm, ringVPosition),"ring_phys0" 662 //G4LogicalBorderSurface* RingSurface_gas0 = 663 new G4LogicalBorderSurface 664 ("Ring", GXe_phys, ring_phys_gas[0], OpRin 665 666 ring_phys_gas[1] = new G4PVPlacement(0, 667 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 668 "ring_phys1",ring_log, GXe_phys, false, 0 669 //G4LogicalBorderSurface* RingSurface_gas1 = 670 new G4LogicalBorderSurface 671 ("Ring", GXe_phys, ring_phys_gas[1], OpRi 672 673 674 // rings inside liquid phase: 675 ringVPosition = 0.5*LXeTubeHeight; 676 677 ring_phys_liq[0] = new G4PVPlacement(0, 678 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 679 "ring_phys2",ring_log,LXe_phys, false, 0) 680 //G4LogicalBorderSurface* RingSurface_liq0 = 681 new G4LogicalBorderSurface 682 ("Ring", LXe_phys, ring_phys_liq[0], OpRin 683 684 ring_phys_liq[1] = new G4PVPlacement(0, 685 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 686 "ring_phys3",ring_log, LXe_phys, false, 0 687 //G4LogicalBorderSurface* RingSurface_liq1 = 688 new G4LogicalBorderSurface 689 ("Ring", LXe_phys, ring_phys_liq[1], OpRin 690 691 ring_phys_liq[2]=new G4PVPlacement(0, 692 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 693 "ring_phys4",ring_log, LXe_phys, false, 0 694 //G4LogicalBorderSurface* RingSurface_liq2 = 695 new G4LogicalBorderSurface 696 ("Ring", LXe_phys, ring_phys_liq[2], OpRin 697 698 ring_phys_liq[3]=new G4PVPlacement(0, 699 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 700 "ring_phys5",ring_log, LXe_phys, false, 0 701 //G4LogicalBorderSurface* RingSurface_liq3 = 702 new G4LogicalBorderSurface 703 ("Ring", LXe_phys, ring_phys_liq[3], OpRin 704 705 ring_phys_liq[4]=new G4PVPlacement(0, 706 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 707 "ring_phys6",ring_log, LXe_phys,false, 0) 708 //G4LogicalBorderSurface* RingSurface_liq4 = 709 new G4LogicalBorderSurface 710 ("Ring", LXe_phys, ring_phys_liq[4], OpRin 711 712 ring_phys_liq[5]=new G4PVPlacement(0, 713 G4ThreeVector(0.*cm, 0.*cm, ringVPosition 714 "ring_phys7",ring_log, LXe_phys,false, 0) 715 //G4LogicalBorderSurface* RingSurface_liq5 = 716 new G4LogicalBorderSurface 717 ("Ring", LXe_phys, ring_phys_liq[5], OpRin 718 719 720 G4VisAttributes* ring_vat= new G4VisAttribut 721 ring_vat->SetVisibility(true); 722 ring_log->SetVisAttributes(ring_vat); 723 724 725 // Mirror ********************************** 726 727 G4double mirrorHeight = 2.0*mm; 728 G4double mirrorRadius = ringInnerRadius; 729 G4double mirrorVOffset = 0.5*ringHeight; 730 G4double mirrorVPosition = -0.5*GXeHeight + 731 732 G4Tubs* mirror_tube = new G4Tubs("mirror_tub 733 0.5*mirrorHeight, 0.*deg, 360.*deg); 734 mirror_log = new G4LogicalVolume(mirror_tub 735 mirror_phys = new G4PVPlacement(0, 736 G4ThreeVector(0.*cm, 0.*cm, mirrorVPositi 737 "mirror_phys", mirror_log, GXe_phys, fals 738 739 G4VisAttributes* mirror_vat = new G4VisAttri 740 mirror_vat->SetVisibility(true); 741 // mirror_vat->SetForceSolid(true); 742 mirror_log->SetVisAttributes(mirror_vat); 743 744 745 // mirror surface 746 G4OpticalSurface * OpMirrorSurface = new G4O 747 ("MirrorSurface", unified, ground, dielect 748 //G4LogicalBorderSurface* MirrorSurface = 749 new G4LogicalBorderSurface 750 ("Mirror", GXe_phys, mirror_phys, OpMirror 751 752 std::vector<G4double> mirror_PP = { 6.00*e 753 std::vector<G4double> mirror_REFL = { 0.83, 754 G4MaterialPropertiesTable *mirror_mt = new G 755 mirror_mt->AddProperty("REFLECTIVITY", mirro 756 OpMirrorSurface->SetMaterialPropertiesTable( 757 758 // Grids ********************************** 759 760 G4double gridHeight = 0.100*mm; 761 G4double gridRadius = ringInnerRadius; 762 G4double grid1VOffset = 3.5*ringHeight+1.7 763 G4double grid1VPosition = 0.5*LXeTubeHeight 764 G4double grid2VOffset = 4.5*ringHeight+3.5 765 G4double grid2VPosition = 0.5*LXeTubeHeight 766 767 G4Tubs* grid_tube = new G4Tubs("grid_tube", 768 0.5*gridHeight, 0.*deg, 360.*deg); 769 770 grid1_log = new G4LogicalVolume(grid_tube, 771 grid1_phys = new G4PVPlacement(0,G4ThreeVect 772 "grid1_phys", grid1_log, LXe_phys, false, 773 grid2_log = new G4LogicalVolume(grid_tube, 774 grid2_phys = new G4PVPlacement(0,G4ThreeVect 775 "grid2_phys", grid2_log, LXe_phys, false, 776 777 G4VisAttributes* grid_vat = new G4VisAttribu 778 grid_vat->SetVisibility(true); 779 grid1_log->SetVisAttributes(grid_vat); 780 grid2_log->SetVisAttributes(grid_vat); 781 782 783 // alpha source holder ********************* 784 785 G4double alphaHeight = 0.7*mm; // total 786 G4double recessHeight = 0.3*mm; // total 787 G4double alphaRadius = 1.2*mm; // was 0. 788 G4double recessRadius = 0.35*mm; // was 0 789 G4double recessVPosition = 0.5*(alphaHeight 790 791 G4double alphaVOffset = grid1VOffset-0.5* 792 G4double americiumHeight = 3000.*nanometer; 793 G4double extra_offset = (recessHeight +0. 794 G4double alphaVPosition = 0.5*LXeTubeHeight 795 796 G4Tubs* alpha_tube = new G4Tubs("alpha_tube 797 0.5*alphaHeight, 0.*deg, 360.*deg); 798 G4Tubs* recess_tube = new G4Tubs("recess_tub 799 0.5*recessHeight, 0.*deg, 360.*deg); 800 801 G4SubtractionSolid* alpha_sol = new G4Subtra 802 ("alpha_sol", alpha_tube, recess_tube, G4T 803 (G4RotationMatrix(), G4ThreeVector(0. ,0. 804 alpha_log = new G4LogicalVolume(alpha_sol, 805 806 alpha_phys = new G4PVPlacement(0, G4ThreeVec 807 "alpha_phys", alpha_l 808 809 G4VisAttributes* alpha_vat = new G4VisAttrib 810 alpha_vat->SetVisibility(true); 811 alpha_log ->SetVisAttributes(alpha_vat); 812 813 // alpha source HOLDER surface 814 G4OpticalSurface* OpAlphaSurface = new G4Opt 815 unified, ground, dielectric_metal, sigalpha= 816 //G4LogicalBorderSurface* AlphaSurface = 817 new G4LogicalBorderSurface 818 ("Alpha", LXe_phys, alpha_phys, OpAlphaSur 819 820 std::vector<G4double> alpha_PP = { 6.00*eV 821 std::vector<G4double> alpha_REFL = { 0.05, 0 822 G4MaterialPropertiesTable *alpha_mt = new G4 823 alpha_mt->AddProperty("REFLECTIVITY", alpha_ 824 OpAlphaSurface->SetMaterialPropertiesTable(a 825 826 // americium ******************************* 827 828 // moved above for the "extra_offset": 829 // G4double americiumHeight = 600.*nanome 830 G4double americiumRadius = recessRadius - 831 G4double americiumVOffset = 0.5*(alphaHeig 832 G4double americiumVPosition = americiumVOffs 833 834 sourceZ = vesselVPos + LXeVPos + alphaVPosit 835 G4cout << G4endl << "Calibration source cent 836 << sourceZ/mm << " mm" << G4endl; 837 838 G4Tubs* americium_tube = new G4Tubs("americi 839 americiumRadius, 0.5*americiumHeight, 0.* 840 americium_log = new G4LogicalVolume(americi 841 "americium_log"); 842 americium_phys = new G4PVPlacement(0, G4Thre 843 americiumVPosition),"americium_phys", ame 844 845 // americium optical properties: 846 G4OpticalSurface* OpAmericiumSurface = new G 847 ("AmericiumSurface", unified, ground, diel 848 //G4LogicalBorderSurface* AmericiumSurface = 849 new G4LogicalBorderSurface 850 ("Americium", LXe_phys, americium_phys, Op 851 852 std::vector<G4double> americium_PP = { 6.0 853 std::vector<G4double> americium_REFL = { 0.7 854 G4MaterialPropertiesTable *americium_mt = ne 855 americium_mt->AddProperty("REFLECTIVITY", am 856 OpAlphaSurface->SetMaterialPropertiesTable(a 857 858 G4VisAttributes* americium_vat= new G4VisAtt 859 americium_vat->SetVisibility(true); 860 americium_vat->SetForceSolid(true); 861 americium_log->SetVisAttributes(americium_va 862 863 864 // Photomultiplier: ETL 9829 QA ************ 865 866 G4double pmtHeight = 12.0*cm; 867 G4double pmtRadius = 2.6*cm; 868 G4double pmtVOffset = 1.0*cm; 869 G4double pmtVPosition = -0.5*(LXeTubeHeight+ 870 871 G4Sphere* pmt_window = new G4Sphere("pmt_sph 872 0.*deg, 360.*deg, 0.*deg, 30.0*deg); 873 G4Tubs* pmt_tube = new G4Tubs("pmt_tube", 0. 874 0.*deg, 360.*deg); 875 876 G4UnionSolid* pmt_sol = new G4UnionSolid("pm 877 G4Transform3D(G4RotationMatrix(), G4ThreeV 878 -2.*pmtRadius*std::cos(30.0*deg)))); 879 880 pmt_log = new G4LogicalVolume(pmt_sol, pmt_ 881 pmt_phys = new G4PVPlacement(0,G4ThreeVector 882 "pmt_phys", pmt_log, LXe_phys, false, 0); 883 884 G4OpticalSurface* pmt_opsurf = new G4Optical 885 ("pmt_opsurf",unified, polished, dielectri 886 //G4LogicalBorderSurface* pmt_surf = 887 new G4LogicalBorderSurface 888 ("pmt_surf", LXe_phys, pmt_phys, pmt_opsur 889 890 G4VisAttributes* pmt_vat= new G4VisAttribute 891 pmt_vat->SetForceSolid(true); 892 pmt_vat->SetVisibility(true); 893 pmt_log->SetVisAttributes(pmt_vat); 894 895 896 // photocathode **************************** 897 898 G4double phcathVOffset = 0.5*pmtHeight-2 899 G4double phcathVPosition = phcathVOffset; 900 901 G4Sphere* phcath_sol = new G4Sphere("phcath_ 902 2.*pmtRadius-1.6*mm, 2.*pmtRadius-1.59*mm 903 27.0*deg); 904 905 phcath_log = new G4LogicalVolume(phcath_sol 906 phcath_phys = new G4PVPlacement(0, G4ThreeVe 907 "phcath_phys", phcath_log, pmt_phys, fals 908 909 G4OpticalSurface* phcath_opsurf = new G4Opt 910 unified, polished, dielectric_dielectric) 911 //G4LogicalBorderSurface* phcath_surf = 912 new G4LogicalBorderSurface 913 ("phcath_surf", pmt_phys, phcath_phys, phc 914 915 std::vector<G4double> phcath_PP = { 6.00*e 916 // std::vector<G4double> phcath_REFL = { 0.0 917 // G4MaterialPropertiesTable* phcath_mt = ne 918 // phcath_mt->AddProperty("REFLECTIVITY", ph 919 // phcath_opsurf->SetMaterialPropertiesTable 920 921 922 //**Photocathode surface properties 923 std::vector<G4double> photocath_EFF={1.,1.}; 924 std::vector<G4double> photocath_ReR={1.92,1. 925 std::vector<G4double> photocath_ImR={1.69,1. 926 G4MaterialPropertiesTable* photocath_mt = ne 927 photocath_mt->AddProperty("EFFICIENCY",phcat 928 photocath_mt->AddProperty("REALRINDEX",phcat 929 photocath_mt->AddProperty("IMAGINARYRINDEX", 930 G4OpticalSurface* photocath_opsurf= 931 new G4OpticalSurface("photocath_opsurf",gl 932 dielectric_metal); 933 photocath_opsurf->SetMaterialPropertiesTable 934 935 G4VisAttributes* phcath_vat= new G4VisAttrib 936 phcath_vat->SetForceSolid(true); 937 phcath_vat->SetVisibility(true); 938 phcath_log->SetVisAttributes(phcath_vat); 939 940 new G4LogicalSkinSurface("photocath_surf",ph 941 942 // ......................................... 943 // attach user limits ...................... 944 945 946 G4cout << G4endl << "User Limits: " << G4end 947 << "\t theMaxTimeCuts: " << G4BestUnit( 948 << G4endl 949 << "\t theRoomTimeCut: " << G4BestUnit( 950 << G4endl 951 << "\t theMaxStepSize: " << G4BestUnit( 952 << G4endl 953 << "\t theMinEKine: " << G4BestUnit( 954 << G4endl 955 << "\t minRoomMinEKine: " << G4BestUnit( 956 << G4endl << G4endl; 957 958 if (theUserLimitsForRoom != 0) delete theUse 959 if (theUserLimitsForDetector != 0) delete th 960 961 theUserLimitsForRoom = new G4UserLimits(theM 962 DBL_MAX, // track length 963 theRoomTimeCut, // Time cut 964 theRoomMinEkine); // min energy 965 966 #include "DMXDetectorRoomLimits.icc" 967 968 theUserLimitsForDetector = new G4UserLimits( 969 DBL_MAX, // Track Max 970 theMaxTimeCuts, 971 theMinEkine); 972 973 world_log->SetUserLimits(theUserLimitsFo 974 lab_log->SetUserLimits(theUserLimitsFo 975 jacket_log->SetUserLimits(theUserLimitsFo 976 vacuum_log->SetUserLimits(theUserLimitsFo 977 vessel_log->SetUserLimits(theUserLimitsFo 978 GXe_log->SetUserLimits(theUserLimitsFo 979 // LXe_log->SetUserLimits(theUserLimi 980 LXe_log->SetUserLimits(theUserLimitsFo 981 CuShield_log->SetUserLimits(theUserLimitsFo 982 ring_log->SetUserLimits(theUserLimitsFo 983 mirror_log->SetUserLimits(theUserLimitsFo 984 grid1_log->SetUserLimits(theUserLimitsFo 985 grid2_log->SetUserLimits(theUserLimitsFo 986 alpha_log->SetUserLimits(theUserLimitsFo 987 americium_log->SetUserLimits(theUserLimitsFo 988 pmt_log->SetUserLimits(theUserLimitsFo 989 phcath_log->SetUserLimits(theUserLimitsFo 990 991 return world_phys; 992 993 } 994 995 //....oooOO0OOooo........oooOO0OOooo........oo 996 997 void DMXDetectorConstruction::ConstructSDandFi 998 { 999 // ......................................... 1000 // sensitive detectors .................... 1001 // ........................................ 1002 1003 if (LXeSD.Get() == 0) 1004 { 1005 G4String name="/DMXDet/LXeSD"; 1006 DMXScintSD* aSD = new DMXScintSD(name); 1007 LXeSD.Put(aSD); 1008 } 1009 G4SDManager::GetSDMpointer()->AddNewDetecto 1010 if (LXe_log) 1011 SetSensitiveDetector(LXe_log,LXeSD.Get()) 1012 1013 if (pmtSD.Get() == 0) 1014 { 1015 G4String name="/DMXDet/pmtSD"; 1016 DMXPmtSD* aSD = new DMXPmtSD(name); 1017 pmtSD.Put(aSD); 1018 } 1019 G4SDManager::GetSDMpointer()->AddNewDetecto 1020 if (phcath_log) 1021 SetSensitiveDetector(phcath_log,pmtSD.Get 1022 1023 return; 1024 } 1025 1026 1027 //....oooOO0OOooo........oooOO0OOooo........o 1028 1029 // specific method to G4UserLimits:= SetUserM 1030 void DMXDetectorConstruction::SetRoomEnergyCu 1031 { 1032 // set minimum charged particle energy cut 1033 theRoomMinEkine = val; 1034 if (theUserLimitsForRoom != 0) 1035 { 1036 theUserLimitsForRoom->SetUserMinEkine(v 1037 G4cout << " Changing Room energy cut to 1038 << G4endl; 1039 } 1040 } 1041 1042 //....oooOO0OOooo........oooOO0OOooo........o 1043 1044 // specific method to G4UserLimits:= SetUserM 1045 void DMXDetectorConstruction::SetEnergyCut(G4 1046 { 1047 // set minimum charged particle energy cut 1048 theMinEkine = val; 1049 if (theUserLimitsForDetector != 0) 1050 { 1051 theUserLimitsForDetector->SetUserMinEki 1052 G4cout << "Changing Detector energy cut 1053 << G4endl; 1054 } 1055 } 1056 1057 //....oooOO0OOooo........oooOO0OOooo........o 1058 1059 // specific method to G4UserLimits:= SetUserM 1060 void DMXDetectorConstruction::SetRoomTimeCut( 1061 { 1062 // set room time cut: 1063 theRoomTimeCut = val; 1064 if (theUserLimitsForRoom != 0) 1065 { 1066 theUserLimitsForRoom->SetUserMaxTime(va 1067 G4cout << " Changing Room Time cut to: 1068 << G4endl; 1069 } 1070 } 1071 1072 //....oooOO0OOooo........oooOO0OOooo........o 1073 1074 // specific method to G4UserLimits:= SetUserM 1075 void DMXDetectorConstruction::SetTimeCut(G4do 1076 { 1077 // set detector time cut: 1078 theMaxTimeCuts = val; 1079 if (theUserLimitsForDetector != 0) 1080 { 1081 theUserLimitsForDetector->SetUserMaxTim 1082 G4cout << " Changing Detector Time cut 1083 << G4endl; 1084 } 1085 } 1086 1087 //....oooOO0OOooo........oooOO0OOooo........o 1088 1089 1090 1091