Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // >> 26 // $Id$ 26 // 27 // 27 //....oooOO0OOooo........oooOO0OOooo........oo 28 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 28 //....oooOO0OOooo........oooOO0OOooo........oo 29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 29 30 30 #include "DetectorConstruction.hh" 31 #include "DetectorConstruction.hh" >> 32 #include "DetectorMessenger.hh" 31 33 32 #include "G4SystemOfUnits.hh" 34 #include "G4SystemOfUnits.hh" 33 #include "G4PhysicalConstants.hh" 35 #include "G4PhysicalConstants.hh" 34 #include "G4Material.hh" 36 #include "G4Material.hh" 35 #include "G4Tubs.hh" 37 #include "G4Tubs.hh" 36 #include "G4Box.hh" 38 #include "G4Box.hh" 37 #include "G4LogicalVolume.hh" 39 #include "G4LogicalVolume.hh" 38 #include "G4PVPlacement.hh" 40 #include "G4PVPlacement.hh" 39 #include "G4PVReplica.hh" 41 #include "G4PVReplica.hh" 40 #include "G4Transform3D.hh" << 41 #include "G4RotationMatrix.hh" 42 #include "G4RotationMatrix.hh" 42 43 >> 44 #include "G4UniformMagField.hh" >> 45 43 #include "G4GeometryManager.hh" 46 #include "G4GeometryManager.hh" 44 #include "G4PhysicalVolumeStore.hh" 47 #include "G4PhysicalVolumeStore.hh" 45 #include "G4LogicalVolumeStore.hh" 48 #include "G4LogicalVolumeStore.hh" 46 #include "G4SolidStore.hh" 49 #include "G4SolidStore.hh" 47 50 >> 51 #include "G4UnitsTable.hh" >> 52 48 #include "G4VisAttributes.hh" 53 #include "G4VisAttributes.hh" 49 54 50 55 51 //....oooOO0OOooo........oooOO0OOooo........oo 56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 52 57 53 DetectorConstruction::DetectorConstruction() 58 DetectorConstruction::DetectorConstruction() 54 :fiberMat(0),lvol_fiber(0), absorberMat(0),lvo 59 :fiberMat(0),lvol_fiber(0), absorberMat(0),lvol_layer(0), 55 moduleMat(0),lvol_module(0), calorimeterMat(0 60 moduleMat(0),lvol_module(0), calorimeterMat(0),lvol_calorimeter(0), 56 worldMat(0),pvol_world(0), defaultMat(0) << 61 worldMat(0),pvol_world(0), defaultMat(0), magField(0) 57 { 62 { 58 // materials 63 // materials 59 DefineMaterials(); 64 DefineMaterials(); 60 65 61 // default parameter values of calorimeter 66 // default parameter values of calorimeter 62 // 67 // 63 fiberDiameter = 1.13*mm; //1.08*mm 68 fiberDiameter = 1.13*mm; //1.08*mm 64 nbOfFibers = 490; //490 69 nbOfFibers = 490; //490 65 distanceInterFibers = 1.35*mm; //1.35*mm 70 distanceInterFibers = 1.35*mm; //1.35*mm 66 layerThickness = 1.73*mm; //1.68*mm << 71 layerThickness = 1.73*mm; //1.68*mm 67 milledLayer = 1.00*mm; //1.40*mm << 72 milledLayer = 1.00*mm; //1.40*mm ? 68 nbOfLayers = 10; //10 << 73 nbOfLayers = 10; //10 69 nbOfModules = 9; //9 << 74 nbOfModules = 9; //9 70 75 71 fiberLength = (nbOfFibers+0.5)*dista << 76 fiberLength = (nbOfFibers+1)*distanceInterFibers; //658*mm >> 77 >> 78 //pixels readout >> 79 // >> 80 G4int nSubModul = 2; //2 >> 81 n1pxl = nbOfModules*nSubModul; //18 >> 82 n2pxl = 72; //72 >> 83 >> 84 n1shift = 1; >> 85 if (n1pxl > 1) n1shift = 10; >> 86 if (n1pxl > 10) n1shift = 100; >> 87 if (n1pxl > 100) n1shift = 1000; >> 88 >> 89 sizeVectorPxl = n1pxl*n1shift; //1800 >> 90 >> 91 // create commands for interactive definition of the calorimeter >> 92 detectorMessenger = new DetectorMessenger(this); 72 } 93 } 73 94 74 //....oooOO0OOooo........oooOO0OOooo........oo 95 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 75 96 76 DetectorConstruction::~DetectorConstruction() 97 DetectorConstruction::~DetectorConstruction() 77 { } << 98 { >> 99 delete detectorMessenger; >> 100 } 78 101 79 //....oooOO0OOooo........oooOO0OOooo........oo 102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 80 103 81 G4VPhysicalVolume* DetectorConstruction::Const 104 G4VPhysicalVolume* DetectorConstruction::Construct() 82 { 105 { 83 return ConstructCalorimeter(); 106 return ConstructCalorimeter(); 84 } 107 } 85 108 86 //....oooOO0OOooo........oooOO0OOooo........oo 109 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 87 110 88 void DetectorConstruction::DefineMaterials() 111 void DetectorConstruction::DefineMaterials() 89 { 112 { 90 // define Elements 113 // define Elements 91 // 114 // 92 G4Element* H = new G4Element("Hydrogen","H" 115 G4Element* H = new G4Element("Hydrogen","H", 1, 1.01*g/mole); 93 G4Element* C = new G4Element("Carbon", "C" 116 G4Element* C = new G4Element("Carbon", "C", 6, 12.01*g/mole); 94 G4Element* N = new G4Element("Nitrogen","N" 117 G4Element* N = new G4Element("Nitrogen","N", 7, 14.01*g/mole); 95 G4Element* O = new G4Element("Oxygen", "O" 118 G4Element* O = new G4Element("Oxygen", "O", 8, 16.00*g/mole); 96 119 97 G4int natoms, ncomponents; 120 G4int natoms, ncomponents; 98 G4double density, massfraction; 121 G4double density, massfraction; 99 122 100 // Lead 123 // Lead 101 // 124 // 102 G4Material* Pb = 125 G4Material* Pb = 103 new G4Material("Lead", 82., 207.20*g/mole, d 126 new G4Material("Lead", 82., 207.20*g/mole, density= 0.98*11.20*g/cm3); 104 127 105 // Scintillator 128 // Scintillator 106 // 129 // 107 G4Material* Sci = 130 G4Material* Sci = 108 new G4Material("Scintillator", density= 1.03 131 new G4Material("Scintillator", density= 1.032*g/cm3, ncomponents=2); 109 Sci->AddElement(C, natoms=8); 132 Sci->AddElement(C, natoms=8); 110 Sci->AddElement(H, natoms=8); 133 Sci->AddElement(H, natoms=8); 111 134 112 Sci->GetIonisation()->SetBirksConstant(0.126 135 Sci->GetIonisation()->SetBirksConstant(0.126*mm/MeV); 113 136 114 // Air 137 // Air 115 // 138 // 116 G4Material* Air = 139 G4Material* Air = 117 new G4Material("Air", density= 1.290*mg/cm3, 140 new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2); 118 Air->AddElement(N, massfraction=70*perCent); 141 Air->AddElement(N, massfraction=70*perCent); 119 Air->AddElement(O, massfraction=30.*perCent) 142 Air->AddElement(O, massfraction=30.*perCent); 120 143 121 // example of vacuum 144 // example of vacuum 122 // 145 // 123 density = universe_mean_density; //fr 146 density = universe_mean_density; //from PhysicalConstants.h 124 G4double pressure = 3.e-18*pascal; 147 G4double pressure = 3.e-18*pascal; 125 G4double temperature = 2.73*kelvin; 148 G4double temperature = 2.73*kelvin; 126 G4Material* Vacuum = 149 G4Material* Vacuum = 127 new G4Material("Galactic", 1., 1.008*g/mole, 150 new G4Material("Galactic", 1., 1.008*g/mole, density, 128 kStateGas,tempera 151 kStateGas,temperature,pressure); 129 152 130 //attribute materials 153 //attribute materials 131 // 154 // 132 defaultMat = Vacuum; 155 defaultMat = Vacuum; 133 fiberMat = Sci; 156 fiberMat = Sci; 134 absorberMat = Pb; 157 absorberMat = Pb; 135 moduleMat = defaultMat; 158 moduleMat = defaultMat; 136 calorimeterMat = defaultMat; 159 calorimeterMat = defaultMat; 137 worldMat = defaultMat; 160 worldMat = defaultMat; 138 161 139 // print table 162 // print table 140 // 163 // 141 G4cout << *(G4Material::GetMaterialTable()) 164 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 142 } 165 } 143 166 144 //....oooOO0OOooo........oooOO0OOooo........oo 167 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 145 168 146 G4VPhysicalVolume* DetectorConstruction::Const 169 G4VPhysicalVolume* DetectorConstruction::ConstructCalorimeter() 147 { 170 { 148 // Cleanup old geometry 171 // Cleanup old geometry 149 // 172 // 150 G4GeometryManager::GetInstance()->OpenGeomet 173 G4GeometryManager::GetInstance()->OpenGeometry(); 151 G4PhysicalVolumeStore::GetInstance()->Clean( 174 G4PhysicalVolumeStore::GetInstance()->Clean(); 152 G4LogicalVolumeStore::GetInstance()->Clean() 175 G4LogicalVolumeStore::GetInstance()->Clean(); 153 G4SolidStore::GetInstance()->Clean(); 176 G4SolidStore::GetInstance()->Clean(); 154 177 155 // fibers 178 // fibers 156 // 179 // 157 G4Tubs* 180 G4Tubs* 158 svol_fiber = new G4Tubs("fiber", //name 181 svol_fiber = new G4Tubs("fiber", //name 159 0*mm, 0.5*fiberDiamet 182 0*mm, 0.5*fiberDiameter, //r1, r2 160 0.5*fiberLength, //half-length 183 0.5*fiberLength, //half-length 161 0., twopi); //theta1, theta2 184 0., twopi); //theta1, theta2 162 185 163 lvol_fiber = new G4LogicalVolume(svol_fiber, 186 lvol_fiber = new G4LogicalVolume(svol_fiber, //solid 164 fiberMat, 187 fiberMat, //material 165 "fiber"); 188 "fiber"); //name 166 189 167 // layer 190 // layer 168 // 191 // 169 G4double sizeX = layerThickness; 192 G4double sizeX = layerThickness; 170 G4double sizeY = distanceInterFibers*nbOfFib 193 G4double sizeY = distanceInterFibers*nbOfFibers; 171 G4double sizeZ = fiberLength; 194 G4double sizeZ = fiberLength; 172 195 173 G4Box* 196 G4Box* 174 svol_layer = new G4Box("layer", //name 197 svol_layer = new G4Box("layer", //name 175 0.5*sizeX, 0.5*sizeY, 0.5*si 198 0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size 176 199 177 200 178 lvol_layer = new G4LogicalVolume(svol_layer, 201 lvol_layer = new G4LogicalVolume(svol_layer, //solid 179 absorberMat 202 absorberMat, //material 180 "layer"); 203 "layer"); //name 181 204 182 // put fibers within layer 205 // put fibers within layer 183 // 206 // 184 G4double Xcenter = 0.; 207 G4double Xcenter = 0.; 185 G4double Ycenter = -0.5*(sizeY + distanceInt 208 G4double Ycenter = -0.5*(sizeY + distanceInterFibers); 186 209 187 for (G4int k=0; k<nbOfFibers; k++) { 210 for (G4int k=0; k<nbOfFibers; k++) { 188 Ycenter += distanceInterFibers; 211 Ycenter += distanceInterFibers; 189 new G4PVPlacement(0, //no rotatio 212 new G4PVPlacement(0, //no rotation 190 G4ThreeVector(Xcenter,Ycenter,0.), 213 G4ThreeVector(Xcenter,Ycenter,0.), //position 191 lvol_fiber, 214 lvol_fiber, //logical volume 192 "fiber", //name 215 "fiber", //name 193 lvol_layer, // 216 lvol_layer, //mother 194 false, // 217 false, //no boulean operat 195 k+1); << 218 k); //copy number 196 219 197 } 220 } 198 221 199 // modules 222 // modules 200 // 223 // 201 moduleThickness = layerThickness*nbOfLayers 224 moduleThickness = layerThickness*nbOfLayers + milledLayer; 202 sizeX = moduleThickness; 225 sizeX = moduleThickness; 203 sizeY = fiberLength; 226 sizeY = fiberLength; 204 sizeZ = fiberLength; 227 sizeZ = fiberLength; 205 228 206 G4Box* 229 G4Box* 207 svol_module = new G4Box("module", //name 230 svol_module = new G4Box("module", //name 208 0.5*sizeX, 0.5*sizeY, 0.5*si 231 0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size 209 232 210 lvol_module = new G4LogicalVolume(svol_modul 233 lvol_module = new G4LogicalVolume(svol_module, //solid 211 absorberMat 234 absorberMat, //material 212 "module"); 235 "module"); //name 213 236 214 // put layers within module 237 // put layers within module 215 // 238 // 216 Xcenter = -0.5*(nbOfLayers+1)*layerThickness 239 Xcenter = -0.5*(nbOfLayers+1)*layerThickness; 217 Ycenter = 0.25*distanceInterFibers; 240 Ycenter = 0.25*distanceInterFibers; 218 241 219 for (G4int k=0; k<nbOfLayers; k++) { 242 for (G4int k=0; k<nbOfLayers; k++) { 220 Xcenter += layerThickness; 243 Xcenter += layerThickness; 221 Ycenter = - Ycenter; 244 Ycenter = - Ycenter; 222 new G4PVPlacement(0, //no rotatio 245 new G4PVPlacement(0, //no rotation 223 G4ThreeVector(Xcenter,Ycenter,0.), 246 G4ThreeVector(Xcenter,Ycenter,0.), //position 224 lvol_layer, 247 lvol_layer, //logical volume 225 "layer", //name 248 "layer", //name 226 lvol_module, 249 lvol_module, //mother 227 false, // 250 false, //no boulean operat 228 k+1); << 251 k); //copy number 229 252 230 } 253 } 231 254 232 // calorimeter 255 // calorimeter 233 // 256 // 234 calorThickness = moduleThickness*nbOfModules 257 calorThickness = moduleThickness*nbOfModules; 235 sizeX = calorThickness; 258 sizeX = calorThickness; 236 sizeY = fiberLength; 259 sizeY = fiberLength; 237 sizeZ = fiberLength; 260 sizeZ = fiberLength; 238 261 239 G4Box* 262 G4Box* 240 svol_calorimeter = new G4Box("calorimeter", 263 svol_calorimeter = new G4Box("calorimeter", //name 241 0.5*sizeX, 0.5*sizeY, 0.5*si 264 0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size 242 265 243 266 244 lvol_calorimeter = new G4LogicalVolume(svol_ 267 lvol_calorimeter = new G4LogicalVolume(svol_calorimeter, //solid 245 calorimeter 268 calorimeterMat, //material 246 "calorimete 269 "calorimeter"); //name 247 270 248 // put modules inside calorimeter 271 // put modules inside calorimeter 249 // 272 // 250 Xcenter = -0.5*(calorThickness + moduleThick 273 Xcenter = -0.5*(calorThickness + moduleThickness); 251 274 252 << 275 //rotation matrix to place modules >> 276 G4RotationMatrix* rotm = 0; >> 277 G4RotationMatrix* rotmX = new G4RotationMatrix(); >> 278 rotmX->rotateX(90*deg); >> 279 253 for (G4int k=0; k<nbOfModules; k++) { 280 for (G4int k=0; k<nbOfModules; k++) { 254 Xcenter += moduleThickness; << 281 rotm = 0; 255 G4RotationMatrix rotm; << 282 if ((k+1)%2 == 0) rotm = rotmX; 256 if ((k+1)%2 == 0) rotm.rotateX(90*deg); << 283 Xcenter += moduleThickness; 257 G4Transform3D transform(rotm, G4ThreeVector( << 284 new G4PVPlacement(rotm, //rotation 258 new G4PVPlacement(transform, //ro << 285 G4ThreeVector(Xcenter,0.,0.), //position 259 lvol_module, // 286 lvol_module, //logical volume 260 "module", // << 287 "module", //name 261 lvol_calorimeter, << 288 lvol_calorimeter, //mother 262 false, // 289 false, //no boulean operat 263 k+1); << 290 k); //copy number 264 } 291 } 265 292 266 // world 293 // world 267 // 294 // 268 sizeX = 1.2*calorThickness; 295 sizeX = 1.2*calorThickness; 269 sizeY = 1.2*fiberLength; 296 sizeY = 1.2*fiberLength; 270 sizeZ = 1.2*fiberLength; 297 sizeZ = 1.2*fiberLength; 271 298 272 worldSizeX = sizeX; 299 worldSizeX = sizeX; 273 300 274 G4Box* 301 G4Box* 275 svol_world = new G4Box("world", //name 302 svol_world = new G4Box("world", //name 276 0.5*sizeX, 0.5*sizeY, 0.5*si 303 0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size 277 304 278 lvol_world = new G4LogicalVolume(svol_world, 305 lvol_world = new G4LogicalVolume(svol_world, //solid 279 worldMat, 306 worldMat, //material 280 "world"); 307 "world"); //name 281 308 282 pvol_world = new G4PVPlacement(0, //no r 309 pvol_world = new G4PVPlacement(0, //no rotation 283 G4ThreeVector(), //at (0,0,0) 310 G4ThreeVector(), //at (0,0,0) 284 lvol_world, 311 lvol_world, //logical volume 285 "world", // 312 "world", //name 286 0, //moth 313 0, //mother volume 287 false, // 314 false, //no boolean operation 288 0); //co 315 0); //copy number 289 316 290 //put calorimeter in world 317 //put calorimeter in world 291 // 318 // 292 new G4PVPlacement(0, //no rotation 319 new G4PVPlacement(0, //no rotation 293 G4ThreeVector(), //at ( 320 G4ThreeVector(), //at (0,0,0) 294 lvol_calorimeter, //logi 321 lvol_calorimeter, //logical volume 295 "calorimeter", //name 322 "calorimeter", //name 296 lvol_world, //mother 323 lvol_world, //mother volume 297 false, //no boolean o 324 false, //no boolean operation 298 0); //copy number 325 0); //copy number 299 326 300 PrintCalorParameters(); 327 PrintCalorParameters(); 301 328 302 // Visualization attributes 329 // Visualization attributes 303 // 330 // 304 lvol_fiber->SetVisAttributes (G4VisAttribute << 331 lvol_fiber->SetVisAttributes (G4VisAttributes::Invisible); 305 lvol_layer->SetVisAttributes (G4VisAttribute << 332 lvol_layer->SetVisAttributes (G4VisAttributes::Invisible); 306 lvol_world->SetVisAttributes (G4VisAttribute << 333 lvol_world->SetVisAttributes (G4VisAttributes::Invisible); 307 << 334 >> 335 // Pixels readout >> 336 // >> 337 d1pxl = calorThickness/n1pxl; >> 338 d2pxl = fiberLength/n2pxl; >> 339 308 //always return the physical World 340 //always return the physical World 309 // 341 // 310 return pvol_world; 342 return pvol_world; 311 } 343 } 312 344 313 //....oooOO0OOooo........oooOO0OOooo........oo 345 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 314 346 315 #include "G4UnitsTable.hh" << 316 << 317 void DetectorConstruction::PrintCalorParameter 347 void DetectorConstruction::PrintCalorParameters() 318 { 348 { 319 G4cout << "\n------------------------------- 349 G4cout << "\n-------------------------------------------------------------" 320 << "\n ---> The calorimeter is " << nbOfM 350 << "\n ---> The calorimeter is " << nbOfModules << " Modules" 321 << "\n ---> A Module is " << nbOfLayers < 351 << "\n ---> A Module is " << nbOfLayers << " Layers + 1 milled Layer"; 322 352 323 G4cout 353 G4cout 324 << "\n ---> A Layer is " << G4BestUnit(la 354 << "\n ---> A Layer is " << G4BestUnit(layerThickness,"Length") 325 << " thickness of " << absorberMat->GetNa 355 << " thickness of " << absorberMat->GetName(); 326 356 327 G4cout 357 G4cout 328 << "\n ---> A Layer includes " << nbOfFib 358 << "\n ---> A Layer includes " << nbOfFibers << " fibers of " 329 << fiberMat->GetName(); 359 << fiberMat->GetName(); 330 360 331 G4cout 361 G4cout 332 << "\n ---> diameter : " << G4BestUn 362 << "\n ---> diameter : " << G4BestUnit(fiberDiameter,"Length") 333 << "\n ---> length : " << G4BestUn 363 << "\n ---> length : " << G4BestUnit(fiberLength,"Length") 334 << "\n ---> distance : " << G4BestUn 364 << "\n ---> distance : " << G4BestUnit(distanceInterFibers,"Length"); 335 365 336 G4cout 366 G4cout 337 << "\n ---> The milled Layer is " << G4Be 367 << "\n ---> The milled Layer is " << G4BestUnit(milledLayer,"Length") 338 << " thickness of " << absorberMat->GetNa 368 << " thickness of " << absorberMat->GetName(); 339 369 340 G4cout 370 G4cout 341 << "\n\n ---> Module thickness " << G4BestU 371 << "\n\n ---> Module thickness " << G4BestUnit(moduleThickness,"Length"); 342 372 343 G4cout 373 G4cout 344 << "\n\n ---> Total calor thickness " << G4 374 << "\n\n ---> Total calor thickness " << G4BestUnit(calorThickness,"Length") 345 << "\n Tranverse size " << G4 375 << "\n Tranverse size " << G4BestUnit(fiberLength,"Length"); 346 376 347 G4cout << "\n------------------------------- 377 G4cout << "\n-------------------------------------------------------------\n"; 348 G4cout << G4endl; 378 G4cout << G4endl; 349 } 379 } 350 380 351 //....oooOO0OOooo........oooOO0OOooo........oo 381 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 352 382 353 #include "G4GlobalMagFieldMessenger.hh" << 383 #include "G4FieldManager.hh" 354 #include "G4AutoDelete.hh" << 384 #include "G4TransportationManager.hh" >> 385 >> 386 void DetectorConstruction::SetMagField(G4double fieldValue) >> 387 { >> 388 //apply a global uniform magnetic field along Z axis >> 389 // >> 390 G4FieldManager* fieldMgr >> 391 = G4TransportationManager::GetTransportationManager()->GetFieldManager(); >> 392 >> 393 if(magField) delete magField; //delete the existing magn field >> 394 >> 395 if(fieldValue!=0.) // create a new one if non nul >> 396 { magField = new G4UniformMagField(G4ThreeVector(0.,0.,fieldValue)); >> 397 fieldMgr->SetDetectorField(magField); >> 398 fieldMgr->CreateChordFinder(magField); >> 399 } else { >> 400 magField = 0; >> 401 fieldMgr->SetDetectorField(magField); >> 402 } >> 403 } >> 404 >> 405 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 406 >> 407 #include "G4RunManager.hh" 355 408 356 void DetectorConstruction::ConstructSDandField << 409 void DetectorConstruction::UpdateGeometry() 357 { 410 { 358 if ( fFieldMessenger.Get() == 0 ) { << 411 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructCalorimeter()); 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 } 412 } 371 413 372 //....oooOO0OOooo........oooOO0OOooo........oo 414 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 373 415