Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ExErrorDetectorConstruction.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: ExErrorDetectorConstruction.cc 68019 2013-03-13 13:32:43Z gcosmo $
27 //
28 /// \file ExErrorDetectorConstruction.cc
29 /// \brief Implementation of the ExErrorDetectorConstruction class
30 //
31 
34 #include "ExErrorMagneticField.hh"
35 
36 #include "G4NistManager.hh"
37 #include "G4Box.hh"
38 #include "G4LogicalVolume.hh"
39 #include "G4PVPlacement.hh"
40 #include "G4PVReplica.hh"
41 
42 #include "G4UserLimits.hh"
43 #include "G4VisAttributes.hh"
44 
45 #include "G4Colour.hh"
46 
47 #include "G4SystemOfUnits.hh"
48 #include "G4ios.hh"
49 
50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
53  fXBEAM(5.*cm), fXCDET(20.*cm), fXECAL(40.*cm), fXSOLN(10.*cm), fXHCAL(100.*cm),
54  fXMUON(50.*cm), fNdivECAL(40./10.), fNdivHCAL(100./10.), fYZLength(50.*cm),
55  fXHalfWorldLength(fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL + fXMUON),
56  fUserLimits(0), fMagField(0), fDetectorMessenger(0)
57 {
58 
59  // create UserLimits
60  fUserLimits = new G4UserLimits();
61 
63  fDetectorMessenger = new ExErrorDetectorMessenger(this);
64 
65 }
66 
67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
69 {
70  delete fMagField;
71  delete fDetectorMessenger;
72 }
73 
74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
76 {
77 //--------- Material definition ---------
78 
79  //Vacuum
80  /* a = 1.*g/mole;
81  density = 1.E-9*g/cm3;
82  G4Material* Vacuum = new G4Material(name="Vacuum", z=1., a, density);
83  */
84 
86  G4Material* air = nistMgr->FindOrBuildMaterial("G4_AIR");
87  //Al
88  G4Material* al = nistMgr->FindOrBuildMaterial("G4_Al");
89  //Fe
90  G4Material* fe = nistMgr->FindOrBuildMaterial("G4_Fe");
91  //Cu
92  G4Material* cu = nistMgr->FindOrBuildMaterial("G4_Cu");
93 
94  // Print all the materials defined.
95  //
96  G4cout << G4endl << "The materials defined are : " << G4endl << G4endl;
97  G4cout << *(G4Material::GetMaterialTable()) << G4endl;
98 
99  //--------- Sizes of the principal geometrical components (solids) --------- (half lengths)
100  //double fXBEAM = 5.*2.*cm;
101  //double fXCDET = 90.*cm;
102  //double fXECAL = 40.*cm;
103  //double fXSOLN = 10.*cm;
104  //double fXHCAL = 100.*cm;
105  //double fXMUON = 50.*cm;
106  //double fNdivECAL = 10;
107  //double fNdivHCAL = 10;
108  //double fYZLength = 100.*cm;
109 
110  // double fXWorldLength= fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL + fXMUON;
111 
112 
113 //--------- Definitions of Solids, Logical Volumes, Physical Volumes ---------
114 
115  //------------------------------
116  // World
117  //------------------------------
118  //- G4double HalfWorldLength = fXWorldLength;
119  G4cout << " HalfWorldLength " << fXHalfWorldLength << G4endl;
120 
121  G4Box* solidWorld= new G4Box("world",fXHalfWorldLength,fYZLength,fYZLength);
122  G4LogicalVolume* logicWorld= new G4LogicalVolume( solidWorld, air, "World", 0, 0, 0);
123  // Must place the World Physical volume unrotated at (0,0,0).
124  //
125  G4VPhysicalVolume* physiWorld
126  = new G4PVPlacement(0, // no rotation
127  G4ThreeVector(), // at (0,0,0)
128  "World", // its name
129  logicWorld, // its logical volume
130  0, // its mother volume
131  false, // no boolean operations
132  0); // no field specific to volum
133 
134  //------------------------------
135  // BEAM
136  //------------------------------
137  G4Box* solidBEAM = new G4Box("BEAM",fXBEAM,fYZLength,fYZLength);
138  G4LogicalVolume* logicBEAM = new G4LogicalVolume(solidBEAM,air,"BEAM",0,0,0);
139  G4ThreeVector positionBEAM = G4ThreeVector(0.,0.,0.);
140  //G4VPhysicalVolume* physiBEAM =
141  new G4PVPlacement(0, // no rotation
142  positionBEAM, // at (x,y,z)
143  "BEAM", // its name
144  logicBEAM, // its logical volume
145  physiWorld, // its mother volume
146  false, // no boolean operations
147  0); // no particular field
148 
149  //------------------------------
150  // CDET (Central DETector)
151  //------------------------------
152  G4ThreeVector positionCdet = G4ThreeVector(fXBEAM + fXCDET/2.,0.,0.);
153  G4Box* solidCDET = new G4Box("CDET",fXCDET/2.,fYZLength,fYZLength);
154  G4LogicalVolume* logicCDET = new G4LogicalVolume(solidCDET,air,"Cdet",0,0,0);
155  // G4VPhysicalVolume* physiCDET =
156  new G4PVPlacement(0, // no rotation
157  positionCdet, // at (x,y,z)
158  "CDET", // its name
159  logicCDET, // its logical volume
160  physiWorld, // its mother volume
161  false, // no boolean operations
162  0); // no particular field
163 
164  //------------------------------
165  // ECAL
166  //------------------------------
167  G4ThreeVector positionECAL = G4ThreeVector(fXBEAM + fXCDET + fXECAL/2., 0., 0.);
168  G4Box* solidECAL = new G4Box("ECAL",fXECAL/2.,fYZLength,fYZLength);
169  G4LogicalVolume* logicECAL = new G4LogicalVolume(solidECAL,cu,"ECAL",0,0,0);
170  G4VPhysicalVolume* physiECAL
171  = new G4PVPlacement(0, // no rotation
172  positionECAL, // at (x,y,z)
173  "ECAL", // its name
174  logicECAL, // its logical volume
175  physiWorld, // its mother volume
176  false, // no boolean operations
177  0); // no particular field
178  //--------- Divide it
179  G4Box* solidECALdiv = new G4Box("ECAL",fXECAL/2./fNdivECAL,fYZLength,fYZLength);
180  G4LogicalVolume* logicECALdiv = new G4LogicalVolume(solidECALdiv,cu,"ECALdiv",0,0,0);
181  new G4PVReplica("DVEC", logicECALdiv, physiECAL,
182  kXAxis, G4int(fNdivECAL), fXECAL/fNdivECAL);
183 
184 
185  //------------------------------
186  // SOLN
187  //------------------------------
188  G4ThreeVector positionSOLN = G4ThreeVector(fXBEAM + fXCDET + fXECAL + fXSOLN/2., 0., 0.);
189  G4Box* solidSOLN = new G4Box("SOLN",fXSOLN/2.,fYZLength,fYZLength);
190  G4LogicalVolume* logicSOLN = new G4LogicalVolume(solidSOLN,al,"SOLN",0,0,0);
191  new G4PVPlacement(0, // no rotation
192  positionSOLN, // at (x,y,z)
193  "SOLN", // its name
194  logicSOLN, // its logical volume
195  physiWorld, // its mother volume
196  false, // no boolean operations
197  0); // no particular field
198 
199  //------------------------------
200  // HCAL
201  //------------------------------
202  G4ThreeVector positionHCAL = G4ThreeVector(fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL/2., 0., 0.);
203  G4Box* solidHCAL = new G4Box("HCAL",fXHCAL/2.,fYZLength,fYZLength);
204  G4LogicalVolume* logicHCAL = new G4LogicalVolume(solidHCAL,fe,"HCAL",0,0,0);
205  G4VPhysicalVolume* physiHCAL
206  = new G4PVPlacement(0, // no rotation
207  positionHCAL, // at (x,y,z)
208  "HCAL", // its name
209  logicHCAL, // its logical volume
210  physiWorld, // its mother volume
211  false, // no boolean operations
212  0); // no particular field
213  //--------- Divide it
214  G4Box* solidHCALdiv = new G4Box("HCAL",fXHCAL/2./fNdivHCAL,fYZLength,fYZLength);
215  G4LogicalVolume* logicHCALdiv = new G4LogicalVolume(solidHCALdiv,fe,"HCALdiv",0,0,0);
216  new G4PVReplica("DVEH", logicHCALdiv, physiHCAL,
217  kXAxis, G4int(fNdivHCAL), fXHCAL/fNdivHCAL);
218 
219  //------------------------------
220  // MUON
221  //------------------------------
222  G4ThreeVector positionMUON = G4ThreeVector(fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL + fXMUON/2., 0., 0.);
223  G4Box* solidMUON = new G4Box("MUON",fXMUON/2.,fYZLength,fYZLength);
224  G4LogicalVolume* logicMUON = new G4LogicalVolume(solidMUON,air,"MUON",0,0,0);
225  new G4PVPlacement(0, // no rotation
226  positionMUON, // at (x,y,z)
227  "MUON", // its name
228  logicMUON, // its logical volume
229  physiWorld, // its mother volume
230  false, // no boolean operations
231  0); // no particular field
232 
233 
234  G4VisAttributes* worldVisAtt = new G4VisAttributes(0);
235  logicWorld->SetVisAttributes( worldVisAtt);
236  return physiWorld;
237 }
238 
239 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
241 {
242  fMagField->SetFieldValue(fieldValue);
243 }
244 
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
virtual G4VPhysicalVolume * Construct()
CLHEP::Hep3Vector G4ThreeVector
Definition: G4Box.hh:63
static G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:564
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
Definition of the ExErrorDetectorConstruction class.
void SetFieldValue(G4double fieldValue)
G4GLOB_DLL std::ostream G4cout
Definition of the ExErrorMagneticField class.
#define G4endl
Definition: G4ios.hh:61
Definition of the ExErrorDetectorMessenger class.
double G4double
Definition: G4Types.hh:76
void SetVisAttributes(const G4VisAttributes *pVA)
G4fissionEvent * fe