9#include "MantidDataObjects/DllConfig.h"
10#include "MantidHistogramData/Histogram.h"
26namespace DataObjects {
93MANTID_DATAOBJECTS_DLL HistogramData::Histogram
stripData(HistogramData::Histogram histogram);
95template <
class T> std::unique_ptr<T>
createHelper() {
return std::make_unique<T>(); }
99template <> MANTID_DATAOBJECTS_DLL std::unique_ptr<API::HistoWorkspace>
createHelper();
102template <> MANTID_DATAOBJECTS_DLL std::unique_ptr<EventWorkspace>
createHelper();
104template <> MANTID_DATAOBJECTS_DLL std::unique_ptr<API::MatrixWorkspace>
createHelper();
115 const HistogramData::Histogram &histArg);
123template <
class UseIndexInfo>
130template <
class T,
class P,
class IndexArg,
class HistArg,
131 class =
typename std::enable_if<std::is_base_of<API::MatrixWorkspace, P>::value>::type>
132std::unique_ptr<T>
create(
const P &parent,
const IndexArg &indexArg,
const HistArg &histArg) {
137 std::unique_ptr<T> ws;
138 if (std::is_base_of<API::HistoWorkspace, T>::value && parent.id() ==
"EventWorkspace") {
140 ws = detail::createHelper<T>();
144 ws =
dynamic_cast<const T &
>(parent).cloneEmpty();
145 }
catch (std::bad_cast &) {
147 ws = detail::createConcreteHelper<T>();
156 ws->setInstrument(parent.getInstrument());
157 ws->initialize(indexArg, HistogramData::Histogram(histArg));
158 detail::initializeFromParent<typename detail::IsIndexInfo<IndexArg>::type>(parent, *ws);
166template <
class T,
class IndexArg,
class HistArg,
167 typename std::enable_if<!std::is_base_of<API::MatrixWorkspace, IndexArg>::value>::type * =
nullptr>
168std::unique_ptr<T>
create(
const IndexArg &indexArg,
const HistArg &histArg) {
169 auto ws = std::make_unique<T>();
170 ws->initialize(indexArg, HistogramData::Histogram(histArg));
174template <
class T,
class IndexArg,
class HistArg,
175 typename std::enable_if<!std::is_base_of<API::MatrixWorkspace, IndexArg>::value>::type * =
nullptr>
176std::unique_ptr<T>
create(
const std::shared_ptr<const Geometry::Instrument> &instrument,
const IndexArg &indexArg,
177 const HistArg &histArg) {
178 auto ws = std::make_unique<T>();
179 ws->setInstrument(std::move(instrument));
180 ws->initialize(indexArg, HistogramData::Histogram(histArg));
184template <class T, class P, typename std::enable_if<std::is_base_of<API::MatrixWorkspace, P>::value>::type * =
nullptr>
186 const auto numHistograms = parent.getNumberHistograms();
189 auto histArg = HistogramData::Histogram(parent.histogram(0).xMode(), parent.histogram(0).yMode());
191 auto ws = create<T>(parent, numHistograms, histArg);
192 for (
size_t i = 0; i < numHistograms; ++i) {
193 ws->resizeHistogram(i, parent.histogramSize(i));
194 ws->setSharedX(i, parent.sharedX(i));
199template <class T, class P, typename std::enable_if<std::is_base_of<API::MatrixWorkspace, P>::value>::type * =
nullptr>
200std::unique_ptr<T>
create(
const P &parent) {
201 if (parent.isRaggedWorkspace())
202 return createRagged<T>(parent);
204 const auto numHistograms = parent.getNumberHistograms();
205 auto ws = create<T>(parent, numHistograms,
detail::stripData(parent.histogram(0)));
206 for (
size_t i = 0; i < numHistograms; ++i) {
207 ws->setSharedX(i, parent.sharedX(i));
215template <class T, class P, typename std::enable_if<std::is_base_of<API::MatrixWorkspace, P>::value>::type * =
nullptr>
216std::unique_ptr<T>
create(
const P &parent,
const HistogramData::Histogram &histogram) {
217 return create<T>(parent, parent.getNumberHistograms(), histogram);
220template <class T, class P, typename std::enable_if<std::is_base_of<API::MatrixWorkspace, P>::value>::type * =
nullptr>
221std::unique_ptr<T>
create(
const P &parent,
const HistogramData::BinEdges &binEdges) {
222 return create<T>(parent, parent.getNumberHistograms(), binEdges);
225template <class T, class P, typename std::enable_if<std::is_base_of<API::MatrixWorkspace, P>::value>::type * =
nullptr>
226std::unique_ptr<T>
create(
const P &parent,
const HistogramData::Points &points) {
227 return create<T>(parent, parent.getNumberHistograms(), points);
IPeaksWorkspace_sptr workspace
Base MatrixWorkspace Abstract Class.
MANTID_DATAOBJECTS_DLL HistogramData::Histogram stripData(HistogramData::Histogram histogram)
void initializeFromParent(const API::MatrixWorkspace &parent, API::MatrixWorkspace &workspace)
Initialize a MatrixWorkspace from its parent including instrument, unit, number of spectra and Run.
std::unique_ptr< T > createHelper()
std::unique_ptr< T > createConcreteHelper()
void fixDistributionFlag(API::MatrixWorkspace &, const HistArg &)
std::unique_ptr< T > createRagged(const P &parent)
std::unique_ptr< T > create(const P &parent, const IndexArg &indexArg, const HistArg &histArg)
This is the create() method that all the other create() methods call.
Helper class which provides the Collimation Length for SANS instruments.