Newer
Older
#include "MantidAlgorithms/CalculateDIFC.h"
#include "MantidDataObjects/SpecialWorkspace2D.h"
#include "MantidGeometry/IDetector.h"
namespace Mantid {
namespace Algorithms {
using Mantid::API::MatrixWorkspace;
using Mantid::API::WorkspaceProperty;
using Mantid::DataObjects::OffsetsWorkspace;
using Mantid::DataObjects::OffsetsWorkspace_sptr;
using Mantid::DataObjects::SpecialWorkspace2D;
using Mantid::DataObjects::SpecialWorkspace2D_sptr;
using Mantid::Geometry::Instrument_const_sptr;
using Mantid::Kernel::Direction;
// Register the algorithm into the AlgorithmFactory
DECLARE_ALGORITHM(CalculateDIFC)
//----------------------------------------------------------------------------------------------
/** Constructor
*/
CalculateDIFC::CalculateDIFC() {}
//----------------------------------------------------------------------------------------------
/** Destructor
*/
CalculateDIFC::~CalculateDIFC() {}
//----------------------------------------------------------------------------------------------
/// Algorithms name for identification. @see Algorithm::name
const std::string CalculateDIFC::name() const { return "CalculateDIFC"; }
/// Algorithm's version for identification. @see Algorithm::version
int CalculateDIFC::version() const { return 1; }
/// Algorithm's category for identification. @see Algorithm::category
const std::string CalculateDIFC::category() const { return "Diffraction"; }
/// Algorithm's summary for use in the GUI and help. @see Algorithm::summary
const std::string CalculateDIFC::summary() const {
return "Calculate the DIFC for every pixel";
//----------------------------------------------------------------------------------------------
/** Initialize the algorithm's properties.
*/
void CalculateDIFC::init() {
declareProperty(new WorkspaceProperty<MatrixWorkspace>("InputWorkspace", "",
Direction::Input),
"Name of the workspace to have DIFC calculated from");
declareProperty(new WorkspaceProperty<MatrixWorkspace>("OutputWorkspace", "",
Direction::Output),
"Workspace containing DIFC for each pixel");
new WorkspaceProperty<OffsetsWorkspace>(
"OffsetsWorkspace", "", Direction::Input,
Mantid::API::PropertyMode::Optional),
"Optional: A OffsetsWorkspace containing the calibration offsets. Either "
"this or CalibrationFile needs to be specified.");
}
//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
*/
void CalculateDIFC::exec() {
m_offsetsWS = getProperty("OffsetsWorkspace");
createOutputWorkspace();
calculate();
setProperty("OutputWorkspace", m_outputWS);
}
void CalculateDIFC::createOutputWorkspace() {
m_inputWS = getProperty("InputWorkspace");
m_outputWS = getProperty("OutputWorkspace");
if (bool(boost::dynamic_pointer_cast<SpecialWorkspace2D>(m_outputWS))
&& !bool(m_inputWS == m_outputWS)) {
m_outputWS = boost::dynamic_pointer_cast<MatrixWorkspace>(SpecialWorkspace2D_sptr(
new SpecialWorkspace2D(m_inputWS->getInstrument())));
m_outputWS->setTitle("DIFC workspace");
}
return;
}
void CalculateDIFC::calculate() {
Instrument_const_sptr instrument = m_inputWS->getInstrument();
SpecialWorkspace2D_sptr localWS =
boost::dynamic_pointer_cast<SpecialWorkspace2D>(m_outputWS);
double l1;
Kernel::V3D beamline, samplePos;
double beamline_norm;
instrument->getInstrumentParameters(l1, beamline, beamline_norm, samplePos);
// To get all the detector ID's
detid2det_map allDetectors;
instrument->getDetectors(allDetectors);
// Now go through all
detid2det_map::const_iterator it = allDetectors.begin();
for (; it != allDetectors.end(); ++it) {
Geometry::IDetector_const_sptr det = it->second;
if ((!det->isMasked()) && (!det->isMonitor())) {
const detid_t detID = it->first;
double offset = 0.;
if (m_offsetsWS)
offset = m_offsetsWS->getValue(detID, 0.);
double difc = Geometry::Instrument::calcConversion(
l1, beamline, beamline_norm, samplePos, det, offset);
difc = 1. / difc; // calcConversion gives 1/DIFC
localWS->setValue(detID, difc);
}
}
} // namespace Algorithms