1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
|
/// \file PlacedRootVolume.h
/// \author Johannes de Fine Licht (johannes.definelicht@cern.ch)
#ifndef VECGEOM_VOLUMES_PLACEDROOTVOLUME_H_
#define VECGEOM_VOLUMES_PLACEDROOTVOLUME_H_
#include "VecGeom/base/Cuda.h"
#include "VecGeom/base/Global.h"
#include "VecGeom/volumes/PlacedVolume.h"
#include "VecGeom/volumes/UnplacedRootVolume.h"
#include "TGeoShape.h"
namespace vecgeom {
VECGEOM_DEVICE_FORWARD_DECLARE(class PlacedRootVolume;);
VECGEOM_DEVICE_DECLARE_CONV(class, PlacedRootVolume);
inline namespace cxx {
template <typename T>
class SOA3D;
class PlacedRootVolume : public VPlacedVolume {
private:
PlacedRootVolume(const PlacedRootVolume &); // Not implemented
PlacedRootVolume &operator=(const PlacedRootVolume &); // Not implemented
public:
PlacedRootVolume(char const *const label, TGeoShape const *const rootShape, LogicalVolume const *const logicalVolume,
Transformation3D const *const transformation);
PlacedRootVolume(TGeoShape const *const rootShape, LogicalVolume const *const logicalVolume,
Transformation3D const *const transformation);
virtual ~PlacedRootVolume() {}
TGeoShape const *GetRootShape() const { return ((UnplacedRootVolume *)GetUnplacedVolume())->GetRootShape(); }
virtual int MemorySize() const override { return sizeof(*this); }
VECCORE_ATT_HOST_DEVICE
virtual void PrintType() const override;
virtual void PrintType(std::ostream &) const override;
virtual void PrintImplementationType(std::ostream &) const override;
virtual void PrintUnplacedType(std::ostream &) const override;
VECGEOM_FORCE_INLINE
virtual bool Contains(Vector3D<Precision> const &point) const override;
VECGEOM_FORCE_INLINE
virtual bool Contains(Vector3D<Precision> const &point, Vector3D<Precision> &localPoint) const override;
virtual void Contains(SOA3D<Precision> const &points, bool *const output) const override;
VECGEOM_FORCE_INLINE
virtual bool UnplacedContains(Vector3D<Precision> const &point) const override;
VECGEOM_FORCE_INLINE
virtual EnumInside Inside(Vector3D<Precision> const &point) const override;
virtual void Inside(SOA3D<Precision> const &points, Inside_t *const output) const override;
VECGEOM_FORCE_INLINE
virtual Precision DistanceToIn(Vector3D<Precision> const &position, Vector3D<Precision> const &direction,
const Precision step_max) const override;
virtual void DistanceToIn(SOA3D<Precision> const &position, SOA3D<Precision> const &direction,
Precision const *const stepMax, Precision *const output) const override;
VECGEOM_FORCE_INLINE
virtual Precision DistanceToOut(Vector3D<Precision> const &position, Vector3D<Precision> const &direction,
Precision const stepMax) const override;
virtual Precision PlacedDistanceToOut(Vector3D<Precision> const &position, Vector3D<Precision> const &direction,
Precision const stepMax) const override;
virtual void DistanceToOut(SOA3D<Precision> const &position, SOA3D<Precision> const &direction,
Precision const *const step_max, Precision *const output) const override;
virtual void DistanceToOut(SOA3D<Precision> const &position, SOA3D<Precision> const &direction,
Precision const *const step_max, Precision *const output,
int *const nextnodeindex) const override;
VECGEOM_FORCE_INLINE
virtual Precision SafetyToOut(Vector3D<Precision> const &position) const override;
virtual void SafetyToOut(SOA3D<Precision> const &position, Precision *const safeties) const override;
VECGEOM_FORCE_INLINE
virtual Precision SafetyToIn(Vector3D<Precision> const &position) const override;
virtual void SafetyToIn(SOA3D<Precision> const &position, Precision *const safeties) const override;
// the SIMD vector interfaces (not implemented)
virtual Real_v DistanceToInVec(Vector3D<Real_v> const &position, Vector3D<Real_v> const &direction,
Real_v const step_max = kInfLength) const override
{
throw std::runtime_error("unimplemented function called");
return Real_v(-1.);
}
virtual Real_v DistanceToOutVec(Vector3D<Real_v> const &position, Vector3D<Real_v> const &direction,
Real_v const step_max = kInfLength) const override
{
throw std::runtime_error("unimplemented function called");
return Real_v(-1.);
}
virtual Real_v SafetyToInVec(Vector3D<Real_v> const &position) const override
{
throw std::runtime_error("unimplemented function called");
return Real_v(-1.);
}
virtual Real_v SafetyToOutVec(Vector3D<Real_v> const &position) const override
{
throw std::runtime_error("unimplemented function called");
return Real_v(-1.);
}
virtual void Extent(Vector3D<Precision> &, Vector3D<Precision> &) const override;
virtual Precision Capacity() override;
virtual Precision SurfaceArea() const override
{
throw std::runtime_error("unimplemented function called");
return -1.;
}
virtual VPlacedVolume const *ConvertToUnspecialized() const override;
#ifdef VECGEOM_ROOT
virtual TGeoShape const *ConvertToRoot() const override;
#endif
#ifdef VECGEOM_GEANT4
virtual G4VSolid const *ConvertToGeant4() const override;
#endif
#ifdef VECGEOM_CUDA_INTERFACE
virtual size_t DeviceSizeOf() const override { return 0; /* return DevicePtr<cuda::PlacedRootVolume>::SizeOf(); */ }
virtual DevicePtr<cuda::VPlacedVolume> CopyToGpu(DevicePtr<cuda::LogicalVolume> const logical_volume,
DevicePtr<cuda::Transformation3D> const transform,
DevicePtr<cuda::VPlacedVolume> const gpu_ptr) const override;
virtual DevicePtr<cuda::VPlacedVolume> CopyToGpu(DevicePtr<cuda::LogicalVolume> const logical_volume,
DevicePtr<cuda::Transformation3D> const transform) const override;
virtual void CopyManyToGpu(std::vector<VPlacedVolume const *> const & host_volumes,
std::vector<DevicePtr<cuda::LogicalVolume>> const & logical_volumes,
std::vector<DevicePtr<cuda::Transformation3D>> const & transforms,
std::vector<DevicePtr<cuda::VPlacedVolume>> const & in_gpu_ptrs) const override { }
#endif
};
bool PlacedRootVolume::Contains(Vector3D<Precision> const &point) const
{
const Vector3D<Precision> local = GetTransformation()->Transform(point);
return UnplacedContains(local);
}
bool PlacedRootVolume::Contains(Vector3D<Precision> const &point, Vector3D<Precision> &localPoint) const
{
localPoint = GetTransformation()->Transform(point);
return UnplacedContains(localPoint);
}
bool PlacedRootVolume::UnplacedContains(Vector3D<Precision> const &point) const
{
return GetRootShape()->Contains(&Vector3D<double>(point)[0]);
}
EnumInside PlacedRootVolume::Inside(Vector3D<Precision> const &point) const
{
const Vector3D<Precision> local = GetTransformation()->Transform(point);
return (UnplacedContains(local)) ? static_cast<EnumInside>(EInside::kInside)
: static_cast<EnumInside>(EInside::kOutside);
}
Precision PlacedRootVolume::DistanceToIn(Vector3D<Precision> const &position, Vector3D<Precision> const &direction,
const Precision stepMax) const
{
Vector3D<double> positionLocal = GetTransformation()->Transform(position);
Vector3D<double> directionLocal = GetTransformation()->TransformDirection(direction);
return GetRootShape()->DistFromOutside(&positionLocal[0], &directionLocal[0], 3);
}
VECGEOM_FORCE_INLINE
Precision PlacedRootVolume::DistanceToOut(Vector3D<Precision> const &position, Vector3D<Precision> const &direction,
const Precision stepMax) const
{
return GetRootShape()->DistFromInside(&Vector3D<double>(position)[0], &Vector3D<double>(direction)[0], 3);
}
VECGEOM_FORCE_INLINE
Precision PlacedRootVolume::PlacedDistanceToOut(Vector3D<Precision> const &position,
Vector3D<Precision> const &direction, const Precision stepMax) const
{
Vector3D<double> positionLocal = GetTransformation()->Transform(position);
Vector3D<double> directionLocal = GetTransformation()->TransformDirection(direction);
return GetRootShape()->DistFromInside(&positionLocal[0], &directionLocal[0], 3);
}
VECGEOM_FORCE_INLINE
Precision PlacedRootVolume::SafetyToOut(Vector3D<Precision> const &position) const
{
Vector3D<double> position_local = GetTransformation()->Transform(position);
return GetRootShape()->Safety(&position_local[0], true);
}
VECGEOM_FORCE_INLINE
Precision PlacedRootVolume::SafetyToIn(Vector3D<Precision> const &position) const
{
Vector3D<double> position_local = GetTransformation()->Transform(position);
return GetRootShape()->Safety(&position_local[0], false);
}
} // namespace cxx
} // namespace vecgeom
#endif // VECGEOM_VOLUMES_PLACEDROOTVOLUME_H_
|