/** Update the shape cache if necessary * @param det :: a pointer to the detector to query * @param detRadius :: An output parameter that contains the detector radius * @param detAxis :: An output parameter that contains the detector axis vector */ void DetectorEfficiencyCor::getDetectorGeometry(const Geometry::IDetector_const_sptr & det, double & detRadius, V3D & detAxis) { boost::shared_ptr<const Object> shape_sptr = det->shape(); if(!shape_sptr->hasValidShape()) { throw Exception::NotFoundError("Shape", "Detector has no shape"); } std::map<const Geometry::Object *, std::pair<double, Kernel::V3D> >::const_iterator it = m_shapeCache.find(shape_sptr.get()); if( it == m_shapeCache.end() ) { double xDist = distToSurface( V3D(DIST_TO_UNIVERSE_EDGE, 0, 0), shape_sptr.get() ); double zDist = distToSurface( V3D(0, 0, DIST_TO_UNIVERSE_EDGE), shape_sptr.get() ); if ( std::abs(zDist - xDist) < 1e-8 ) { detRadius = zDist/2.0; detAxis = V3D(0,1,0); // assume radi in z and x and the axis is in the y PARALLEL_CRITICAL(deteff_shapecachea) { m_shapeCache.insert(std::pair<const Object *,std::pair<double, V3D> >(shape_sptr.get(), std::pair<double, V3D>(detRadius, detAxis))); } return; }
/** * Update the shape cache if necessary * @param det :: a pointer to the detector to query * @param detRadius :: An output parameter that contains the detector radius * @param detAxis :: An output parameter that contains the detector axis vector */ void He3TubeEfficiency::getDetectorGeometry(\ Geometry::IDetector_const_sptr det, double & detRadius, Kernel::V3D & detAxis) { boost::shared_ptr<const Geometry::Object> shape_sptr = det->shape(); std::map<const Geometry::Object *, std::pair<double, Kernel::V3D> >::const_iterator it = this->shapeCache.find(shape_sptr.get()); if( it == this->shapeCache.end() ) { double xDist = distToSurface( Kernel::V3D(DIST_TO_UNIVERSE_EDGE, 0, 0), shape_sptr.get() ); double zDist = distToSurface( Kernel::V3D(0, 0, DIST_TO_UNIVERSE_EDGE), shape_sptr.get() ); if ( std::abs(zDist - xDist) < 1e-8 ) { detRadius = zDist / 2.0; detAxis = Kernel::V3D(0, 1, 0); // assume radii in z and x and the axis is in the y PARALLEL_CRITICAL(deteff_shapecachea) { this->shapeCache.insert(std::pair<const Geometry::Object *, std::pair<double, Kernel::V3D> >(shape_sptr.get(), std::pair<double, Kernel::V3D>(detRadius, detAxis))); } return; }