Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // Implementation for G4UHype wrapper class 27 // 28 // 16-10-2017 G.Cosmo, CERN 29 // ------------------------------------------- 30 31 #include "G4Hype.hh" 32 33 #include "G4UHype.hh" 34 35 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G 36 37 #include "G4AffineTransform.hh" 38 #include "G4VPVParameterisation.hh" 39 #include "G4BoundingEnvelope.hh" 40 #include "G4Polyhedron.hh" 41 42 ////////////////////////////////////////////// 43 // 44 // Constructor 45 46 G4UHype::G4UHype(const G4String& pName, 47 G4double newInnerRadiu 48 G4double newOuterRadiu 49 G4double newInnerStere 50 G4double newOuterStere 51 G4double newHalfLenZ) 52 : Base_t(pName, newInnerRadius, newOuterRadi 53 newInnerStereo, newOuterSter 54 { } 55 56 ////////////////////////////////////////////// 57 // 58 // Fake default constructor - sets only member 59 // for usage restri 60 61 G4UHype::G4UHype( __void__& a ) 62 : Base_t(a) 63 { } 64 65 ////////////////////////////////////////////// 66 // 67 // Destructor 68 69 G4UHype::~G4UHype() = default; 70 71 ////////////////////////////////////////////// 72 // 73 // Copy constructor 74 75 G4UHype::G4UHype(const G4UHype& rhs) 76 : Base_t(rhs) 77 { } 78 79 ////////////////////////////////////////////// 80 // 81 // Assignment operator 82 83 G4UHype& G4UHype::operator = (const G4UHype& r 84 { 85 // Check assignment to self 86 // 87 if (this == &rhs) { return *this; } 88 89 // Copy base class data 90 // 91 Base_t::operator=(rhs); 92 93 return *this; 94 } 95 96 ////////////////////////////////////////////// 97 // 98 // Accessors 99 100 G4double G4UHype::GetInnerRadius () const 101 { 102 return GetRmin(); 103 } 104 105 G4double G4UHype::GetOuterRadius () const 106 { 107 return GetRmax(); 108 } 109 110 G4double G4UHype::GetZHalfLength () const 111 { 112 return GetDz(); 113 } 114 115 G4double G4UHype::GetInnerStereo () const 116 { 117 return GetStIn(); 118 } 119 120 G4double G4UHype::GetOuterStereo () const 121 { 122 return GetStOut(); 123 } 124 125 ////////////////////////////////////////////// 126 // 127 // Modifiers 128 129 void G4UHype::SetInnerRadius (G4double newIRad 130 { 131 SetParameters(newIRad, GetRmax(), GetStIn(), 132 fRebuildPolyhedron = true; 133 } 134 135 void G4UHype::SetOuterRadius (G4double newORad 136 { 137 SetParameters(GetRmin(), newORad, GetStIn(), 138 fRebuildPolyhedron = true; 139 } 140 141 void G4UHype::SetZHalfLength (G4double newHLZ) 142 { 143 SetParameters(GetRmin(), GetRmax(), GetStIn( 144 fRebuildPolyhedron = true; 145 } 146 147 void G4UHype::SetInnerStereo (G4double newISte 148 { 149 SetParameters(GetRmin(), GetRmax(), newISte, 150 fRebuildPolyhedron = true; 151 } 152 153 void G4UHype::SetOuterStereo (G4double newOSte 154 { 155 SetParameters(GetRmin(), GetRmax(), GetStIn( 156 fRebuildPolyhedron = true; 157 } 158 159 160 ////////////////////////////////////////////// 161 // 162 // Dispatch to parameterisation for replicatio 163 // computation & modification. 164 165 void G4UHype::ComputeDimensions(G4VPVParameter 166 const G4int n, 167 const G4VPhysi 168 { 169 p->ComputeDimensions(*(G4Hype*)this,n,pRep); 170 } 171 172 173 ////////////////////////////////////////////// 174 // 175 // Make a clone of the object 176 177 G4VSolid* G4UHype::Clone() const 178 { 179 return new G4UHype(*this); 180 } 181 182 ////////////////////////////////////////////// 183 // 184 // Get bounding box 185 186 void G4UHype::BoundingLimits(G4ThreeVector& pM 187 G4ThreeVector& pM 188 { 189 G4double endORadius = GetEndInnerRadius(); 190 pMin.set(-endORadius,-endORadius,-GetDz()); 191 pMax.set( endORadius, endORadius, GetDz()); 192 193 // Check correctness of the bounding box 194 // 195 if (pMin.x() >= pMax.x() || pMin.y() >= pMax 196 { 197 std::ostringstream message; 198 message << "Bad bounding box (min >= max) 199 << GetName() << " !" 200 << "\npMin = " << pMin 201 << "\npMax = " << pMax; 202 G4Exception("G4UHype::BoundingLimits()", " 203 JustWarning, message); 204 StreamInfo(G4cout); 205 } 206 } 207 208 ////////////////////////////////////////////// 209 // 210 // Calculate extent under transform and specif 211 212 G4bool 213 G4UHype::CalculateExtent(const EAxis pAxis, 214 const G4VoxelLimits& 215 const G4AffineTransfo 216 G4double& pMin, 217 { 218 G4ThreeVector bmin, bmax; 219 220 // Get bounding box 221 BoundingLimits(bmin,bmax); 222 223 // Find extent 224 G4BoundingEnvelope bbox(bmin,bmax); 225 return bbox.CalculateExtent(pAxis,pVoxelLimi 226 } 227 228 ////////////////////////////////////////////// 229 // 230 // CreatePolyhedron 231 // 232 G4Polyhedron* G4UHype::CreatePolyhedron() cons 233 { 234 return new G4PolyhedronHype(GetRmin(), GetRm 235 GetTIn2(), GetTO 236 } 237 238 #endif // G4GEOM_USE_USOLIDS 239