11#include "MantidDataObjects/DllConfig.h"
17#include "MantidNexus/NexusFile.h"
37 setNumberOfDetectorGroups(0);
46 :
IPeaksWorkspace(other), m_peaks(other.m_peaks), m_columns(), m_columnNames(), m_coordSystem(other.m_coordSystem) {
69 const auto &col =
name.first;
70 const bool ascending =
name.second;
71 bool lessThan =
false;
78 lessThan = (valA < valB);
118 if (peakNum >=
static_cast<int>(
m_peaks.size()) || peakNum < 0) {
119 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::removePeak(): peakNum is out of range.");
128 if (badPeaks.empty())
135 return std::any_of(badPeaks.cbegin(), badPeaks.cend(), [ip](int badPeak) { return badPeak == ip; });
137 m_peaks.erase(it, m_peaks.end());
174 if (peakNum >=
m_peaks.size()) {
175 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getPeak(): peakNum is out of range.");
186 if (peakNum >=
m_peaks.size()) {
187 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getPeak(): peakNum is out of range.");
200 std::optional<double>)
const {
211std::unique_ptr<Geometry::IPeak>
231 std::unique_ptr<IPeak> peak = std::make_unique<LeanElasticPeak>(
position,
run().getGoniometer().getR());
272 const V3D qSampleFrame = lattice.getUB() *
HKL * 2 * M_PI;
275 std::unique_ptr<IPeak> peak = std::make_unique<LeanElasticPeak>(qSampleFrame, goniometer.getR());
278 peak->setIntHKL(peak->getHKL());
323 const std::string peaksIntegrated =
"PeaksIntegrated";
324 if (this->
run().hasProperty(peaksIntegrated)) {
325 const auto value = boost::lexical_cast<int>(this->
run().getProperty(peaksIntegrated)->
value());
388 throw std::invalid_argument(
"Column named " +
name +
" was not found in the LeanElasticPeaksWorkspace.");
395 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getColumn() called with invalid index.");
403 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getColumn() called with invalid index.");
410 const size_t np(
m_peaks.size());
413 std::vector<double> H(np);
414 std::vector<double> K(np);
415 std::vector<double> L(np);
417 std::vector<double> sigmaIntensity(np);
418 std::vector<double> binCount(np);
419 std::vector<double> waveLength(np);
420 std::vector<double> scattering(np);
421 std::vector<double> dSpacing(np);
422 std::vector<int> runNumber(np);
423 std::vector<int> peakNumber(np);
424 std::vector<double> tbar(np);
425 std::vector<double> intHKL(3 * np);
426 std::vector<double> intMNP(3 * np);
427 std::vector<double> goniometerMatrix(9 * np);
428 std::vector<std::string> shapes(np);
429 std::vector<double> qlabs(3 * np);
430 std::vector<double> monitorCount(np);
433 size_t maxShapeJSONLength = 0;
434 for (
size_t i = 0; i < np; i++) {
450 intHKL[3 * i + 0] = hkl[0];
451 intHKL[3 * i + 1] = hkl[1];
452 intHKL[3 * i + 2] = hkl[2];
454 intMNP[3 * i + 0] = mnp[0];
455 intMNP[3 * i + 1] = mnp[1];
456 intMNP[3 * i + 2] = mnp[2];
458 goniometerMatrix[9 * i + 0] = gm[0][0];
459 goniometerMatrix[9 * i + 1] = gm[1][0];
460 goniometerMatrix[9 * i + 2] = gm[2][0];
461 goniometerMatrix[9 * i + 3] = gm[0][1];
462 goniometerMatrix[9 * i + 4] = gm[1][1];
463 goniometerMatrix[9 * i + 5] = gm[2][1];
464 goniometerMatrix[9 * i + 6] = gm[0][2];
465 goniometerMatrix[9 * i + 7] = gm[1][2];
466 goniometerMatrix[9 * i + 8] = gm[2][2];
469 shapes[i] = shapeJSON;
470 if (shapeJSON.size() > maxShapeJSONLength) {
471 maxShapeJSONLength = shapeJSON.size();
482 const std::string specifyInteger =
"An integer";
483 const std::string specifyDouble =
"A double";
484 const std::string specifyString =
"A string";
485 file->makeGroup(
"peaks_workspace",
"NXentry",
489 file->writeData(
"coordinate_system",
static_cast<uint32_t
>(
m_coordSystem));
494 file->putAttr(
"QConvention", m_QConvention);
497 file->writeData(
"column_1", H);
498 file->openData(
"column_1");
499 file->putAttr(
"name",
"H");
500 file->putAttr(
"interpret_as", specifyDouble);
501 file->putAttr(
"units",
"Not known");
505 file->writeData(
"column_2", K);
506 file->openData(
"column_2");
507 file->putAttr(
"name",
"K");
508 file->putAttr(
"interpret_as", specifyDouble);
509 file->putAttr(
"units",
"Not known");
513 file->writeData(
"column_3", L);
514 file->openData(
"column_3");
515 file->putAttr(
"name",
"L");
516 file->putAttr(
"interpret_as", specifyDouble);
517 file->putAttr(
"units",
"Not known");
522 file->openData(
"column_4");
523 file->putAttr(
"name",
"Intensity");
524 file->putAttr(
"interpret_as", specifyDouble);
525 file->putAttr(
"units",
"Not known");
529 file->writeData(
"column_5", sigmaIntensity);
530 file->openData(
"column_5");
531 file->putAttr(
"name",
"Sigma Intensity");
532 file->putAttr(
"interpret_as", specifyDouble);
533 file->putAttr(
"units",
"Not known");
537 file->writeData(
"column_6", binCount);
538 file->openData(
"column_6");
539 file->putAttr(
"name",
"Bin Count");
540 file->putAttr(
"interpret_as", specifyDouble);
541 file->putAttr(
"units",
"Not known");
545 file->writeData(
"column_7", waveLength);
546 file->openData(
"column_7");
547 file->putAttr(
"name",
"Wave Length");
548 file->putAttr(
"interpret_as", specifyDouble);
549 file->putAttr(
"units",
"Not known");
553 file->writeData(
"column_8", scattering);
554 file->openData(
"column_8");
555 file->putAttr(
"name",
"Scattering");
556 file->putAttr(
"interpret_as", specifyDouble);
557 file->putAttr(
"units",
"Not known");
561 file->writeData(
"column_9", dSpacing);
562 file->openData(
"column_9");
563 file->putAttr(
"name",
"D Spacing");
564 file->putAttr(
"interpret_as", specifyDouble);
565 file->putAttr(
"units",
"Not known");
569 file->writeData(
"column_10", runNumber);
570 file->openData(
"column_10");
571 file->putAttr(
"name",
"Run Number");
572 file->putAttr(
"interpret_as", specifyInteger);
573 file->putAttr(
"units",
"Not known");
577 file->writeData(
"column_11", peakNumber);
578 file->openData(
"column_11");
579 file->putAttr(
"name",
"Peak Number");
580 file->putAttr(
"interpret_as", specifyInteger);
581 file->putAttr(
"units",
"Not known");
585 file->writeData(
"column_12", tbar);
586 file->openData(
"column_12");
587 file->putAttr(
"name",
"TBar");
588 file->putAttr(
"interpret_as", specifyDouble);
589 file->putAttr(
"units",
"Not known");
594 file->writeData(
"column_13", goniometerMatrix, array_dims);
595 file->openData(
"column_13");
596 file->putAttr(
"name",
"Goniometer Matrix");
597 file->putAttr(
"interpret_as",
"A matrix of 3x3 doubles");
598 file->putAttr(
"units",
"Not known");
603 dims.emplace_back(np);
604 dims.emplace_back(
static_cast<int>(maxShapeJSONLength));
605 const std::string
name =
"column_14";
607 file->openData(
name);
609 auto toNexus =
new char[maxShapeJSONLength * np];
610 for (
size_t ii = 0; ii < np; ii++) {
611 std::string rowStr = shapes[ii];
612 for (
size_t ic = 0; ic < rowStr.size(); ic++)
613 toNexus[ii * maxShapeJSONLength + ic] = rowStr[ic];
614 for (
size_t ic = rowStr.size(); ic < static_cast<size_t>(maxShapeJSONLength); ic++)
615 toNexus[ii * maxShapeJSONLength + ic] =
' ';
618 file->putData(toNexus);
621 file->putAttr(
"units",
"Not known");
622 file->putAttr(
"name",
"Shape");
623 file->putAttr(
"interpret_as", specifyString);
628 file->writeData(
"column_15", qlabs, qlab_dims);
629 file->openData(
"column_15");
630 file->putAttr(
"name",
"Q LabFrame");
631 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
632 file->putAttr(
"units",
"angstrom^-1");
636 file->writeData(
"column_16", intHKL, qlab_dims);
637 file->openData(
"column_16");
638 file->putAttr(
"name",
"IntHKL");
639 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
640 file->putAttr(
"units",
"r.l.u.");
644 file->writeData(
"column_17", intMNP, qlab_dims);
645 file->openData(
"column_17");
646 file->putAttr(
"name",
"IntMNP");
647 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
648 file->putAttr(
"units",
"r.l.u.");
652 file->writeData(
"column_18", monitorCount);
653 file->openData(
"column_18");
654 file->putAttr(
"name",
"Monitor Count");
655 file->putAttr(
"interpret_as", specifyDouble);
656 file->putAttr(
"units",
"Not known");
702IPropertyManager::getValue<Mantid::DataObjects::LeanElasticPeaksWorkspace_sptr>(
const std::string &
name)
const {
704 getPointerToProperty(
name));
708 std::string message =
709 "Attempt to assign property " +
name +
" to incorrect type. Expected shared_ptr<LeanElasticPeaksWorkspace>.";
710 throw std::runtime_error(message);
716IPropertyManager::getValue<Mantid::DataObjects::LeanElasticPeaksWorkspace_const_sptr>(
const std::string &
name)
const {
718 getPointerToProperty(
name))) {
719 return prop->operator()();
721 std::string message =
"Attempt to assign property " +
name +
722 " to incorrect type. Expected const "
723 "shared_ptr<LeanElasticPeaksWorkspace>.";
724 throw std::runtime_error(message);
double value
The value of the point.
std::map< DeltaEMode::Type, std::string > index
#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.
Mantid::Kernel::V3D getIntMNP() const override
Return the int MNP vector.
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.
double getMonitorCount() const override
Return the monitor count stored in this peak.
Mantid::Kernel::V3D getIntHKL() const override
Return the int HKL vector.
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)
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
Mantid::Kernel::V3D getQLabFrame() const final
Return the Q change (of the lattice, k_i - k_f) for this peak.
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 saveNexus(Nexus::File *file) const override
void removePeaks(std::vector< int > badPeaks) override
Removes multiple peaks.
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...
LeanElasticPeak & getPeak(size_t const peakNum) override
Return a reference to the Peak.
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.
static unsigned short constexpr CHAR
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.
std::vector< dimsize_t > DimVector