Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
XDetectorConstruction.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 //
28 //
29 // $Id$
30 //
31 
32 #include "XDetectorConstruction.hh"
33 
34 #include "G4Material.hh"
35 #include "G4NistManager.hh"
36 
37 #include "G4Box.hh"
38 #include "G4Tubs.hh"
39 #include "G4Sphere.hh"
40 #include "G4LogicalVolume.hh"
41 #include "G4PVPlacement.hh"
42 #include "G4UniformMagField.hh"
44 #include "G4FieldManager.hh"
45 #include "G4VisAttributes.hh"
46 #include "G4Colour.hh"
47 #include "G4SDManager.hh"
48 
50 #include "XPhysicalLattice.hh"
51 #include "XLogicalLattice.hh"
52 
53 #include "G4UserLimits.hh"
54 #include "G4SystemOfUnits.hh"
55 #include "G4ios.hh"
56 
57 const G4String XDetectorConstruction::fsCrystalMapsDir =
58  getenv("CRYSTALMAPS") ? getenv("CRYSTALMAPS") : "./CrystalMaps";
59 
60 
61 XDetectorConstruction::XDetectorConstruction():fConstructed(false),fIfField(true)
62 {
63  fLiquidHelium = NULL;
64  fGermanium = NULL;
65  fAlminum = NULL;
66  fTungsten = NULL;
67  fWorldPhys = NULL;
68 }
69 
70 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
71 
73 {;}
74 
75 
76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
77 
79 {
80  if(!fConstructed)
81  {
82  fConstructed = true;
83  DefineMaterials();
84  SetupGeometry();
85  }
86  return fWorldPhys;
87 }
88 
89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
90 
91 void XDetectorConstruction::DefineMaterials()
92 {
93  G4NistManager* nistManager = G4NistManager::Instance();
94 
95  fLiquidHelium = nistManager->FindOrBuildMaterial("G4_AIR"); // to be corrected.......
96  fGermanium = nistManager->FindOrBuildMaterial("G4_Ge");
97  fAlminum = nistManager->FindOrBuildMaterial("G4_Al");
98  fTungsten = nistManager->FindOrBuildMaterial("G4_W");
99 }
100 
101 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
102 
103 void XDetectorConstruction::SetupGeometry()
104 {
105  //
106  // World
107  //
108  G4VSolid* worldSolid = new G4Box("World",16.*cm,16.*cm,16.*cm);
109  G4LogicalVolume* worldLogical = new G4LogicalVolume(worldSolid,fLiquidHelium,"World");
110  worldLogical->SetUserLimits(new G4UserLimits(10*mm, DBL_MAX, DBL_MAX, 0, 0));
111  fWorldPhys = new G4PVPlacement(0,G4ThreeVector(),worldLogical,"World",0,false,0);
112 
113  //
114  // Germanium cylinder - this is the volume in which we will propagate phonons
115  //
116  G4VSolid* fGermaniumSolid = new G4Tubs("fGermaniumSolid",0.*cm,3.81*cm,1.27*cm, 0.*deg, 360.*deg);
117  G4LogicalVolume* fGermaniumLogical = new G4LogicalVolume(fGermaniumSolid,fGermanium,"fGermaniumLogical");
118  G4VPhysicalVolume* GePhys = new G4PVPlacement(0,G4ThreeVector(),fGermaniumLogical,"fGermaniumPhysical",worldLogical,false,0);
119 
120  //
121  //Germanium lattice information
122  //
123 
124  //Get pointer to new logical lattice object
125  XLogicalLattice* GeLogical = new XLogicalLattice();
126 
127  //Load maps for mapping phonon momentum direciton onto propagation direction
128  //Convention for polarization state: 0=LON, 1=ST, 2=FT
129  if(GeLogical->Load_NMap(161, 321, 0, fsCrystalMapsDir + "/LVec.ssv")){
130  if(GeLogical->Load_NMap(161, 321, 1,fsCrystalMapsDir + "/STVec.ssv")){
131  if(GeLogical->Load_NMap(161, 321, 2,fsCrystalMapsDir + "/FTVec.ssv")){
132  G4cout<<"\nXDetectorConstruction::Loaded all three maps";}}}
133 
134  //Load maps for mapping phonon momentum direction onto velocity
135  //Convention for polarization state: 0=LON, 1=ST, 2=FT
136  if(GeLogical->LoadMap(161, 321, 0, fsCrystalMapsDir +"/L.ssv")){
137  if(GeLogical->LoadMap(161, 321, 1, fsCrystalMapsDir +"/ST.ssv")){
138  if(GeLogical->LoadMap(161, 321, 2, fsCrystalMapsDir +"/FT.ssv")){
139  G4cout<<"\nXDetectorConstruction::Loaded all three velocity maps";}}}
140 
141  //Set Ge lattice dynamical information
142  GeLogical->SetDynamicalConstants(-0.732, -0.708, 0.376, 0.561);
143  GeLogical->SetScatteringConstant(3.67e-41*s*s*s);
144  GeLogical->SetAnhDecConstant(1.6456e-54*s*s*s*s);
145  GeLogical->SetLDOS(0.097834);
146  GeLogical->SetSTDOS(0.53539);
147  GeLogical->SetFTDOS(0.36677);
148 
149  //XPhysicalLattice associates XLogicalLattice with a PhysicalVolume.
150  //XLatticeManager3 gives physics processes access to lattices
151  XPhysicalLattice* GePhysical = new XPhysicalLattice(GePhys,GeLogical);
153  LM->RegisterLattice(GePhysical);
154 
155  //
156  // Alminum - crystal end caps. This is where phonon hits are registered
157  //
158  G4VSolid* fAlminumSolid = new G4Tubs("aluminiumSolid",0.*cm,3.81*cm,0.01*cm, 0.*deg, 360.*deg);
159 
160  G4LogicalVolume* fAlminumLogical = new G4LogicalVolume(fAlminumSolid,fAlminum,"fAlminumLogical");
161  new G4PVPlacement(0,G4ThreeVector(0.,0.,1.28*cm),fAlminumLogical,"fAlminumPhysical",worldLogical,false,0);
162  new G4PVPlacement(0,G4ThreeVector(0.,0.,-1.28*cm),fAlminumLogical,"fAlminumPhysical",worldLogical,false,1);
163 
164 
165  //
166  // detector -- Note : Alminum electrode sensitivity is attached to Germanium
167  //
169  XAlminumElectrodeSensitivity* electrodeSensitivity = new XAlminumElectrodeSensitivity("XAlminumElectrode");
170  SDman->AddNewDetector(electrodeSensitivity);
171  fGermaniumLogical->SetSensitiveDetector(electrodeSensitivity);
172 
173  //
174  // Visualization attributes
175  //
177  G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
178  simpleBoxVisAtt->SetVisibility(true);
179  fGermaniumLogical->SetVisAttributes(simpleBoxVisAtt);
180  fAlminumLogical->SetVisAttributes(simpleBoxVisAtt);
181 
182 }
183 
184