Skip to content
Snippets Groups Projects
Workspace2D.cpp 7.91 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/TripleRef.h"
#include "MantidAPI/TripleIterator.h"
#include "MantidAPI/TripleIteratorCode.h"
Nick Draper's avatar
Nick Draper committed
#include "MantidAPI/WorkspaceProperty.h"
/// Constructor
Workspace2D::Workspace2D()
Stuart Ansell's avatar
Stuart Ansell committed
{ }
/// Copy constructor
Stuart Ansell's avatar
Stuart Ansell committed
Workspace2D::Workspace2D(const Workspace2D& A) :
    data(A.data)
{ }

/// Assignment operator
Stuart Ansell's avatar
Stuart Ansell committed
Workspace2D& 
Workspace2D::operator=(const Workspace2D& A)
Stuart Ansell's avatar
Stuart Ansell committed
  if (this!=&A)
    {
      data=A.data;
    }
Stuart Ansell's avatar
Stuart Ansell committed

 ///Destructor
Workspace2D::~Workspace2D()
Stuart Ansell's avatar
Stuart Ansell committed
{}
Stuart Ansell's avatar
Stuart Ansell committed
    Set the histogram count.
    \todo FIX this can't be right since we have not dimensioned the internal arrays
    \param nhist The number of histograms
Stuart Ansell's avatar
Stuart Ansell committed
  */
void 
Workspace2D::setHistogramNumber(const int nhist)
Stuart Ansell's avatar
Stuart Ansell committed
  if (nhist<0) 
    throw std::invalid_argument("Workspace2D::setHistogramNumber, invalid histograms number <0");
  data.resize(nhist);
/**
  Get the amount of memory used by the 2D workspace
  \todo to be changed
*/
Stuart Ansell's avatar
Stuart Ansell committed
long int 
Workspace2D::getMemorySize() const 
Stuart Ansell's avatar
Stuart Ansell committed
  return 0;
Stuart Ansell's avatar
Stuart Ansell committed
    Set the x values
    \param histnumber :: Index to the histogram
    \param Vec :: Vec to set [Should be typedef]
   */
