Skip to content
Snippets Groups Projects
Workspace2D.cpp 8.51 KiB
Newer Older
Stuart Ansell's avatar
Stuart Ansell committed
#include "MantidDataObjects/Workspace2D.h"
#include "MantidKernel/Exception.h"
Nick Draper's avatar
Nick Draper committed
#include "MantidAPI/LocatedDataRef.h"
Nick Draper's avatar
Nick Draper committed
#include "MantidAPI/WorkspaceIterator.h"
#include "MantidAPI/WorkspaceIteratorCode.h"
Nick Draper's avatar
Nick Draper committed
#include "MantidAPI/WorkspaceProperty.h"
#include "MantidAPI/WorkspaceFactory.h"
Nick Draper's avatar
Nick Draper committed
  namespace DataObjects
  {
    // Get a reference to the logger
    Kernel::Logger& Workspace2D::g_log = Kernel::Logger::get("Workspace2D");

Nick Draper's avatar
Nick Draper committed
    /// Constructor
    Workspace2D::Workspace2D()
Nick Draper's avatar
Nick Draper committed
    ///Destructor
    Workspace2D::~Workspace2D()
    {}

    /** Sets the size of the workspace and initializes arrays to zero
    *  @param NVectors The number of vectors/histograms/detectors in the workspace
    *  @param XLength The number of X data points/bin boundaries in each vector (must all be the same)
    *  @param YLength The number of data/error points in each vector (must all be the same)
    */
    void Workspace2D::init(const int &NVectors, const int &XLength, const int &YLength)
    {
      m_noVectors = NVectors;
      data.resize(m_noVectors);
      m_axes.resize(2);
      m_axes[0] = new API::RefAxis(XLength, this);
      // This axis is always a spectra one for now
      m_axes[1] = new API::Axis(API::AxisType::Spectra,m_noVectors);

      Histogram1D::RCtype t1,t2;
      t1.access().resize(XLength); //this call initializes array to zero
Nick Draper's avatar
Nick Draper committed
      t2.access().resize(YLength);
Nick Draper's avatar
Nick Draper committed
      {
        this->setX(i,t1);
        // Y,E arrays populated
        this->setData(i,t2,t2);
Nick Draper's avatar
Nick Draper committed
      }
    }
Nick Draper's avatar
Nick Draper committed
    /**
Stuart Ansell's avatar
Stuart Ansell committed
    Set the x values
    \param histnumber :: Index to the histogram
    \param Vec :: Shared ptr base object
Nick Draper's avatar
Nick Draper committed
    */
Nick Draper's avatar
Nick Draper committed
      Workspace2D::setX(const int histnumber, const Histogram1D::RCtype::ptr_type& Vec)
    {
      if (histnumber<0 || histnumber>=m_noVectors)
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::setX, histogram number out of range");
Nick Draper's avatar
Nick Draper committed
      data[histnumber].setX(Vec);
Nick Draper's avatar
Nick Draper committed
      return;
    }

    /**
    Set the x values
    \param histnumber :: Index to the histogram
    \param PA :: Reference counted histogram
Nick Draper's avatar
Nick Draper committed
    */
Nick Draper's avatar
Nick Draper committed
      Workspace2D::setX(const int histnumber, const Histogram1D::RCtype& PA)
    {
      if (histnumber<0 || histnumber>=m_noVectors)
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::setX, histogram number out of range");
Nick Draper's avatar
Nick Draper committed
      data[histnumber].setX(PA);
Nick Draper's avatar
Nick Draper committed
      return;
    }
Nick Draper's avatar
Nick Draper committed
    /**
    Sets the data in the workspace
Nick Draper's avatar
Nick Draper committed
    \param histnumber The histogram to be set
Nick Draper's avatar
Nick Draper committed
    */
Nick Draper's avatar
Nick Draper committed
      Workspace2D::setData(const int histnumber, const Histogram1D::RCtype& PY)
    {
      if (histnumber<0 || histnumber>=m_noVectors)
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::setData, histogram number out of range");
Stuart Ansell's avatar
Stuart Ansell committed

Nick Draper's avatar
Nick Draper committed
      data[histnumber].setData(PY);
    }
Nick Draper's avatar
Nick Draper committed
    /**
    Sets the data in the workspace
Nick Draper's avatar
Nick Draper committed
    \param histnumber The histogram to be set
Nick Draper's avatar
Nick Draper committed
    \param PE A reference containing the corresponding errors
    */
    void Workspace2D::setData(const int histnumber, const Histogram1D::RCtype& PY,
Nick Draper's avatar
Nick Draper committed
      const Histogram1D::RCtype& PE)
    {
      if (histnumber<0 || histnumber>=m_noVectors)
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::setData, histogram number out of range");
Stuart Ansell's avatar
Stuart Ansell committed

Nick Draper's avatar
Nick Draper committed
      data[histnumber].setData(PY,PE);
      return;
    }
Nick Draper's avatar
Nick Draper committed
    /**
Nick Draper's avatar
Nick Draper committed
    Sets the data in the workspace
Nick Draper's avatar
Nick Draper committed
    \param histnumber The histogram to be set
Nick Draper's avatar
Nick Draper committed
    \param PE A reference containing the corresponding errors
    */
    void Workspace2D::setData(const int histnumber, const Histogram1D::RCtype::ptr_type& PY,
Nick Draper's avatar
Nick Draper committed
      const Histogram1D::RCtype::ptr_type& PE)
    {
      if (histnumber<0 || histnumber>=m_noVectors)
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::setData, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      data[histnumber].setData(PY,PE);
      return;
    }
Nick Draper's avatar
Nick Draper committed
    /** Gets the number of histograms
    \return Integer
    */
Nick Draper's avatar
Nick Draper committed
    {
      return getHistogramNumberHelper();
    }
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
    /**
    Get the x data of a specified histogram
    @param index The number of the histogram
    @return A vector of doubles containing the x data
    */
Nick Draper's avatar
Nick Draper committed
      Workspace2D::dataX(const int index) const
    {
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::dataX, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      return data[index].dataX();
    }
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
    /**
    Get the y data of a specified histogram
    @param index The number of the histogram
    @return A vector of doubles containing the y data
    */
Nick Draper's avatar
Nick Draper committed
      Workspace2D::dataY(const int index) const
    {
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::dataY, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      return data[index].dataY();
    }
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
    /**
    Get the error data for a specified histogram
    @param index The number of the histogram
    @return A vector of doubles containing the error data
    */
Nick Draper's avatar
Nick Draper committed
      Workspace2D::dataE(const int index) const
    {
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::dataE, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      return data[index].dataE();
    }
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
    /// get pseudo size
    int Workspace2D::size() const
    {
      return data.size() * blocksize();
    }
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
    ///get the size of each vector
    int Workspace2D::blocksize() const
    {
      return (data.size() > 0) ? data[0].size() : 0;
    }
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
    ///Returns the x data
    MantidVec& Workspace2D::dataX(int const index)
Nick Draper's avatar
Nick Draper committed
    {
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::dataX, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      return data[index].dataX();
    }
Nick Draper's avatar
Nick Draper committed
    ///Returns the y data
    MantidVec& Workspace2D::dataY(int const index)
Nick Draper's avatar
Nick Draper committed
    {
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::dataY, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      return data[index].dataY();
    }
Nick Draper's avatar
Nick Draper committed
    ///Returns the error data
    MantidVec& Workspace2D::dataE(int const index)
Nick Draper's avatar
Nick Draper committed
    {
Nick Draper's avatar
Nick Draper committed
        throw std::range_error("Workspace2D::dataE, histogram number out of range");
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
      return data[index].dataE();
    }
    
    /// Returns a pointer to the x data
    Kernel::cow_ptr<MantidVec> Workspace2D::refX(const int index) const
    {
      if (index<0 || index>=m_noVectors)
        throw std::range_error("Workspace2D::refX, histogram number out of range");

      return data[index].ptrX();      
    }
Nick Draper's avatar
Nick Draper committed

    /** Returns the number of histograms.
    For some reason Visual Studio couldn't deal with the main getHistogramNumber() method
Nick Draper's avatar
Nick Draper committed
    being virtual so it now just calls this private (and virtual) method which does the work.
    */
    const int Workspace2D::getHistogramNumberHelper() const
    {
      return static_cast<const int>(data.size());
    }

  } // namespace DataObjects
Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed

