Geant4 Cross Reference |
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 // Implementation for G4UBox wrapper class 27 // 28 // 13.09.13 G.Cosmo, CERN/PH 29 // -------------------------------------------------------------------- 30 31 #include "G4Box.hh" 32 #include "G4UBox.hh" 33 34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) ) 35 36 #include "G4AffineTransform.hh" 37 #include "G4VPVParameterisation.hh" 38 #include "G4BoundingEnvelope.hh" 39 40 using namespace CLHEP; 41 42 //////////////////////////////////////////////////////////////////////// 43 // 44 // Constructor - check & set half widths 45 46 47 G4UBox::G4UBox(const G4String& pName, 48 G4double pX, 49 G4double pY, 50 G4double pZ) 51 : Base_t(pName, pX, pY, pZ) 52 { 53 } 54 55 ////////////////////////////////////////////////////////////////////////// 56 // 57 // Fake default constructor - sets only member data and allocates memory 58 // for usage restricted to object persistency. 59 60 G4UBox::G4UBox( __void__& a ) 61 : Base_t(a) 62 { 63 } 64 65 ////////////////////////////////////////////////////////////////////////// 66 // 67 // Destructor 68 69 G4UBox::~G4UBox() = default; 70 71 ////////////////////////////////////////////////////////////////////////// 72 // 73 // Copy constructor 74 75 G4UBox::G4UBox(const G4UBox& rhs) 76 : Base_t(rhs) 77 { 78 } 79 80 ////////////////////////////////////////////////////////////////////////// 81 // 82 // Assignment operator 83 84 G4UBox& G4UBox::operator = (const G4UBox& rhs) 85 { 86 // Check assignment to self 87 // 88 if (this == &rhs) { return *this; } 89 90 // Copy base class data 91 // 92 Base_t::operator=(rhs); 93 94 return *this; 95 } 96 97 //////////////////////////////////////////////////////////////////////// 98 // 99 // Accessors & modifiers 100 101 G4double G4UBox::GetXHalfLength() const 102 { 103 return x(); 104 } 105 G4double G4UBox::GetYHalfLength() const 106 { 107 return y(); 108 } 109 G4double G4UBox::GetZHalfLength() const 110 { 111 return z(); 112 } 113 114 void G4UBox::SetXHalfLength(G4double dx) 115 { 116 SetX(dx); 117 fRebuildPolyhedron = true; 118 } 119 void G4UBox::SetYHalfLength(G4double dy) 120 { 121 SetY(dy); 122 fRebuildPolyhedron = true; 123 } 124 void G4UBox::SetZHalfLength(G4double dz) 125 { 126 SetZ(dz); 127 fRebuildPolyhedron = true; 128 } 129 130 //////////////////////////////////////////////////////////////////////// 131 // 132 // Dispatch to parameterisation for replication mechanism dimension 133 // computation & modification. 134 135 void G4UBox::ComputeDimensions(G4VPVParameterisation* p, 136 const G4int n, 137 const G4VPhysicalVolume* pRep) 138 { 139 p->ComputeDimensions(*(G4Box*)this,n,pRep); 140 } 141 142 ////////////////////////////////////////////////////////////////////////// 143 // 144 // Make a clone of the object 145 146 G4VSolid* G4UBox::Clone() const 147 { 148 return new G4UBox(*this); 149 } 150 151 ////////////////////////////////////////////////////////////////////////// 152 // 153 // Get bounding box 154 155 void G4UBox::BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const 156 { 157 G4double dx = GetXHalfLength(); 158 G4double dy = GetYHalfLength(); 159 G4double dz = GetZHalfLength(); 160 pMin.set(-dx,-dy,-dz); 161 pMax.set( dx, dy, dz); 162 163 // Check correctness of the bounding box 164 // 165 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z()) 166 { 167 std::ostringstream message; 168 message << "Bad bounding box (min >= max) for solid: " 169 << GetName() << " !" 170 << "\npMin = " << pMin 171 << "\npMax = " << pMax; 172 G4Exception("G4UBox::BoundingLimits()", "GeomMgt0001", 173 JustWarning, message); 174 StreamInfo(G4cout); 175 } 176 } 177 178 ////////////////////////////////////////////////////////////////////////// 179 // 180 // Calculate extent under transform and specified limit 181 182 G4bool 183 G4UBox::CalculateExtent(const EAxis pAxis, 184 const G4VoxelLimits& pVoxelLimit, 185 const G4AffineTransform& pTransform, 186 G4double& pMin, G4double& pMax) const 187 { 188 G4ThreeVector bmin, bmax; 189 190 // Get bounding box limits 191 BoundingLimits(bmin,bmax); 192 193 // Find extent 194 G4BoundingEnvelope bbox(bmin,bmax); 195 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax); 196 } 197 198 199 ////////////////////////////////////////////////////////////////////////// 200 // 201 // Create polyhedron for visualization 202 203 G4Polyhedron* G4UBox::CreatePolyhedron() const 204 { 205 return new G4PolyhedronBox(GetXHalfLength(), 206 GetYHalfLength(), 207 GetZHalfLength()); 208 } 209 210 #endif // G4GEOM_USE_USOLIDS 211