Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // Implementation for G4UEllipsoid wrapper cla 26 // Implementation for G4UEllipsoid wrapper class 27 // 27 // 28 // 13-08-2019 Gabriele Cosmo, CERN 28 // 13-08-2019 Gabriele Cosmo, CERN 29 // ------------------------------------------- 29 // -------------------------------------------------------------------- 30 30 31 #include "G4Ellipsoid.hh" 31 #include "G4Ellipsoid.hh" 32 #include "G4UEllipsoid.hh" 32 #include "G4UEllipsoid.hh" 33 33 34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G 34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) ) 35 35 36 #include "G4AffineTransform.hh" 36 #include "G4AffineTransform.hh" 37 #include "G4VPVParameterisation.hh" 37 #include "G4VPVParameterisation.hh" 38 #include "G4PhysicalConstants.hh" 38 #include "G4PhysicalConstants.hh" 39 #include "G4BoundingEnvelope.hh" 39 #include "G4BoundingEnvelope.hh" 40 #include "G4Polyhedron.hh" 40 #include "G4Polyhedron.hh" 41 41 42 ////////////////////////////////////////////// 42 //////////////////////////////////////////////////////////////////////// 43 // 43 // 44 // Constructor - check & set half widths 44 // Constructor - check & set half widths 45 45 46 46 47 G4UEllipsoid::G4UEllipsoid(const G4String& pNa 47 G4UEllipsoid::G4UEllipsoid(const G4String& pName, 48 G4d 48 G4double dx, 49 G4d 49 G4double dy, 50 G4d 50 G4double dz, 51 G4d 51 G4double bcut, 52 G4d 52 G4double tcut ) 53 : Base_t(pName, dx, dy, dz, bcut, tcut) 53 : Base_t(pName, dx, dy, dz, bcut, tcut) 54 { } 54 { } 55 55 56 ////////////////////////////////////////////// 56 ////////////////////////////////////////////////////////////////////////// 57 // 57 // 58 // Fake default constructor - sets only member 58 // Fake default constructor - sets only member data and allocates memory 59 // for usage restri 59 // for usage restricted to object persistency. 60 60 61 G4UEllipsoid::G4UEllipsoid( __void__& a ) 61 G4UEllipsoid::G4UEllipsoid( __void__& a ) 62 : Base_t(a) 62 : Base_t(a) 63 { } 63 { } 64 64 65 ////////////////////////////////////////////// 65 ////////////////////////////////////////////////////////////////////////// 66 // 66 // 67 // Destructor 67 // Destructor 68 68 69 G4UEllipsoid::~G4UEllipsoid() = default; << 69 G4UEllipsoid::~G4UEllipsoid() { } 70 70 71 ////////////////////////////////////////////// 71 ////////////////////////////////////////////////////////////////////////// 72 // 72 // 73 // Copy constructor 73 // Copy constructor 74 74 75 G4UEllipsoid::G4UEllipsoid(const G4UEllipsoid& 75 G4UEllipsoid::G4UEllipsoid(const G4UEllipsoid& rhs) 76 : Base_t(rhs) 76 : Base_t(rhs) 77 { } 77 { } 78 78 79 ////////////////////////////////////////////// 79 ////////////////////////////////////////////////////////////////////////// 80 // 80 // 81 // Assignment operator 81 // Assignment operator 82 82 83 G4UEllipsoid& G4UEllipsoid::operator = (const 83 G4UEllipsoid& G4UEllipsoid::operator = (const G4UEllipsoid& rhs) 84 { 84 { 85 // Check assignment to self 85 // Check assignment to self 86 // 86 // 87 if (this == &rhs) { return *this; } 87 if (this == &rhs) { return *this; } 88 88 89 // Copy base class data 89 // Copy base class data 90 // 90 // 91 Base_t::operator=(rhs); 91 Base_t::operator=(rhs); 92 92 93 return *this; 93 return *this; 94 } 94 } 95 95 96 ////////////////////////////////////////////// 96 ////////////////////////////////////////////////////////////////////////// 97 // 97 // 98 // Accessors 98 // Accessors 99 99 100 G4double G4UEllipsoid::GetDx() const 100 G4double G4UEllipsoid::GetDx() const 101 { 101 { 102 return Base_t::GetDx(); 102 return Base_t::GetDx(); 103 } 103 } 104 104 105 G4double G4UEllipsoid::GetDy() const 105 G4double G4UEllipsoid::GetDy() const 106 { 106 { 107 return Base_t::GetDy(); 107 return Base_t::GetDy(); 108 } 108 } 109 109 110 G4double G4UEllipsoid::GetDz() const 110 G4double G4UEllipsoid::GetDz() const 111 { 111 { 112 return Base_t::GetDz(); 112 return Base_t::GetDz(); 113 } 113 } 114 114 115 G4double G4UEllipsoid::GetSemiAxisMax (G4int i 115 G4double G4UEllipsoid::GetSemiAxisMax (G4int i) const 116 { 116 { 117 return (i==0) ? GetDx() 117 return (i==0) ? GetDx() 118 : (i==1) ? GetDy() 118 : (i==1) ? GetDy() 119 : GetDz(); 119 : GetDz(); 120 } 120 } 121 121 122 G4double G4UEllipsoid::GetZBottomCut() const 122 G4double G4UEllipsoid::GetZBottomCut() const 123 { 123 { 124 return Base_t::GetZBottomCut(); 124 return Base_t::GetZBottomCut(); 125 } 125 } 126 126 127 G4double G4UEllipsoid::GetZTopCut() const 127 G4double G4UEllipsoid::GetZTopCut() const 128 { 128 { 129 return Base_t::GetZTopCut(); 129 return Base_t::GetZTopCut(); 130 } 130 } 131 131 132 ////////////////////////////////////////////// 132 ////////////////////////////////////////////////////////////////////////// 133 // 133 // 134 // Modifiers 134 // Modifiers 135 135 136 void G4UEllipsoid::SetSemiAxis (G4double x, G4 136 void G4UEllipsoid::SetSemiAxis (G4double x, G4double y, G4double z) 137 { 137 { 138 Base_t::SetSemiAxes(x, y, z); 138 Base_t::SetSemiAxes(x, y, z); 139 } 139 } 140 140 141 void G4UEllipsoid::SetZCuts (G4double newzBott 141 void G4UEllipsoid::SetZCuts (G4double newzBottomCut, G4double newzTopCut) 142 { 142 { 143 Base_t::SetZCuts(newzBottomCut, newzTopCut); 143 Base_t::SetZCuts(newzBottomCut, newzTopCut); 144 } 144 } 145 145 146 ////////////////////////////////////////////// 146 ////////////////////////////////////////////////////////////////////////// 147 // 147 // 148 // Make a clone of the object 148 // Make a clone of the object 149 149 150 G4VSolid* G4UEllipsoid::Clone() const 150 G4VSolid* G4UEllipsoid::Clone() const 151 { 151 { 152 return new G4UEllipsoid(*this); 152 return new G4UEllipsoid(*this); 153 } 153 } 154 154 155 ////////////////////////////////////////////// 155 ////////////////////////////////////////////////////////////////////////// 156 // 156 // 157 // Get bounding box 157 // Get bounding box 158 158 159 void G4UEllipsoid::BoundingLimits(G4ThreeVecto 159 void G4UEllipsoid::BoundingLimits(G4ThreeVector& pMin, 160 G4ThreeVecto 160 G4ThreeVector& pMax) const 161 { 161 { 162 G4double dx = GetDx(); 162 G4double dx = GetDx(); 163 G4double dy = GetDy(); 163 G4double dy = GetDy(); 164 G4double dz = GetDz(); 164 G4double dz = GetDz(); 165 G4double zmin = std::max(-dz,GetZBottomCut() 165 G4double zmin = std::max(-dz,GetZBottomCut()); 166 G4double zmax = std::min( dz,GetZTopCut()); 166 G4double zmax = std::min( dz,GetZTopCut()); 167 pMin.set(-dx,-dy,zmin); 167 pMin.set(-dx,-dy,zmin); 168 pMax.set( dx, dy,zmax); 168 pMax.set( dx, dy,zmax); 169 169 170 // Check correctness of the bounding box 170 // Check correctness of the bounding box 171 // 171 // 172 if (pMin.x() >= pMax.x() || pMin.y() >= pMax 172 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z()) 173 { 173 { 174 std::ostringstream message; 174 std::ostringstream message; 175 message << "Bad bounding box (min >= max) 175 message << "Bad bounding box (min >= max) for solid: " 176 << GetName() << " !" 176 << GetName() << " !" 177 << "\npMin = " << pMin 177 << "\npMin = " << pMin 178 << "\npMax = " << pMax; 178 << "\npMax = " << pMax; 179 G4Exception("G4UEllipsoid::BoundingLimits( 179 G4Exception("G4UEllipsoid::BoundingLimits()", "GeomMgt0001", 180 JustWarning, message); 180 JustWarning, message); 181 StreamInfo(G4cout); 181 StreamInfo(G4cout); 182 } 182 } 183 } 183 } 184 184 185 ////////////////////////////////////////////// 185 ////////////////////////////////////////////////////////////////////////// 186 // 186 // 187 // Calculate extent under transform and specif 187 // Calculate extent under transform and specified limit 188 188 189 G4bool 189 G4bool 190 G4UEllipsoid::CalculateExtent(const EAxis pAxi 190 G4UEllipsoid::CalculateExtent(const EAxis pAxis, 191 const G4VoxelLim 191 const G4VoxelLimits& pVoxelLimit, 192 const G4AffineTr 192 const G4AffineTransform& pTransform, 193 G4double& 193 G4double& pMin, G4double& pMax) const 194 { 194 { 195 G4ThreeVector bmin, bmax; 195 G4ThreeVector bmin, bmax; 196 196 197 // Get bounding box 197 // Get bounding box 198 BoundingLimits(bmin,bmax); 198 BoundingLimits(bmin,bmax); 199 199 200 // Find extent 200 // Find extent 201 G4BoundingEnvelope bbox(bmin,bmax); 201 G4BoundingEnvelope bbox(bmin,bmax); 202 return bbox.CalculateExtent(pAxis,pVoxelLimi 202 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax); 203 } 203 } 204 204 205 ////////////////////////////////////////////// 205 //////////////////////////////////////////////////////////////////////// 206 // 206 // 207 // CreatePolyhedron 207 // CreatePolyhedron 208 208 209 G4Polyhedron* G4UEllipsoid::CreatePolyhedron() 209 G4Polyhedron* G4UEllipsoid::CreatePolyhedron() const 210 { 210 { 211 return new G4PolyhedronEllipsoid(GetDx(), Ge 211 return new G4PolyhedronEllipsoid(GetDx(), GetDy(), GetDz(), 212 GetZBottomC 212 GetZBottomCut(), GetZTopCut()); 213 } 213 } 214 214 215 #endif // G4GEOM_USE_USOLIDS 215 #endif // G4GEOM_USE_USOLIDS 216 216