/** 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(const Geometry::IDetector &det, double &detRadius, Kernel::V3D &detAxis) { boost::shared_ptr<const Geometry::Object> shape_sptr = det.shape(); if (!shape_sptr) { throw std::runtime_error( "Detector geometry error: detector with id: " + std::to_string(det.getID()) + " does not have shape. Is this a detectors group?\n" "The algorithm works for instruments with one-to-one " "spectra-to-detector maps only!"); } 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; }
/** * 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; }
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; } double yDist = distToSurface( V3D(0, DIST_TO_UNIVERSE_EDGE, 0), shape_sptr.get() ); if ( std::abs(yDist - zDist) < 1e-8 ) { detRadius = yDist/2.0; detAxis = V3D(1,0,0); // assume that y and z are radi of the cylinder's circular cross-section and the axis is perpendicular, in the x direction PARALLEL_CRITICAL(deteff_shapecacheb) { m_shapeCache.insert(std::pair<const Object *,std::pair<double, V3D> >(shape_sptr.get(), std::pair<double, V3D>(detRadius, detAxis))); } return; } if ( std::abs(xDist - yDist) < 1e-8 ) { detRadius = xDist/2.0;