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 //....oooOO0OOooo........oooOO0OOooo........oo 28 //....oooOO0OOooo........oooOO0OOooo........oo 29 30 #include "DetectorConstruction.hh" 31 32 #include "G4SystemOfUnits.hh" 33 #include "G4PhysicalConstants.hh" 34 #include "G4Material.hh" 35 #include "G4Tubs.hh" 36 #include "G4Box.hh" 37 #include "G4LogicalVolume.hh" 38 #include "G4PVPlacement.hh" 39 #include "G4PVReplica.hh" 40 #include "G4Transform3D.hh" 41 #include "G4RotationMatrix.hh" 42 43 #include "G4GeometryManager.hh" 44 #include "G4PhysicalVolumeStore.hh" 45 #include "G4LogicalVolumeStore.hh" 46 #include "G4SolidStore.hh" 47 48 #include "G4VisAttributes.hh" 49 50 51 //....oooOO0OOooo........oooOO0OOooo........oo 52 53 DetectorConstruction::DetectorConstruction() 54 :fiberMat(0),lvol_fiber(0), absorberMat(0),lvo 55 moduleMat(0),lvol_module(0), calorimeterMat(0 56 worldMat(0),pvol_world(0), defaultMat(0) 57 { 58 // materials 59 DefineMaterials(); 60 61 // default parameter values of calorimeter 62 // 63 fiberDiameter = 1.13*mm; //1.08*mm 64 nbOfFibers = 490; //490 65 distanceInterFibers = 1.35*mm; //1.35*mm 66 layerThickness = 1.73*mm; //1.68*mm 67 milledLayer = 1.00*mm; //1.40*mm 68 nbOfLayers = 10; //10 69 nbOfModules = 9; //9 70 71 fiberLength = (nbOfFibers+0.5)*dista 72 } 73 74 //....oooOO0OOooo........oooOO0OOooo........oo 75 76 DetectorConstruction::~DetectorConstruction() 77 { } 78 79 //....oooOO0OOooo........oooOO0OOooo........oo 80 81 G4VPhysicalVolume* DetectorConstruction::Const 82 { 83 return ConstructCalorimeter(); 84 } 85 86 //....oooOO0OOooo........oooOO0OOooo........oo 87 88 void DetectorConstruction::DefineMaterials() 89 { 90 // define Elements 91 // 92 G4Element* H = new G4Element("Hydrogen","H" 93 G4Element* C = new G4Element("Carbon", "C" 94 G4Element* N = new G4Element("Nitrogen","N" 95 G4Element* O = new G4Element("Oxygen", "O" 96 97 G4int natoms, ncomponents; 98 G4double density, massfraction; 99 100 // Lead 101 // 102 G4Material* Pb = 103 new G4Material("Lead", 82., 207.20*g/mole, d 104 105 // Scintillator 106 // 107 G4Material* Sci = 108 new G4Material("Scintillator", density= 1.03 109 Sci->AddElement(C, natoms=8); 110 Sci->AddElement(H, natoms=8); 111 112 Sci->GetIonisation()->SetBirksConstant(0.126 113 114 // Air 115 // 116 G4Material* Air = 117 new G4Material("Air", density= 1.290*mg/cm3, 118 Air->AddElement(N, massfraction=70*perCent); 119 Air->AddElement(O, massfraction=30.*perCent) 120 121 // example of vacuum 122 // 123 density = universe_mean_density; //fr 124 G4double pressure = 3.e-18*pascal; 125 G4double temperature = 2.73*kelvin; 126 G4Material* Vacuum = 127 new G4Material("Galactic", 1., 1.008*g/mole, 128 kStateGas,tempera 129 130 //attribute materials 131 // 132 defaultMat = Vacuum; 133 fiberMat = Sci; 134 absorberMat = Pb; 135 moduleMat = defaultMat; 136 calorimeterMat = defaultMat; 137 worldMat = defaultMat; 138 139 // print table 140 // 141 G4cout << *(G4Material::GetMaterialTable()) 142 } 143 144 //....oooOO0OOooo........oooOO0OOooo........oo 145 146 G4VPhysicalVolume* DetectorConstruction::Const 147 { 148 // Cleanup old geometry 149 // 150 G4GeometryManager::GetInstance()->OpenGeomet 151 G4PhysicalVolumeStore::GetInstance()->Clean( 152 G4LogicalVolumeStore::GetInstance()->Clean() 153 G4SolidStore::GetInstance()->Clean(); 154 155 // fibers 156 // 157 G4Tubs* 158 svol_fiber = new G4Tubs("fiber", //name 159 0*mm, 0.5*fiberDiamet 160 0.5*fiberLength, //half-length 161 0., twopi); //theta1, theta2 162 163 lvol_fiber = new G4LogicalVolume(svol_fiber, 164 fiberMat, 165 "fiber"); 166 167 // layer 168 // 169 G4double sizeX = layerThickness; 170 G4double sizeY = distanceInterFibers*nbOfFib 171 G4double sizeZ = fiberLength; 172 173 G4Box* 174 svol_layer = new G4Box("layer", //name 175 0.5*sizeX, 0.5*sizeY, 0.5*si 176 177 178 lvol_layer = new G4LogicalVolume(svol_layer, 179 absorberMat 180 "layer"); 181 182 // put fibers within layer 183 // 184 G4double Xcenter = 0.; 185 G4double Ycenter = -0.5*(sizeY + distanceInt 186 187 for (G4int k=0; k<nbOfFibers; k++) { 188 Ycenter += distanceInterFibers; 189 new G4PVPlacement(0, //no rotatio 190 G4ThreeVector(Xcenter,Ycenter,0.), 191 lvol_fiber, 192 "fiber", //name 193 lvol_layer, // 194 false, // 195 k+1); 196 197 } 198 199 // modules 200 // 201 moduleThickness = layerThickness*nbOfLayers 202 sizeX = moduleThickness; 203 sizeY = fiberLength; 204 sizeZ = fiberLength; 205 206 G4Box* 207 svol_module = new G4Box("module", //name 208 0.5*sizeX, 0.5*sizeY, 0.5*si 209 210 lvol_module = new G4LogicalVolume(svol_modul 211 absorberMat 212 "module"); 213 214 // put layers within module 215 // 216 Xcenter = -0.5*(nbOfLayers+1)*layerThickness 217 Ycenter = 0.25*distanceInterFibers; 218 219 for (G4int k=0; k<nbOfLayers; k++) { 220 Xcenter += layerThickness; 221 Ycenter = - Ycenter; 222 new G4PVPlacement(0, //no rotatio 223 G4ThreeVector(Xcenter,Ycenter,0.), 224 lvol_layer, 225 "layer", //name 226 lvol_module, 227 false, // 228 k+1); 229 230 } 231 232 // calorimeter 233 // 234 calorThickness = moduleThickness*nbOfModules 235 sizeX = calorThickness; 236 sizeY = fiberLength; 237 sizeZ = fiberLength; 238 239 G4Box* 240 svol_calorimeter = new G4Box("calorimeter", 241 0.5*sizeX, 0.5*sizeY, 0.5*si 242 243 244 lvol_calorimeter = new G4LogicalVolume(svol_ 245 calorimeter 246 "calorimete 247 248 // put modules inside calorimeter 249 // 250 Xcenter = -0.5*(calorThickness + moduleThick 251 252 253 for (G4int k=0; k<nbOfModules; k++) { 254 Xcenter += moduleThickness; 255 G4RotationMatrix rotm; 256 if ((k+1)%2 == 0) rotm.rotateX(90*deg); 257 G4Transform3D transform(rotm, G4ThreeVector( 258 new G4PVPlacement(transform, //ro 259 lvol_module, // 260 "module", // 261 lvol_calorimeter, 262 false, // 263 k+1); 264 } 265 266 // world 267 // 268 sizeX = 1.2*calorThickness; 269 sizeY = 1.2*fiberLength; 270 sizeZ = 1.2*fiberLength; 271 272 worldSizeX = sizeX; 273 274 G4Box* 275 svol_world = new G4Box("world", //name 276 0.5*sizeX, 0.5*sizeY, 0.5*si 277 278 lvol_world = new G4LogicalVolume(svol_world, 279 worldMat, 280 "world"); 281 282 pvol_world = new G4PVPlacement(0, //no r 283 G4ThreeVector(), //at (0,0,0) 284 lvol_world, 285 "world", // 286 0, //moth 287 false, // 288 0); //co 289 290 //put calorimeter in world 291 // 292 new G4PVPlacement(0, //no rotation 293 G4ThreeVector(), //at ( 294 lvol_calorimeter, //logi 295 "calorimeter", //name 296 lvol_world, //mother 297 false, //no boolean o 298 0); //copy number 299 300 PrintCalorParameters(); 301 302 // Visualization attributes 303 // 304 lvol_fiber->SetVisAttributes (G4VisAttribute 305 lvol_layer->SetVisAttributes (G4VisAttribute 306 lvol_world->SetVisAttributes (G4VisAttribute 307 308 //always return the physical World 309 // 310 return pvol_world; 311 } 312 313 //....oooOO0OOooo........oooOO0OOooo........oo 314 315 #include "G4UnitsTable.hh" 316 317 void DetectorConstruction::PrintCalorParameter 318 { 319 G4cout << "\n------------------------------- 320 << "\n ---> The calorimeter is " << nbOfM 321 << "\n ---> A Module is " << nbOfLayers < 322 323 G4cout 324 << "\n ---> A Layer is " << G4BestUnit(la 325 << " thickness of " << absorberMat->GetNa 326 327 G4cout 328 << "\n ---> A Layer includes " << nbOfFib 329 << fiberMat->GetName(); 330 331 G4cout 332 << "\n ---> diameter : " << G4BestUn 333 << "\n ---> length : " << G4BestUn 334 << "\n ---> distance : " << G4BestUn 335 336 G4cout 337 << "\n ---> The milled Layer is " << G4Be 338 << " thickness of " << absorberMat->GetNa 339 340 G4cout 341 << "\n\n ---> Module thickness " << G4BestU 342 343 G4cout 344 << "\n\n ---> Total calor thickness " << G4 345 << "\n Tranverse size " << G4 346 347 G4cout << "\n------------------------------- 348 G4cout << G4endl; 349 } 350 351 //....oooOO0OOooo........oooOO0OOooo........oo 352 353 #include "G4GlobalMagFieldMessenger.hh" 354 #include "G4AutoDelete.hh" 355 356 void DetectorConstruction::ConstructSDandField 357 { 358 if ( fFieldMessenger.Get() == 0 ) { 359 // Create global magnetic field messen 360 // Uniform magnetic field is then crea 361 // the field value is not zero. 362 G4ThreeVector fieldValue = G4ThreeVect 363 G4GlobalMagFieldMessenger* msg = 364 new G4GlobalMagFieldMessenger(fieldVal 365 //msg->SetVerboseLevel(1); 366 G4AutoDelete::Register(msg); 367 fFieldMessenger.Put( msg ); 368 369 } 370 } 371 372 //....oooOO0OOooo........oooOO0OOooo........oo 373