Skip to content
Snippets Groups Projects
CreateSampleShape.cpp 2.18 KiB
Newer Older
/*WIKI* 

Creates a shape object that defines the sample and sets the sample for the given workspace. Shapes are defined using XML descriptions that can be found [[HowToDefineGeometricShape|here]].


*WIKI*/
//--------------------------------
// Includes
//--------------------------------
#include "MantidDataHandling/CreateSampleShape.h"
Nick Draper's avatar
Nick Draper committed
#include "MantidGeometry/Objects/ShapeFactory.h"

namespace Mantid
{
namespace DataHandling
{
  // Register the algorithm into the AlgorithmFactory
  
  /// Sets documentation strings for this algorithm
  void CreateSampleShape::initDocs()
  {
    this->setWikiSummary("Create a shape object to model the sample. ");
    this->setOptionalMessage("Create a shape object to model the sample.");
  }
  
  using namespace Mantid::DataHandling;
  using namespace Mantid::API;
  /**
   * Initialize the algorithm
   */
  void CreateSampleShape::init()
    using namespace Mantid::Kernel;
    declareProperty(
        new WorkspaceProperty<MatrixWorkspace>("InputWorkspace","",Direction::Input),
        "The workspace with which to associate the sample ");
    declareProperty("ShapeXML","",new MandatoryValidator<std::string>(),
        "The XML that describes the shape" );

  /**
   * Execute the algorithm
   */
  void CreateSampleShape::exec()
    // Get the input workspace
    MatrixWorkspace_sptr workspace = getProperty("InputWorkspace");
    // Get the XML definition
    std::string shapeXML = getProperty("ShapeXML");
    Geometry::ShapeFactory sFactory;
    // Create the object
    boost::shared_ptr<Geometry::Object> shape_sptr = sFactory.createShape(shapeXML);
    // Check it's valid and attach it to the workspace sample
    if( shape_sptr->hasValidShape() )
    {
      workspace->mutableSample().setShape(*shape_sptr);
    }
    else
    {
      g_log.warning() << "Object has invalid shape. TopRule = " << shape_sptr->topRule()
              << ", number of surfaces = " << shape_sptr->getSurfacePtr().size() << "\n";
      throw std::runtime_error("Shape object is invalid, cannot attach it to workspace.");
    }
    // Done!
    progress(1);