/** * * @param detectorInfo A reference to the workspace's detector info * @param detIndex The index of the detector whose parameters should be updated * @param pmap A reference to the ParameterMap instance to update * @param l2 The new l2 value * @param theta The new theta value * @param phi The new phi value * @param delay The new delay time * @param pressure The new pressure value * @param thickness The new thickness value */ void LoadDetectorInfo::updateParameterMap(Geometry::DetectorInfo &detectorInfo, const size_t detIndex, Geometry::ParameterMap &pmap, const double l2, const double theta, const double phi, const double delay, const double pressure, const double thickness) const { const auto detCompID = detectorInfo.detector(detIndex).getComponentID(); // store detector params that are different to instrument level if (fabs(delay - m_instDelta) > 1e-06) pmap.addDouble(detCompID, DELAY_PARAM, delay); if (fabs(pressure - m_instPressure) > 1e-06) pmap.addDouble(detCompID, PRESSURE_PARAM, pressure); if (fabs(thickness - m_instThickness) > 1e-06) pmap.addDouble(detCompID, THICKNESS_PARAM, thickness); // move if (m_moveDets) { V3D newPos; newPos.spherical(l2, theta, phi); // The sample position may not be at 0,0,0 newPos += m_samplePos; detectorInfo.setPosition(detIndex, newPos); } }
void LoadILLIndirect::moveComponent(const std::string &componentName, double twoTheta, double offSet) { try { Geometry::Instrument_const_sptr instrument = m_localWorkspace->getInstrument(); Geometry::IComponent_const_sptr component = instrument->getComponentByName(componentName); double r, theta, phi, newTheta, newR; V3D oldPos = component->getPos(); oldPos.getSpherical(r, theta, phi); newTheta = twoTheta; newR = offSet; V3D newPos; newPos.spherical(newR, newTheta, phi); // g_log.debug() << tube->getName() << " : t = " << theta << " ==> t = " << // newTheta << "\n"; Geometry::ParameterMap &pmap = m_localWorkspace->instrumentParameters(); Geometry::ComponentHelper::moveComponent( *component, pmap, newPos, Geometry::ComponentHelper::Absolute); } catch (Mantid::Kernel::Exception::NotFoundError &) { throw std::runtime_error("Error when trying to move the " + componentName + " : NotFoundError"); } catch (std::runtime_error &) { throw std::runtime_error("Error when trying to move the " + componentName + " : runtime_error"); } }
/** * Executes the algorithm * */ void ConvertToConstantL2::exec() { initWorkspaces(); // Calculate the number of spectra in this workspace const size_t numberOfSpectra = m_inputWS->getNumberHistograms(); API::Progress prog(this, 0.0, 1.0, numberOfSpectra); int64_t numberOfSpectra_i = static_cast<int64_t>(numberOfSpectra); // cast to make openmp happy const auto &inputSpecInfo = m_inputWS->spectrumInfo(); auto &outputDetInfo = m_outputWS->mutableDetectorInfo(); // Loop over the histograms (detector spectra) PARALLEL_FOR_IF(Kernel::threadSafe(*m_inputWS, *m_outputWS)) for (int64_t i = 0; i < numberOfSpectra_i; ++i) { PARALLEL_START_INTERUPT_REGION m_outputWS->setHistogram(i, m_inputWS->histogram(i)); // Should not move the monitors if (inputSpecInfo.isMonitor(i)) continue; // Throw if detector doesn't exist or is a group if (!inputSpecInfo.hasUniqueDetector(i)) { const auto errorMsg = boost::format("The detector for spectrum number %d was either not " "found, or is a group.") % i; throw std::runtime_error(errorMsg.str()); } // subract the diference in l2 double thisDetL2 = inputSpecInfo.l2(i); double deltaL2 = std::abs(thisDetL2 - m_l2); double deltaTOF = calculateTOF(deltaL2); deltaTOF *= 1e6; // micro sec // position - set all detector distance to constant l2 double r, theta, phi; V3D oldPos = inputSpecInfo.position(i); oldPos.getSpherical(r, theta, phi); V3D newPos; newPos.spherical(m_l2, theta, phi); const auto detIndex = inputSpecInfo.spectrumDefinition(i)[0]; outputDetInfo.setPosition(detIndex, newPos); m_outputWS->mutableX(i) -= deltaTOF; prog.report("Aligning elastic line..."); PARALLEL_END_INTERUPT_REGION } // end for i PARALLEL_CHECK_INTERUPT_REGION this->setProperty("OutputWorkspace", this->m_outputWS); }
/** Creates or modifies the parameter map for the specified detector adding * pressure and wall thickness information * @param params :: these will be written to the detector paraments 3He(atm)=pressure) and wallT(m)=wall thickness * @param change :: if the parameters are successfully changed they are stored here * @throw NotFoundError if a pointer to the specified detector couldn't be retrieved */ void LoadDetectorInfo::setDetectorParams(const detectorInfo ¶ms, detectorInfo &change) { Geometry::IDetector_sptr det; try { det = boost::const_pointer_cast<IDetector>(m_workspace->getInstrument()->baseInstrument()->getDetector(params.detID)); } catch( std::runtime_error &e) { throw Exception::NotFoundError(e.what(), params.detID); } Geometry::ParameterMap &pmap = m_workspace->instrumentParameters(); // Set the detectors pressure. pmap.addDouble(det->getComponentID(), "3He(atm)", params.pressure); // Set the wall thickness pmap.addDouble(det->getComponentID(), "wallT(m)", params.wallThick); // If we have a l2, theta and phi. Update the postion if required if( m_moveDets && params.l2 != DBL_MAX && params.theta != DBL_MAX && params.phi != DBL_MAX ) { V3D newPos; newPos.spherical(params.l2, params.theta, params.phi); // The sample position may not be at 0,0,0 newPos += m_samplePos; IComponent_const_sptr parent = det->getParent(); if (parent) { newPos -= parent->getPos(); Quat rot = parent->getRotation(); rot.inverse(); rot.rotate(newPos); } det->setPos(newPos); } // this operation has been successful if we are here, the following infomation is usefull for logging change = params; }
/** * * @param pmap A reference to the ParameterMap instance to update * @param det A pointer to the detector whose parameters should be updated * @param l2 The new l2 value * @param theta The new theta value * @param phi The new phi value * @param delay The new delay time * @param pressure The new pressure value * @param thickness The new thickness value */ void LoadDetectorInfo::updateParameterMap(Geometry::ParameterMap & pmap, const Geometry::IDetector_const_sptr & det, const double l2, const double theta, const double phi, const double delay, const double pressure, const double thickness) const { // store detector params that are different to instrument level if(fabs(delay - m_instDelta) > 1e-06) pmap.addDouble(det->getComponentID(), DELAY_PARAM, delay); if(fabs(pressure - m_instPressure) > 1e-06) pmap.addDouble(det->getComponentID(), PRESSURE_PARAM, pressure); if(fabs(thickness - m_instThickness) > 1e-06) pmap.addDouble(det->getComponentID(), THICKNESS_PARAM, thickness); // move if(m_moveDets) { V3D newPos; newPos.spherical(l2, theta, phi); // The sample position may not be at 0,0,0 newPos += m_samplePos; ComponentHelper::moveComponent(*det, pmap, newPos, ComponentHelper::Absolute); } }