29#include <boost/container/flat_set.hpp>
30#include <boost/math/special_functions/round.hpp>
46 useAlgorithm(
"SCDCalibratePanels", 2);
47 deprecatedDate(
"2025-05-27");
59 std::vector<std::pair<std::string, bool>> criteria{{
"BankName",
true}};
60 peaksWs->sort(criteria);
65 std::vector<Peak> &peaks = peaksWs->getPeaks();
66 auto it = std::remove_if(peaks.begin(), peaks.end(), [edge, inst](
const Peak &pk) {
67 return edgePixel(inst, pk.getBankName(), pk.getCol(), pk.getRow(), edge);
69 peaks.erase(it, peaks.end());
73 auto nPeaks =
static_cast<int>(peaksWs->getNumberPeaks());
77 bool snapPanels =
getProperty(
"CalibrateSNAPPanels");
84 boost::container::flat_set<string> MyBankNames;
85 boost::container::flat_set<string> MyPanels;
87 MyPanels.insert(
"East");
88 MyPanels.insert(
"West");
89 int maxRecurseDepth = 4;
92 for (
int num = 1; num < 64; ++num) {
94 std::ostringstream mess;
95 mess <<
"bank" << num;
99 MyBankNames.insert(mess.str());
104 for (
int i = 0; i < nPeaks; ++i) {
105 std::string bankName = peaksWs->getPeak(i).getBankName();
106 if (bankName !=
"None")
107 MyBankNames.insert(bankName);
111 std::vector<std::string> fit_workspaces(MyBankNames.size() + MyPanels.size(),
"fit_");
112 std::vector<std::string> parameter_workspaces(MyBankNames.size() + MyPanels.size(),
"params_");
113 int bankAndPanelCount = 0;
114 for (
const auto &MyPanel : MyPanels) {
115 fit_workspaces[bankAndPanelCount] += MyPanel;
116 parameter_workspaces[bankAndPanelCount] += MyPanel;
120 findL2(MyPanels, peaksWs);
122 double delta = results->
cell<
double>(4, 1);
123 g_log.
notice() <<
"For west rotation change det_arc1 " <<
delta <<
" degrees\n";
124 results = AnalysisDataService::Instance().retrieveWS<
ITableWorkspace>(
"params_East");
126 g_log.
notice() <<
"For east rotation change det_arc2 " <<
delta <<
" degrees\n";
129 for (
const auto &MyBankName : MyBankNames) {
130 fit_workspaces[bankAndPanelCount] += MyBankName;
131 parameter_workspaces[bankAndPanelCount] += MyBankName;
135 findL2(MyBankNames, peaksWs);
139 for (
int j = bankAndPanelCount - 1; j >= 0; j--) {
140 if (!AnalysisDataService::Instance().doesExist(fit_workspaces[j]))
141 fit_workspaces.erase(fit_workspaces.begin() + j);
142 if (!AnalysisDataService::Instance().doesExist(parameter_workspaces[j]))
143 parameter_workspaces.erase(parameter_workspaces.begin() + j);
149 parameter_workspaces.emplace_back(
"params_L1");
150 fit_workspaces.emplace_back(
"fit_L1");
154 parameter_workspaces.emplace_back(
"params_T0");
155 fit_workspaces.emplace_back(
"fit_T0");
157 std::sort(parameter_workspaces.begin(), parameter_workspaces.end());
158 std::sort(fit_workspaces.begin(), fit_workspaces.end());
161 auto groupAlg = AlgorithmManager::Instance().createUnmanaged(
"GroupWorkspaces");
162 groupAlg->initialize();
163 groupAlg->setProperty(
"InputWorkspaces", parameter_workspaces);
164 groupAlg->setProperty(
"OutputWorkspace",
"Fit_Parameters");
167 groupAlg = AlgorithmManager::Instance().createUnmanaged(
"GroupWorkspaces");
168 groupAlg->initialize();
169 groupAlg->setProperty(
"InputWorkspaces", fit_workspaces);
170 groupAlg->setProperty(
"OutputWorkspace",
"Fit_Residuals");
177 for (
int i = 0; i < nPeaks; i++) {
182 }
catch (
const std::exception &exc) {
183 g_log.
notice() <<
"Problem in applying calibration to peak " << i <<
" : " << exc.what() <<
"\n";
192 string DetCalFileName =
getProperty(
"DetCalFilename");
193 API::Run &run = peaksWs->mutableRun();
206 ColWksp->setInstrument(inst2);
209 RowWksp->setInstrument(inst2);
212 TofWksp->setInstrument(inst2);
213 OrientedLattice lattice = peaksWs->mutableSample().getOrientedLattice();
216 peaksWs->sort(criteria);
218 for (
int i = 0; i < static_cast<int>(MyBankNames.size()); ++i) {
220 const std::string &bankName = *std::next(MyBankNames.begin(), i);
221 size_t k = bankName.find_last_not_of(
"0123456789");
223 if (k < bankName.length())
224 bank = boost::lexical_cast<int>(bankName.substr(k + 1));
225 ColWksp->getSpectrum(i).setSpectrumNo(
specnum_t(bank));
226 RowWksp->getSpectrum(i).setSpectrumNo(
specnum_t(bank));
227 TofWksp->getSpectrum(i).setSpectrumNo(
specnum_t(bank));
228 auto &ColX = ColWksp->mutableX(i);
229 auto &ColY = ColWksp->mutableY(i);
230 auto &RowX = RowWksp->mutableX(i);
231 auto &RowY = RowWksp->mutableY(i);
232 auto &TofX = TofWksp->mutableX(i);
233 auto &TofY = TofWksp->mutableY(i);
235 for (
int j = 0; j < nPeaks; j++) {
236 Peak peak = peaksWs->getPeak(j);
241 ColX[icount] = peak.
getCol();
242 ColY[icount] = theoretical.
getCol();
243 RowX[icount] = peak.
getRow();
244 RowY[icount] = theoretical.
getRow();
245 TofX[icount] = peak.
getTOF();
246 TofY[icount] = theoretical.
getTOF();
267 save->setProperty(
"InputWorkspace", outputWS);
268 save->setProperty(
"FileName", outputFile);
283 std::ostringstream fun_str;
284 fun_str <<
"name=SCDPanelErrors,Workspace=" << peaksWs->getName() <<
",Bank=moderator";
285 std::ostringstream tie_str;
286 tie_str <<
"XShift=0.0,YShift=0.0,XRotate=0.0,YRotate=0.0,ZRotate=0.0,"
287 "ScaleWidth=1.0,ScaleHeight=1.0,T0Shift ="
289 fitL1_alg->setPropertyValue(
"Function", fun_str.str());
290 fitL1_alg->setProperty(
"Ties", tie_str.str());
291 fitL1_alg->setProperty(
"InputWorkspace", L1WS);
292 fitL1_alg->setProperty(
"CreateOutput",
true);
293 fitL1_alg->setProperty(
"Output",
"fit");
294 fitL1_alg->executeAsChildAlg();
295 std::string fitL1Status = fitL1_alg->getProperty(
"OutputStatus");
296 double chisqL1 = fitL1_alg->getProperty(
"OutputChi2overDoF");
298 AnalysisDataService::Instance().addOrReplace(
"fit_L1", fitL1);
300 AnalysisDataService::Instance().addOrReplace(
"params_L1", paramsL1);
301 double deltaL1 = paramsL1->getRef<
double>(
"Value", 2);
303 com.
moveDetector(0.0, 0.0, deltaL1, 0.0, 0.0, 0.0, 1.0, 1.0,
"moderator", peaksWs);
304 g_log.
notice() <<
"L1 = " << -peaksWs->getInstrument()->getSource()->getPos().Z() <<
" " << fitL1Status
305 <<
" Chi2overDoF " << chisqL1 <<
"\n";
319 std::ostringstream fun_str;
320 fun_str <<
"name=SCDPanelErrors,Workspace=" << peaksWs->getName() <<
",Bank=none";
321 std::ostringstream tie_str;
322 tie_str <<
"XShift=0.0,YShift=0.0,ZShift=0.0,XRotate=0.0,YRotate=0.0,ZRotate=0.0,"
323 "ScaleWidth=1.0,ScaleHeight=1.0";
324 fitT0_alg->setPropertyValue(
"Function", fun_str.str());
325 fitT0_alg->setProperty(
"Ties", tie_str.str());
326 fitT0_alg->setProperty(
"InputWorkspace", T0WS);
327 fitT0_alg->setProperty(
"CreateOutput",
true);
328 fitT0_alg->setProperty(
"Output",
"fit");
330 fitT0_alg->setProperty(
"Minimizer",
"Simplex");
331 fitT0_alg->setProperty(
"MaxIterations", 1000);
332 fitT0_alg->executeAsChildAlg();
333 std::string fitT0Status = fitT0_alg->getProperty(
"OutputStatus");
334 double chisqT0 = fitT0_alg->getProperty(
"OutputChi2overDoF");
336 AnalysisDataService::Instance().addOrReplace(
"fit_T0", fitT0);
338 AnalysisDataService::Instance().addOrReplace(
"params_T0", paramsT0);
339 mT0 = paramsT0->getRef<
double>(
"Value", 8);
340 API::Run &run = peaksWs->mutableRun();
343 if (run.hasProperty(
"T0")) {
346 run.addProperty<
double>(
"T0",
mT0 + oldT0,
true);
347 g_log.
notice() <<
"T0 = " <<
mT0 <<
" " << fitT0Status <<
" Chi2overDoF " << chisqT0 <<
"\n";
348 for (
int i = 0; i < peaksWs->getNumberPeaks(); i++) {
363 g_log.
error(
"Can't locate CalculateUMatrix algorithm");
374 peaksWs->sample().hasOrientedLattice()) {
379 alpha = latt.
alpha();
381 gamma = latt.
gamma();
383 ub_alg->setProperty(
"PeaksWorkspace", peaksWs);
384 ub_alg->setProperty(
"a", a);
385 ub_alg->setProperty(
"b", b);
386 ub_alg->setProperty(
"c", c);
387 ub_alg->setProperty(
"alpha", alpha);
388 ub_alg->setProperty(
"beta", beta);
389 ub_alg->setProperty(
"gamma", gamma);
390 ub_alg->executeAsChildAlg();
394 alg->setPropertyValue(
"PeaksWorkspace", peaksWs->getName());
395 alg->setProperty(
"Tolerance", 0.15);
396 alg->executeAsChildAlg();
397 int numIndexed = alg->getProperty(
"NumIndexed");
399 g_log.
notice() << peaksWs->sample().getOrientedLattice().getUB() <<
"\n";
413 boost::container::flat_set<string> &AllBankName,
double T0,
414 const string &filename) {
416 if (filename.empty())
419 g_log.
notice() <<
"Saving DetCal file in " << filename <<
"\n";
422 const size_t number_spectra = instrument->getNumberDetectors();
425 wksp->setInstrument(instrument);
426 wksp->rebuildSpectraMapping(
true );
429 std::vector<string> banknames(AllBankName.begin(), AllBankName.end());
433 alg->setProperty(
"InputWorkspace", wksp);
434 alg->setProperty(
"Filename", filename);
435 alg->setProperty(
"TimeOffset", T0);
436 alg->setProperty(
"BankNames", banknames);
437 alg->executeAsChildAlg();
442 "Workspace of Indexed Peaks");
444 auto mustBePositive = std::make_shared<BoundedValidator<double>>();
445 mustBePositive->setLower(0.0);
448 "Lattice Parameter a (Leave empty to use lattice constants "
449 "in peaks workspace)");
451 "Lattice Parameter b (Leave empty to use lattice constants "
452 "in peaks workspace)");
454 "Lattice Parameter c (Leave empty to use lattice constants "
455 "in peaks workspace)");
457 "Lattice Parameter alpha in degrees (Leave empty to use "
458 "lattice constants in peaks workspace)");
460 "Lattice Parameter beta in degrees (Leave empty to use "
461 "lattice constants in peaks workspace)");
463 "Lattice Parameter gamma in degrees (Leave empty to use "
464 "lattice constants in peaks workspace)");
465 declareProperty(
"ChangeL1",
true,
"Change the L1(source to sample) distance");
468 "Change the height and width of the "
469 "detectors. Implemented only for "
470 "RectangularDetectors.");
472 declareProperty(
"EdgePixels", 0,
"Remove peaks that are at pixels this close to edge. ");
473 declareProperty(
"CalibrateBanks",
true,
"Calibrate the panels of the banks.");
475 "Calibrate the 3 X 3 panels of the "
479 const std::vector<std::string> detcalExts{
".DetCal",
".Det_Cal"};
481 std::make_unique<FileProperty>(
"DetCalFilename",
"SCDCalibrate.DetCal",
FileProperty::Save, detcalExts),
482 "Path to an ISAW-style .detcal file to save.");
485 "Path to an Mantid .xml description(for LoadParameterFile) file to "
489 "Path to a NeXus file comparing calculated and theoretical "
490 "column of each peak.");
493 "Path to a NeXus file comparing calculated and theoretical "
494 "row of each peak.");
497 "Path to a NeXus file comparing calculated and theoretical "
498 "TOF of each peak.");
500 const string OUTPUTS(
"Outputs");
509 ostream <<
" <parameter name =\"" <<
name <<
"\"><value val=\"" <<
value <<
"\" /> </parameter>\n";
514 if (FileName.empty())
517 g_log.
notice() <<
"Saving parameter file as " << FileName <<
"\n";
520 ofstream oss3(FileName.c_str());
521 oss3 <<
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
522 oss3 <<
" <parameter-file instrument=\"" << instrument.
getName() <<
"\" valid-from=\""
527 for (
auto bankName : AllBankNames) {
528 if (instrument.
getName().compare(
"CORELLI") == 0.0)
529 bankName.append(
"/sixteenpack");
530 oss3 <<
"<component-link name=\"" << bankName <<
"\">\n";
533 Quat relRot = bank->getRelativeRot();
541 V3D pos1 = bank->getRelativePos();
546 vector<double> oldScalex =
pmap->getDouble(bank->getName(),
string(
"scalex"));
547 vector<double> oldScaley =
pmap->getDouble(bank->getName(),
string(
"scaley"));
550 if (!oldScalex.empty())
555 if (!oldScaley.empty())
560 oss3 << R
"( <parameter name ="scalex"><value val=")" << scalex << "\" /> </parameter>\n";
561 oss3 << R
"( <parameter name ="scaley"><value val=")" << scaley << "\" /> </parameter>\n";
562 oss3 <<
"</component-link>\n";
568 oss3 <<
"<component-link name=\"" << source->getName() <<
"\">\n";
569 V3D sourceRelPos = source->getRelativePos();
574 oss3 <<
"</component-link>\n";
575 oss3 <<
"</parameter-file>\n";
587 for (
int bankIndex = 0; bankIndex < static_cast<int>(MyBankNames.size()); ++bankIndex) {
589 const std::string &iBank = *std::next(MyBankNames.begin(), bankIndex);
590 const std::string bankName =
"__PWS_" + iBank;
592 AnalysisDataService::Instance().addOrReplace(bankName, local);
593 std::vector<Peak> &localPeaks = local->getPeaks();
594 auto lit = std::remove_if(localPeaks.begin(), localPeaks.end(), [&iBank](
const Peak &pk) {
595 std::string name = pk.getBankName();
596 IComponent_const_sptr det = pk.getInstrument()->getComponentByName(name);
597 if (det && iBank.substr(0, 4) !=
"bank") {
598 IComponent_const_sptr parent = det->getParent();
600 IComponent_const_sptr grandparent = parent->getParent();
602 name = grandparent->getName();
607 return name != iBank;
609 localPeaks.erase(lit, localPeaks.end());
611 int nBankPeaks = local->getNumberPeaks();
612 if (nBankPeaks < 6) {
613 g_log.
notice() <<
"Too few peaks for " << iBank <<
"\n";
620 auto &outSpec = q3DWS->getSpectrum(0);
621 auto &yVec = outSpec.mutableY();
622 auto &eVec = outSpec.mutableE();
623 auto &xVec = outSpec.mutableX();
626 for (
int i = 0; i < nBankPeaks; i++) {
636 for (
int j = 0; j < 3; j++) {
650 std::ostringstream fun_str;
651 fun_str <<
"name=SCDPanelErrors,Workspace=" + bankName <<
",Bank=" << iBank;
652 fit_alg->setPropertyValue(
"Function", fun_str.str());
653 std::ostringstream tie_str;
654 tie_str <<
"ScaleWidth=1.0,ScaleHeight=1.0,T0Shift =" <<
mT0;
655 fit_alg->setProperty(
"Ties", tie_str.str());
656 fit_alg->setProperty(
"InputWorkspace", q3DWS);
657 fit_alg->setProperty(
"CreateOutput",
true);
658 fit_alg->setProperty(
"Output",
"fit");
659 fit_alg->executeAsChildAlg();
660 std::string fitStatus = fit_alg->getProperty(
"OutputStatus");
661 double fitChisq = fit_alg->getProperty(
"OutputChi2overDoF");
662 g_log.
notice() << iBank <<
" " << fitStatus <<
" Chi2overDoF " << fitChisq <<
"\n";
664 AnalysisDataService::Instance().addOrReplace(
"fit_" + iBank, fitWS);
666 AnalysisDataService::Instance().addOrReplace(
"params_" + iBank, paramsWS);
667 double xShift = paramsWS->getRef<
double>(
"Value", 0);
668 double yShift = paramsWS->getRef<
double>(
"Value", 1);
669 double zShift = paramsWS->getRef<
double>(
"Value", 2);
670 double xRotate = paramsWS->getRef<
double>(
"Value", 3);
671 double yRotate = paramsWS->getRef<
double>(
"Value", 4);
672 double zRotate = paramsWS->getRef<
double>(
"Value", 5);
673 double scaleWidth = 1.0;
674 double scaleHeight = 1.0;
677 std::shared_ptr<const Geometry::RectangularDetector> rectDet =
678 std::dynamic_pointer_cast<const Geometry::RectangularDetector>(comp);
679 if (rectDet && changeSize) {
687 fit2_alg->setPropertyValue(
"Function", fun_str.str());
688 std::ostringstream tie_str2;
689 tie_str2 <<
"XShift=" << xShift <<
",YShift=" << yShift <<
",ZShift=" << zShift <<
",XRotate=" << xRotate
690 <<
",YRotate=" << yRotate <<
",ZRotate=" << zRotate <<
",T0Shift =" <<
mT0;
691 fit2_alg->setProperty(
"Ties", tie_str2.str());
692 fit2_alg->setProperty(
"InputWorkspace", q3DWS);
693 fit2_alg->setProperty(
"CreateOutput",
true);
694 fit2_alg->setProperty(
"Output",
"fit");
695 fit2_alg->executeAsChildAlg();
696 std::string fit2Status = fit2_alg->getProperty(
"OutputStatus");
697 double fit2Chisq = fit2_alg->getProperty(
"OutputChi2overDoF");
698 g_log.
notice() << iBank <<
" " << fit2Status <<
" Chi2overDoF " << fit2Chisq <<
"\n";
699 fitWS = fit2_alg->getProperty(
"OutputWorkspace");
700 AnalysisDataService::Instance().addOrReplace(
"fit_" + iBank, fitWS);
701 paramsWS = fit2_alg->getProperty(
"OutputParameters");
702 AnalysisDataService::Instance().addOrReplace(
"params_" + iBank, paramsWS);
703 scaleWidth = paramsWS->getRef<
double>(
"Value", 6);
704 scaleHeight = paramsWS->getRef<
double>(
"Value", 7);
706 AnalysisDataService::Instance().remove(bankName);
708 det.
moveDetector(xShift, yShift, zShift, xRotate, yRotate, zRotate, scaleWidth, scaleHeight, iBank, peaksWs);
#define DECLARE_ALGORITHM(classname)
double value
The value of the point.
#define PARALLEL_START_INTERRUPT_REGION
Begins a block to skip processing is the algorithm has been interupted Note the end of the block if n...
#define PARALLEL_CRITICAL(name)
#define PARALLEL_END_INTERRUPT_REGION
Ends a block to skip processing is the algorithm has been interupted Note the start of the block if n...
#define PARALLEL_FOR_IF(condition)
Empty definitions - to enable set your complier to enable openMP.
#define PRAGMA_OMP(expression)
#define PARALLEL_CHECK_INTERRUPT_REGION
Adds a check after a Parallel region to see if it was interupted.
void declareProperty(std::unique_ptr< Kernel::Property > p, const std::string &doc="") override
Add a property to the list of managed properties.
TypedValue getProperty(const std::string &name) const override
Get the value of a property.
virtual std::shared_ptr< Algorithm > createChildAlgorithm(const std::string &name, const double startProgress=-1., const double endProgress=-1., const bool enableLogging=true, const int &version=-1)
Create a Child Algorithm.
@ OptionalSave
to specify a file to write to but an empty string is
@ Save
to specify a file to write to, the file may or may not exist
ITableWorkspace is an implementation of Workspace in which the data are organised in columns of same ...
T & cell(size_t row, size_t col)
Get the reference to the element in row row and column col.
bool hasProperty(const std::string &name) const
Does the property exist on the object.
HeldType getPropertyValueAsType(const std::string &name) const
Get the value of a property as the given TYPE.
This class stores information regarding an experimental run as a series of log entries.
A property class for workspaces.
SCDCalibratePanels calibrates instrument parameters for Rectangular Detectors.
void saveXmlFile(const std::string &FileName, const boost::container::flat_set< std::string > &AllBankNames, const Geometry::Instrument &instrument) const
Saves the new instrument to an xml file that can be used with the LoadParameterFile Algorithm.
void init() override
Virtual method - must be overridden by concrete algorithm.
const std::string name() const override
function to return a name of the algorithm, must be overridden in all algorithms
void findT0(int nPeaks, const DataObjects::PeaksWorkspace_sptr &peaksWs)
Function to optimize T0.
void findL2(boost::container::flat_set< std::string > MyBankNames, const DataObjects::PeaksWorkspace_sptr &peaksWs)
Function to optimize L2.
int version() const override
Algorithm's version for identification overriding a virtual method.
void saveIsawDetCal(std::shared_ptr< Geometry::Instrument > &instrument, boost::container::flat_set< std::string > &AllBankName, double T0, const std::string &filename)
Really this is the operator SaveIsawDetCal but only the results of the given banks are saved.
void findU(const DataObjects::PeaksWorkspace_sptr &peaksWs)
Function to calculate U.
void exec() override
Virtual method - must be overridden by concrete algorithm.
void saveNexus(const std::string &outputFile, const API::MatrixWorkspace_sptr &outputWS)
save workspaces
void findL1(int nPeaks, const DataObjects::PeaksWorkspace_sptr &peaksWs)
Function to optimize L1.
const std::string category() const override
Algorithm's category for identification overriding a virtual method.
void moveDetector(double x, double y, double z, double rotx, double roty, double rotz, double scalex, double scaley, std::string detname, const API::Workspace_sptr &inputW) const
Move detectors with parameters.
double getIntensity() const override
Return the integrated peak intensity.
double getSigmaIntensity() const override
Return the error on the integrated peak intensity.
Mantid::Kernel::V3D getHKL() const override
Return the HKL vector.
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.
Structure describing a single-crystal peak.
int getCol() const override
For RectangularDetectors only, returns the column (x) of the pixel of the detector or -1 if not found...
Geometry::Instrument_const_sptr getInstrument() const
Return a shared ptr to the instrument for this peak.
int getRow() const override
For RectangularDetectors only, returns the row (y) of the pixel of the detector or -1 if not found.
void setWavelength(double wavelength) override
Set the incident wavelength of the neutron.
double getL1() const override
Return the L1 flight path length (source to sample), in meters.
double getTOF() const override
Calculate the time of flight (in microseconds) of the neutrons for this peak, using the geometry of t...
double getL2() const override
Return the L2 flight path length (sample to detector), in meters.
const std::string & getBankName() const
Find the name of the bank that is the parent of the detector.
void setInstrument(const Geometry::Instrument_const_sptr &inst)
Set the instrument (and save the source/sample pos).
double getScattering() const override
Calculate the scattering angle of the peak
std::shared_ptr< const IComponent > getComponentByName(const std::string &cname, int nlevels=0) const override
Returns a pointer to the first component of assembly encountered with the given name.
std::string getName() const override
Get the IComponent name.
IComponent_const_sptr getSource() const
Gets a pointer to the source.
std::shared_ptr< ParameterMap > getParameterMap() const
Pointer to the NOT const ParameterMap holding the parameters of the modified instrument components.
Types::Core::DateAndTime getValidFromDate() const
Class to implement UB matrix.
const Kernel::DblMatrix & getUB() const
Get the UB matrix.
double alpha() const
Get lattice parameter.
double a(int nd) const
Get lattice parameter a1-a3 as function of index (0-2)
double c() const
Get lattice parameter.
double beta() const
Get lattice parameter.
double b() const
Get lattice parameter.
double gamma() const
Get lattice parameter.
Exception for when an item is not found in a collection.
void setPropertyGroup(const std::string &name, const std::string &group)
Set the group for a given property.
void notice(const std::string &msg)
Logs at notice level.
void error(const std::string &msg)
Logs at error level.
std::vector< double > getEulerAngles(const std::string &convention) const
Calculate the Euler angles that are equivalent to this Quaternion.
static T & Instance()
Return a reference to the Singleton instance, creating it if it does not already exist Creation is do...
void initialize(const double &_l1, const int &_emode, const UnitParametersMap ¶ms)
Initialize the unit to perform conversion using singleToTof() and singleFromTof()
double singleFromTOF(const double tof) const override
Convert a single tof value to this unit.
constexpr double X() const noexcept
Get x.
constexpr double Y() const noexcept
Get y.
constexpr double Z() const noexcept
Get z.
std::shared_ptr< IAlgorithm > IAlgorithm_sptr
shared pointer to Mantid::API::IAlgorithm
std::shared_ptr< ITableWorkspace > ITableWorkspace_sptr
shared pointer to Mantid::API::ITableWorkspace
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class
void writeXmlParameter(ofstream &ostream, const string &name, const double value)
std::shared_ptr< Workspace2D > Workspace2D_sptr
shared pointer to Mantid::DataObjects::Workspace2D
std::shared_ptr< PeaksWorkspace > PeaksWorkspace_sptr
Typedef for a shared pointer to a peaks workspace.
std::unique_ptr< T > create(const P &parent, const IndexArg &indexArg, const HistArg &histArg)
This is the create() method that all the other create() methods call.
std::shared_ptr< const IComponent > IComponent_const_sptr
Typdef of a shared pointer to a const IComponent.
std::shared_ptr< ParameterMap > ParameterMap_sptr
ParameterMap shared pointer typedef.
std::shared_ptr< const Instrument > Instrument_const_sptr
Shared pointer to an const instrument object.
std::shared_ptr< Instrument > Instrument_sptr
Shared pointer to an instrument object.
std::enable_if< std::is_pointer< Arg >::value, bool >::type threadSafe(Arg workspace)
Thread-safety check Checks the workspace to ensure it is suitable for multithreaded access.
int32_t specnum_t
Typedef for a spectrum Number.
constexpr double EMPTY_DBL() noexcept
Returns what we consider an "empty" double within a property.
Generate a tableworkspace to store the calibration results.
adjust instrument component position and orientation
: detector size scale at y-direction
@ InOut
Both an input & output workspace.