ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ExErrorDetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file ExErrorDetectorConstruction.cc
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 //
29 //
30 
33 #include "ExErrorMagneticField.hh"
34 
35 #include "G4NistManager.hh"
36 #include "G4Box.hh"
37 #include "G4LogicalVolume.hh"
38 #include "G4PVPlacement.hh"
39 #include "G4PVReplica.hh"
40 
41 #include "G4UserLimits.hh"
42 #include "G4VisAttributes.hh"
43 
44 #include "G4Colour.hh"
45 
46 #include "G4SystemOfUnits.hh"
47 #include "G4ios.hh"
48 
49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52  fXBEAM(5.*cm), fXCDET(20.*cm), fXECAL(40.*cm), fXSOLN(10.*cm), fXHCAL(100.*cm),
53  fXMUON(50.*cm), fNdivECAL(40./10.), fNdivHCAL(100./10.), fYZLength(50.*cm),
54  fXHalfWorldLength(fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL + fXMUON),
55  fUserLimits(0), fMagField(0), fDetectorMessenger(0)
56 {
57 
58  // create UserLimits
59  fUserLimits = new G4UserLimits();
60 
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,
183 
184 
185  //------------------------------
186  // SOLN
187  //------------------------------
188  G4ThreeVector positionSOLN
189  = G4ThreeVector(fXBEAM + fXCDET + fXECAL + fXSOLN/2., 0., 0.);
190  G4Box* solidSOLN = new G4Box("SOLN",fXSOLN/2.,fYZLength,fYZLength);
191  G4LogicalVolume* logicSOLN = new G4LogicalVolume(solidSOLN,al,"SOLN",0,0,0);
192  new G4PVPlacement(0, // no rotation
193  positionSOLN, // at (x,y,z)
194  "SOLN", // its name
195  logicSOLN, // its logical volume
196  physiWorld, // its mother volume
197  false, // no boolean operations
198  0); // no particular field
199 
200  //------------------------------
201  // HCAL
202  //------------------------------
203  G4ThreeVector positionHCAL = G4ThreeVector(fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL/2., 0., 0.);
204  G4Box* solidHCAL = new G4Box("HCAL",fXHCAL/2.,fYZLength,fYZLength);
205  G4LogicalVolume* logicHCAL = new G4LogicalVolume(solidHCAL,fe,"HCAL",0,0,0);
206  G4VPhysicalVolume* physiHCAL
207  = new G4PVPlacement(0, // no rotation
208  positionHCAL, // at (x,y,z)
209  "HCAL", // its name
210  logicHCAL, // its logical volume
211  physiWorld, // its mother volume
212  false, // no boolean operations
213  0); // no particular field
214  //--------- Divide it
215  G4Box* solidHCALdiv = new G4Box("HCAL",fXHCAL/2./fNdivHCAL,fYZLength,fYZLength);
216  G4LogicalVolume* logicHCALdiv = new G4LogicalVolume(solidHCALdiv,fe,"HCALdiv",0,0,0);
217  new G4PVReplica("DVEH", logicHCALdiv, physiHCAL,
219 
220  //------------------------------
221  // MUON
222  //------------------------------
223  G4ThreeVector positionMUON
224  = G4ThreeVector(fXBEAM + fXCDET + fXECAL + fXSOLN + fXHCAL + fXMUON/2., 0., 0.);
225  G4Box* solidMUON = new G4Box("MUON",fXMUON/2.,fYZLength,fYZLength);
226  G4LogicalVolume* logicMUON = new G4LogicalVolume(solidMUON,air,"MUON",0,0,0);
227  new G4PVPlacement(0, // no rotation
228  positionMUON, // at (x,y,z)
229  "MUON", // its name
230  logicMUON, // its logical volume
231  physiWorld, // its mother volume
232  false, // no boolean operations
233  0); // no particular field
234 
235 
236  G4VisAttributes* worldVisAtt = new G4VisAttributes(0);
237  logicWorld->SetVisAttributes( worldVisAtt);
238  return physiWorld;
239 }
240 
241 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
243 {
244  fMagField->SetFieldValue(fieldValue);
245 }
246