/** Method calculates averaged polar coordinates of the detector's group (which may consist of one detector) *@param spDet -- shared pointer to the Mantid Detector *@param Observer -- sample position or the centre of the polar system of coordinates to calculate detector's parameters. *@param Detector -- return Detector class containing averaged polar coordinates of the detector or detector's group in spherical coordinate system with centre at Observer */ void FindDetectorsPar::calcDetPar(const Geometry::IDetector_const_sptr &spDet, const Kernel::V3D &Observer, DetParameters &Detector) { // get number of basic detectors within the composit detector size_t nDetectors = spDet->nDets(); // define summator AvrgDetector detSum; // do we want spherical or linear box sizes? detSum.setUseSpherical(!m_SizesAreLinear); if (nDetectors == 1) { detSum.addDetInfo(spDet, Observer); } else { // access contributing detectors; Geometry::DetectorGroup_const_sptr spDetGroup = boost::dynamic_pointer_cast<const Geometry::DetectorGroup>(spDet); if (!spDetGroup) { g_log.error() << "calc_cylDetPar: can not downcast IDetector_sptr to " "detector group for det->ID: " << spDet->getID() << std::endl; throw(std::bad_cast()); } auto detectors = spDetGroup->getDetectors(); auto it = detectors.begin(); auto it_end = detectors.end(); for (; it != it_end; it++) { detSum.addDetInfo(*it, Observer); } } // calculate averages and return the detector parameters detSum.returnAvrgDetPar(Detector); }
/** Method calculates averaged polar coordinates of the detector's group (which may consist of one detector) *@param det -- reference to the Mantid Detector *@param Observer -- sample position or the centre of the polar system of coordinates to calculate detector's parameters. *@param Detector -- return Detector class containing averaged polar coordinates of the detector or detector's group in spherical coordinate system with centre at Observer */ void FindDetectorsPar::calcDetPar(const Geometry::IDetector &det, const Kernel::V3D &Observer, DetParameters &Detector) { // get number of basic detectors within the composit detector size_t nDetectors = det.nDets(); // define summator AvrgDetector detSum; // do we want spherical or linear box sizes? detSum.setUseSpherical(!m_SizesAreLinear); if (nDetectors == 1) { detSum.addDetInfo(det, Observer); } else { // access contributing detectors; auto detGroup = dynamic_cast<const Geometry::DetectorGroup *>(&det); if (!detGroup) { g_log.error() << "calc_cylDetPar: can not downcast IDetector_sptr to " "detector group for det->ID: " << det.getID() << '\n'; throw(std::bad_cast()); } for (const auto &det : detGroup->getDetectors()) { detSum.addDetInfo(*det, Observer); } } // calculate averages and return the detector parameters detSum.returnAvrgDetPar(Detector); }