/** Executes the algorithm. Moving detectors of input workspace to positions indicated in table workspace * * @throw FileError Thrown if unable to get instrument from workspace, * table workspace is incompatible with instrument */ void ApplyCalibration::exec() { // Get pointers to the workspace, parameter map and table API::MatrixWorkspace_sptr inputWS = getProperty("Workspace"); m_pmap = &(inputWS->instrumentParameters()); // Avoids a copy if you get the reference before the instrument API::ITableWorkspace_sptr PosTable = getProperty("PositionTable"); Geometry::Instrument_const_sptr instrument = inputWS->getInstrument(); if(!instrument) { throw std::runtime_error("Workspace to apply calibration to has no defined instrument"); } size_t numDetector = PosTable->rowCount(); ColumnVector<int> detID = PosTable->getVector("Detector ID"); ColumnVector<V3D> detPos = PosTable->getVector("Detector Position"); // numDetector needs to be got as the number of rows in the table and the detID got from the (i)th row of table. for (size_t i = 0; i < numDetector; ++i) { setDetectorPosition(instrument, detID[i], detPos[i], false ); } // Ensure pointer is only valid for execution m_pmap = NULL; }
void LoadHelper::rotateComponent(API::MatrixWorkspace_sptr ws, const std::string &componentName, const Kernel::Quat & rot) { try { Geometry::Instrument_const_sptr instrument = ws->getInstrument(); Geometry::IComponent_const_sptr component = instrument->getComponentByName(componentName); //g_log.debug() << tube->getName() << " : t = " << theta << " ==> t = " << newTheta << "\n"; Geometry::ParameterMap& pmap = ws->instrumentParameters(); Geometry::ComponentHelper::rotateComponent(*component, pmap, rot, 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"); } }