Newer
Older
#include "DD4hep/objects/DetectorInterna.h"
#include "DDRec/MaterialManager.h"
#include <exception>
#include "TGeoMatrix.h"
#include "TGeoShape.h"
#include "TRotation.h"
//TGeoTrd1 is apparently not included by defautl
#include "TGeoTrd1.h"
namespace DD4hep {
namespace DDRec {
using namespace Geometry ;
//======================================================================================================
void VolSurfaceBase::setU(const Vector3D& u_val) { _u = u_val ; }
void VolSurfaceBase::setV(const Vector3D& v_val) { _v = v_val ; }
void VolSurfaceBase::setNormal(const Vector3D& n) { _n = n ; }
void VolSurfaceBase::setOrigin(const Vector3D& o) { _o = o ; }
long64 VolSurfaceBase::id() const { return _id ; }
const SurfaceType& VolSurfaceBase::type() const { return _type ; }
Vector3D VolSurfaceBase::u(const Vector3D& /*point*/) const { return _u ; }
Vector3D VolSurfaceBase::v(const Vector3D& /*point*/) const { return _v ; }
Vector3D VolSurfaceBase::normal(const Vector3D& /*point*/) const { return _n ; }
const Vector3D& VolSurfaceBase::origin() const { return _o ;}
Vector2D VolSurfaceBase::globalToLocal( const Vector3D& point) const {
Vector3D p = point - origin() ;
// create new orthogonal unit vectors
// FIXME: these vectors should be cached really ...
double uv = u() * v() ;
Vector3D uprime = ( u() - uv * v() ).unit() ;
Vector3D vprime = ( v() - uv * u() ).unit() ;
double uup = u() * uprime ;
double vvp = v() * vprime ;
return Vector2D( p*uprime / uup , p*vprime / vvp ) ;
Vector3D VolSurfaceBase::localToGlobal( const Vector2D& point) const {
Vector3D g = origin() + point[0] * u() + point[1] * v() ;
return g ;
}
const IMaterial& VolSurfaceBase::innerMaterial() const{ return _innerMat ; }
const IMaterial& VolSurfaceBase::outerMaterial() const { return _outerMat ; }
double VolSurfaceBase::innerThickness() const { return _th_i ; }
double VolSurfaceBase::outerThickness() const { return _th_o ; }
double VolSurfaceBase::length_along_u() const {
const DDSurfaces::Vector3D& u_val = this->u( o ) ;
DDSurfaces::Vector3D um = -1. * u_val ;
double dist_p = 0. ;
double dist_m = 0. ;
// std::cout << " VolSurfaceBase::length_along_u() : o = " << o << " u = " << this->u( o )
// << " -u = " << um << std::endl ;
if( volume()->GetShape()->Contains( o.const_array() ) ){
dist_p = volume()->GetShape()->DistFromInside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( u_val.const_array() ) ) ;
dist_m = volume()->GetShape()->DistFromInside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( um.array() ) ) ;
// std::cout << " VolSurfaceBase::length_along_u() : shape contains(o) = " << volume()->GetShape()->Contains( o.const_array() )
// << " dist_p " << dist_p
// << " dist_m " << dist_m
// << std::endl ;
} else{
dist_p = volume()->GetShape()->DistFromOutside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( u_val.const_array() ) ) ;
dist_m = volume()->GetShape()->DistFromOutside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( um.array() ) ) ;
dist_p *= 1.0001 ;
dist_m *= 1.0001 ;
// std::cout << " VolSurfaceBase::length_along_u() : shape contains(o) = " << volume()->GetShape()->Contains( o.const_array() )
// << " dist_p " << dist_p
// << " dist_m " << dist_m
// << std::endl ;
DDSurfaces::Vector3D o_1 = this->origin() + dist_p * u_val ;
DDSurfaces::Vector3D o_2 = this->origin() + dist_m * um ;
dist_p += volume()->GetShape()->DistFromInside( const_cast<double*> ( o_1.const_array() ) ,
const_cast<double*> ( u_val.const_array() ) ) ;
dist_m += volume()->GetShape()->DistFromInside( const_cast<double*> ( o_2.const_array() ) ,
const_cast<double*> ( um.array() ) ) ;
// std::cout << " VolSurfaceBase::length_along_u() : shape contains(o) = " << volume()->GetShape()->Contains( o.const_array() )
// << " dist_p " << dist_p
// << " dist_m " << dist_m
// << std::endl ;
}
double VolSurfaceBase::length_along_v() const {
const DDSurfaces::Vector3D& v_val = this->v( o ) ;
DDSurfaces::Vector3D vm = -1. * v_val ;
double dist_p = 0. ;
double dist_m = 0. ;
// std::cout << " VolSurfaceBase::length_along_u() : o = " << o << " u = " << this->u( o )
// << " -u = " << vm << std::endl ;
if( volume()->GetShape()->Contains( o.const_array() ) ){
dist_p = volume()->GetShape()->DistFromInside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( v_val.const_array() ) ) ;
dist_m = volume()->GetShape()->DistFromInside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( vm.array() ) ) ;
// std::cout << " VolSurfaceBase::length_along_u() : shape contains(o) = " << volume()->GetShape()->Contains( o.const_array() )
// << " dist_p " << dist_p
// << " dist_m " << dist_m
// << std::endl ;
} else{
dist_p = volume()->GetShape()->DistFromOutside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( v_val.const_array() ) ) ;
dist_m = volume()->GetShape()->DistFromOutside( const_cast<double*> ( o.const_array() ) ,
const_cast<double*> ( vm.array() ) ) ;
dist_p *= 1.0001 ;
dist_m *= 1.0001 ;
// std::cout << " VolSurfaceBase::length_along_u() : shape contains(o) = " << volume()->GetShape()->Contains( o.const_array() )
// << " dist_p " << dist_p
// << " dist_m " << dist_m
// << std::endl ;
DDSurfaces::Vector3D o_1 = this->origin() + dist_p * v_val ;
DDSurfaces::Vector3D o_2 = this->origin() + dist_m * vm ;
dist_p += volume()->GetShape()->DistFromInside( const_cast<double*> ( o_1.const_array() ) ,
const_cast<double*> ( v_val.const_array() ) ) ;
dist_m += volume()->GetShape()->DistFromInside( const_cast<double*> ( o_2.const_array() ) ,
const_cast<double*> ( vm.array() ) ) ;
// std::cout << " VolSurfaceBase::length_along_u() : shape contains(o) = " << volume()->GetShape()->Contains( o.const_array() )
// << " dist_p " << dist_p
// << " dist_m " << dist_m
// << std::endl ;
}
double VolSurfaceBase::distance(const Vector3D& /*point*/ ) const { return 1.e99 ; }
/// Checks if the given point lies within the surface
bool VolSurfaceBase::insideBounds(const Vector3D& point, double epsilon) const {
double dist = std::abs ( distance( point ) ) ;
Loading
Loading full blame...