Nick Draper's avatar
Nick Draper committed
///\cond TEMPLATE
Nick Draper's avatar
Nick Draper committed
template DLLExport class Mantid::API::workspace_iterator<Mantid::API::LocatedDataRef, Mantid::DataObjects::Workspace2D>;
template DLLExport class Mantid::API::workspace_iterator<const Mantid::API::LocatedDataRef, const Mantid::DataObjects::Workspace2D>;
Nick Draper's avatar
Nick Draper committed

template DLLExport class Mantid::API::WorkspaceProperty<Mantid::DataObjects::Workspace2D>;
Nick Draper's avatar
Nick Draper committed
  namespace Kernel
Nick Draper's avatar
Nick Draper committed
  {
Nick Draper's avatar
Nick Draper committed
    template<> DLLExport
    Mantid::DataObjects::Workspace2D_sptr IPropertyManager::getValue<Mantid::DataObjects::Workspace2D_sptr>(const std::string &name) const
Nick Draper's avatar
Nick Draper committed
    {
      PropertyWithValue<Mantid::DataObjects::Workspace2D_sptr>* prop =
Nick Draper's avatar
Nick Draper committed
        dynamic_cast<PropertyWithValue<Mantid::DataObjects::Workspace2D_sptr>*>(getPointerToProperty(name));
      if (prop)
      {
        return *prop;
      }
      else
      {
        std::string message = "Attempt to assign property "+ name +" to incorrect type";
        throw std::runtime_error(message);
Nick Draper's avatar
Nick Draper committed
      }
    }
Nick Draper's avatar
Nick Draper committed
    template<> DLLExport
    Mantid::DataObjects::Workspace2D_const_sptr IPropertyManager::getValue<Mantid::DataObjects::Workspace2D_const_sptr>(const std::string &name) const
Nick Draper's avatar
Nick Draper committed
    {
      PropertyWithValue<Mantid::DataObjects::Workspace2D_sptr>* prop =
        dynamic_cast<PropertyWithValue<Mantid::DataObjects::Workspace2D_sptr>*>(getPointerToProperty(name));
Nick Draper's avatar
Nick Draper committed
      if (prop)
      {
Nick Draper's avatar
Nick Draper committed
      }
      else
      {
        std::string message = "Attempt to assign property "+ name +" to incorrect type";
        throw std::runtime_error(message);
Nick Draper's avatar
Nick Draper committed
      }
    }
  } // namespace Kernel
Nick Draper's avatar
Nick Draper committed
///\endcond TEMPLATE