Newer
Older
#include "MantidVatesAPI/MDHWInMemoryLoadingPresenter.h"
#include "MantidGeometry/MDGeometry/MDGeometryXMLBuilder.h"
#include "MantidVatesAPI/FactoryChains.h"
#include "MantidVatesAPI/MDLoadingView.h"
#include "MantidVatesAPI/MetaDataExtractorUtils.h"
#include "MantidVatesAPI/ProgressAction.h"
#include "MantidVatesAPI/WorkspaceProvider.h"
#include "MantidVatesAPI/vtkDataSetFactory.h"
#include "vtkStructuredGrid.h"
#include "vtkUnsignedCharArray.h"
#include "vtkUnstructuredGrid.h"
namespace Mantid {
namespace VATES {
/*
Constructor
@param view : MVP view
@param repository : Object for accessing the workspaces
@param wsName : Name of the workspace to use.
@throw invalid_argument if the workspace name is empty
@throw invalid_argument if the repository is null
@throw invalid_arument if view is null
*/
MDHWInMemoryLoadingPresenter::MDHWInMemoryLoadingPresenter(
std::unique_ptr<MDLoadingView> view, WorkspaceProvider *repository,
std::string wsName)
: MDHWLoadingPresenter(std::move(view)), m_repository(repository),
m_wsName(wsName), m_wsTypeName(""), m_specialCoords(-1) {
throw std::invalid_argument("The workspace name is empty.");
throw std::invalid_argument("The repository is NULL");
}
throw std::invalid_argument("View is NULL.");
}
}
/*
Indicates whether this presenter is capable of handling the type of file that is
attempted to be loaded.
@return false if the file cannot be read.
*/
bool MDHWInMemoryLoadingPresenter::canReadFile() const {
bool bCanReadIt = true;
if (!m_repository->canProvideWorkspace(m_wsName)) {
// The workspace does not exist.
bCanReadIt = false;
} else if (boost::dynamic_pointer_cast<Mantid::API::IMDHistoWorkspace>(
m_repository->fetchWorkspace(m_wsName))) {
// The workspace can be found, but is not an IMDHistoWorkspace.
} else {
// The workspace is present, and is of the correct type.
}
return bCanReadIt;
}
/*
Executes the underlying algorithm to create the MVP model.
@param factory : visualisation factory to use.
@param : Handler for GUI updates while algorithm progresses.
@param drawingProgressUpdate : Handler for GUI updates while
vtkDataSetFactory::create occurs.
*/
vtkSmartPointer<vtkDataSet>
MDHWInMemoryLoadingPresenter::execute(vtkDataSetFactory *factory,
ProgressAction &,
ProgressAction &drawingProgressUpdate) {
using namespace Mantid::API;
using namespace Mantid::Geometry;
Workspace_sptr ws = m_repository->fetchWorkspace(m_wsName);
IMDHistoWorkspace_sptr histoWs =
boost::dynamic_pointer_cast<Mantid::API::IMDHistoWorkspace>(ws);
MDHWLoadingPresenter::transposeWs(histoWs, m_cachedVisualHistoWs);
// factory->setRecursionDepth(this->m_view->getRecursionDepth());
auto visualDataSet = factory->oneStepCreate(
m_cachedVisualHistoWs,
drawingProgressUpdate); // HACK: progressUpdate should be
// argument for drawing!
/*extractMetaData needs to be re-run here because the first execution of this
from ::executeLoadMetadata will not have ensured that all dimensions
have proper range extents set.
*/
this->extractMetadata(*m_cachedVisualHistoWs);
// Transposed workpace is temporary, outside the ADS, and does not have a
// name. so get it from pre-transposed.
// If this fails, create a default name with a time stamp
auto name = histoWs->getName();
if (name.empty()) {
name = createTimeStampedName("HistoWS");
}
this->appendMetadata(visualDataSet, name);
/**
Executes any meta-data loading required.
*/
void MDHWInMemoryLoadingPresenter::executeLoadMetadata() {
using namespace Mantid::API;
Workspace_sptr ws = m_repository->fetchWorkspace(m_wsName);
IMDHistoWorkspace_sptr histoWs =
boost::dynamic_pointer_cast<Mantid::API::IMDHistoWorkspace>(ws);
m_wsTypeName = histoWs->id();
m_specialCoords = histoWs->getSpecialCoordinateSystem();
MDHWLoadingPresenter::transposeWs(histoWs, m_cachedVisualHistoWs);
// Set the instrument which is associated with the workspace.
m_metadataJsonManager->setInstrument(
m_metaDataExtractor->extractInstrument(m_cachedVisualHistoWs.get()));
// Set the special coordinates
m_metadataJsonManager->setSpecialCoordinates(m_specialCoords);
// Call base-class extraction method.
this->extractMetadata(*m_cachedVisualHistoWs);
/// Destructor
MDHWInMemoryLoadingPresenter::~MDHWInMemoryLoadingPresenter() {}
/*
* Getter for the workspace type name.
* @return Workspace Type Name
*/
std::string MDHWInMemoryLoadingPresenter::getWorkspaceTypeName() {
return m_wsTypeName;
}
/**
* Getter for the special coordinates.
* @return the special coordinates value
*/
int MDHWInMemoryLoadingPresenter::getSpecialCoordinates() {
return m_specialCoords;
}
std::vector<int> MDHWInMemoryLoadingPresenter::getExtents() {
using namespace Mantid::API;
Workspace_sptr ws = m_repository->fetchWorkspace(m_wsName);
IMDHistoWorkspace_sptr histoWs =
boost::dynamic_pointer_cast<Mantid::API::IMDHistoWorkspace>(ws);
MDHWLoadingPresenter::transposeWs(histoWs, m_cachedVisualHistoWs);
extents[1] =
static_cast<int>(m_cachedVisualHistoWs->getXDimension()->getNBins());
extents[3] =
static_cast<int>(m_cachedVisualHistoWs->getYDimension()->getNBins());
extents[5] =
static_cast<int>(m_cachedVisualHistoWs->getZDimension()->getNBins());