18#include <nexus/NeXusFile.hpp>
19#include <nexus/NeXusException.hpp>
42 setNumberOfDetectorGroups(0);
51 :
IPeaksWorkspace(other), m_peaks(other.m_peaks), m_columns(), m_columnNames(), m_coordSystem(other.m_coordSystem) {
74 const auto &col = name.first;
75 const bool ascending = name.second;
76 bool lessThan =
false;
83 lessThan = (valA < valB);
123 if (peakNum >=
static_cast<int>(
m_peaks.size()) || peakNum < 0) {
124 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::removePeak(): peakNum is out of range.");
133 if (badPeaks.empty())
140 return std::any_of(badPeaks.cbegin(), badPeaks.cend(), [ip](int badPeak) { return badPeak == ip; });
142 m_peaks.erase(it, m_peaks.end());
179 if (peakNum >=
static_cast<int>(
m_peaks.size()) || peakNum < 0) {
180 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getPeak(): peakNum is out of range.");
191 if (peakNum >=
static_cast<int>(
m_peaks.size()) || peakNum < 0) {
192 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getPeak(): peakNum is out of range.");
205 boost::optional<double>)
const {
216std::unique_ptr<Geometry::IPeak>
236 std::unique_ptr<IPeak> peak = std::make_unique<LeanElasticPeak>(
position,
run().getGoniometer().getR());
277 const V3D qSampleFrame = lattice.getUB() *
HKL * 2 * M_PI;
280 std::unique_ptr<IPeak> peak = std::make_unique<LeanElasticPeak>(qSampleFrame, goniometer.getR());
283 peak->setIntHKL(peak->getHKL());
328 const std::string peaksIntegrated =
"PeaksIntegrated";
329 if (this->
run().hasProperty(peaksIntegrated)) {
330 const auto value = boost::lexical_cast<int>(this->
run().getProperty(peaksIntegrated)->
value());
387 for (
size_t i = 0; i <
m_columns.size(); i++)
390 throw std::invalid_argument(
"Column named " + name +
" was not found in the LeanElasticPeaksWorkspace.");
397 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getColumn() called with invalid index.");
405 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getColumn() called with invalid index.");
412 const size_t np(
m_peaks.size());
415 std::vector<double> H(np);
416 std::vector<double> K(np);
417 std::vector<double> L(np);
418 std::vector<double> intensity(np);
419 std::vector<double> sigmaIntensity(np);
420 std::vector<double> binCount(np);
421 std::vector<double> waveLength(np);
422 std::vector<double> scattering(np);
423 std::vector<double> dSpacing(np);
424 std::vector<int> runNumber(np);
425 std::vector<int> peakNumber(np);
426 std::vector<double> tbar(np);
427 std::vector<double> goniometerMatrix(9 * np);
428 std::vector<std::string> shapes(np);
429 std::vector<double> qlabs(3 * np);
432 size_t maxShapeJSONLength = 0;
433 for (
size_t i = 0; i < np; i++) {
449 goniometerMatrix[9 * i] = gm[0][0];
450 goniometerMatrix[9 * i + 1] = gm[1][0];
451 goniometerMatrix[9 * i + 2] = gm[2][0];
452 goniometerMatrix[9 * i + 3] = gm[0][1];
453 goniometerMatrix[9 * i + 4] = gm[1][1];
454 goniometerMatrix[9 * i + 5] = gm[2][1];
455 goniometerMatrix[9 * i + 6] = gm[0][2];
456 goniometerMatrix[9 * i + 7] = gm[1][2];
457 goniometerMatrix[9 * i + 8] = gm[2][2];
460 shapes[i] = shapeJSON;
461 if (shapeJSON.size() > maxShapeJSONLength) {
462 maxShapeJSONLength = shapeJSON.size();
472 const std::string specifyInteger =
"An integer";
473 const std::string specifyDouble =
"A double";
474 const std::string specifyString =
"A string";
475 file->makeGroup(
"peaks_workspace",
"NXentry",
479 file->writeData(
"coordinate_system",
static_cast<uint32_t
>(
m_coordSystem));
484 file->putAttr(
"QConvention", m_QConvention);
487 file->writeData(
"column_1", H);
488 file->openData(
"column_1");
489 file->putAttr(
"name",
"H");
490 file->putAttr(
"interpret_as", specifyDouble);
491 file->putAttr(
"units",
"Not known");
495 file->writeData(
"column_2", K);
496 file->openData(
"column_2");
497 file->putAttr(
"name",
"K");
498 file->putAttr(
"interpret_as", specifyDouble);
499 file->putAttr(
"units",
"Not known");
503 file->writeData(
"column_3", L);
504 file->openData(
"column_3");
505 file->putAttr(
"name",
"L");
506 file->putAttr(
"interpret_as", specifyDouble);
507 file->putAttr(
"units",
"Not known");
511 file->writeData(
"column_4", intensity);
512 file->openData(
"column_4");
513 file->putAttr(
"name",
"Intensity");
514 file->putAttr(
"interpret_as", specifyDouble);
515 file->putAttr(
"units",
"Not known");
519 file->writeData(
"column_5", sigmaIntensity);
520 file->openData(
"column_5");
521 file->putAttr(
"name",
"Sigma Intensity");
522 file->putAttr(
"interpret_as", specifyDouble);
523 file->putAttr(
"units",
"Not known");
527 file->writeData(
"column_6", binCount);
528 file->openData(
"column_6");
529 file->putAttr(
"name",
"Bin Count");
530 file->putAttr(
"interpret_as", specifyDouble);
531 file->putAttr(
"units",
"Not known");
535 file->writeData(
"column_7", waveLength);
536 file->openData(
"column_7");
537 file->putAttr(
"name",
"Wave Length");
538 file->putAttr(
"interpret_as", specifyDouble);
539 file->putAttr(
"units",
"Not known");
543 file->writeData(
"column_8", scattering);
544 file->openData(
"column_8");
545 file->putAttr(
"name",
"Scattering");
546 file->putAttr(
"interpret_as", specifyDouble);
547 file->putAttr(
"units",
"Not known");
551 file->writeData(
"column_9", dSpacing);
552 file->openData(
"column_9");
553 file->putAttr(
"name",
"D Spacing");
554 file->putAttr(
"interpret_as", specifyDouble);
555 file->putAttr(
"units",
"Not known");
559 file->writeData(
"column_10", runNumber);
560 file->openData(
"column_10");
561 file->putAttr(
"name",
"Run Number");
562 file->putAttr(
"interpret_as", specifyInteger);
563 file->putAttr(
"units",
"Not known");
567 file->writeData(
"column_11", peakNumber);
568 file->openData(
"column_11");
569 file->putAttr(
"name",
"Peak Number");
570 file->putAttr(
"interpret_as", specifyInteger);
571 file->putAttr(
"units",
"Not known");
575 file->writeData(
"column_12", tbar);
576 file->openData(
"column_12");
577 file->putAttr(
"name",
"TBar");
578 file->putAttr(
"interpret_as", specifyDouble);
579 file->putAttr(
"units",
"Not known");
583 std::vector<int> array_dims;
584 array_dims.emplace_back(
static_cast<int>(
m_peaks.size()));
585 array_dims.emplace_back(9);
586 file->writeData(
"column_13", goniometerMatrix, array_dims);
587 file->openData(
"column_13");
588 file->putAttr(
"name",
"Goniometer Matrix");
589 file->putAttr(
"interpret_as",
"A matrix of 3x3 doubles");
590 file->putAttr(
"units",
"Not known");
594 std::vector<int64_t> dims;
595 dims.emplace_back(np);
596 dims.emplace_back(
static_cast<int>(maxShapeJSONLength));
597 const std::string name =
"column_14";
598 file->makeData(name, NeXus::CHAR, dims,
false);
599 file->openData(name);
601 auto toNexus =
new char[maxShapeJSONLength * np];
602 for (
size_t ii = 0; ii < np; ii++) {
603 std::string rowStr = shapes[ii];
604 for (
size_t ic = 0; ic < rowStr.size(); ic++)
605 toNexus[ii * maxShapeJSONLength + ic] = rowStr[ic];
606 for (
size_t ic = rowStr.size(); ic <
static_cast<size_t>(maxShapeJSONLength); ic++)
607 toNexus[ii * maxShapeJSONLength + ic] =
' ';
610 file->putData((
void *)(toNexus));
613 file->putAttr(
"units",
"Not known");
614 file->putAttr(
"name",
"Shape");
615 file->putAttr(
"interpret_as", specifyString);
619 std::vector<int> qlab_dims;
620 qlab_dims.emplace_back(
static_cast<int>(
m_peaks.size()));
621 qlab_dims.emplace_back(9);
622 file->writeData(
"column_15", qlabs, qlab_dims);
623 file->openData(
"column_15");
624 file->putAttr(
"name",
"Q LabFrame");
625 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
626 file->putAttr(
"units",
"angstrom^-1");
672IPropertyManager::getValue<Mantid::DataObjects::LeanElasticPeaksWorkspace_sptr>(
const std::string &name)
const {
674 getPointerToProperty(name));
678 std::string message =
679 "Attempt to assign property " + name +
" to incorrect type. Expected shared_ptr<LeanElasticPeaksWorkspace>.";
680 throw std::runtime_error(message);
686IPropertyManager::getValue<Mantid::DataObjects::LeanElasticPeaksWorkspace_const_sptr>(
const std::string &name)
const {
688 getPointerToProperty(name));
690 return prop->operator()();
692 std::string message =
"Attempt to assign property " + name +
693 " to incorrect type. Expected const "
694 "shared_ptr<LeanElasticPeaksWorkspace>.";
695 throw std::runtime_error(message);
double value
The value of the point.
std::map< DeltaEMode::Type, std::string > index
#define DLLExport
Definitions of the DLLImport compiler directives for MSVC.
#define DECLARE_WORKSPACE(classname)
Run & mutableRun()
Writable version of the run object.
const Run & run() const
Run details object access.
const Sample & sample() const
Sample accessors.
int getRunNumber() const
Utility method to get the run number.
void setNumberOfDetectorGroups(const size_t count) const
Sets the number of detector groups.
Interface to the class Mantid::DataObjects::PeaksWorkspace.
ITableWorkspace is an implementation of Workspace in which the data are organised in columns of same ...
This class contains the information about the log entries.
const Geometry::Goniometer & getGoniometer() const
Return reference to the first const Goniometer object for this run.
const Geometry::OrientedLattice & getOrientedLattice() const
Get a reference to the sample's OrientedLattice.
double getL() const override
Get the L index of the peak.
double getIntensity() const override
Return the integrated peak intensity.
double getAbsorptionWeightedPathLength() const override
Gets the absorption weighted path length.
double getSigmaIntensity() const override
Return the error on the integrated peak intensity.
double getK() const override
Get the K index of the peak.
int getPeakNumber() const override
Returns the unique peak number Returns -1 if it could not find it.
int getRunNumber() const override
Return the run number this peak was measured at.
double getH() const override
Get the H index of the peak.
double getBinCount() const override
Return the # of counts in the bin at its peak.
Mantid::Kernel::Matrix< double > getGoniometerMatrix() const override
Get the goniometer rotation matrix at which this peak was measured.
const Mantid::Geometry::PeakShape & getPeakShape() const override
Get the peak shape.
virtual double getValueByColName(std::string colName) const
Helper function for displaying/sorting peaks.
Structure describing a single-crystal peak.
double getWavelength() const override
Return the neutron wavelength (in angstroms)
Mantid::Kernel::V3D getQLabFrame() const override
Return the Q change (of the lattice, k_i - k_f) for this peak.
double getScattering() const override
Calculate the scattering angle of the peak
double getDSpacing() const override
Calculate the d-spacing of the peak, in 1/Angstroms
The class LeanElasticPeaksWorkspace stores information about a set of SCD lean peaks.
int peakInfoNumber(const Kernel::V3D &qFrame, bool labCoords) const override
Returns selected information for a "peak" at QLabFrame.
std::unique_ptr< Geometry::IPeak > createPeakQSample(const Kernel::V3D &position) const override
Creates an instance of a Peak BUT DOES NOT ADD IT TO THE WORKSPACE.
bool hasIntegratedPeaks() const override
Getter for the integration status.
API::ITableWorkspace_sptr createDetectorTable() const override
Creates a new TableWorkspace giving the IDs of the detectors that contribute to the peaks within the ...
std::unique_ptr< Geometry::IPeak > createPeak() const override
Create a Peak using default values.
void initColumns()
Initialize the table structure.
std::vector< std::pair< std::string, std::string > > peakInfo(const Kernel::V3D &qFrame, bool labCoords) const override
Returns selected information for a "peak" at QLabFrame.
std::shared_ptr< Mantid::API::Column > getColumn(const std::string &name) override
Gets the shared pointer to a column by name.
API::LogManager_sptr logs() override
Get access to shared pointer containing workspace porperties.
void setCoordinateSystem(const Kernel::SpecialCoordinateSystem coordinateSystem) override
Set the special coordinate system.
int getNumberPeaks() const override
Kernel::SpecialCoordinateSystem m_coordSystem
Coordinates.
void sort(std::vector< ColumnAndDirection > &criteria) override
Sort the peaks by one or more criteria.
std::vector< std::string > m_columnNames
Column names.
void removePeak(int peakNum) override
Removes the indicated peak.
void removePeaks(std::vector< int > badPeaks) override
Removes multiple peaks.
void saveNexus(::NeXus::File *file) const override
LeanElasticPeak & getPeak(int peakNum) override
Return a reference to the Peak.
size_t getMemorySize() const override
Return the memory used in bytes.
std::vector< std::shared_ptr< Mantid::DataObjects::PeakColumn< LeanElasticPeak > > > m_columns
Column shared pointers.
void addPeak(const Geometry::IPeak &peak) override
Add a peak to the list.
std::vector< LeanElasticPeak > m_peaks
Vector of Peak contained within.
std::unique_ptr< Geometry::IPeak > createPeakHKL(const Kernel::V3D &HKL) const override
Create a Peak from a HKL value provided by the client.
LeanElasticPeaksWorkspace()
Register the workspace as a type.
API::LogManager_const_sptr getLogs() const override
Get constant access to shared pointer containing workspace porperties; Copies logs into new LogManage...
std::pair< std::string, bool > ColumnAndDirection
std::vector< LeanElasticPeak > & getPeaks()
Return a reference to the Peaks vector.
ITableWorkspace * doCloneColumns(const std::vector< std::string > &colNames) const override
Kernel::SpecialCoordinateSystem getSpecialCoordinateSystem() const override
Get the special coordinate system.
virtual size_t getColumnIndex(const std::string &name) const
std::string getConvention() const override
void addPeakColumn(const std::string &name)
Adds a new PeakColumn of the given type.
PeakColumn : a Column sub-class used to display peak information as a TableWorkspace.
Comparator class for sorting peaks by one or more criteria.
PeakComparator(std::vector< ColumnAndDirection > &criteria)
Constructor for the comparator for sorting peaks.
LeanElasticPeaksWorkspace::ColumnAndDirection ColumnAndDirection
bool operator()(const LeanElasticPeak &a, const LeanElasticPeak &b)
Compare two peaks using the stored criteria.
std::vector< ColumnAndDirection > & criteria
Structure describing a single-crystal peak.
virtual std::string toJSON() const =0
Serialize.
Marks code as not implemented yet.
The concrete, templated class for properties.
constexpr double X() const noexcept
Get x.
constexpr double Y() const noexcept
Get y.
constexpr double Z() const noexcept
Get z.
std::shared_ptr< const LogManager > LogManager_const_sptr
shared pointer to the logManager base class (const version)
std::shared_ptr< LogManager > LogManager_sptr
shared pointer to the logManager base class
std::shared_ptr< ITableWorkspace > ITableWorkspace_sptr
shared pointer to Mantid::API::ITableWorkspace
std::shared_ptr< LeanElasticPeaksWorkspace > LeanElasticPeaksWorkspace_sptr
Typedef for a shared pointer to a peaks workspace.
std::shared_ptr< const LeanElasticPeaksWorkspace > LeanElasticPeaksWorkspace_const_sptr
Typedef for a shared pointer to a const peaks workspace.
SpecialCoordinateSystem
Special coordinate systems for Q3D.