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 /// \file electromagnetic/TestEm6/src/Detector 26 /// \file electromagnetic/TestEm6/src/DetectorConstruction.cc 27 /// \brief Implementation of the DetectorConst 27 /// \brief Implementation of the DetectorConstruction class 28 // 28 // >> 29 // $Id: DetectorConstruction.cc 83428 2014-08-21 15:46:01Z gcosmo $ 29 // 30 // 30 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 33 33 #include "DetectorConstruction.hh" 34 #include "DetectorConstruction.hh" 34 << 35 #include "DetectorMessenger.hh" 35 #include "DetectorMessenger.hh" >> 36 #include "G4NistManager.hh" >> 37 #include "G4RunManager.hh" 36 38 >> 39 #include "G4Material.hh" 37 #include "G4Box.hh" 40 #include "G4Box.hh" 38 #include "G4GeometryManager.hh" << 39 #include "G4LogicalVolume.hh" 41 #include "G4LogicalVolume.hh" 40 #include "G4LogicalVolumeStore.hh" << 41 #include "G4Material.hh" << 42 #include "G4NistManager.hh" << 43 #include "G4PVPlacement.hh" 42 #include "G4PVPlacement.hh" >> 43 #include "G4UniformMagField.hh" >> 44 #include "G4UserLimits.hh" >> 45 >> 46 #include "G4GeometryManager.hh" 44 #include "G4PhysicalVolumeStore.hh" 47 #include "G4PhysicalVolumeStore.hh" 45 #include "G4RunManager.hh" << 48 #include "G4LogicalVolumeStore.hh" 46 #include "G4SolidStore.hh" 49 #include "G4SolidStore.hh" 47 #include "G4SystemOfUnits.hh" << 50 48 #include "G4UniformMagField.hh" << 49 #include "G4UnitsTable.hh" 51 #include "G4UnitsTable.hh" 50 #include "G4UserLimits.hh" << 52 #include "G4SystemOfUnits.hh" 51 53 52 //....oooOO0OOooo........oooOO0OOooo........oo 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 55 54 DetectorConstruction::DetectorConstruction() 56 DetectorConstruction::DetectorConstruction() 55 : G4VUserDetectorConstruction(), << 57 :G4VUserDetectorConstruction(), 56 fP_Box(0), << 58 fP_Box(0), fL_Box(0), fBoxSize(500*m), fMaterial(0), fMagField(0), 57 fL_Box(0), << 59 fUserLimits(0), fDetectorMessenger(0) 58 fBoxSize(500 * m), << 59 fMaterial(0), << 60 fMagField(0), << 61 fUserLimits(0), << 62 fDetectorMessenger(0) << 63 { 60 { 64 DefineMaterials(); 61 DefineMaterials(); 65 SetMaterial("Iron"); 62 SetMaterial("Iron"); 66 << 63 67 // create UserLimits 64 // create UserLimits 68 fUserLimits = new G4UserLimits(); 65 fUserLimits = new G4UserLimits(); 69 66 70 // create commands for interactive definitio << 67 // create commands for interactive definition of the detector 71 fDetectorMessenger = new DetectorMessenger(t 68 fDetectorMessenger = new DetectorMessenger(this); 72 } 69 } 73 70 74 //....oooOO0OOooo........oooOO0OOooo........oo 71 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 75 72 76 DetectorConstruction::~DetectorConstruction() 73 DetectorConstruction::~DetectorConstruction() 77 { << 74 { delete fDetectorMessenger;} 78 delete fDetectorMessenger; << 79 } << 80 75 81 //....oooOO0OOooo........oooOO0OOooo........oo 76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 82 77 83 G4VPhysicalVolume* DetectorConstruction::Const 78 G4VPhysicalVolume* DetectorConstruction::Construct() 84 { 79 { 85 return ConstructVolumes(); 80 return ConstructVolumes(); 86 } 81 } 87 82 88 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 89 84 90 void DetectorConstruction::DefineMaterials() 85 void DetectorConstruction::DefineMaterials() 91 { << 86 { 92 G4double a, z, density; << 87 G4double a, z, density; 93 88 94 new G4Material("Beryllium", z = 4., a = 9.01 << 89 new G4Material("Beryllium", z= 4., a= 9.012182*g/mole, density= 1.848*g/cm3); 95 new G4Material("Carbon", z = 6., a = 12.011 << 90 new G4Material("Carbon", z= 6., a= 12.011*g/mole, density= 2.265*g/cm3); 96 new G4Material("Iron", z = 26., a = 55.85 * << 91 new G4Material("Iron", z=26., a= 55.85*g/mole, density= 7.870*g/cm3); 97 92 98 G4cout << *(G4Material::GetMaterialTable()) << 93 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 99 } 94 } 100 95 101 //....oooOO0OOooo........oooOO0OOooo........oo 96 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 102 << 97 103 G4VPhysicalVolume* DetectorConstruction::Const 98 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes() 104 { 99 { 105 G4GeometryManager::GetInstance()->OpenGeomet 100 G4GeometryManager::GetInstance()->OpenGeometry(); 106 G4PhysicalVolumeStore::GetInstance()->Clean( 101 G4PhysicalVolumeStore::GetInstance()->Clean(); 107 G4LogicalVolumeStore::GetInstance()->Clean() 102 G4LogicalVolumeStore::GetInstance()->Clean(); 108 G4SolidStore::GetInstance()->Clean(); 103 G4SolidStore::GetInstance()->Clean(); 109 << 104 110 G4Box* sBox = new G4Box("Container", // its << 105 G4Box* 111 fBoxSize / 2, fBoxSi << 106 sBox = new G4Box("Container", //its name 112 << 107 fBoxSize/2,fBoxSize/2,fBoxSize/2); //its dimensions 113 fL_Box = new G4LogicalVolume(sBox, // its s << 108 114 fMaterial, // << 109 fL_Box = new G4LogicalVolume(sBox, //its shape 115 fMaterial->GetN << 110 fMaterial, //its material 116 << 111 fMaterial->GetName()); //its name 117 fL_Box->SetUserLimits(fUserLimits); << 112 118 << 113 fL_Box->SetUserLimits(fUserLimits); 119 fP_Box = new G4PVPlacement(0, // no rotatio << 114 120 G4ThreeVector(), << 115 fP_Box = new G4PVPlacement(0, //no rotation 121 fL_Box, // its l << 116 G4ThreeVector(), //at (0,0,0) 122 fMaterial->GetNam << 117 fL_Box, //its logical volume 123 0, // its mother << 118 fMaterial->GetName(), //its name 124 false, // no boo << 119 0, //its mother volume 125 0); // copy numb << 120 false, //no boolean operation 126 << 121 0); //copy number >> 122 127 PrintParameters(); 123 PrintParameters(); 128 << 124 129 // 125 // 130 // always return the root volume << 126 //always return the root volume 131 // 127 // 132 return fP_Box; 128 return fP_Box; 133 } 129 } 134 130 135 //....oooOO0OOooo........oooOO0OOooo........oo 131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 136 132 137 void DetectorConstruction::PrintParameters() 133 void DetectorConstruction::PrintParameters() 138 { 134 { 139 G4cout << "\n The Box is " << G4BestUnit(fBo << 135 G4cout << "\n The Box is " << G4BestUnit(fBoxSize,"Length") 140 << G4endl; << 136 << " of " << fMaterial->GetName() << G4endl; 141 } 137 } 142 138 143 //....oooOO0OOooo........oooOO0OOooo........oo 139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 144 140 145 void DetectorConstruction::SetMaterial(const G 141 void DetectorConstruction::SetMaterial(const G4String& name) 146 { 142 { 147 G4cout << "###SetMaterial" << G4endl; << 143 G4cout << "###SetMaterial" << G4endl; 148 144 149 // get the pointer to the existing material 145 // get the pointer to the existing material 150 G4Material* mat = G4Material::GetMaterial(na 146 G4Material* mat = G4Material::GetMaterial(name, false); 151 << 147 152 // create the material by its name 148 // create the material by its name 153 if (!mat) { << 149 if(!mat) { mat = G4NistManager::Instance()->FindOrBuildMaterial(name); } 154 mat = G4NistManager::Instance()->FindOrBui << 150 155 } << 156 << 157 if (mat && mat != fMaterial) { 151 if (mat && mat != fMaterial) { 158 G4cout << "### New target material: " << m 152 G4cout << "### New target material: " << mat->GetName() << G4endl; 159 fMaterial = mat; 153 fMaterial = mat; 160 if (fL_Box) { << 154 if(fL_Box) { 161 fL_Box->SetMaterial(mat); 155 fL_Box->SetMaterial(mat); 162 G4RunManager::GetRunManager()->PhysicsHa 156 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); 163 } << 157 } 164 } 158 } 165 } 159 } >> 160 166 161 167 //....oooOO0OOooo........oooOO0OOooo........oo 162 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 168 163 169 void DetectorConstruction::SetSize(G4double va 164 void DetectorConstruction::SetSize(G4double value) 170 { 165 { 171 fBoxSize = value; 166 fBoxSize = value; 172 } << 167 } 173 168 174 //....oooOO0OOooo........oooOO0OOooo........oo 169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 175 170 176 #include "G4FieldManager.hh" 171 #include "G4FieldManager.hh" 177 #include "G4TransportationManager.hh" 172 #include "G4TransportationManager.hh" 178 173 179 void DetectorConstruction::SetMagField(G4doubl 174 void DetectorConstruction::SetMagField(G4double fieldValue) 180 { 175 { 181 // apply a global uniform magnetic field alo << 176 //apply a global uniform magnetic field along Z axis 182 G4FieldManager* fieldMgr = G4TransportationM << 177 G4FieldManager* fieldMgr 183 << 178 = G4TransportationManager::GetTransportationManager()->GetFieldManager(); 184 if (fMagField) delete fMagField; // delete << 179 185 << 180 if (fMagField) delete fMagField; //delete the existing magn field 186 if (fieldValue != 0.) // create a new one i << 181 187 { << 182 if (fieldValue!=0.) // create a new one if non nul 188 fMagField = new G4UniformMagField(G4ThreeV << 183 { 189 fieldMgr->SetDetectorField(fMagField); << 184 fMagField = new G4UniformMagField(G4ThreeVector(0.,0.,fieldValue)); 190 fieldMgr->CreateChordFinder(fMagField); << 185 fieldMgr->SetDetectorField(fMagField); 191 } << 186 fieldMgr->CreateChordFinder(fMagField); 192 else { << 187 } 193 fMagField = 0; << 188 else 194 fieldMgr->SetDetectorField(fMagField); << 189 { 195 } << 190 fMagField = 0; >> 191 fieldMgr->SetDetectorField(fMagField); >> 192 } 196 } 193 } 197 194 198 //....oooOO0OOooo........oooOO0OOooo........oo 195 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 199 196 200 void DetectorConstruction::SetMaxStepSize(G4do 197 void DetectorConstruction::SetMaxStepSize(G4double val) 201 { 198 { 202 // set the maximum allowed step size 199 // set the maximum allowed step size 203 // 200 // 204 if (val <= DBL_MIN) { << 201 if (val <= DBL_MIN) 205 G4cout << "\n --->warning from SetMaxStepS << 202 { G4cout << "\n --->warning from SetMaxStepSize: maxStep " 206 << " out of range. Command refused" << 203 << val << " out of range. Command refused" << G4endl; 207 return; << 204 return; 208 } << 205 } 209 fUserLimits->SetMaxAllowedStep(val); 206 fUserLimits->SetMaxAllowedStep(val); 210 } << 207 } 211 208 212 //....oooOO0OOooo........oooOO0OOooo........oo 209 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 213 210 214 #include "G4RunManager.hh" << 211 #include "G4RunManager.hh" 215 << 212 216 void DetectorConstruction::UpdateGeometry() 213 void DetectorConstruction::UpdateGeometry() 217 { 214 { 218 G4RunManager::GetRunManager()->DefineWorldVo 215 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes()); 219 } 216 } 220 217 221 //....oooOO0OOooo........oooOO0OOooo........oo 218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 222 219