void 
Workspace2D::setX(const int histnumber, const std::vector<double>& Vec)
Stuart Ansell's avatar
Stuart Ansell committed
{
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setX, histogram number out of range");
  
  data[histnumber].dataX()=Vec;
  return;
Stuart Ansell's avatar
Stuart Ansell committed
    Set the x values
    \param histnumber :: Index to the histogram
    \param Vec :: Shared ptr base object
Stuart Ansell's avatar
Stuart Ansell committed
   */
void 
Workspace2D::setX(const int histnumber, const Histogram1D::RCtype::ptr_type& Vec)
Stuart Ansell's avatar
Stuart Ansell committed
{
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setX, histogram number out of range");
  
  data[histnumber].setX(Vec);
  return;
}

 /**
    Set the x values
    \param histnumber :: Index to the histogram
    \param PA :: Reference counted histogram
   */
Stuart Ansell's avatar
Stuart Ansell committed
void 
Workspace2D::setX(const int histnumber, const Histogram1D::RCtype& PA)
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setX, histogram number out of range");
Stuart Ansell's avatar
Stuart Ansell committed

  data[histnumber].setX(PA);
  return;
/**
    Sets the data in the workspace
	\param histnumber The histogram to be set
	\param Vec A vector containing the data	
*/
Stuart Ansell's avatar
Stuart Ansell committed
void 
Workspace2D::setData(const int histnumber, const std::vector<double>& Vec)
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setDAta, histogram number out of range");

  data[histnumber].dataY()=Vec;
/**
    Sets the data in the workspace (including errors)
	\param histnumber The histogram to be set
	\param Vec A vector containing the data	
	\param VecErr A vector containing the corresponding errors
*/
Stuart Ansell's avatar
Stuart Ansell committed
void 
Workspace2D::setData(const int histnumber, const std::vector<double>& Vec, 
		     const std::vector<double>& VecErr)
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setDAta, histogram number out of range");
Stuart Ansell's avatar
Stuart Ansell committed

  data[histnumber].dataY()=Vec;
  data[histnumber].dataE()=VecErr;
Stuart Ansell's avatar
Stuart Ansell committed
  return;
/**
    Sets the data in the workspace
	\param histnumber The histogram to be set
	\param PY A reference counted data range	
*/
Stuart Ansell's avatar
Stuart Ansell committed
void 
Workspace2D::setData(const int histnumber, const Histogram1D::RCtype& PY)
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setX, histogram number out of range");

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

  data[histnumber].setData(PY,PE);
  return;
Nick Draper's avatar
Nick Draper committed

/**
    Sets the data in the workspace
	\param histnumber The histogram to be set
	\param PY A reference counted data range	
	\param PE A reference containing the corresponding errors
*/
void Workspace2D::setData(const int histnumber, const Histogram1D::RCtype::ptr_type& PY, 
			  const Histogram1D::RCtype::ptr_type& PE)
{
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::setX, histogram number out of range");

  data[histnumber].setData(PY,PE);
  return;
}


/** Gets the number of histograms
	\return Integer
*/
Stuart Ansell's avatar
Stuart Ansell committed
const int 
Workspace2D::getHistogramNumber() const
Stuart Ansell's avatar
Stuart Ansell committed
  return static_cast<const int>(data.size());
/**
	Get the x data of a specified histogram
	\param histnumber The number of the histogram
	\return A vector of doubles containing the x data
*/
Stuart Ansell's avatar
Stuart Ansell committed
const std::vector<double>& 
Workspace2D::getX(int histnumber) const
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::getX, histogram number out of range");

  return data[histnumber].dataX();
Stuart Ansell's avatar
Stuart Ansell committed

/**
	Get the y data of a specified histogram
	\param histnumber The number of the histogram
	\return A vector of doubles containing the y data
*/
Stuart Ansell's avatar
Stuart Ansell committed
const std::vector<double>& 
Workspace2D::getY(int histnumber) const
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::getY, histogram number out of range");

  return data[histnumber].dataY();
Stuart Ansell's avatar
Stuart Ansell committed

/**
	Get the error data for a specified histogram
	\param histnumber The number of the histogram
	\return A vector of doubles containing the error data
*/
Stuart Ansell's avatar
Stuart Ansell committed
const std::vector<double>& 
Workspace2D::getE(int histnumber) const
Stuart Ansell's avatar
Stuart Ansell committed
  if (histnumber<0 || histnumber>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::getY, histogram number out of range");

  return data[histnumber].dataE();
Nick Draper's avatar
Nick Draper committed
/// get pseudo size
int Workspace2D::size() const 
{ 
  int retVal = data.size();
  //if not empty
  if (retVal > 0)
  {
    //get the first entry multiply by its size
    retVal *= data[0].size();
  }
  return retVal; 
} 

Nick Draper's avatar
Nick Draper committed
///get the size of each vector
int Workspace2D::blocksize() const
{
  int retVal = 1000000000;
  //if not empty
  if (data.size() > 0)
  {
    //set the reteurn value to the length of the first vector
    retVal = data[0].size();
  }
  return retVal; 
}

std::vector<double>& Workspace2D::dataX(int const index)
{
  if (index<0 || index>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::dataX, histogram number out of range");

  return data[index].dataX();
}
///Returns the y data
std::vector<double>& Workspace2D::dataY(int const index)
{
  if (index<0 || index>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::dataY, histogram number out of range");

  return data[index].dataY();
}
///Returns the error data
std::vector<double>& Workspace2D::dataE(int const index)
{
  if (index<0 || index>=static_cast<int>(data.size()))
    throw std::range_error("Workspace2D::dataE, histogram number out of range");

  return data[index].dataE();
}

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::triple_iterator<Mantid::DataObjects::Workspace2D>;
Nick Draper's avatar
Nick Draper committed

template DLLExport class Mantid::API::WorkspaceProperty<Mantid::DataObjects::Workspace2D>;
template<> DLLExport
Mantid::DataObjects::Workspace2D* PropertyManager::getValue<Mantid::DataObjects::Workspace2D*>(const std::string &name) const
{
  PropertyWithValue<Mantid::DataObjects::Workspace2D*> *prop = 
          dynamic_cast<PropertyWithValue<Mantid::DataObjects::Workspace2D*>*>(getPointerToProperty(name));
  if (prop)
  {
    return *prop;
  }
  else
  {
    throw std::runtime_error("Attempt to assign property of incorrect type");
  }
}
} // namespace Kernel
} // namespace Mantid

Nick Draper's avatar
Nick Draper committed
///\endcond TEMPLATE