30#include <boost/container/flat_set.hpp>
31#include <boost/math/special_functions/round.hpp>
47 useAlgorithm(
"SCDCalibratePanels", 2);
48 deprecatedDate(
"2025-05-27");
60 std::vector<std::pair<std::string, bool>> criteria{{
"BankName",
true}};
61 peaksWs->sort(criteria);
67 std::vector<Peak> &peaks = peaksWs->getPeaks();
68 auto it = std::remove_if(peaks.begin(), peaks.end(), [edge, &compInfo](
const Peak &pk) {
69 return edgePixel(compInfo, pk.getBankName(), pk.getCol(), pk.getRow(), edge);
71 peaks.erase(it, peaks.end());
75 auto nPeaks =
static_cast<int>(peaksWs->getNumberPeaks());
79 bool snapPanels =
getProperty(
"CalibrateSNAPPanels");
86 boost::container::flat_set<string> MyBankNames;
87 boost::container::flat_set<string> MyPanels;
89 MyPanels.insert(
"East");
90 MyPanels.insert(
"West");
91 int maxRecurseDepth = 4;
94 for (
int num = 1; num < 64; ++num) {
96 std::ostringstream mess;
97 mess <<
"bank" << num;
101 MyBankNames.insert(mess.str());
106 for (
int i = 0; i < nPeaks; ++i) {
107 std::string bankName = peaksWs->getPeak(i).getBankName();
108 if (bankName !=
"None")
109 MyBankNames.insert(bankName);
113 std::vector<std::string> fit_workspaces(MyBankNames.size() + MyPanels.size(),
"fit_");
114 std::vector<std::string> parameter_workspaces(MyBankNames.size() + MyPanels.size(),
"params_");
115 int bankAndPanelCount = 0;
116 for (
const auto &MyPanel : MyPanels) {
117 fit_workspaces[bankAndPanelCount] += MyPanel;
118 parameter_workspaces[bankAndPanelCount] += MyPanel;
122 findL2(MyPanels, peaksWs);
124 double delta = results->
cell<
double>(4, 1);
125 g_log.
notice() <<
"For west rotation change det_arc1 " <<
delta <<
" degrees\n";
126 results = AnalysisDataService::Instance().retrieveWS<
ITableWorkspace>(
"params_East");
128 g_log.
notice() <<
"For east rotation change det_arc2 " <<
delta <<
" degrees\n";
131 for (
const auto &MyBankName : MyBankNames) {
132 fit_workspaces[bankAndPanelCount] += MyBankName;
133 parameter_workspaces[bankAndPanelCount] += MyBankName;
137 findL2(MyBankNames, peaksWs);
141 for (
int j = bankAndPanelCount - 1; j >= 0; j--) {
142 if (!AnalysisDataService::Instance().doesExist(fit_workspaces[j]))
143 fit_workspaces.erase(fit_workspaces.begin() + j);
144 if (!AnalysisDataService::Instance().doesExist(parameter_workspaces[j]))
145 parameter_workspaces.erase(parameter_workspaces.begin() + j);
151 parameter_workspaces.emplace_back(
"params_L1");
152 fit_workspaces.emplace_back(
"fit_L1");
156 parameter_workspaces.emplace_back(
"params_T0");
157 fit_workspaces.emplace_back(
"fit_T0");
159 std::sort(parameter_workspaces.begin(), parameter_workspaces.end());
160 std::sort(fit_workspaces.begin(), fit_workspaces.end());
163 auto groupAlg = AlgorithmManager::Instance().createUnmanaged(
"GroupWorkspaces");
164 groupAlg->initialize();
165 groupAlg->setProperty(
"InputWorkspaces", parameter_workspaces);
166 groupAlg->setProperty(
"OutputWorkspace",
"Fit_Parameters");
169 groupAlg = AlgorithmManager::Instance().createUnmanaged(
"GroupWorkspaces");
170 groupAlg->initialize();
171 groupAlg->setProperty(
"InputWorkspaces", fit_workspaces);
172 groupAlg->setProperty(
"OutputWorkspace",
"Fit_Residuals");
179 for (
int i = 0; i < nPeaks; i++) {
184 }
catch (
const std::exception &exc) {
185 g_log.
notice() <<
"Problem in applying calibration to peak " << i <<
" : " << exc.what() <<
"\n";
194 string DetCalFileName =
getProperty(
"DetCalFilename");
195 API::Run &run = peaksWs->mutableRun();
208 ColWksp->setInstrument(inst2);
211 RowWksp->setInstrument(inst2);
214 TofWksp->setInstrument(inst2);
215 OrientedLattice lattice = peaksWs->mutableSample().getOrientedLattice();
218 peaksWs->sort(criteria);
220 for (
int i = 0; i < static_cast<int>(MyBankNames.size()); ++i) {
222 const std::string &bankName = *std::next(MyBankNames.begin(), i);
223 size_t k = bankName.find_last_not_of(
"0123456789");
225 if (k < bankName.length())
226 bank = boost::lexical_cast<int>(bankName.substr(k + 1));
227 ColWksp->getSpectrum(i).setSpectrumNo(
specnum_t(bank));
228 RowWksp->getSpectrum(i).setSpectrumNo(
specnum_t(bank));
229 TofWksp->getSpectrum(i).setSpectrumNo(
specnum_t(bank));
230 auto &ColX = ColWksp->mutableX(i);
231 auto &ColY = ColWksp->mutableY(i);
232 auto &RowX = RowWksp->mutableX(i);
233 auto &RowY = RowWksp->mutableY(i);
234 auto &TofX = TofWksp->mutableX(i);
235 auto &TofY = TofWksp->mutableY(i);
237 for (
int j = 0; j < nPeaks; j++) {
238 Peak peak = peaksWs->getPeak(j);
243 ColX[icount] = peak.
getCol();
244 ColY[icount] = theoretical.
getCol();
245 RowX[icount] = peak.
getRow();
246 RowY[icount] = theoretical.
getRow();
247 TofX[icount] = peak.
getTOF();
248 TofY[icount] = theoretical.
getTOF();
269 save->setProperty(
"InputWorkspace", outputWS);
270 save->setProperty(
"FileName", outputFile);
285 std::ostringstream fun_str;
286 fun_str <<
"name=SCDPanelErrors,Workspace=" << peaksWs->getName() <<
",Bank=moderator";
287 std::ostringstream tie_str;
288 tie_str <<
"XShift=0.0,YShift=0.0,XRotate=0.0,YRotate=0.0,ZRotate=0.0,"
289 "ScaleWidth=1.0,ScaleHeight=1.0,T0Shift ="
291 fitL1_alg->setPropertyValue(
"Function", fun_str.str());
292 fitL1_alg->setProperty(
"Ties", tie_str.str());
293 fitL1_alg->setProperty(
"InputWorkspace", L1WS);
294 fitL1_alg->setProperty(
"CreateOutput",
true);
295 fitL1_alg->setProperty(
"Output",
"fit");
296 fitL1_alg->executeAsChildAlg();
297 std::string fitL1Status = fitL1_alg->getProperty(
"OutputStatus");
298 double chisqL1 = fitL1_alg->getProperty(
"OutputChi2overDoF");
300 AnalysisDataService::Instance().addOrReplace(
"fit_L1", fitL1);
302 AnalysisDataService::Instance().addOrReplace(
"params_L1", paramsL1);
303 double deltaL1 = paramsL1->getRef<
double>(
"Value", 2);
305 com.
moveDetector(0.0, 0.0, deltaL1, 0.0, 0.0, 0.0, 1.0, 1.0,
"moderator", peaksWs);
306 g_log.
notice() <<
"L1 = " << -peaksWs->getInstrument()->getSource()->getPos().Z() <<
" " << fitL1Status
307 <<
" Chi2overDoF " << chisqL1 <<
"\n";
321 std::ostringstream fun_str;
322 fun_str <<
"name=SCDPanelErrors,Workspace=" << peaksWs->getName() <<
",Bank=none";
323 std::ostringstream tie_str;
324 tie_str <<
"XShift=0.0,YShift=0.0,ZShift=0.0,XRotate=0.0,YRotate=0.0,ZRotate=0.0,"
325 "ScaleWidth=1.0,ScaleHeight=1.0";
326 fitT0_alg->setPropertyValue(
"Function", fun_str.str());
327 fitT0_alg->setProperty(
"Ties", tie_str.str());
328 fitT0_alg->setProperty(
"InputWorkspace", T0WS);
329 fitT0_alg->setProperty(
"CreateOutput",
true);
330 fitT0_alg->setProperty(
"Output",
"fit");
332 fitT0_alg->setProperty(
"Minimizer",
"Simplex");
333 fitT0_alg->setProperty(
"MaxIterations", 1000);
334 fitT0_alg->executeAsChildAlg();
335 std::string fitT0Status = fitT0_alg->getProperty(
"OutputStatus");
336 double chisqT0 = fitT0_alg->getProperty(
"OutputChi2overDoF");
338 AnalysisDataService::Instance().addOrReplace(
"fit_T0", fitT0);
340 AnalysisDataService::Instance().addOrReplace(
"params_T0", paramsT0);
341 mT0 = paramsT0->getRef<
double>(
"Value", 8);
342 API::Run &run = peaksWs->mutableRun();
345 if (run.hasProperty(
"T0")) {
348 run.addProperty<
double>(
"T0",
mT0 + oldT0,
true);
349 g_log.
notice() <<
"T0 = " <<
mT0 <<
" " << fitT0Status <<
" Chi2overDoF " << chisqT0 <<
"\n";
350 for (
int i = 0; i < peaksWs->getNumberPeaks(); i++) {
365 g_log.
error(
"Can't locate CalculateUMatrix algorithm");
376 peaksWs->sample().hasOrientedLattice()) {
381 alpha = latt.
alpha();
383 gamma = latt.
gamma();
385 ub_alg->setProperty(
"PeaksWorkspace", peaksWs);
386 ub_alg->setProperty(
"a", a);
387 ub_alg->setProperty(
"b", b);
388 ub_alg->setProperty(
"c", c);
389 ub_alg->setProperty(
"alpha", alpha);
390 ub_alg->setProperty(
"beta", beta);
391 ub_alg->setProperty(
"gamma", gamma);
392 ub_alg->executeAsChildAlg();
396 alg->setPropertyValue(
"PeaksWorkspace", peaksWs->getName());
397 alg->setProperty(
"Tolerance", 0.15);
398 alg->executeAsChildAlg();
399 int numIndexed = alg->getProperty(
"NumIndexed");
401 g_log.
notice() << peaksWs->sample().getOrientedLattice().getUB() <<
"\n";
415 boost::container::flat_set<string> &AllBankName,
double T0,
416 const string &filename) {
418 if (filename.empty())
421 g_log.
notice() <<
"Saving DetCal file in " << filename <<
"\n";
424 const size_t number_spectra = instrument->getNumberDetectors();
427 wksp->setInstrument(instrument);
428 wksp->rebuildSpectraMapping(
true );
431 std::vector<string> banknames(AllBankName.begin(), AllBankName.end());
435 alg->setProperty(
"InputWorkspace", wksp);
436 alg->setProperty(
"Filename", filename);
437 alg->setProperty(
"TimeOffset", T0);
438 alg->setProperty(
"BankNames", banknames);
439 alg->executeAsChildAlg();
444 "Workspace of Indexed Peaks");
446 auto mustBePositive = std::make_shared<BoundedValidator<double>>();
447 mustBePositive->setLower(0.0);
450 "Lattice Parameter a (Leave empty to use lattice constants "
451 "in peaks workspace)");
453 "Lattice Parameter b (Leave empty to use lattice constants "
454 "in peaks workspace)");
456 "Lattice Parameter c (Leave empty to use lattice constants "
457 "in peaks workspace)");
459 "Lattice Parameter alpha in degrees (Leave empty to use "
460 "lattice constants in peaks workspace)");
462 "Lattice Parameter beta in degrees (Leave empty to use "
463 "lattice constants in peaks workspace)");
465 "Lattice Parameter gamma in degrees (Leave empty to use "
466 "lattice constants in peaks workspace)");
467 declareProperty(
"ChangeL1",
true,
"Change the L1(source to sample) distance");
470 "Change the height and width of the "
471 "detectors. Implemented only for "
472 "RectangularDetectors.");
474 declareProperty(
"EdgePixels", 0,
"Remove peaks that are at pixels this close to edge. ");
475 declareProperty(
"CalibrateBanks",
true,
"Calibrate the panels of the banks.");
477 "Calibrate the 3 X 3 panels of the "
481 const std::vector<std::string> detcalExts{
".DetCal",
".Det_Cal"};
483 std::make_unique<FileProperty>(
"DetCalFilename",
"SCDCalibrate.DetCal",
FileProperty::Save, detcalExts),
484 "Path to an ISAW-style .detcal file to save.");
487 "Path to an Mantid .xml description(for LoadParameterFile) file to "
491 "Path to a NeXus file comparing calculated and theoretical "
492 "column of each peak.");
495 "Path to a NeXus file comparing calculated and theoretical "
496 "row of each peak.");
499 "Path to a NeXus file comparing calculated and theoretical "
500 "TOF of each peak.");
502 const string OUTPUTS(
"Outputs");
511 ostream <<
" <parameter name =\"" <<
name <<
"\"><value val=\"" <<
value <<
"\" /> </parameter>\n";
516 if (FileName.empty())
519 g_log.
notice() <<
"Saving parameter file as " << FileName <<
"\n";
522 ofstream oss3(FileName.c_str());
523 oss3 <<
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
524 oss3 <<
" <parameter-file instrument=\"" << instrument.
getName() <<
"\" valid-from=\""
529 for (
auto bankName : AllBankNames) {
530 if (instrument.
getName().compare(
"CORELLI") == 0.0)
531 bankName.append(
"/sixteenpack");
532 oss3 <<
"<component-link name=\"" << bankName <<
"\">\n";
535 Quat relRot = bank->getRelativeRot();
543 V3D pos1 = bank->getRelativePos();
548 vector<double> oldScalex =
pmap->getDouble(bank->getName(),
string(
"scalex"));
549 vector<double> oldScaley =
pmap->getDouble(bank->getName(),
string(
"scaley"));
552 if (!oldScalex.empty())
557 if (!oldScaley.empty())
562 oss3 << R
"( <parameter name ="scalex"><value val=")" << scalex << "\" /> </parameter>\n";
563 oss3 << R
"( <parameter name ="scaley"><value val=")" << scaley << "\" /> </parameter>\n";
564 oss3 <<
"</component-link>\n";
570 oss3 <<
"<component-link name=\"" << source->getName() <<
"\">\n";
571 V3D sourceRelPos = source->getRelativePos();
576 oss3 <<
"</component-link>\n";
577 oss3 <<
"</parameter-file>\n";
589 for (
int bankIndex = 0; bankIndex < static_cast<int>(MyBankNames.size()); ++bankIndex) {
591 const std::string &iBank = *std::next(MyBankNames.begin(), bankIndex);
592 const std::string bankName =
"__PWS_" + iBank;
594 AnalysisDataService::Instance().addOrReplace(bankName, local);
595 std::vector<Peak> &localPeaks = local->getPeaks();
596 auto lit = std::remove_if(localPeaks.begin(), localPeaks.end(), [&iBank](
const Peak &pk) {
597 std::string name = pk.getBankName();
598 IComponent_const_sptr det = pk.getInstrument()->getComponentByName(name);
599 if (det && iBank.substr(0, 4) !=
"bank") {
600 IComponent_const_sptr parent = det->getParent();
602 IComponent_const_sptr grandparent = parent->getParent();
604 name = grandparent->getName();
609 return name != iBank;
611 localPeaks.erase(lit, localPeaks.end());
613 int nBankPeaks = local->getNumberPeaks();
614 if (nBankPeaks < 6) {
615 g_log.
notice() <<
"Too few peaks for " << iBank <<
"\n";
622 auto &outSpec = q3DWS->getSpectrum(0);
623 auto &yVec = outSpec.mutableY();
624 auto &eVec = outSpec.mutableE();
625 auto &xVec = outSpec.mutableX();
628 for (
int i = 0; i < nBankPeaks; i++) {
638 for (
int j = 0; j < 3; j++) {
652 std::ostringstream fun_str;
653 fun_str <<
"name=SCDPanelErrors,Workspace=" + bankName <<
",Bank=" << iBank;
654 fit_alg->setPropertyValue(
"Function", fun_str.str());
655 std::ostringstream tie_str;
656 tie_str <<
"ScaleWidth=1.0,ScaleHeight=1.0,T0Shift =" <<
mT0;
657 fit_alg->setProperty(
"Ties", tie_str.str());
658 fit_alg->setProperty(
"InputWorkspace", q3DWS);
659 fit_alg->setProperty(
"CreateOutput",
true);
660 fit_alg->setProperty(
"Output",
"fit");
661 fit_alg->executeAsChildAlg();
662 std::string fitStatus = fit_alg->getProperty(
"OutputStatus");
663 double fitChisq = fit_alg->getProperty(
"OutputChi2overDoF");
664 g_log.
notice() << iBank <<
" " << fitStatus <<
" Chi2overDoF " << fitChisq <<
"\n";
666 AnalysisDataService::Instance().addOrReplace(
"fit_" + iBank, fitWS);
668 AnalysisDataService::Instance().addOrReplace(
"params_" + iBank, paramsWS);
669 double xShift = paramsWS->getRef<
double>(
"Value", 0);
670 double yShift = paramsWS->getRef<
double>(
"Value", 1);
671 double zShift = paramsWS->getRef<
double>(
"Value", 2);
672 double xRotate = paramsWS->getRef<
double>(
"Value", 3);
673 double yRotate = paramsWS->getRef<
double>(
"Value", 4);
674 double zRotate = paramsWS->getRef<
double>(
"Value", 5);
675 double scaleWidth = 1.0;
676 double scaleHeight = 1.0;
679 std::shared_ptr<const Geometry::RectangularDetector> rectDet =
680 std::dynamic_pointer_cast<const Geometry::RectangularDetector>(comp);
681 if (rectDet && changeSize) {
689 fit2_alg->setPropertyValue(
"Function", fun_str.str());
690 std::ostringstream tie_str2;
691 tie_str2 <<
"XShift=" << xShift <<
",YShift=" << yShift <<
",ZShift=" << zShift <<
",XRotate=" << xRotate
692 <<
",YRotate=" << yRotate <<
",ZRotate=" << zRotate <<
",T0Shift =" <<
mT0;
693 fit2_alg->setProperty(
"Ties", tie_str2.str());
694 fit2_alg->setProperty(
"InputWorkspace", q3DWS);
695 fit2_alg->setProperty(
"CreateOutput",
true);
696 fit2_alg->setProperty(
"Output",
"fit");
697 fit2_alg->executeAsChildAlg();
698 std::string fit2Status = fit2_alg->getProperty(
"OutputStatus");
699 double fit2Chisq = fit2_alg->getProperty(
"OutputChi2overDoF");
700 g_log.
notice() << iBank <<
" " << fit2Status <<
" Chi2overDoF " << fit2Chisq <<
"\n";
701 fitWS = fit2_alg->getProperty(
"OutputWorkspace");
702 AnalysisDataService::Instance().addOrReplace(
"fit_" + iBank, fitWS);
703 paramsWS = fit2_alg->getProperty(
"OutputParameters");
704 AnalysisDataService::Instance().addOrReplace(
"params_" + iBank, paramsWS);
705 scaleWidth = paramsWS->getRef<
double>(
"Value", 6);
706 scaleHeight = paramsWS->getRef<
double>(
"Value", 7);
708 AnalysisDataService::Instance().remove(bankName);
710 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.
ComponentInfo : Provides a component centric view on to the instrument.
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< PeaksWorkspace > PeaksWorkspace_sptr
Typedef for a shared pointer to a peaks workspace.
std::shared_ptr< Workspace2D > Workspace2D_sptr
shared pointer to Mantid::DataObjects::Workspace2D
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.