[807] | 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 | //***************************************************************************** |
---|