/** Execute the algorithm. */ void CalculateDIFC::exec() { DataObjects::OffsetsWorkspace_const_sptr offsetsWs = getProperty("OffsetsWorkspace"); API::ITableWorkspace_const_sptr calibWs = getProperty("CalibrationWorkspace"); API::MatrixWorkspace_sptr inputWs = getProperty("InputWorkspace"); API::MatrixWorkspace_sptr outputWs = getProperty("OutputWorkspace"); if ((!bool(inputWs == outputWs)) || (!bool(boost::dynamic_pointer_cast<SpecialWorkspace2D>(outputWs)))) { outputWs = boost::dynamic_pointer_cast<MatrixWorkspace>( boost::make_shared<SpecialWorkspace2D>(inputWs->getInstrument())); outputWs->setTitle("DIFC workspace"); } // convert to actual type being used DataObjects::SpecialWorkspace2D_sptr outputSpecialWs = boost::dynamic_pointer_cast<DataObjects::SpecialWorkspace2D>(outputWs); API::Progress progress(this, 0.0, 1.0, inputWs->getNumberHistograms()); if (bool(calibWs)) { calculateFromTable(progress, *outputSpecialWs, *calibWs); } else { // this method handles calculating from instrument geometry as well const auto &detectorInfo = inputWs->detectorInfo(); calculateFromOffset(progress, *outputSpecialWs, offsetsWs.get(), detectorInfo); } setProperty("OutputWorkspace", outputWs); }
/** * Calculates the 1D diffractogram based on the supplied function * * This method takes a fit function and checks whether it implements the * IPoldiFunction1D interface. If that's the case, it calculates the * diffractogram based on the function. * * @param fitFunction :: IFunction that also implements IPoldiFunction1D. * @param workspace :: Workspace with POLDI raw data. * @return :: Q-based diffractogram. */ MatrixWorkspace_sptr PoldiFitPeaks2D::get1DSpectrum( const IFunction_sptr &fitFunction, const API::MatrixWorkspace_sptr &workspace) const { // Check whether the function is of correct type boost::shared_ptr<IPoldiFunction1D> poldiFunction = boost::dynamic_pointer_cast<IPoldiFunction1D>(fitFunction); if (!poldiFunction) { throw std::invalid_argument("Can only process Poldi2DFunctions."); } // And that we have an instrument available if (!m_poldiInstrument) { throw std::runtime_error("No POLDI instrument available."); } PoldiAbstractDetector_sptr detector(new PoldiDeadWireDecorator( workspace->detectorInfo(), m_poldiInstrument->detector())); std::vector<int> indices = detector->availableElements(); // Create the grid for the diffractogram and corresponding domain/values double lambdaMin = getProperty("LambdaMin"); double lambdaMax = getProperty("LambdaMax"); PoldiDGrid grid(detector, m_poldiInstrument->chopper(), m_deltaT, std::make_pair(lambdaMin, lambdaMax)); FunctionDomain1DVector domain(grid.grid()); FunctionValues values(domain); // Calculate 1D function poldiFunction->poldiFunction1D(indices, domain, values); // Create and return Q-based workspace with spectrum return getQSpectrum(domain, values); }