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 // g << 25 //g 26 /// \file persistency/gdml/G02/src/G02Detector 26 /// \file persistency/gdml/G02/src/G02DetectorConstruction.cc 27 /// \brief Implementation of the G02DetectorCo 27 /// \brief Implementation of the G02DetectorConstruction class 28 // 28 // 29 // 29 // >> 30 // $Id$ 30 // 31 // 31 // Class G02DetectorConstruction implementatio 32 // Class G02DetectorConstruction implementation 32 // 33 // 33 // ------------------------------------------- 34 // ---------------------------------------------------------------------------- 34 35 35 #include "G02DetectorConstruction.hh" 36 #include "G02DetectorConstruction.hh" 36 37 37 // Geant4 includes 38 // Geant4 includes 38 // 39 // >> 40 #include "globals.hh" 39 #include "G4GeometryManager.hh" 41 #include "G4GeometryManager.hh" 40 #include "G4VisAttributes.hh" 42 #include "G4VisAttributes.hh" 41 #include "globals.hh" << 42 43 43 // Materials 44 // Materials 44 // 45 // 45 #include "G4Material.hh" 46 #include "G4Material.hh" 46 47 47 // Geometry includes 48 // Geometry includes 48 // 49 // 49 #include "G4Box.hh" << 50 #include "G4LogicalVolume.hh" 50 #include "G4LogicalVolume.hh" >> 51 #include "G4VPhysicalVolume.hh" 51 #include "G4PVParameterised.hh" 52 #include "G4PVParameterised.hh" 52 #include "G4PVPlacement.hh" 53 #include "G4PVPlacement.hh" >> 54 #include "G4Box.hh" 53 #include "G4Tubs.hh" 55 #include "G4Tubs.hh" 54 #include "G4VPhysicalVolume.hh" << 55 56 56 // Reflected solids 57 // Reflected solids 57 // 58 // 58 #include "G4AffineTransform.hh" << 59 #include "G4DisplacedSolid.hh" << 60 #include "G4ReflectedSolid.hh" 59 #include "G4ReflectedSolid.hh" >> 60 #include "G4DisplacedSolid.hh" 61 #include "G4ReflectionFactory.hh" 61 #include "G4ReflectionFactory.hh" 62 #include "G4RotationMatrix.hh" 62 #include "G4RotationMatrix.hh" >> 63 #include "G4AffineTransform.hh" 63 #include "G4Transform3D.hh" 64 #include "G4Transform3D.hh" 64 65 65 // Assembly volumes 66 // Assembly volumes 66 // 67 // 67 #include "G4AssemblyVolume.hh" 68 #include "G4AssemblyVolume.hh" 68 69 69 // Volume parameterisations 70 // Volume parameterisations 70 // 71 // 71 #include "G02ChamberParameterisation.hh" 72 #include "G02ChamberParameterisation.hh" 72 73 73 // Messenger 74 // Messenger 74 // 75 // 75 #include "G02DetectorMessenger.hh" 76 #include "G02DetectorMessenger.hh" 76 77 77 // GDML parser include 78 // GDML parser include 78 // 79 // 79 #include "G4GDMLParser.hh" 80 #include "G4GDMLParser.hh" >> 81 80 #include "G4PhysicalConstants.hh" 82 #include "G4PhysicalConstants.hh" 81 #include "G4SystemOfUnits.hh" 83 #include "G4SystemOfUnits.hh" 82 84 83 //....oooOO0OOooo........oooOO0OOooo........oo 85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 84 // 86 // 85 // Constructor 87 // Constructor 86 // 88 // 87 G02DetectorConstruction::G02DetectorConstructi 89 G02DetectorConstruction::G02DetectorConstruction() 88 : G4VUserDetectorConstruction(), fAir(0), fA << 90 : fAir(0), fAluminum(0), fPb(0), fXenon(0) 89 { 91 { 90 fExpHall_x = 5. * m; << 92 fExpHall_x=5.*m; 91 << 93 92 fReadFile = "test.gdml"; << 94 fReadFile ="test.gdml"; 93 fWriteFile = "wtest.gdml"; << 95 fWriteFile="wtest.gdml"; 94 fStepFile = "mbb"; << 96 fStepFile ="mbb"; 95 fWritingChoice = 1; << 97 fWritingChoice=1; 96 << 98 97 fDetectorMessenger = new G02DetectorMessenge << 99 fDetectorMessenger = new G02DetectorMessenger( this ); 98 } 100 } 99 101 100 //....oooOO0OOooo........oooOO0OOooo........oo 102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 101 // 103 // 102 // Destructor 104 // Destructor 103 // 105 // 104 G02DetectorConstruction::~G02DetectorConstruct 106 G02DetectorConstruction::~G02DetectorConstruction() 105 { 107 { 106 if (fDetectorMessenger) delete fDetectorMess << 108 if(fDetectorMessenger) delete fDetectorMessenger; 107 } 109 } 108 110 109 //....oooOO0OOooo........oooOO0OOooo........oo 111 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 110 // 112 // 111 // Constructs geometries and materials 113 // Constructs geometries and materials 112 // 114 // 113 G4VPhysicalVolume* G02DetectorConstruction::Co 115 G4VPhysicalVolume* G02DetectorConstruction::Construct() 114 { << 116 { 115 // Writing or Reading of Geometry using G4GD 117 // Writing or Reading of Geometry using G4GDML 116 118 117 G4VPhysicalVolume* fWorldPhysVol; 119 G4VPhysicalVolume* fWorldPhysVol; 118 120 119 if (fWritingChoice == 0) { << 121 if(fWritingChoice==0) >> 122 { 120 // **** LOOK HERE*** FOR READING GDML FILE 123 // **** LOOK HERE*** FOR READING GDML FILES 121 // 124 // 122 << 125 123 // ACTIVATING OVERLAP CHECK when read volu 126 // ACTIVATING OVERLAP CHECK when read volumes are placed. 124 // Can take long time in case of complex g 127 // Can take long time in case of complex geometries 125 // 128 // 126 // fParser.SetOverlapCheck(true); 129 // fParser.SetOverlapCheck(true); 127 130 128 fParser.Read(fReadFile); 131 fParser.Read(fReadFile); 129 132 130 // READING GDML FILES OPTION: 2nd Boolean 133 // READING GDML FILES OPTION: 2nd Boolean argument "Validate". 131 // Flag to "false" disables check with the 134 // Flag to "false" disables check with the Schema when reading GDML file. 132 // See the GDML Documentation for more inf 135 // See the GDML Documentation for more information. 133 // 136 // 134 // fParser.Read(fReadFile,false); 137 // fParser.Read(fReadFile,false); 135 << 138 136 // Prints the material information 139 // Prints the material information 137 // 140 // 138 G4cout << *(G4Material::GetMaterialTable() << 141 G4cout << *(G4Material::GetMaterialTable() ) << G4endl; 139 << 142 140 // Giving World Physical Volume from GDML 143 // Giving World Physical Volume from GDML Parser 141 // 144 // 142 fWorldPhysVol = fParser.GetWorldVolume(); << 145 fWorldPhysVol = fParser.GetWorldVolume(); 143 } 146 } 144 else if (fWritingChoice == 1) { << 147 else if(fWritingChoice==1) >> 148 { 145 // **** LOOK HERE*** FOR WRITING GDML FILE 149 // **** LOOK HERE*** FOR WRITING GDML FILES 146 // Detector Construction and WRITING to GD 150 // Detector Construction and WRITING to GDML 147 // 151 // 148 ListOfMaterials(); 152 ListOfMaterials(); 149 fWorldPhysVol = ConstructDetector(); 153 fWorldPhysVol = ConstructDetector(); 150 154 151 // OPTION: TO ADD MODULE AT DEPTH LEVEL .. 155 // OPTION: TO ADD MODULE AT DEPTH LEVEL ... 152 // 156 // 153 // Can be a integer or a pointer to the to 157 // Can be a integer or a pointer to the top Physical Volume: 154 // 158 // 155 // G4int depth=1; 159 // G4int depth=1; 156 // fParser.AddModule(depth); << 160 // parser.AddModule(depth); 157 << 161 158 // OPTION: SETTING ADDITION OF POINTER TO 162 // OPTION: SETTING ADDITION OF POINTER TO NAME TO FALSE 159 // 163 // 160 // By default, written names in GDML consi 164 // By default, written names in GDML consist of the given name with 161 // appended the pointer reference to it, i 165 // appended the pointer reference to it, in order to make it unique. 162 // Naming policy can be changed by using t 166 // Naming policy can be changed by using the following method, or 163 // calling Write with additional Boolean a 167 // calling Write with additional Boolean argument to "false". 164 // NOTE: you have to be sure not to have d 168 // NOTE: you have to be sure not to have duplication of names in your 165 // Geometry Setup. 169 // Geometry Setup. 166 // << 170 // 167 // fParser.SetAddPointerToName(false); << 171 // parser.SetAddPointerToName(false); 168 // 172 // 169 // or 173 // or 170 // 174 // 171 // fParser.Write(fWriteFile, fWorldPhysVol 175 // fParser.Write(fWriteFile, fWorldPhysVol, false); 172 << 176 173 // OPTION: SET MAXIMUM LEVEL TO EXPORT (RE << 174 // << 175 // Can be a integer greater than zero: << 176 // << 177 // G4int maxlevel=3; << 178 // fParser.SetMaxExportLevel(maxlevel); << 179 << 180 // Writing Geometry to GDML File 177 // Writing Geometry to GDML File 181 // 178 // 182 fParser.Write(fWriteFile, fWorldPhysVol); 179 fParser.Write(fWriteFile, fWorldPhysVol); 183 << 180 184 // OPTION: SPECIFYING THE SCHEMA LOCATION 181 // OPTION: SPECIFYING THE SCHEMA LOCATION 185 // 182 // 186 // When writing GDML file the default the 183 // When writing GDML file the default the Schema Location from the 187 // GDML web site will be used: 184 // GDML web site will be used: 188 // "http://cern.ch/service-spi/app/release << 185 // "http://cern.ch/service-spi/app/releases/GDML/GDML_2_10_0/src/GDMLSchema/gdml.xsd" 189 // 186 // 190 // NOTE: GDML Schema is distributed in Gea 187 // NOTE: GDML Schema is distributed in Geant4 in the directory: 191 // $G4INSTALL/source/persistency/gdml/s 188 // $G4INSTALL/source/persistency/gdml/schema 192 // 189 // 193 // You can change the Schema path by addin 190 // You can change the Schema path by adding a parameter to the Write 194 // command, as follows: 191 // command, as follows: 195 // 192 // 196 // fParser.Write(fWriteFile, fWorldPhysVol 193 // fParser.Write(fWriteFile, fWorldPhysVol, "your-path-to-schema/gdml.xsd"); 197 } 194 } 198 else // Demonstration how to Read STEP file << 195 else // Demonstration how to Read STEP files using GDML 199 { 196 { 200 // Some printout... << 197 // Some printout... 201 // << 198 // 202 ListOfMaterials(); << 199 ListOfMaterials(); 203 << 200 204 // Arbitrary values that should enclose an << 201 // Arbitrary values that should enclose any reasonable geometry 205 // << 202 // 206 const G4double expHall_y = fExpHall_x / 50 << 203 const G4double expHall_y = fExpHall_x/50.; 207 const G4double expHall_z = fExpHall_x / 50 << 204 const G4double expHall_z = fExpHall_x/50.; 208 << 205 209 // Create the hall << 206 // Create the hall 210 // << 207 // 211 G4Box* experimentalHallBox = new G4Box("Ex << 208 G4Box * experimentalHallBox 212 G4LogicalVolume* experimentalHallLV = << 209 = new G4Box("ExpHallBox",fExpHall_x/50.,expHall_y,expHall_z); 213 new G4LogicalVolume(experimentalHallBox, << 210 G4LogicalVolume * experimentalHallLV 214 fWorldPhysVol = new G4PVPlacement(0, G4Thr << 211 = new G4LogicalVolume(experimentalHallBox, fAir,"ExpHallLV"); 215 "ExpHall << 212 fWorldPhysVol 216 << 213 = new G4PVPlacement(0, G4ThreeVector(0.0,0.0,0.0), 217 // G02DetectorConstruction via reading STE << 214 experimentalHallLV, "ExpHallPhys", 0, false, 0); 218 // << 215 219 G4LogicalVolume* LogicalVolST = fParser.Pa << 216 // G02DetectorConstruction via reading STEP File 220 << 217 // 221 // Placement inside of the hall << 218 G4LogicalVolume* LogicalVolST 222 // << 219 = fParser.ParseST(fStepFile,fAir,fAluminum); 223 new G4PVPlacement(0, G4ThreeVector(10.0, 0 << 220 224 experimentalHallLV, fals << 221 // Placement inside of the hall >> 222 // >> 223 new G4PVPlacement(0, G4ThreeVector(10.0,0.0,0.0), LogicalVolST, >> 224 "StepPhys", experimentalHallLV, false, 0); 225 } 225 } 226 226 227 // Set Visualization attributes to world 227 // Set Visualization attributes to world 228 // 228 // 229 G4VisAttributes* BoxVisAtt = new G4VisAttrib << 229 G4VisAttributes* BoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); 230 fWorldPhysVol->GetLogicalVolume()->SetVisAtt << 230 fWorldPhysVol->GetLogicalVolume()->SetVisAttributes(BoxVisAtt); 231 231 232 return fWorldPhysVol; 232 return fWorldPhysVol; 233 } 233 } 234 234 235 //....oooOO0OOooo........oooOO0OOooo........oo 235 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 236 // 236 // 237 // Utility to build and list necessary materia 237 // Utility to build and list necessary materials 238 // 238 // 239 void G02DetectorConstruction::ListOfMaterials( 239 void G02DetectorConstruction::ListOfMaterials() 240 { 240 { 241 G4double a; // atomic mass 241 G4double a; // atomic mass 242 G4double z; // atomic number 242 G4double z; // atomic number 243 G4double density, temperature, pressure; << 243 G4double density,temperature,pressure; 244 G4double fractionmass; 244 G4double fractionmass; 245 G4String name, symbol; 245 G4String name, symbol; 246 G4int ncomponents; 246 G4int ncomponents; 247 247 248 // Elements needed for the materials 248 // Elements needed for the materials 249 249 250 a = 14.01 * g / mole; << 250 a = 14.01*g/mole; 251 G4Element* elN = new G4Element(name = "Nitro << 251 G4Element* elN = new G4Element(name="Nitrogen", symbol="N", z=7., a); 252 << 253 a = 16.00 * g / mole; << 254 G4Element* elO = new G4Element(name = "Oxyge << 255 << 256 a = 26.98 * g / mole; << 257 G4Element* elAl = new G4Element(name = "Alum << 258 252 >> 253 a = 16.00*g/mole; >> 254 G4Element* elO = new G4Element(name="Oxygen", symbol="O", z=8., a); >> 255 >> 256 a = 26.98*g/mole; >> 257 G4Element* elAl = new G4Element(name="Aluminum", symbol="Al", z=13., a); >> 258 259 // Print the Element information 259 // Print the Element information 260 // 260 // 261 G4cout << *(G4Element::GetElementTable()) << 261 G4cout << *(G4Element::GetElementTable()) << G4endl; 262 262 263 // Air 263 // Air 264 // 264 // 265 density = 1.29 * mg / cm3; << 265 density = 1.29*mg/cm3; 266 fAir = new G4Material(name = "Air", density, << 266 fAir = new G4Material(name="Air", density, ncomponents=2); 267 fAir->AddElement(elN, fractionmass = 0.7); << 267 fAir->AddElement(elN, fractionmass=0.7); 268 fAir->AddElement(elO, fractionmass = 0.3); << 268 fAir->AddElement(elO, fractionmass=0.3); 269 269 270 // Aluminum 270 // Aluminum 271 // 271 // 272 density = 2.70 * g / cm3; << 272 density = 2.70*g/cm3; 273 fAluminum = new G4Material(name = "Aluminum" << 273 fAluminum = new G4Material(name="Aluminum", density, ncomponents=1); 274 fAluminum->AddElement(elAl, fractionmass = 1 << 274 fAluminum->AddElement(elAl, fractionmass=1.0); 275 275 276 // Lead 276 // Lead 277 // 277 // 278 fPb = new G4Material("Lead", z = 82., a = 20 << 278 fPb = new G4Material("Lead", z=82., a= 207.19*g/mole, density= 11.35*g/cm3); 279 279 280 // Xenon gas 280 // Xenon gas 281 // 281 // 282 fXenon = new G4Material("XenonGas", z = 54., << 282 fXenon = new G4Material("XenonGas", z=54., a=131.29*g/mole, 283 kStateGas, temperatu << 283 density= 5.458*mg/cm3, kStateGas, >> 284 temperature= 293.15*kelvin, pressure= 1*atmosphere); 284 285 285 // Prints the material information 286 // Prints the material information 286 // 287 // 287 G4cout << *(G4Material::GetMaterialTable()) << 288 G4cout << *(G4Material::GetMaterialTable() ) << G4endl; 288 } 289 } 289 290 290 //....oooOO0OOooo........oooOO0OOooo........oo 291 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 291 // 292 // 292 // Detector Construction 293 // Detector Construction 293 // 294 // 294 // Detector consist from DetectorBox, Conrol R 295 // Detector consist from DetectorBox, Conrol Room and 4 SubDetectors 295 // SubDetectors1 and 2 show how to use Reflect 296 // SubDetectors1 and 2 show how to use Reflection Factory and Assembly 296 // SubDetectors 3 and 4 show how to use Parame 297 // SubDetectors 3 and 4 show how to use Parameterisation 297 // 298 // 298 G4VPhysicalVolume* G02DetectorConstruction::Co 299 G4VPhysicalVolume* G02DetectorConstruction::ConstructDetector() 299 { 300 { 300 // Arbitary values that should enclose any r 301 // Arbitary values that should enclose any reasonable geometry 301 // 302 // 302 const G4double expHall_y = fExpHall_x; 303 const G4double expHall_y = fExpHall_x; 303 const G4double expHall_z = fExpHall_x; 304 const G4double expHall_z = fExpHall_x; 304 305 305 // Create the hall 306 // Create the hall 306 // 307 // 307 G4Box* experimentalHallBox = new G4Box("ExpH << 308 G4Box * experimentalHallBox = 308 G4LogicalVolume* experimentalHallLV = new G4 << 309 new G4Box("ExpHallBox", fExpHall_x, expHall_y, expHall_z); 309 G4PVPlacement* experimentalHallPhys = new G4 << 310 G4LogicalVolume * experimentalHallLV = 310 0, G4ThreeVector(0.0, 0.0, 0.0), experimen << 311 new G4LogicalVolume(experimentalHallBox, fAir, "ExpHallLV"); >> 312 G4PVPlacement * experimentalHallPhys = >> 313 new G4PVPlacement(0, G4ThreeVector(0.0,0.0,0.0), experimentalHallLV, >> 314 "ExpHallPhys", 0, false, 0); 311 315 312 // G02DetectorConstruction 316 // G02DetectorConstruction 313 317 314 const G4double det_x = fExpHall_x * 0.8; << 318 const G4double det_x = fExpHall_x*0.8; 315 const G4double det_y = fExpHall_x * 0.7; << 319 const G4double det_y = fExpHall_x*0.7; 316 const G4double det_z = det_y; 320 const G4double det_z = det_y; 317 321 318 // Create the detector box 322 // Create the detector box 319 // 323 // 320 G4Box* detectorBox = new G4Box("detectorBox" << 324 G4Box * detectorBox = 321 G4LogicalVolume* detectorLV = new G4LogicalV << 325 new G4Box("detectorBox", det_x, det_y, det_z); 322 // G4PVPlacement * detectorPhys = << 326 G4LogicalVolume * detectorLV = 323 new G4PVPlacement(0, G4ThreeVector(0.0, 0.0, << 327 new G4LogicalVolume(detectorBox, fAir, "detLV"); 324 false, 0); << 328 // G4PVPlacement * detectorPhys = >> 329 new G4PVPlacement(0, G4ThreeVector(0.0,0.0,0.0), detectorLV, >> 330 "detPhys", experimentalHallLV, false, 0); 325 331 326 // Create the Control room box 332 // Create the Control room box 327 // 333 // 328 const G4double room_x = fExpHall_x / 20.; << 334 const G4double room_x = fExpHall_x/20.; 329 const G4double room_y = room_x; 335 const G4double room_y = room_x; 330 const G4double room_z = room_x; 336 const G4double room_z = room_x; 331 337 332 G4Box* roomBox = new G4Box("roomBox", room_x << 338 G4Box * roomBox = 333 G4LogicalVolume* roomLV = new G4LogicalVolum << 339 new G4Box("roomBox", room_x, room_y, room_z); >> 340 G4LogicalVolume * roomLV = >> 341 new G4LogicalVolume(roomBox, fAir, "roomLV"); 334 // G4PVPlacement * roomPhys = 342 // G4PVPlacement * roomPhys = 335 new G4PVPlacement(0, G4ThreeVector(fExpHall_ << 343 new G4PVPlacement(0, G4ThreeVector(fExpHall_x-room_x-10.,0.0,0.0), roomLV, 336 experimentalHallLV, false, << 344 "roomPhys", experimentalHallLV, false, 0); 337 << 345 338 // SubDetector1 346 // SubDetector1 339 // 347 // 340 const G4double bigL = fExpHall_x / 5. + 50.; << 348 const G4double bigL=fExpHall_x/5.+50.; 341 G4LogicalVolume* subDetectorLV1 = ConstructS 349 G4LogicalVolume* subDetectorLV1 = ConstructSubDetector1(); 342 // G4PVPlacement * detPhys1 = 350 // G4PVPlacement * detPhys1 = 343 new G4PVPlacement(0, G4ThreeVector(bigL, 0.0 << 351 new G4PVPlacement(0, G4ThreeVector(bigL,0.0,0.0), subDetectorLV1, 344 detectorLV, false, 0); << 352 "PhysSubDetector1", detectorLV, false, 0); 345 << 353 346 // 354 // 347 // LOOK HERE FOR REFLECTIONS 355 // LOOK HERE FOR REFLECTIONS 348 // << 356 // 349 357 350 // SubDetector2 358 // SubDetector2 351 // << 359 // 352 G4Translate3D translation(-bigL, 0., 0.); 360 G4Translate3D translation(-bigL, 0., 0.); 353 G4RotationMatrix* rotD3 = new G4RotationMatr 361 G4RotationMatrix* rotD3 = new G4RotationMatrix(); 354 G4Transform3D rotation = G4Rotate3D(*rotD3); 362 G4Transform3D rotation = G4Rotate3D(*rotD3); 355 G4ReflectX3D reflection; << 363 G4ReflectX3D reflection; 356 G4Transform3D transform = translation * rota << 364 G4Transform3D transform = translation*rotation*reflection; 357 365 358 // Place the reflected part using G4Reflecti 366 // Place the reflected part using G4ReflectionFactory 359 // 367 // 360 G4ReflectionFactory::Instance()->Place(trans << 368 G4ReflectionFactory::Instance()->Place(transform, "reflSubDetector", 361 false << 369 subDetectorLV1, detectorLV, false, 0); 362 370 363 // SubDetector3 371 // SubDetector3 364 // 372 // 365 G4LogicalVolume* subDetectorLV3 = ConstructS 373 G4LogicalVolume* subDetectorLV3 = ConstructSubDetector2(); 366 // G4PVPlacement * detPhys3 = 374 // G4PVPlacement * detPhys3 = 367 new G4PVPlacement(0, G4ThreeVector(0.0, bigL << 375 new G4PVPlacement(0, G4ThreeVector(0.0,bigL,0.0), subDetectorLV3, 368 detectorLV, false, 0); << 376 "PhysSubDetectorFirst3", detectorLV, false, 0); 369 << 377 370 // SubDetector4, placement of parameterised 378 // SubDetector4, placement of parameterised chambers 371 // 379 // 372 G4LogicalVolume* subDetectorLV4 = ConstructS 380 G4LogicalVolume* subDetectorLV4 = ConstructSubDetector2(); 373 G4LogicalVolume* subChamberLV = ConstructPar << 381 G4LogicalVolume* subChamberLV = ConstructParametrisationChamber(); 374 // G4PVPlacement * detChamb = 382 // G4PVPlacement * detChamb = 375 new G4PVPlacement(0, G4ThreeVector(0, 0.0, 0 << 383 new G4PVPlacement(0, G4ThreeVector(0,0.0,0.0), subChamberLV, 376 false, 0); << 384 "AssemblyPhys", subDetectorLV4, false, 0); 377 // G4PVPlacement * detPhys4 = 385 // G4PVPlacement * detPhys4 = 378 new G4PVPlacement(0, G4ThreeVector(0.0, -big << 386 new G4PVPlacement(0, G4ThreeVector(0.0,-bigL,0.0), subDetectorLV4, 379 detectorLV, false, 0); << 387 "PhysSubDetectorSecond3", detectorLV, false, 0); 380 388 381 return experimentalHallPhys; 389 return experimentalHallPhys; 382 } 390 } 383 391 384 //....oooOO0OOooo........oooOO0OOooo........oo 392 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 385 // 393 // 386 // SubDetector1 394 // SubDetector1 387 // 395 // 388 G4LogicalVolume* G02DetectorConstruction::Cons 396 G4LogicalVolume* G02DetectorConstruction::ConstructSubDetector1() 389 { << 397 { 390 const G4double sub_x = fExpHall_x / 5.; << 398 const G4double sub_x = fExpHall_x/5.; 391 const G4double sub_y = sub_x; 399 const G4double sub_y = sub_x; 392 400 393 // Create the hall 401 // Create the hall 394 // 402 // 395 G4Tubs* subTub = new G4Tubs("subTub", 0., su << 403 G4Tubs * subTub = 396 G4LogicalVolume* subTubLV = new G4LogicalVol << 404 new G4Tubs("subTub", 0., sub_x, sub_y, -90.*deg, 180*deg); 397 G4LogicalVolume* AssemblyLV = ConstructAssem << 405 G4LogicalVolume * subTubLV = >> 406 new G4LogicalVolume(subTub, fPb, "tubLV"); >> 407 G4LogicalVolume *AssemblyLV = ConstructAssembly(); 398 // G4PVPlacement * detAss = 408 // G4PVPlacement * detAss = 399 new G4PVPlacement(0, G4ThreeVector(sub_x / 3 << 409 new G4PVPlacement(0, G4ThreeVector(sub_x/3,0.0,0.0), AssemblyLV, 400 false, 0); << 410 "AssemblyPhys", subTubLV, false, 0); 401 return subTubLV; << 411 return subTubLV; 402 } << 412 } 403 413 404 //....oooOO0OOooo........oooOO0OOooo........oo 414 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 405 // 415 // 406 // SubDetector2 416 // SubDetector2 407 // 417 // 408 G4LogicalVolume* G02DetectorConstruction::Cons 418 G4LogicalVolume* G02DetectorConstruction::ConstructSubDetector2() 409 { << 419 { 410 const G4double sub_x = fExpHall_x / 10.; << 420 const G4double sub_x = fExpHall_x/10.; 411 const G4double sub_y = sub_x * 2.; << 421 const G4double sub_y = sub_x*2.; 412 const G4double sub_z = sub_x; 422 const G4double sub_z = sub_x; 413 423 414 // Create the hall 424 // Create the hall 415 // 425 // 416 G4Box* detHallBox = new G4Box("detHallBox", << 426 G4Box * detHallBox = 417 G4LogicalVolume* detHallLV = new G4LogicalVo << 427 new G4Box("detHallBox", sub_x, sub_y, sub_z); >> 428 G4LogicalVolume * detHallLV = >> 429 new G4LogicalVolume(detHallBox, fAluminum, "detHallLV"); 418 430 419 return detHallLV; << 431 return detHallLV; 420 } << 432 } 421 433 422 //....oooOO0OOooo........oooOO0OOooo........oo 434 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 423 // 435 // 424 // Assembly 436 // Assembly 425 // 437 // 426 G4LogicalVolume* G02DetectorConstruction::Cons 438 G4LogicalVolume* G02DetectorConstruction::ConstructAssembly() 427 { << 439 { 428 const G4double big_x = fExpHall_x / 17; << 440 const G4double big_x = fExpHall_x/17; 429 const G4double big_y = big_x; 441 const G4double big_y = big_x; 430 const G4double big_z = big_x; 442 const G4double big_z = big_x; 431 443 432 // Create the Box 444 // Create the Box 433 // 445 // 434 G4Box* OuterBox = new G4Box("OuterBox", big_ << 446 G4Box * OuterBox = 435 G4LogicalVolume* OuterBoxLV = new G4LogicalV << 447 new G4Box("OuterBox", big_x, big_y, big_z); 436 // G4PVPlacement * OuterBoxPhys = << 448 G4LogicalVolume * OuterBoxLV = 437 new G4PVPlacement(0, G4ThreeVector(0.0, 0.0, << 449 new G4LogicalVolume(OuterBox, fAir, "OuterBoxLV"); >> 450 // G4PVPlacement * OuterBoxPhys = >> 451 new G4PVPlacement(0, G4ThreeVector(0.0,0.0,0.0), OuterBoxLV, >> 452 "OuterBoxPhys", 0, false, 0); 438 453 439 // The aluminum object's logical volume 454 // The aluminum object's logical volume 440 // 455 // 441 const G4double bigL = big_x / 2.5; << 456 const G4double bigL=big_x/2.5; 442 const G4double medL = big_x / 8; << 457 const G4double medL=big_x/8; 443 const G4double smalL = big_x / 12; << 458 const G4double smalL=big_x/12; 444 << 459 445 G4Box* BigBox = new G4Box("BBox", bigL, bigL << 460 G4Box * BigBox = 446 G4LogicalVolume* BigBoxLV = new G4LogicalVol << 461 new G4Box("BBox", bigL, bigL, bigL); 447 G4Box* MedBox = new G4Box("MBox", medL, medL << 462 G4LogicalVolume * BigBoxLV = 448 G4LogicalVolume* MedBoxLV1 = new G4LogicalVo << 463 new G4LogicalVolume(BigBox, fAluminum, "AlBigBoxLV"); 449 G4Box* SmallBox = new G4Box("SBox", smalL, s << 464 G4Box * MedBox = 450 G4LogicalVolume* SmallBoxLV = new G4LogicalV << 465 new G4Box("MBox", medL, medL, medL); 451 << 466 G4LogicalVolume * MedBoxLV1 = 452 const G4double bigPlace = bigL + 10.; << 467 new G4LogicalVolume(MedBox, fAluminum, "AlMedBoxLV1"); 453 const G4double medPlace = medL + 10.; << 468 G4Box * SmallBox = 454 // G4PVPlacement * BigBoxPhys = << 469 new G4Box("SBox", smalL, smalL, smalL); 455 new G4PVPlacement(0, G4ThreeVector(bigPlace, << 470 G4LogicalVolume * SmallBoxLV = 456 0); << 471 new G4LogicalVolume(SmallBox, fAluminum, "AlSmaBoxLV"); >> 472 >> 473 const G4double bigPlace=bigL+10.; >> 474 const G4double medPlace=medL+10.; >> 475 // G4PVPlacement * BigBoxPhys = >> 476 new G4PVPlacement(0, G4ThreeVector(bigPlace,0.0,0.0), BigBoxLV, >> 477 "AlPhysBig", OuterBoxLV, false, 0); 457 478 458 // Construction of Tub << 479 // Construction of Tub 459 // 480 // 460 G4Tubs* BigTube = new G4Tubs("BTube", 0, sma << 481 G4Tubs * BigTube = >> 482 new G4Tubs("BTube",0,smalL,smalL,-pi/2.,pi); 461 483 462 // Construction of Reflection of Tub 484 // Construction of Reflection of Tub 463 // 485 // 464 G4ReflectX3D Xreflection; << 486 G4ReflectX3D Xreflection; 465 G4Translate3D translation(-bigPlace, 0., 0.) 487 G4Translate3D translation(-bigPlace, 0., 0.); 466 G4Transform3D transform = Xreflection; << 488 G4Transform3D transform =Xreflection; 467 489 468 G4ReflectedSolid* ReflBig = new G4ReflectedS << 490 G4ReflectedSolid * ReflBig = 469 G4LogicalVolume* ReflBigLV = new G4LogicalVo << 491 new G4ReflectedSolid("Refll_Big", BigTube, transform); 470 new G4PVPlacement(0, G4ThreeVector(0., 0.0, << 492 G4LogicalVolume * ReflBigLV = 471 0); << 493 new G4LogicalVolume(ReflBig, fXenon, "ReflBigAl"); >> 494 new G4PVPlacement(0, G4ThreeVector(0.,0.0,0.0), ReflBigLV, >> 495 "AlPhysBigTube", SmallBoxLV, false, 0); 472 // 496 // 473 // LOOK HERE FOR ASSEMBLY << 497 // LOOK HERE FOR ASSEMBLY 474 // 498 // 475 499 476 // create Assembly of Boxes and Tubs 500 // create Assembly of Boxes and Tubs 477 // 501 // 478 G4AssemblyVolume* assembly = new G4AssemblyV 502 G4AssemblyVolume* assembly = new G4AssemblyVolume(); 479 G4RotationMatrix* rot = new G4RotationMatrix 503 G4RotationMatrix* rot = new G4RotationMatrix(); 480 G4ThreeVector posBig(-bigPlace, 0, 0); 504 G4ThreeVector posBig(-bigPlace, 0, 0); 481 G4ThreeVector posBig0(bigPlace / 4, 0, 0); << 505 G4ThreeVector posBig0(bigPlace/4, 0, 0); 482 G4ThreeVector posMed(-medPlace, 0, 0); 506 G4ThreeVector posMed(-medPlace, 0, 0); 483 G4ThreeVector posMed0(medPlace, 0, 0); 507 G4ThreeVector posMed0(medPlace, 0, 0); 484 G4ThreeVector position(0., 0., 0.); 508 G4ThreeVector position(0., 0., 0.); 485 509 486 // Add to Assembly the MediumBox1 510 // Add to Assembly the MediumBox1 487 // 511 // 488 assembly->AddPlacedVolume(MedBoxLV1, posMed0 512 assembly->AddPlacedVolume(MedBoxLV1, posMed0, rot); 489 513 490 // Add to Assembly the Small Box 514 // Add to Assembly the Small Box 491 // 515 // 492 assembly->AddPlacedVolume(SmallBoxLV, posMed 516 assembly->AddPlacedVolume(SmallBoxLV, posMed, rot); 493 << 517 494 // Place the Assembly 518 // Place the Assembly 495 // 519 // 496 assembly->MakeImprint(BigBoxLV, posBig0, rot 520 assembly->MakeImprint(BigBoxLV, posBig0, rot, 0); 497 521 498 // 522 // 499 // LOOK HERE FOR ASSEMBLY with REFLECTION << 523 // LOOK HERE FOR ASSEMBLY with REFLECTION 500 // << 524 // 501 525 502 G4Translate3D translation1(-bigPlace, 0., 0. 526 G4Translate3D translation1(-bigPlace, 0., 0.); 503 G4RotationMatrix* rotD3 = new G4RotationMatr 527 G4RotationMatrix* rotD3 = new G4RotationMatrix(); 504 G4Transform3D rotation = G4Rotate3D(*rotD3); 528 G4Transform3D rotation = G4Rotate3D(*rotD3); 505 G4ReflectX3D reflection; << 529 G4ReflectX3D reflection; 506 G4Transform3D transform1 = translation1 * ro << 530 G4Transform3D transform1 = translation1*rotation*reflection; 507 531 508 assembly->MakeImprint(OuterBoxLV, transform1 532 assembly->MakeImprint(OuterBoxLV, transform1, 0, 0); 509 533 510 return OuterBoxLV; << 534 return OuterBoxLV; 511 } 535 } 512 536 513 //....oooOO0OOooo........oooOO0OOooo........oo 537 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 514 // 538 // 515 // Parameterised Chamber 539 // Parameterised Chamber 516 // 540 // 517 G4LogicalVolume* G02DetectorConstruction::Cons 541 G4LogicalVolume* G02DetectorConstruction::ConstructParametrisationChamber() 518 { << 542 { 519 const G4double chamber_x = fExpHall_x / 12.; << 543 const G4double chamber_x = fExpHall_x/12.; 520 const G4double chamber_y = chamber_x; 544 const G4double chamber_y = chamber_x; 521 const G4double chamber_z = chamber_x; 545 const G4double chamber_z = chamber_x; 522 546 523 // Create the hall 547 // Create the hall 524 // 548 // 525 G4Box* paramChamberBox = new G4Box("ChamberB << 549 G4Box * paramChamberBox = 526 G4LogicalVolume* paramChamberLV = new G4Logi << 550 new G4Box("ChamberBox", chamber_x, chamber_y, chamber_z); >> 551 G4LogicalVolume * paramChamberLV = >> 552 new G4LogicalVolume(paramChamberBox, fAir, "ChamberLV"); 527 553 528 // Parametrisation Chamber (taken from N02 n 554 // Parametrisation Chamber (taken from N02 novice example) 529 // 555 // 530 G4int NbOfChambers = 5; 556 G4int NbOfChambers = 5; 531 G4double ChamberWidth = 2 * cm; << 557 G4double ChamberWidth = 2*cm; 532 G4double ChamberSpacing = 8 * cm; << 558 G4double ChamberSpacing = 8*cm; 533 G4double fTrackerLength = (NbOfChambers + 1) << 559 G4double fTrackerLength = (NbOfChambers+1)*ChamberSpacing; // Full length 534 G4double trackerSize = 0.5 * fTrackerLength; << 560 G4double trackerSize = 0.5*fTrackerLength; 535 561 536 // An example of parameterised volume 562 // An example of parameterised volume 537 // dummy values for G4Box -- modified by par 563 // dummy values for G4Box -- modified by parameterised volume 538 // 564 // 539 G4Box* solidChamber = new G4Box("chamber", 1 << 565 G4Box *solidChamber = 540 G4LogicalVolume* logicChamber = new G4Logica << 566 new G4Box("chamber", 10*cm, 10*cm, 1*cm); 541 << 567 G4LogicalVolume* logicChamber = 542 G4double firstPosition = -trackerSize + 0.5 << 568 new G4LogicalVolume(solidChamber, fAluminum, "Chamber", 0, 0, 0); 543 G4double firstLength = fTrackerLength / 10; << 569 544 G4double lastLength = fTrackerLength; << 570 G4double firstPosition = -trackerSize + 0.5*ChamberWidth; >> 571 G4double firstLength = fTrackerLength/10; >> 572 G4double lastLength = fTrackerLength; 545 573 546 G4VPVParameterisation* chamberParam = 574 G4VPVParameterisation* chamberParam = 547 new G02ChamberParameterisation(NbOfChamber << 575 new G02ChamberParameterisation( NbOfChambers, // NoChambers 548 firstPositi << 576 firstPosition, // Z of center of first 549 ChamberSpac << 577 ChamberSpacing, // Z spacing of centers 550 ChamberWidt << 578 ChamberWidth, // Width Chamber 551 firstLength << 579 firstLength, // lengthInitial 552 lastLength) << 580 lastLength); // lengthFinal 553 // G4VPhysicalVolume* physiChamber = << 581 // G4VPhysicalVolume* physiChamber = 554 new G4PVParameterised("Chamber", // their n << 582 new G4PVParameterised( "Chamber", // their name 555 logicChamber, // thei << 583 logicChamber, // their logical volume 556 paramChamberLV, // mo << 584 paramChamberLV, // mother logical volume 557 kZAxis, // Are placed << 585 kZAxis, // Are placed along this axis 558 NbOfChambers, // Numb << 586 NbOfChambers, // Number of chambers 559 chamberParam); // The << 587 chamberParam); // The parametrisation 560 return paramChamberLV; 588 return paramChamberLV; 561 } << 589 } 562 590 563 //....oooOO0OOooo........oooOO0OOooo........oo 591 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 564 // 592 // 565 // SetReadFile 593 // SetReadFile 566 // 594 // 567 void G02DetectorConstruction::SetReadFile(cons << 595 void G02DetectorConstruction::SetReadFile( const G4String& File ) 568 { 596 { 569 fReadFile = File; << 597 fReadFile=File; 570 fWritingChoice = 0; << 598 fWritingChoice=0; 571 } 599 } 572 600 573 //....oooOO0OOooo........oooOO0OOooo........oo 601 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 574 // 602 // 575 // SetWriteFile 603 // SetWriteFile 576 // 604 // 577 void G02DetectorConstruction::SetWriteFile(con << 605 void G02DetectorConstruction::SetWriteFile( const G4String& File ) 578 { 606 { 579 fWriteFile = File; << 607 fWriteFile=File; 580 fWritingChoice = 1; << 608 fWritingChoice=1; 581 } 609 } 582 610 583 //....oooOO0OOooo........oooOO0OOooo........oo 611 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 584 // 612 // 585 // SetStepFile 613 // SetStepFile 586 // 614 // 587 void G02DetectorConstruction::SetStepFile(cons << 615 void G02DetectorConstruction::SetStepFile( const G4String& File ) 588 { 616 { 589 fStepFile = File; << 617 fStepFile=File; 590 fWritingChoice = 3; << 618 fWritingChoice=3; 591 } 619 } 592 620