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 G4UEllipticalCone wrappe 26 // Implementation for G4UEllipticalCone wrapper class 27 // 27 // 28 // 13-08-2019 Gabriele Cosmo, CERN 28 // 13-08-2019 Gabriele Cosmo, CERN 29 // ------------------------------------------- 29 // -------------------------------------------------------------------- 30 30 31 #include "G4EllipticalCone.hh" 31 #include "G4EllipticalCone.hh" 32 #include "G4UEllipticalCone.hh" 32 #include "G4UEllipticalCone.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 G4UEllipticalCone::G4UEllipticalCone(const G4S 47 G4UEllipticalCone::G4UEllipticalCone(const G4String& pName, 48 G4d 48 G4double a, 49 G4d 49 G4double b, 50 G4d 50 G4double h, 51 G4d 51 G4double cut ) 52 : Base_t(pName, a, b, h, cut) 52 : Base_t(pName, a, b, h, cut) 53 { } 53 { } 54 54 55 ////////////////////////////////////////////// 55 ////////////////////////////////////////////////////////////////////////// 56 // 56 // 57 // Fake default constructor - sets only member 57 // Fake default constructor - sets only member data and allocates memory 58 // for usage restri 58 // for usage restricted to object persistency. 59 59 60 G4UEllipticalCone::G4UEllipticalCone( __void__ 60 G4UEllipticalCone::G4UEllipticalCone( __void__& a ) 61 : Base_t(a) 61 : Base_t(a) 62 { } 62 { } 63 63 64 ////////////////////////////////////////////// 64 ////////////////////////////////////////////////////////////////////////// 65 // 65 // 66 // Destructor 66 // Destructor 67 67 68 G4UEllipticalCone::~G4UEllipticalCone() = defa << 68 G4UEllipticalCone::~G4UEllipticalCone() { } 69 69 70 ////////////////////////////////////////////// 70 ////////////////////////////////////////////////////////////////////////// 71 // 71 // 72 // Copy constructor 72 // Copy constructor 73 73 74 G4UEllipticalCone::G4UEllipticalCone(const G4U 74 G4UEllipticalCone::G4UEllipticalCone(const G4UEllipticalCone& rhs) 75 : Base_t(rhs) 75 : Base_t(rhs) 76 { } 76 { } 77 77 78 ////////////////////////////////////////////// 78 ////////////////////////////////////////////////////////////////////////// 79 // 79 // 80 // Assignment operator 80 // Assignment operator 81 81 82 G4UEllipticalCone& G4UEllipticalCone::operator 82 G4UEllipticalCone& G4UEllipticalCone::operator = (const G4UEllipticalCone& rhs) 83 { 83 { 84 // Check assignment to self 84 // Check assignment to self 85 // 85 // 86 if (this == &rhs) { return *this; } 86 if (this == &rhs) { return *this; } 87 87 88 // Copy base class data 88 // Copy base class data 89 // 89 // 90 Base_t::operator=(rhs); 90 Base_t::operator=(rhs); 91 91 92 return *this; 92 return *this; 93 } 93 } 94 94 95 ////////////////////////////////////////////// 95 ////////////////////////////////////////////////////////////////////////// 96 // 96 // 97 // Accessors 97 // Accessors 98 98 99 G4double G4UEllipticalCone::GetSemiAxisX() con 99 G4double G4UEllipticalCone::GetSemiAxisX() const 100 { 100 { 101 return Base_t::GetSemiAxisX(); 101 return Base_t::GetSemiAxisX(); 102 } 102 } 103 103 104 G4double G4UEllipticalCone::GetSemiAxisY() con 104 G4double G4UEllipticalCone::GetSemiAxisY() const 105 { 105 { 106 return Base_t::GetSemiAxisY(); 106 return Base_t::GetSemiAxisY(); 107 } 107 } 108 108 109 G4double G4UEllipticalCone::GetZMax() const 109 G4double G4UEllipticalCone::GetZMax() const 110 { 110 { 111 return Base_t::GetZMax(); 111 return Base_t::GetZMax(); 112 } 112 } 113 113 114 G4double G4UEllipticalCone::GetZTopCut() const 114 G4double G4UEllipticalCone::GetZTopCut() const 115 { 115 { 116 return Base_t::GetZTopCut(); 116 return Base_t::GetZTopCut(); 117 } 117 } 118 118 119 G4double G4UEllipticalCone::GetSemiAxisMax () 119 G4double G4UEllipticalCone::GetSemiAxisMax () const 120 { 120 { 121 return std::max(GetSemiAxisX(),GetSemiAxisY( 121 return std::max(GetSemiAxisX(),GetSemiAxisY()); 122 } 122 } 123 123 124 G4double G4UEllipticalCone::GetSemiAxisMin () 124 G4double G4UEllipticalCone::GetSemiAxisMin () const 125 { 125 { 126 return std::min(GetSemiAxisX(),GetSemiAxisY( 126 return std::min(GetSemiAxisX(),GetSemiAxisY()); 127 } 127 } 128 128 129 ////////////////////////////////////////////// 129 ////////////////////////////////////////////////////////////////////////// 130 // 130 // 131 // Modifiers 131 // Modifiers 132 132 133 void G4UEllipticalCone::SetSemiAxis(G4double x 133 void G4UEllipticalCone::SetSemiAxis(G4double x, G4double y, G4double z) 134 { 134 { 135 Base_t::SetParameters(x, y, z, GetZTopCut()) 135 Base_t::SetParameters(x, y, z, GetZTopCut()); 136 } 136 } 137 137 138 void G4UEllipticalCone::SetZCut(G4double newzT 138 void G4UEllipticalCone::SetZCut(G4double newzTopCut) 139 { 139 { 140 Base_t::SetParameters(GetSemiAxisX(), GetSem 140 Base_t::SetParameters(GetSemiAxisX(), GetSemiAxisY(), GetZMax(), newzTopCut); 141 } 141 } 142 142 143 ////////////////////////////////////////////// 143 ////////////////////////////////////////////////////////////////////////// 144 // 144 // 145 // Make a clone of the object 145 // Make a clone of the object 146 146 147 G4VSolid* G4UEllipticalCone::Clone() const 147 G4VSolid* G4UEllipticalCone::Clone() const 148 { 148 { 149 return new G4UEllipticalCone(*this); 149 return new G4UEllipticalCone(*this); 150 } 150 } 151 151 152 ////////////////////////////////////////////// 152 ////////////////////////////////////////////////////////////////////////// 153 // 153 // 154 // Get bounding box 154 // Get bounding box 155 155 156 void G4UEllipticalCone::BoundingLimits(G4Three 156 void G4UEllipticalCone::BoundingLimits(G4ThreeVector& pMin, 157 G4Three 157 G4ThreeVector& pMax) const 158 { 158 { 159 G4double zcut = GetZTopCut(); 159 G4double zcut = GetZTopCut(); 160 G4double height = GetZMax(); 160 G4double height = GetZMax(); 161 G4double xmax = GetSemiAxisX()*(height+zcu 161 G4double xmax = GetSemiAxisX()*(height+zcut); 162 G4double ymax = GetSemiAxisY()*(height+zcu 162 G4double ymax = GetSemiAxisY()*(height+zcut); 163 pMin.set(-xmax,-ymax,-zcut); 163 pMin.set(-xmax,-ymax,-zcut); 164 pMax.set( xmax, ymax, zcut); 164 pMax.set( xmax, ymax, zcut); 165 165 166 // Check correctness of the bounding box 166 // Check correctness of the bounding box 167 // 167 // 168 if (pMin.x() >= pMax.x() || pMin.y() >= pMax 168 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z()) 169 { 169 { 170 std::ostringstream message; 170 std::ostringstream message; 171 message << "Bad bounding box (min >= max) 171 message << "Bad bounding box (min >= max) for solid: " 172 << GetName() << " !" 172 << GetName() << " !" 173 << "\npMin = " << pMin 173 << "\npMin = " << pMin 174 << "\npMax = " << pMax; 174 << "\npMax = " << pMax; 175 G4Exception("G4UEllipticalCone::BoundingLi 175 G4Exception("G4UEllipticalCone::BoundingLimits()", "GeomMgt0001", 176 JustWarning, message); 176 JustWarning, message); 177 StreamInfo(G4cout); 177 StreamInfo(G4cout); 178 } 178 } 179 } 179 } 180 180 181 ////////////////////////////////////////////// 181 ////////////////////////////////////////////////////////////////////////// 182 // 182 // 183 // Calculate extent under transform and specif 183 // Calculate extent under transform and specified limit 184 184 185 G4bool 185 G4bool 186 G4UEllipticalCone::CalculateExtent(const EAxis 186 G4UEllipticalCone::CalculateExtent(const EAxis pAxis, 187 const G4Vox 187 const G4VoxelLimits& pVoxelLimit, 188 const G4Aff 188 const G4AffineTransform& pTransform, 189 G4dou 189 G4double& pMin, G4double& pMax) const 190 { 190 { 191 G4ThreeVector bmin,bmax; 191 G4ThreeVector bmin,bmax; 192 G4bool exist; 192 G4bool exist; 193 193 194 // Check bounding box (bbox) 194 // Check bounding box (bbox) 195 // 195 // 196 BoundingLimits(bmin,bmax); 196 BoundingLimits(bmin,bmax); 197 G4BoundingEnvelope bbox(bmin,bmax); 197 G4BoundingEnvelope bbox(bmin,bmax); 198 #ifdef G4BBOX_EXTENT 198 #ifdef G4BBOX_EXTENT 199 return bbox.CalculateExtent(pAxis,pVoxelLimi 199 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax); 200 #endif 200 #endif 201 if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVox 201 if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVoxelLimit,pTransform,pMin,pMax)) 202 { 202 { 203 return exist = pMin < pMax; << 203 return exist = (pMin < pMax) ? true : false; 204 } 204 } 205 205 206 // Set bounding envelope (benv) and calculat 206 // Set bounding envelope (benv) and calculate extent 207 // 207 // 208 static const G4int NSTEPS = 48; // number of 208 static const G4int NSTEPS = 48; // number of steps for whole circle 209 static const G4double ang = twopi/NSTEPS; 209 static const G4double ang = twopi/NSTEPS; 210 static const G4double sinHalf = std::sin(0.5 210 static const G4double sinHalf = std::sin(0.5*ang); 211 static const G4double cosHalf = std::cos(0.5 211 static const G4double cosHalf = std::cos(0.5*ang); 212 static const G4double sinStep = 2.*sinHalf*c 212 static const G4double sinStep = 2.*sinHalf*cosHalf; 213 static const G4double cosStep = 1. - 2.*sinH 213 static const G4double cosStep = 1. - 2.*sinHalf*sinHalf; 214 G4double zcut = bmax.z(); 214 G4double zcut = bmax.z(); 215 G4double height = GetZMax(); 215 G4double height = GetZMax(); 216 G4double sxmin = GetSemiAxisX()*(height-zcu 216 G4double sxmin = GetSemiAxisX()*(height-zcut)/cosHalf; 217 G4double symin = GetSemiAxisY()*(height-zcu 217 G4double symin = GetSemiAxisY()*(height-zcut)/cosHalf; 218 G4double sxmax = bmax.x()/cosHalf; 218 G4double sxmax = bmax.x()/cosHalf; 219 G4double symax = bmax.y()/cosHalf; 219 G4double symax = bmax.y()/cosHalf; 220 220 221 G4double sinCur = sinHalf; 221 G4double sinCur = sinHalf; 222 G4double cosCur = cosHalf; 222 G4double cosCur = cosHalf; 223 G4ThreeVectorList baseA(NSTEPS),baseB(NSTEPS 223 G4ThreeVectorList baseA(NSTEPS),baseB(NSTEPS); 224 for (G4int k=0; k<NSTEPS; ++k) 224 for (G4int k=0; k<NSTEPS; ++k) 225 { 225 { 226 baseA[k].set(sxmax*cosCur,symax*sinCur,-zc 226 baseA[k].set(sxmax*cosCur,symax*sinCur,-zcut); 227 baseB[k].set(sxmin*cosCur,symin*sinCur, zc 227 baseB[k].set(sxmin*cosCur,symin*sinCur, zcut); 228 228 229 G4double sinTmp = sinCur; 229 G4double sinTmp = sinCur; 230 sinCur = sinCur*cosStep + cosCur*sinStep; 230 sinCur = sinCur*cosStep + cosCur*sinStep; 231 cosCur = cosCur*cosStep - sinTmp*sinStep; 231 cosCur = cosCur*cosStep - sinTmp*sinStep; 232 } 232 } 233 233 234 std::vector<const G4ThreeVectorList *> polyg 234 std::vector<const G4ThreeVectorList *> polygons(2); 235 polygons[0] = &baseA; 235 polygons[0] = &baseA; 236 polygons[1] = &baseB; 236 polygons[1] = &baseB; 237 G4BoundingEnvelope benv(bmin,bmax,polygons); 237 G4BoundingEnvelope benv(bmin,bmax,polygons); 238 exist = benv.CalculateExtent(pAxis,pVoxelLim 238 exist = benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax); 239 return exist; 239 return exist; 240 } 240 } 241 241 242 ////////////////////////////////////////////// 242 //////////////////////////////////////////////////////////////////////// 243 // 243 // 244 // CreatePolyhedron 244 // CreatePolyhedron 245 // 245 // 246 G4Polyhedron* G4UEllipticalCone::CreatePolyhed 246 G4Polyhedron* G4UEllipticalCone::CreatePolyhedron() const 247 { 247 { 248 return new G4PolyhedronEllipticalCone(GetSem 248 return new G4PolyhedronEllipticalCone(GetSemiAxisX(), GetSemiAxisY(), 249 GetZMa 249 GetZMax(), GetZTopCut()); 250 } 250 } 251 251 252 #endif // G4GEOM_USE_USOLIDS 252 #endif // G4GEOM_USE_USOLIDS 253 253