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 | // ******************************************************************** |
---|
27 | // * * |
---|
28 | // * cosmicray_charging advanced example for Geant4 * |
---|
29 | // * (adapted simulation of test-mass charging in the LISA mission) * |
---|
30 | // * * |
---|
31 | // * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * |
---|
32 | // * Imperial College London * |
---|
33 | // * * |
---|
34 | // * LISADetectorConstruction class * |
---|
35 | // * * |
---|
36 | // ******************************************************************** |
---|
37 | // |
---|
38 | // HISTORY |
---|
39 | // 22/02/2004: migrated from LISA-V04 |
---|
40 | // 24/11/2004: migrated to cmath |
---|
41 | // |
---|
42 | // ******************************************************************** |
---|
43 | |
---|
44 | |
---|
45 | //*************************************************************************** |
---|
46 | // Support systems |
---|
47 | //*************************************************************************** |
---|
48 | // Star Trackers |
---|
49 | // FEEP Thrusters |
---|
50 | // Communications Antennas |
---|
51 | //*************************************************************************** |
---|
52 | |
---|
53 | |
---|
54 | // Star Trackers ************************************************************ |
---|
55 | |
---|
56 | G4double ST_rad = 0.5*2270*mm; |
---|
57 | G4RotationMatrix ST_rot1; ST_rot1.rotateZ(+30.*deg); |
---|
58 | G4ThreeVector ST_pos1(ST_rad*std::cos(56*deg), |
---|
59 | +ST_rad*std::sin(56*deg),180.*mm); |
---|
60 | G4RotationMatrix ST_rot2; ST_rot2.rotateZ(-30.*deg); |
---|
61 | G4ThreeVector ST_pos2(ST_rad*std::cos(56*deg), |
---|
62 | -ST_rad*std::sin(56*deg),180.*mm); |
---|
63 | G4RotationMatrix ST_rot3; ST_rot3.rotateY(90.*deg); |
---|
64 | |
---|
65 | // Star Tracker: 2 kg |
---|
66 | G4double StarTracker_dia_o = 100.*mm; |
---|
67 | G4double StarTracker_dia_i = 40.*mm; |
---|
68 | G4double StarTracker_len = 120.*mm; |
---|
69 | // Bracket: 0.25 kg |
---|
70 | G4double StarTrackerBracket_wid = 120.*mm; |
---|
71 | G4double StarTrackerBracket_hei = 104.*mm; |
---|
72 | G4double StarTrackerBracket_thi = 7.5*mm; |
---|
73 | |
---|
74 | G4Tubs* StarTracker_tub = new G4Tubs("StarTracker_tub",0.5*StarTracker_dia_i, |
---|
75 | 0.5*StarTracker_dia_o, 0.5*StarTracker_len, 0., 360.*deg); |
---|
76 | G4Box* StarTrackerBracket_box = new G4Box("StarTrackerBracket_box", |
---|
77 | 0.5*StarTrackerBracket_thi, 0.5*StarTrackerBracket_wid, |
---|
78 | 0.5*StarTrackerBracket_hei); |
---|
79 | G4UnionSolid* StarTracker_sol = new G4UnionSolid("StarTracker_sol", |
---|
80 | StarTrackerBracket_box, StarTracker_tub, G4Transform3D(ST_rot3, |
---|
81 | G4ThreeVector(0.5*(StarTracker_len + StarTrackerBracket_thi),0,0))); |
---|
82 | G4LogicalVolume* StarTracker_log = |
---|
83 | new G4LogicalVolume(StarTracker_sol, Al6061, "StarTracker_log"); |
---|
84 | G4VPhysicalVolume* StarTracker_phys; |
---|
85 | StarTracker_phys = new G4PVPlacement(G4Transform3D(ST_rot1, spacecraft_pos |
---|
86 | + ST_pos1), "StarTracker_phys", StarTracker_log, wld_phys, false, 0); |
---|
87 | StarTracker_phys = new G4PVPlacement(G4Transform3D(ST_rot2, spacecraft_pos |
---|
88 | + ST_pos2), "StarTracker_phys", StarTracker_log, wld_phys, false, 1); |
---|
89 | StarTracker_log->SetVisAttributes(sol_cyan_vat); |
---|
90 | |
---|
91 | |
---|
92 | |
---|
93 | // FEEP Thrusters *********************************************************** |
---|
94 | |
---|
95 | G4double FEEP_rad = 0.5*2520*mm; |
---|
96 | G4RotationMatrix FEEP_rot1; |
---|
97 | FEEP_rot1.rotateZ(-90.*deg); FEEP_rot1.rotateX(180.*deg); |
---|
98 | G4ThreeVector FEEP_pos1(FEEP_rad,0,170.*mm); |
---|
99 | G4RotationMatrix FEEP_rot2; |
---|
100 | FEEP_rot2.rotateZ(+30.*deg); FEEP_rot2.rotateX(180.*deg); |
---|
101 | G4ThreeVector FEEP_pos2(-FEEP_rad*std::cos(60*deg), |
---|
102 | -FEEP_rad*std::sin(60*deg),170.*mm); |
---|
103 | G4RotationMatrix FEEP_rot3; |
---|
104 | FEEP_rot3.rotateZ(150.*deg); FEEP_rot3.rotateX(180.*deg); |
---|
105 | G4ThreeVector FEEP_pos3(-FEEP_rad*std::cos(60*deg), |
---|
106 | +FEEP_rad*std::sin(60*deg),170.*mm); |
---|
107 | |
---|
108 | // 1 support + 2 FEEPs: ~11 kg |
---|
109 | G4double FEEP_dia_o = 140.*mm; |
---|
110 | G4double FEEP_dia_i = 130.*mm; |
---|
111 | G4double FEEP_len = 105.*mm; |
---|
112 | G4double FEEP_xoff = 110.*mm; |
---|
113 | G4double FEEP_yoff = 70.*mm; |
---|
114 | G4double FEEP_zoff = 15.*mm; |
---|
115 | G4double FEEPSup_len = 245.*mm; |
---|
116 | G4double FEEPSup_wid = 276.*mm; |
---|
117 | G4double FEEPSup_hei = 146.*mm; |
---|
118 | G4double FEEPCut1_wid = 31.*mm; |
---|
119 | G4double FEEPCut1_yoff = 50.*mm; |
---|
120 | G4double FEEPCut2_len = 70.*mm; |
---|
121 | G4double FEEPCut2_zoff = 10.*mm; |
---|
122 | G4double FEEPCut3_xoff = 140.*mm; |
---|
123 | |
---|
124 | G4RotationMatrix FEEP_rot4; |
---|
125 | FEEP_rot4.rotateY((90.+15.)*deg); FEEP_rot4.rotateZ(-25.*deg); |
---|
126 | G4RotationMatrix FEEP_rot5; |
---|
127 | FEEP_rot5.rotateY((90.-15.)*deg); FEEP_rot5.rotateZ(+25.*deg); |
---|
128 | |
---|
129 | // Mounting bracket |
---|
130 | G4Box* FEEP_sol1 = new G4Box("FEEP_sol1", |
---|
131 | 0.5*FEEPSup_wid, 0.5*FEEPSup_len, 0.5*FEEPSup_hei); |
---|
132 | G4Box* FEEPSupCutout1 = new G4Box("FEEPSupCutout1", |
---|
133 | 0.5*FEEPCut1_wid, 0.5*FEEPSup_len, 0.6*FEEPSup_hei); |
---|
134 | G4SubtractionSolid* FEEP_sol2 = new G4SubtractionSolid("FEEP_sol2", |
---|
135 | FEEP_sol1, FEEPSupCutout1, G4Transform3D(G4RotationMatrix(), |
---|
136 | G4ThreeVector(0, -FEEPCut1_yoff, 0.))); |
---|
137 | G4Box* FEEPSupCutout2 = new G4Box("FEEPSupCutout2", |
---|
138 | 0.6*FEEPSup_wid, 0.5*FEEPCut2_len, 0.51*FEEPSup_hei); |
---|
139 | G4SubtractionSolid* FEEP_sol3 = new G4SubtractionSolid("FEEP_sol3", |
---|
140 | FEEP_sol2, FEEPSupCutout2, G4Transform3D(G4RotationMatrix(), |
---|
141 | G4ThreeVector(0,-0.5*FEEPSup_len+0.5*FEEPCut2_len-.5*mm, FEEPCut2_zoff))); |
---|
142 | G4Box* FEEPSupCutout3 = new G4Box("FEEPSupCutout3", |
---|
143 | FEEPSup_wid, FEEPSup_hei, FEEPCut2_len); |
---|
144 | G4SubtractionSolid* FEEP_sol4 = new G4SubtractionSolid("FEEP_sol4", |
---|
145 | FEEP_sol3, FEEPSupCutout3, G4Transform3D(FEEP_rot4, |
---|
146 | G4ThreeVector(-FEEPCut3_xoff,FEEPCut2_len,0))); |
---|
147 | G4SubtractionSolid* FEEP_sol5 = new G4SubtractionSolid("FEEP_sol5", |
---|
148 | FEEP_sol4, FEEPSupCutout3, G4Transform3D(FEEP_rot5, |
---|
149 | G4ThreeVector(+FEEPCut3_xoff,FEEPCut2_len,0))); |
---|
150 | // FEEPs |
---|
151 | G4Tubs* FEEP_tub = new G4Tubs("FEEP_tub", 0.5*FEEP_dia_i, 0.5*FEEP_dia_o, |
---|
152 | 0.5*FEEP_len, 0., 360.*deg); |
---|
153 | G4UnionSolid* FEEP_sol6 = new G4UnionSolid("FEEP_sol", |
---|
154 | FEEP_sol5, FEEP_tub, G4Transform3D(FEEP_rot4, |
---|
155 | G4ThreeVector(-FEEP_xoff,FEEP_yoff,FEEP_zoff))); |
---|
156 | G4UnionSolid* FEEP_sol7 = new G4UnionSolid("FEEP_sol", |
---|
157 | FEEP_sol6, FEEP_tub, G4Transform3D(FEEP_rot5, |
---|
158 | G4ThreeVector(+FEEP_xoff,FEEP_yoff,FEEP_zoff))); |
---|
159 | G4LogicalVolume* FEEP_log = |
---|
160 | new G4LogicalVolume(FEEP_sol7, Al6061, "FEEP_log"); |
---|
161 | G4VPhysicalVolume* FEEP_phys; |
---|
162 | FEEP_phys = new G4PVPlacement(G4Transform3D(FEEP_rot1, |
---|
163 | spacecraft_pos+FEEP_pos1), "FEEP_phys", FEEP_log, wld_phys, false, 0); |
---|
164 | FEEP_phys = new G4PVPlacement(G4Transform3D(FEEP_rot2, |
---|
165 | spacecraft_pos+FEEP_pos2), "FEEP_phys", FEEP_log, wld_phys, false, 1); |
---|
166 | FEEP_phys = new G4PVPlacement(G4Transform3D(FEEP_rot3, |
---|
167 | spacecraft_pos+FEEP_pos3), "FEEP_phys", FEEP_log, wld_phys, false, 2); |
---|
168 | FEEP_log->SetVisAttributes(sol_cyan_vat); |
---|
169 | |
---|
170 | |
---|
171 | // Communications Antennas ************************************************** |
---|
172 | |
---|
173 | |
---|
174 | // Antenna dish: ~1.4 kg |
---|
175 | G4double Antenna_dia = 295.*mm; |
---|
176 | G4double Antenna_thi = 7.*mm; |
---|
177 | G4double Antenna_rad = 300.*mm; |
---|
178 | // Antenna mount: 1 kg cylindrical shell |
---|
179 | G4double AntennaMount_dia_o = 90.*mm; |
---|
180 | G4double AntennaMount_dia_i = 77.*mm; |
---|
181 | G4double AntennaMount_len = 220.*mm; |
---|
182 | |
---|
183 | G4ThreeVector ant_pos1(Antenna_rad+0*mm,+1250*mm,+550.*mm); |
---|
184 | G4ThreeVector ant_pos2(Antenna_rad-0*mm,-1250*mm,+550.*mm); |
---|
185 | G4RotationMatrix ant_rot3; ant_rot3.rotateY(-90.*deg); |
---|
186 | |
---|
187 | // Dish |
---|
188 | G4Sphere* Antenna_sol = new G4Sphere("Antenna_sol", Antenna_rad-Antenna_thi, |
---|
189 | Antenna_rad, 0., 360.*deg, 0, std::asin(0.5*Antenna_dia/Antenna_rad)); |
---|
190 | G4LogicalVolume* Antenna_log = new G4LogicalVolume |
---|
191 | (Antenna_sol, Al6061, "Antenna_log"); |
---|
192 | G4VPhysicalVolume* Antenna_phys; |
---|
193 | Antenna_phys = new G4PVPlacement(G4Transform3D(ant_rot3, spacecraft_pos |
---|
194 | + ant_pos1), "Antenna_phys", Antenna_log, wld_phys, false, 0); |
---|
195 | Antenna_phys = new G4PVPlacement(G4Transform3D(ant_rot3, spacecraft_pos |
---|
196 | + ant_pos2), "Antenna_phys", Antenna_log, wld_phys, false, 1); |
---|
197 | Antenna_log->SetVisAttributes(sol_cyan_vat); |
---|
198 | |
---|
199 | // Mount |
---|
200 | G4Tubs* AntennaMount_tub = new G4Tubs("AntennaMount_sol", |
---|
201 | 0.5*AntennaMount_dia_i, 0.5*AntennaMount_dia_o, 0.5*AntennaMount_len, |
---|
202 | 0., 360.*deg); |
---|
203 | G4LogicalVolume* AntennaMount_log = new G4LogicalVolume |
---|
204 | (AntennaMount_tub, Al6061, "AntennaMount_log"); |
---|
205 | G4VPhysicalVolume* AntennaMount_phys; |
---|
206 | AntennaMount_phys = new G4PVPlacement(0, spacecraft_pos+ant_pos1+ |
---|
207 | G4ThreeVector(-Antenna_rad-60.*mm,0,-80.*mm), |
---|
208 | "AntennaMount_phys", AntennaMount_log, wld_phys, false, 0); |
---|
209 | AntennaMount_phys = new G4PVPlacement(0, spacecraft_pos+ant_pos2+ |
---|
210 | G4ThreeVector(-Antenna_rad-60.*mm,0,-80.*mm), |
---|
211 | "AntennaMount_phys", AntennaMount_log, wld_phys, false, 1); |
---|
212 | AntennaMount_log->SetVisAttributes(sol_cyan_vat); |
---|
213 | |
---|
214 | //***************************************************************************** |
---|