16#include "MantidNexus/NexusFile.h"
36 setNumberOfDetectorGroups(0);
45 :
IPeaksWorkspace(other), m_peaks(other.m_peaks), m_columns(), m_columnNames(), m_coordSystem(other.m_coordSystem) {
68 const auto &col =
name.first;
69 const bool ascending =
name.second;
70 bool lessThan =
false;
77 lessThan = (valA < valB);
117 if (peakNum >=
static_cast<int>(
m_peaks.size()) || peakNum < 0) {
118 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::removePeak(): peakNum is out of range.");
127 if (badPeaks.empty())
134 return std::any_of(badPeaks.cbegin(), badPeaks.cend(), [ip](int badPeak) { return badPeak == ip; });
136 m_peaks.erase(it, m_peaks.end());
173 if (peakNum >=
m_peaks.size()) {
174 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getPeak(): peakNum is out of range.");
185 if (peakNum >=
m_peaks.size()) {
186 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getPeak(): peakNum is out of range.");
199 std::optional<double>)
const {
210std::unique_ptr<Geometry::IPeak>
230 std::unique_ptr<IPeak> peak = std::make_unique<LeanElasticPeak>(
position,
run().getGoniometer().getR());
271 const V3D qSampleFrame = lattice.getUB() *
HKL * 2 * M_PI;
274 std::unique_ptr<IPeak> peak = std::make_unique<LeanElasticPeak>(qSampleFrame, goniometer.getR());
277 peak->setIntHKL(peak->getHKL());
322 const std::string peaksIntegrated =
"PeaksIntegrated";
323 if (this->
run().hasProperty(peaksIntegrated)) {
324 const auto value = boost::lexical_cast<int>(this->
run().getProperty(peaksIntegrated)->
value());
387 throw std::invalid_argument(
"Column named " +
name +
" was not found in the LeanElasticPeaksWorkspace.");
394 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getColumn() called with invalid index.");
402 throw std::invalid_argument(
"LeanElasticPeaksWorkspace::getColumn() called with invalid index.");
409 const size_t np(
m_peaks.size());
412 std::vector<double> H(np);
413 std::vector<double> K(np);
414 std::vector<double> L(np);
415 std::vector<double> intensity(np);
416 std::vector<double> sigmaIntensity(np);
417 std::vector<double> binCount(np);
418 std::vector<double> waveLength(np);
419 std::vector<double> scattering(np);
420 std::vector<double> dSpacing(np);
421 std::vector<int> runNumber(np);
422 std::vector<int> peakNumber(np);
423 std::vector<double> tbar(np);
424 std::vector<double> intHKL(3 * np);
425 std::vector<double> intMNP(3 * np);
426 std::vector<double> goniometerMatrix(9 * np);
427 std::vector<std::string> shapes(np);
428 std::vector<double> qlabs(3 * np);
429 std::vector<double> monitorCount(np);
432 size_t maxShapeJSONLength = 0;
433 for (
size_t i = 0; i < np; i++) {
449 intHKL[3 * i + 0] = hkl[0];
450 intHKL[3 * i + 1] = hkl[1];
451 intHKL[3 * i + 2] = hkl[2];
453 intMNP[3 * i + 0] = mnp[0];
454 intMNP[3 * i + 1] = mnp[1];
455 intMNP[3 * i + 2] = mnp[2];
457 goniometerMatrix[9 * i + 0] = gm[0][0];
458 goniometerMatrix[9 * i + 1] = gm[1][0];
459 goniometerMatrix[9 * i + 2] = gm[2][0];
460 goniometerMatrix[9 * i + 3] = gm[0][1];
461 goniometerMatrix[9 * i + 4] = gm[1][1];
462 goniometerMatrix[9 * i + 5] = gm[2][1];
463 goniometerMatrix[9 * i + 6] = gm[0][2];
464 goniometerMatrix[9 * i + 7] = gm[1][2];
465 goniometerMatrix[9 * i + 8] = gm[2][2];
468 shapes[i] = shapeJSON;
469 if (shapeJSON.size() > maxShapeJSONLength) {
470 maxShapeJSONLength = shapeJSON.size();
481 const std::string specifyInteger =
"An integer";
482 const std::string specifyDouble =
"A double";
483 const std::string specifyString =
"A string";
484 file->makeGroup(
"peaks_workspace",
"NXentry",
488 file->writeData(
"coordinate_system",
static_cast<uint32_t
>(
m_coordSystem));
493 file->putAttr(
"QConvention", m_QConvention);
496 file->writeData(
"column_1", H);
497 file->openData(
"column_1");
498 file->putAttr(
"name",
"H");
499 file->putAttr(
"interpret_as", specifyDouble);
500 file->putAttr(
"units",
"Not known");
504 file->writeData(
"column_2", K);
505 file->openData(
"column_2");
506 file->putAttr(
"name",
"K");
507 file->putAttr(
"interpret_as", specifyDouble);
508 file->putAttr(
"units",
"Not known");
512 file->writeData(
"column_3", L);
513 file->openData(
"column_3");
514 file->putAttr(
"name",
"L");
515 file->putAttr(
"interpret_as", specifyDouble);
516 file->putAttr(
"units",
"Not known");
520 file->writeData(
"column_4", intensity);
521 file->openData(
"column_4");
522 file->putAttr(
"name",
"Intensity");
523 file->putAttr(
"interpret_as", specifyDouble);
524 file->putAttr(
"units",
"Not known");
528 file->writeData(
"column_5", sigmaIntensity);
529 file->openData(
"column_5");
530 file->putAttr(
"name",
"Sigma Intensity");
531 file->putAttr(
"interpret_as", specifyDouble);
532 file->putAttr(
"units",
"Not known");
536 file->writeData(
"column_6", binCount);
537 file->openData(
"column_6");
538 file->putAttr(
"name",
"Bin Count");
539 file->putAttr(
"interpret_as", specifyDouble);
540 file->putAttr(
"units",
"Not known");
544 file->writeData(
"column_7", waveLength);
545 file->openData(
"column_7");
546 file->putAttr(
"name",
"Wave Length");
547 file->putAttr(
"interpret_as", specifyDouble);
548 file->putAttr(
"units",
"Not known");
552 file->writeData(
"column_8", scattering);
553 file->openData(
"column_8");
554 file->putAttr(
"name",
"Scattering");
555 file->putAttr(
"interpret_as", specifyDouble);
556 file->putAttr(
"units",
"Not known");
560 file->writeData(
"column_9", dSpacing);
561 file->openData(
"column_9");
562 file->putAttr(
"name",
"D Spacing");
563 file->putAttr(
"interpret_as", specifyDouble);
564 file->putAttr(
"units",
"Not known");
568 file->writeData(
"column_10", runNumber);
569 file->openData(
"column_10");
570 file->putAttr(
"name",
"Run Number");
571 file->putAttr(
"interpret_as", specifyInteger);
572 file->putAttr(
"units",
"Not known");
576 file->writeData(
"column_11", peakNumber);
577 file->openData(
"column_11");
578 file->putAttr(
"name",
"Peak Number");
579 file->putAttr(
"interpret_as", specifyInteger);
580 file->putAttr(
"units",
"Not known");
584 file->writeData(
"column_12", tbar);
585 file->openData(
"column_12");
586 file->putAttr(
"name",
"TBar");
587 file->putAttr(
"interpret_as", specifyDouble);
588 file->putAttr(
"units",
"Not known");
593 file->writeData(
"column_13", goniometerMatrix, array_dims);
594 file->openData(
"column_13");
595 file->putAttr(
"name",
"Goniometer Matrix");
596 file->putAttr(
"interpret_as",
"A matrix of 3x3 doubles");
597 file->putAttr(
"units",
"Not known");
602 dims.emplace_back(np);
603 dims.emplace_back(
static_cast<int>(maxShapeJSONLength));
604 const std::string
name =
"column_14";
606 file->openData(
name);
608 auto toNexus =
new char[maxShapeJSONLength * np];
609 for (
size_t ii = 0; ii < np; ii++) {
610 std::string rowStr = shapes[ii];
611 for (
size_t ic = 0; ic < rowStr.size(); ic++)
612 toNexus[ii * maxShapeJSONLength + ic] = rowStr[ic];
613 for (
size_t ic = rowStr.size(); ic < static_cast<size_t>(maxShapeJSONLength); ic++)
614 toNexus[ii * maxShapeJSONLength + ic] =
' ';
617 file->putData(toNexus);
620 file->putAttr(
"units",
"Not known");
621 file->putAttr(
"name",
"Shape");
622 file->putAttr(
"interpret_as", specifyString);
627 file->writeData(
"column_15", qlabs, qlab_dims);
628 file->openData(
"column_15");
629 file->putAttr(
"name",
"Q LabFrame");
630 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
631 file->putAttr(
"units",
"angstrom^-1");
635 file->writeData(
"column_16", intHKL, qlab_dims);
636 file->openData(
"column_16");
637 file->putAttr(
"name",
"IntHKL");
638 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
639 file->putAttr(
"units",
"r.l.u.");
643 file->writeData(
"column_17", intMNP, qlab_dims);
644 file->openData(
"column_17");
645 file->putAttr(
"name",
"IntMNP");
646 file->putAttr(
"interpret_as",
"A vector of 3 doubles");
647 file->putAttr(
"units",
"r.l.u.");
651 file->writeData(
"column_18", monitorCount);
652 file->openData(
"column_18");
653 file->putAttr(
"name",
"Monitor Count");
654 file->putAttr(
"interpret_as", specifyDouble);
655 file->putAttr(
"units",
"Not known");
701IPropertyManager::getValue<Mantid::DataObjects::LeanElasticPeaksWorkspace_sptr>(
const std::string &
name)
const {
703 getPointerToProperty(
name));
707 std::string message =
708 "Attempt to assign property " +
name +
" to incorrect type. Expected shared_ptr<LeanElasticPeaksWorkspace>.";
709 throw std::runtime_error(message);
715IPropertyManager::getValue<Mantid::DataObjects::LeanElasticPeaksWorkspace_const_sptr>(
const std::string &
name)
const {
717 getPointerToProperty(
name))) {
718 return prop->operator()();
720 std::string message =
"Attempt to assign property " +
name +
721 " to incorrect type. Expected const "
722 "shared_ptr<LeanElasticPeaksWorkspace>.";
723 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.
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