ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ExN04DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file ExN04DetectorConstruction.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 
31 #include "ExN04DetectorConstruction.hh"
32 #include "ExN04TrackerSD.hh"
33 #include "ExN04CalorimeterSD.hh"
34 #include "ExN04CalorimeterROGeometry.hh"
35 #include "ExN04MuonSD.hh"
36 #include "ExN04TrackerParametrisation.hh"
37 #include "ExN04CalorimeterParametrisation.hh"
38 #include "ExN04Field.hh"
39 
40 #include "G4Material.hh"
41 #include "G4MaterialTable.hh"
42 #include "G4Element.hh"
43 #include "G4ElementTable.hh"
44 #include "G4Box.hh"
45 #include "G4Tubs.hh"
46 #include "G4LogicalVolume.hh"
47 #include "G4ThreeVector.hh"
48 #include "G4PVPlacement.hh"
49 #include "G4PVParameterised.hh"
50 #include "G4Transform3D.hh"
51 #include "G4RotationMatrix.hh"
52 #include "G4FieldManager.hh"
54 #include "G4SDManager.hh"
55 #include "G4VisAttributes.hh"
56 #include "G4Colour.hh"
57 #include "G4SystemOfUnits.hh"
58 
60 {
61 
62 #include "ExN04DetectorParameterDef.icc"
64 
65 }
66 
68 {
69  delete Scinti;
70  delete Silicon;
71  delete Ar;
72  delete Lead;
73  delete Air;
74 
75  delete O;
76  delete N;
77  delete C;
78  delete H;
79 }
80 
82 {
83  //-------------------------------------------------------------------------
84  // Materials
85  //-------------------------------------------------------------------------
86 
87  G4double a, z, density;
88  G4int nel;
89 
90  H = new G4Element("Hydrogen", "H", z=1., a= 1.01*g/mole);
91  C = new G4Element("Carbon", "C", z=6., a= 12.01*g/mole);
92  N = new G4Element("Nitrogen", "N", z=7., a= 14.01*g/mole);
93  O = new G4Element("Oxygen", "O", z=8., a= 16.00*g/mole);
94 
95  Air = new G4Material("Air", density= 1.29*mg/cm3, nel=2);
96  Air->AddElement(N, 70.*perCent);
97  Air->AddElement(O, 30.*perCent);
98 
99  Lead =
100  new G4Material("Lead", z=82., a= 207.19*g/mole, density= 11.35*g/cm3);
101 
102  Ar =
103  new G4Material("ArgonGas",z=18., a= 39.95*g/mole, density=1.782*mg/cm3);
104 
105  Silicon =
106  new G4Material("Silicon", z=14., a= 28.09*g/mole, density= 2.33*g/cm3);
107 
108  Scinti = new G4Material("Scintillator", density= 1.032*g/cm3, nel=2);
109  Scinti->AddElement(C, 9);
110  Scinti->AddElement(H, 10);
111 }
112 
114 {
115  //-------------------------------------------------------------------------
116  // Magnetic field
117  //-------------------------------------------------------------------------
118 
119  static G4bool fieldIsInitialized = false;
120  if(!fieldIsInitialized)
121  {
122  ExN04Field* myField = new ExN04Field;
123  G4FieldManager* fieldMgr
125  ->GetFieldManager();
126  fieldMgr->SetDetectorField(myField);
127  fieldMgr->CreateChordFinder(myField);
128  fieldIsInitialized = true;
129  }
130 
131 
132  //-------------------------------------------------------------------------
133  // Detector geometry
134  //-------------------------------------------------------------------------
135 
136  //------------------------------ experimental hall
137  G4Box * experimentalHall_box
138  = new G4Box("expHall_b",expHall_x,expHall_y,expHall_z);
139  G4LogicalVolume * experimentalHall_log
140  = new G4LogicalVolume(experimentalHall_box,Air,"expHall_L",0,0,0);
141  G4VPhysicalVolume * experimentalHall_phys
142  = new G4PVPlacement(0,G4ThreeVector(),experimentalHall_log,"expHall_P",
143  0,false,0);
144  experimentalHall_log->SetVisAttributes(G4VisAttributes::GetInvisible());
145 
146  //------------------------------ tracker
147  G4VSolid * tracker_tubs
148  = new G4Tubs("trkTubs_tubs",trkTubs_rmin,trkTubs_rmax,trkTubs_dz,
150  G4LogicalVolume * tracker_log
151  = new G4LogicalVolume(tracker_tubs,Ar,"trackerT_L",0,0,0);
152  // G4VPhysicalVolume * tracker_phys =
153  new G4PVPlacement(0,G4ThreeVector(),tracker_log,"tracker_phys",
154  experimentalHall_log,false,0);
155  G4VisAttributes* tracker_logVisAtt
156  = new G4VisAttributes(G4Colour(1.0,0.0,1.0));
157  tracker_log->SetVisAttributes(tracker_logVisAtt);
158 
159  //------------------------------ tracker layers
160  // As an example for Parameterised volume
161  // dummy values for G4Tubs -- modified by parameterised volume
162  G4VSolid * trackerLayer_tubs
163  = new G4Tubs("trackerLayer_tubs",trkTubs_rmin,trkTubs_rmax,trkTubs_dz,
165  G4LogicalVolume * trackerLayer_log
166  = new G4LogicalVolume(trackerLayer_tubs,Silicon,"trackerB_L",0,0,0);
167  G4VPVParameterisation * trackerParam
169  // dummy value : kXAxis -- modified by parameterised volume
170  // G4VPhysicalVolume *trackerLayer_phys =
171  new G4PVParameterised("trackerLayer_phys",trackerLayer_log,tracker_log,
172  kXAxis, notrkLayers, trackerParam);
173  G4VisAttributes* trackerLayer_logVisAtt
174  = new G4VisAttributes(G4Colour(0.5,0.0,1.0));
175  trackerLayer_logVisAtt->SetForceWireframe(true);
176  trackerLayer_log->SetVisAttributes(trackerLayer_logVisAtt);
177 
178  //------------------------------ calorimeter
179  G4VSolid * calorimeter_tubs
180  = new G4Tubs("calorimeter_tubs",caloTubs_rmin,caloTubs_rmax,
182  G4LogicalVolume * calorimeter_log
183  = new G4LogicalVolume(calorimeter_tubs,Scinti,"caloT_L",0,0,0);
184  // G4VPhysicalVolume * calorimeter_phys =
185  new G4PVPlacement(0,G4ThreeVector(),calorimeter_log,"caloM_P",
186  experimentalHall_log,false,0);
187  G4VisAttributes* calorimeter_logVisATT
188  = new G4VisAttributes(G4Colour(1.0,1.0,0.0));
189  calorimeter_logVisATT->SetForceWireframe(true);
190  calorimeter_log->SetVisAttributes(calorimeter_logVisATT);
191 
192  //------------------------------- Lead layers
193  // As an example for Parameterised volume
194  // dummy values for G4Tubs -- modified by parameterised volume
195  G4VSolid * caloLayer_tubs
196  = new G4Tubs("caloLayer_tubs",caloRing_rmin,caloRing_rmax,
198  G4LogicalVolume * caloLayer_log
199  = new G4LogicalVolume(caloLayer_tubs,Lead,"caloR_L",0,0,0);
200  G4VPVParameterisation * calorimeterParam
202  // dummy value : kXAxis -- modified by parameterised volume
203  // G4VPhysicalVolume * caloLayer_phys =
204  new G4PVParameterised("caloLayer_phys",caloLayer_log,calorimeter_log,
205  kXAxis, nocaloLayers, calorimeterParam);
206  G4VisAttributes* caloLayer_logVisAtt
207  = new G4VisAttributes(G4Colour(0.7,1.0,0.0));
208  caloLayer_log->SetVisAttributes(caloLayer_logVisAtt);
209 
210  //------------------------------ muon counters
211  // As an example of CSG volumes with rotation
212  G4VSolid * muoncounter_box
213  = new G4Box("muoncounter_box",muBox_width,muBox_thick,
214  muBox_length);
215  G4LogicalVolume * muoncounter_log
216  = new G4LogicalVolume(muoncounter_box,Scinti,"mucounter_L",0,0,0);
217  for(int i=0; i<nomucounter ; i++)
218  {
219  G4double phi, x, y, z;
220  phi = 360.*deg/nomucounter*i;
221  x = muBox_radius*std::sin(phi);
222  y = muBox_radius*std::cos(phi);
223  z = 0.*cm;
224  G4RotationMatrix rm;
225  rm.rotateZ(phi);
227  muoncounter_log, "muoncounter_P",
228  experimentalHall_log,false,i);
229  }
230  G4VisAttributes* muoncounter_logVisAtt
231  = new G4VisAttributes(G4Colour(0.0,1.0,1.0));
232  muoncounter_logVisAtt->SetForceWireframe(true);
233  muoncounter_log->SetVisAttributes(muoncounter_logVisAtt);
234 
235  //------------------------------------------------------------------
236  // Sensitive Detector
237  //------------------------------------------------------------------
238 
240 
241  G4String trackerSDname = "/mydet/tracker";
242  ExN04TrackerSD * trackerSD = new ExN04TrackerSD(trackerSDname);
243  SDman->AddNewDetector(trackerSD);
244  trackerLayer_log->SetSensitiveDetector(trackerSD);
245 
246  G4String calorimeterSDname = "/mydet/calorimeter";
247  ExN04CalorimeterSD * calorimeterSD = new ExN04CalorimeterSD(calorimeterSDname);
248  G4String ROgeometryName = "CalorimeterROGeom";
249  G4VReadOutGeometry* calRO = new ExN04CalorimeterROGeometry(ROgeometryName);
250  calRO->BuildROGeometry();
251  calRO->SetName(ROgeometryName);
252  calorimeterSD->SetROgeometry(calRO);
253  SDman->AddNewDetector(calorimeterSD);
254  calorimeter_log->SetSensitiveDetector(calorimeterSD);
255 
256  G4String muonSDname = "/mydet/muon";
257  ExN04MuonSD * muonSD = new ExN04MuonSD(muonSDname);
258  SDman->AddNewDetector(muonSD);
259  muoncounter_log->SetSensitiveDetector(muonSD);
260 
261  //------------------------------------------------------------------
262  // Digitizer modules
263  //------------------------------------------------------------------
264 
265  return experimentalHall_phys;
266 }
267