Mantid
Loading...
Searching...
No Matches
LoadNXcanSAS.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
10#include "MantidAPI/Axis.h"
14#include "MantidAPI/Progress.h"
16#include "MantidAPI/Run.h"
17#include "MantidAPI/Workspace.h"
22#include "MantidKernel/Logger.h"
24
25#include <H5Cpp.h>
26#include <Poco/DirectoryIterator.h>
27#include <Poco/Path.h>
28#include <nexus/NeXusFile.hpp>
29#include <type_traits>
30
31using namespace Mantid::Kernel;
32using namespace Mantid::API;
33using namespace Mantid::DataHandling::NXcanSAS;
34using Mantid::HistogramData::HistogramE;
35using Mantid::HistogramData::HistogramX;
36using Mantid::HistogramData::HistogramY;
37
38namespace {
39
40Mantid::Kernel::Logger g_log("LoadNXcanSAS");
41
42struct DataSpaceInformation {
43 DataSpaceInformation(size_t dimSpectrumAxis = 0, size_t dimBin = 0)
44 : dimSpectrumAxis(dimSpectrumAxis), dimBin(dimBin) {}
45 size_t dimSpectrumAxis;
46 size_t dimBin;
47};
48
49DataSpaceInformation getDataSpaceInfo(H5::DataSet &dataSet) {
50 DataSpaceInformation dataSpaceInfo;
51 auto dataSpace = dataSet.getSpace();
52 const auto rank = dataSpace.getSimpleExtentNdims();
53 if (rank > 2) {
54 std::invalid_argument("LoadNXcanSAS: Cannot load a data set "
55 "with more than 2 dimensions.");
56 }
57
58 hsize_t dims[2] = {0, 0};
59 dataSpace.getSimpleExtentDims(dims);
60 // If dims[1] is 0, then the first entry is the number of data points
61 // If dims[1] is not 0, then the second entry is the number of data points
62 if (dims[1] == 0) {
63 dims[1] = dims[0];
64 dims[0] = 1; // One histogram
65 }
66
67 dataSpaceInfo.dimSpectrumAxis = dims[0];
68 dataSpaceInfo.dimBin = dims[1];
69 return dataSpaceInfo;
70}
71
72std::string getNameOfEntry(H5::H5File &root) {
73 auto numberOfObjects = root.getNumObjs();
74 if (numberOfObjects != 1) {
75 throw std::invalid_argument("LoadNXcanSAS: Trying to load multiperiod "
76 "data. This is currently not supported.");
77 }
78
79 auto objectType = root.getObjTypeByIdx(0);
80 if (objectType != H5G_GROUP) {
81 throw std::invalid_argument("LoadNXcanSAS: The object below the root is not a H5::Group.");
82 }
83
84 return root.getObjnameByIdx(0);
85}
86
88 auto dimInfo = getDataSpaceInfo(dataSet);
89
90 // Create a workspace based on the dataSpace information
91 return Mantid::API::WorkspaceFactory::Instance().create("Workspace2D", dimInfo.dimSpectrumAxis /*NHisto*/,
92 dimInfo.dimBin /*xdata*/, dimInfo.dimBin /*ydata*/);
93}
94
95Mantid::API::MatrixWorkspace_sptr createWorkspaceForHistogram(H5::DataSet &dataSet) {
96 auto dimInfo = getDataSpaceInfo(dataSet);
97
98 // Create a workspace based on the dataSpace information
99 return Mantid::API::WorkspaceFactory::Instance().create("Workspace2D", dimInfo.dimSpectrumAxis /*NHisto*/,
100 dimInfo.dimBin + 1 /*xdata*/, dimInfo.dimBin /*ydata*/);
101}
102
103// ----- LOGS
104
105void addLogFromGroupIfExists(H5::Group &sasGroup, std::string const &sasTerm, Run &run,
106 std::string const &propertyName) {
107 auto value = Mantid::DataHandling::H5Util::readString(sasGroup, sasTerm);
108 if (!value.empty()) {
109 run.addLogData(new PropertyWithValue<std::string>(propertyName, value));
110 }
111}
112
113void loadLogs(H5::Group &entry, const Mantid::API::MatrixWorkspace_sptr &workspace) {
114 auto &run = workspace->mutableRun();
115
116 // Load UserFile and BatchFile (optional)
117 auto process = entry.openGroup(sasProcessGroupName);
118 addLogFromGroupIfExists(process, sasProcessTermUserFile, run, sasProcessUserFileInLogs);
119 addLogFromGroupIfExists(process, sasProcessTermBatchFile, run, sasProcessBatchFileInLogs);
120
121 // Load Run (optional)
122 addLogFromGroupIfExists(entry, sasEntryRun, run, sasEntryRunInLogs);
123
124 // Load Title (optional)
126 if (!title.empty()) {
127 workspace->setTitle(title);
128 }
129}
130
131// ----- INSTRUMENT
132std::string extractIdfFileOnCurrentSystem(const std::string &idf) {
133 // If the idf is is not empty extract the last element from the file
134 if (idf.empty()) {
135 return "";
136 }
137
138 // Get the specified IDF name
139 Poco::Path path(idf);
140 const auto &fileName = path.getFileName();
141
142 // Compare against all available IDFs
143 const std::vector<std::string> &directoryNames = Mantid::Kernel::ConfigService::Instance().getInstrumentDirectories();
144 Poco::DirectoryIterator end_iter;
145 for (const auto &directoryName : directoryNames) {
146 for (Poco::DirectoryIterator dir_itr(directoryName); dir_itr != end_iter; ++dir_itr) {
147 if (Poco::File(dir_itr->path()).isFile()) {
148 if (fileName == Poco::Path(dir_itr->path()).getFileName()) {
149 return Poco::Path(dir_itr->path()).absolute().toString();
150 }
151 }
152 }
153 }
154 return "";
155}
156
157void loadInstrument(H5::Group &entry, const Mantid::API::MatrixWorkspace_sptr &workspace) {
158 auto instrument = entry.openGroup(sasInstrumentGroupName);
159
160 // Get instrument name
161 auto instrumentName = Mantid::DataHandling::H5Util::readString(instrument, sasInstrumentName);
162 if (instrumentName.empty()) {
163 return;
164 }
165
166 // Get IDF
168 idf = extractIdfFileOnCurrentSystem(idf);
169
170 // Try to load the instrument. If it fails we will continue nevertheless.
171 try {
172 auto instAlg = Mantid::API::AlgorithmManager::Instance().createUnmanaged("LoadInstrument");
173 instAlg->initialize();
174 instAlg->setChild(true);
175 instAlg->setProperty("Workspace", workspace);
176 instAlg->setProperty("InstrumentName", instrumentName);
177 if (!idf.empty()) {
178 instAlg->setProperty("Filename", idf);
179 }
180 instAlg->setProperty("RewriteSpectraMap", "False");
181 instAlg->execute();
182 } catch (std::invalid_argument &) {
183 g_log.information("Invalid argument to LoadInstrument Child Algorithm.");
184 } catch (std::runtime_error &) {
185 g_log.information("Unable to successfully run LoadInstrument Child Algorithm.");
186 }
187}
188
189// ----- DATA
190WorkspaceDimensionality getWorkspaceDimensionality(H5::Group &dataGroup) {
191 WorkspaceDimensionality dimensionality(WorkspaceDimensionality::other);
192 auto intensity = dataGroup.openDataSet(sasDataI);
193 auto dataSpaceInfo = getDataSpaceInfo(intensity);
194
195 if (dataSpaceInfo.dimSpectrumAxis == 1 && dataSpaceInfo.dimBin > 0) {
196 dimensionality = WorkspaceDimensionality::oneD;
197 } else if (dataSpaceInfo.dimSpectrumAxis > 1 && dataSpaceInfo.dimBin > 0) {
198 dimensionality = WorkspaceDimensionality::twoD;
199 } else {
200 dimensionality = WorkspaceDimensionality::other;
201 }
202 return dimensionality;
203}
204
205std::string getUnit(H5::DataSet &dataSet) {
207}
208
209bool hasQDev(H5::Group &dataGroup) {
210 bool hasQDev(true);
211 try {
212 dataGroup.openDataSet(sasDataQdev);
213 } catch (H5::GroupIException &) {
214 hasQDev = false;
215 } catch (H5::FileIException &) {
216 hasQDev = false;
217 }
218
219 return hasQDev;
220}
221
222void loadData1D(H5::Group &dataGroup, const Mantid::API::MatrixWorkspace_sptr &workspace) {
223 // General
224 workspace->setDistribution(true);
225
226 // Load the Q value
228 workspace->getAxis(0)->setUnit("MomentumTransfer");
229
230 // Load the I value + units
232
233 auto iDataSet = dataGroup.openDataSet(sasDataI);
234 auto yUnit = getUnit(iDataSet);
235 workspace->setYUnit(yUnit);
236
237 // Load the Idev value
239
240 // Load the Qdev value (optional)
241 bool hasQResolution = hasQDev(dataGroup);
242 if (hasQResolution) {
243 workspace->setPointStandardDeviations(
245 }
246}
247
248template <typename Functor>
249void read2DWorkspace(H5::DataSet &dataSet, Mantid::API::MatrixWorkspace_sptr workspace, Functor func,
250 const H5::DataType &memoryDataType) {
251 using namespace Mantid::DataHandling::NXcanSAS;
252 auto dimInfo = getDataSpaceInfo(dataSet);
253
254 // File Data Space
255 auto fileSpace = dataSet.getSpace();
256
257 // Size of single slab
258 const hsize_t rank = 2;
259 hsize_t sizeOfSingleSlab[rank] = {1, dimInfo.dimBin};
260 hsize_t start[rank] = {0, 0};
261
262 // Memory Data Space
263 hsize_t memSpaceDimension[1] = {dimInfo.dimBin};
264 H5::DataSpace memSpace(1, memSpaceDimension);
265
266 auto &dataHist = func(workspace, 0);
267 Mantid::MantidVec data(dataHist.size());
268 for (size_t index = 0; index < dimInfo.dimSpectrumAxis; ++index) {
269 // Set the dataSpace to a 1D HyperSlab
270 fileSpace.selectHyperslab(H5S_SELECT_SET, sizeOfSingleSlab, start);
271 dataSet.read(data.data(), memoryDataType, memSpace, fileSpace);
272 auto &dat = func(workspace, index);
273 dat = data;
274 ++start[0];
275 }
276}
277
278void readQyInto2DWorkspace(H5::DataSet &dataSet, const Mantid::API::MatrixWorkspace_sptr &workspace,
279 const H5::DataType &memoryDataType) {
280 using namespace Mantid::DataHandling::NXcanSAS;
281
282 // Get info about the data set
283 auto dimInfo = getDataSpaceInfo(dataSet);
284
285 // If axis 1 is spectra axis we need to convert it to numeric axes.
286 if (workspace->getAxis(1)->isSpectra()) {
287 auto newAxis = std::make_unique<Mantid::API::NumericAxis>(dimInfo.dimSpectrumAxis);
288 workspace->replaceAxis(1, std::move(newAxis));
289 }
290
291 // File Data Space
292 auto fileSpace = dataSet.getSpace();
293
294 // Size of single slab
295 const hsize_t rank = 2;
296 hsize_t sizeOfSingleSlab[rank] = {dimInfo.dimSpectrumAxis, 1};
297 hsize_t start[rank] = {0, 0};
298
299 // Memory Data Space
300 hsize_t memSpaceDimension[1] = {dimInfo.dimSpectrumAxis};
301 H5::DataSpace memSpace(1, memSpaceDimension);
302
303 // Select the HyperSlab
304 fileSpace.selectHyperslab(H5S_SELECT_SET, sizeOfSingleSlab, start);
305
306 // Read the data
308 data.resize(dimInfo.dimSpectrumAxis);
309 dataSet.read(data.data(), memoryDataType, memSpace, fileSpace);
310
311 auto axis1 = workspace->getAxis(1);
312 for (size_t index = 0; index < dimInfo.dimSpectrumAxis; ++index) {
313 axis1->setValue(index, data[index]);
314 }
315
316 // Set the axis units
317 axis1->unit() = Mantid::Kernel::UnitFactory::Instance().create("MomentumTransfer");
318}
319
320void loadData2D(H5::Group &dataGroup, const Mantid::API::MatrixWorkspace_sptr &workspace) {
321 // General
322 workspace->setDistribution(true);
323 //-----------------------------------------
324 // Load the I value.
325 auto iDataSet = dataGroup.openDataSet(sasDataI);
326 auto iExtractor = [](const Mantid::API::MatrixWorkspace_sptr &ws, size_t index) -> HistogramY & {
327 return ws->mutableY(index);
328 };
330 read2DWorkspace(iDataSet, workspace, iExtractor, iDataType);
331 auto yUnit = getUnit(iDataSet);
332 workspace->setYUnit(yUnit);
333
334 //-----------------------------------------
335 // Load the Idev value
336 auto eDataSet = dataGroup.openDataSet(sasDataIdev);
337 auto eExtractor = [](const Mantid::API::MatrixWorkspace_sptr &ws, size_t index) -> HistogramE & {
338 return ws->mutableE(index);
339 };
340 read2DWorkspace(eDataSet, workspace, eExtractor, iDataType);
341
342 //-----------------------------------------
343 // Load the Qx value + units
344 auto qxDataSet = dataGroup.openDataSet(sasDataQx);
345 auto qxExtractor = [](const Mantid::API::MatrixWorkspace_sptr &ws, size_t index) -> HistogramX & {
346 return ws->mutableX(index);
347 };
349 read2DWorkspace(qxDataSet, workspace, qxExtractor, qxDataType);
350 workspace->getAxis(0)->setUnit("MomentumTransfer");
351
352 //-----------------------------------------
353 // Load the Qy value
354 auto qyDataSet = dataGroup.openDataSet(sasDataQy);
356 readQyInto2DWorkspace(qyDataSet, workspace, qyDataType);
357}
358
359void loadData(H5::Group &entry, const Mantid::API::MatrixWorkspace_sptr &workspace) {
360 auto dataGroup = entry.openGroup(sasDataGroupName);
361 auto dimensionality = getWorkspaceDimensionality(dataGroup);
362 switch (dimensionality) {
363 case (WorkspaceDimensionality::oneD):
364 loadData1D(dataGroup, workspace);
365 break;
366 case (WorkspaceDimensionality::twoD):
367 loadData2D(dataGroup, workspace);
368 break;
369 default:
370 throw std::invalid_argument("LoadNXcanSAS: Cannot load workspace which not 1D or 2D.");
371 }
372}
373
374bool findDefinition(::NeXus::File &file) {
375 bool foundDefinition = false;
376 auto entries = file.getEntries();
377
378 for (auto &entry : entries) {
379 if (entry.second == sasEntryClassAttr || entry.second == nxEntryClassAttr) {
380 file.openGroup(entry.first, entry.second);
381 file.openData(sasEntryDefinition);
382 auto definitionFromFile = file.getStrData();
383 if (definitionFromFile == sasEntryDefinitionFormat) {
384 foundDefinition = true;
385 break;
386 }
387 file.closeData();
388 file.closeGroup();
389 }
390 }
391 return foundDefinition;
392}
393
394// --- TRANSMISSION
395bool hasTransmissionEntry(H5::Group &entry, const std::string &name) {
396 bool hasTransmission(false);
397 try {
398 entry.openGroup(sasTransmissionSpectrumGroupName + "_" + name);
399 hasTransmission = true;
400 } catch (H5::GroupIException &) {
401 } catch (H5::FileIException &) {
402 }
403 return hasTransmission;
404}
405
406void loadTransmissionData(H5::Group &transmission, const Mantid::API::MatrixWorkspace_sptr &workspace) {
407 //-----------------------------------------
408 // Load T
409 workspace->mutableY(0) =
411 //-----------------------------------------
412 // Load Tdev
413 workspace->mutableE(0) =
415 //-----------------------------------------
416 // Load Lambda. A bug in older versions (fixed in 6.0) allowed the
417 // transmission lambda points to be saved as bin edges rather than points as
418 // required by the NXcanSAS standard. We allow loading those files and convert
419 // to points on the fly
421 if (lambda.size() == workspace->blocksize())
422 workspace->setPoints(0, std::move(lambda));
423 else if (lambda.size() == workspace->blocksize() + 1)
424 workspace->setBinEdges(0, std::move(lambda));
425 else {
426#if defined(H5_USE_18_API)
427 const std::string objectName{transmission.getObjName()};
428#else
429 const size_t nchars = H5Iget_name(transmission.getId(), nullptr, 0);
430 std::string objectName;
431 objectName.resize(nchars);
432 H5Iget_name(transmission.getId(), objectName.data(),
433 nchars + 1); // +1 for null terminator
434#endif
435 throw std::runtime_error("Unexpected array size for lambda in transmission group '" + objectName +
436 "'. Expected length=" + std::to_string(workspace->blocksize()) +
437 ", found length=" + std::to_string(lambda.size()));
438 }
439
440 workspace->getAxis(0)->unit() = Mantid::Kernel::UnitFactory::Instance().create("Wavelength");
441}
442} // namespace
443
444namespace Mantid::DataHandling {
445
446// Register the algorithm into the AlgorithmFactory
448
449
451
453 const std::string &extn = descriptor.extension();
454 if (extn != ".nxs" && extn != ".h5") {
455 return 0;
456 }
457
458 int confidence(0);
459
460 ::NeXus::File &file = descriptor.data();
461 // Check if there is an entry root/SASentry/definition->NXcanSAS
462 try {
463 bool foundDefinition = findDefinition(file);
464 if (foundDefinition) {
465 confidence = 95;
466 }
467 } catch (...) {
468 }
469
470 return confidence;
471}
472
474 // Declare required input parameters for algorithm
475 const std::vector<std::string> exts{".nxs", ".h5"};
476 declareProperty(std::make_unique<Mantid::API::FileProperty>("Filename", "", FileProperty::Load, exts),
477 "The name of the NXcanSAS file to read, as a full or relative path.");
478 declareProperty(std::make_unique<Mantid::API::WorkspaceProperty<Mantid::API::Workspace>>("OutputWorkspace", "",
480 "The name of the workspace to be created as the output of "
481 "the algorithm. A workspace of this name will be created "
482 "and stored in the Analysis Data Service. For multiperiod "
483 "files, one workspace may be generated for each period. "
484 "Currently only one workspace can be saved at a time so "
485 "multiperiod Mantid files are not generated.");
486
487 declareProperty(std::make_unique<PropertyWithValue<bool>>("LoadTransmission", false, Direction::Input),
488 "Load the transmission related data from the file if it is present "
489 "(optional, default False).");
490}
491
493 const std::string fileName = getPropertyValue("Filename");
494 const bool loadTransmissions = getProperty("LoadTransmission");
495 H5::H5File file(fileName, H5F_ACC_RDONLY);
496
497 // Setup progress bar
498 const int numberOfSteps = loadTransmissions ? 4 : 3;
499 Progress progress(this, 0.1, 1.0, numberOfSteps);
500
501 auto entryName = getNameOfEntry(file);
502 auto entry = file.openGroup(entryName);
503
504 // Create the output workspace
505 auto dataGroup = entry.openGroup(sasDataGroupName);
506 auto intensity = dataGroup.openDataSet(sasDataI);
507 auto ws = createWorkspace(intensity);
508
509 // Load the logs
510 progress.report("Loading logs.");
511 loadLogs(entry, ws);
512
513 // Load instrument
514 progress.report("Loading instrument.");
515 loadInstrument(entry, ws);
516
517 // Load data
518 progress.report("Loading data.");
519 loadData(entry, ws);
520
521 // Load Transmissions
522
523 if (loadTransmissions) {
524 progress.report("Loading transmissions.");
525 // Load sample transmission
527
528 // Load can transmission
530 }
531 file.close();
532 setProperty("OutputWorkspace", ws);
533}
534
535void LoadNXcanSAS::loadTransmission(H5::Group &entry, const std::string &name) {
536 if (!hasTransmissionEntry(entry, name)) {
537 g_log.information("NXcanSAS file does not contain transmission for " + name);
538 return;
539 }
540
541 auto transmission = entry.openGroup(sasTransmissionSpectrumGroupName + "_" + name);
542
543 // Create a 1D workspace
544 auto tDataSet = transmission.openDataSet(sasTransmissionSpectrumT);
545 auto workspace = createWorkspaceForHistogram(tDataSet);
546
547 // Load logs
548 loadLogs(entry, workspace);
549 auto title = workspace->getTitle();
550 const std::string transExtension = "_trans_" + name;
551 title += transExtension;
552 workspace->setTitle(transExtension);
553
554 // Load instrument
555 loadInstrument(entry, workspace);
556
557 // Load transmission data
558 loadTransmissionData(transmission, workspace);
559
560 // Set to distribution
561 workspace->setDistribution(true);
562 workspace->setYUnitLabel("Transmission");
563
564 // Set the workspace on the output
565
566 std::string propertyName;
567 if (name == "sample")
568 propertyName = "TransmissionWorkspace";
569 else
570 propertyName = "TransmissionCanWorkspace";
571 const std::string doc = "The transmission workspace";
572
575 doc);
576 setProperty(propertyName, workspace);
577}
578
579} // namespace Mantid::DataHandling
const std::vector< double > * lambda
double value
The value of the point.
Definition: FitMW.cpp:51
IPeaksWorkspace_sptr workspace
Definition: IndexPeaks.cpp:114
std::map< DeltaEMode::Type, std::string > index
Definition: DeltaEMode.cpp:19
#define DECLARE_NEXUS_FILELOADER_ALGORITHM(classname)
DECLARE_NEXUS_FILELOADER_ALGORITHM should be used in place of the standard DECLARE_ALGORITHM macro wh...
void declareProperty(std::unique_ptr< Kernel::Property > p, const std::string &doc="") override
Add a property to the list of managed properties.
Definition: Algorithm.cpp:1913
std::string getPropertyValue(const std::string &name) const override
Get the value of a property as a string.
Definition: Algorithm.cpp:2026
TypedValue getProperty(const std::string &name) const override
Get the value of a property.
Definition: Algorithm.cpp:2076
void progress(double p, const std::string &msg="", double estimatedTime=0.0, int progressPrecision=0)
Sends ProgressNotification.
Definition: Algorithm.cpp:231
@ Load
allowed here which will be passed to the algorithm
Definition: FileProperty.h:52
void addLogData(Kernel::Property *p)
Add a log entry.
Definition: LogManager.h:115
Helper class for reporting progress from algorithms.
Definition: Progress.h:25
This class stores information regarding an experimental run as a series of log entries.
Definition: Run.h:38
A property class for workspaces.
LoadNXcanSAS : Tries to load an NXcanSAS file type into a Workspace2D.
Definition: LoadNXcanSAS.h:23
void init() override
Initialisation code.
const std::string name() const override
function to return a name of the algorithm, must be overridden in all algorithms
Definition: LoadNXcanSAS.h:29
void loadTransmission(H5::Group &entry, const std::string &name)
Loads the transmission runs.
int confidence(Kernel::NexusDescriptor &descriptor) const override
Returns a confidence value that this algorithm can load a file.
void exec() override
Execution code.
IPropertyManager * setProperty(const std::string &name, const T &value)
Templated method to set the value of a PropertyWithValue.
The Logger class is in charge of the publishing messages from the framework through various channels.
Definition: Logger.h:52
void information(const std::string &msg)
Logs at information level.
Definition: Logger.cpp:105
Defines a wrapper around a file whose internal structure can be accessed using the NeXus API.
const std::string & extension() const
Access the file extension.
inline ::NeXus::File & data()
Access the open NeXus File object.
The concrete, templated class for properties.
static T & Instance()
Return a reference to the Singleton instance, creating it if it does not already exist Creation is do...
std::shared_ptr< T > createWorkspace(InitArgs... args)
Kernel::Logger g_log("ExperimentInfo")
static logger object
std::shared_ptr< MatrixWorkspace > MatrixWorkspace_sptr
shared pointer to the matrix workspace base class
template MANTID_DATAHANDLING_DLL std::vector< double > readArray1DCoerce< double >(DataSet &dataset)
MANTID_DATAHANDLING_DLL std::string readString(H5::H5File &file, const std::string &path)
Definition: H5Util.cpp:174
std::string readAttributeAsString(LocationType &dataset, const std::string &attributeName)
Definition: H5Util.cpp:234
MANTID_DATAHANDLING_DLL DataType getType< double >()
Definition: H5Util.cpp:36
const std::string sasTransmissionSpectrumNameCanAttrValue
const std::string sasTransmissionSpectrumTdev
const std::string sasTransmissionSpectrumT
const std::string sasTransmissionSpectrumLambda
const std::string sasTransmissionSpectrumNameSampleAttrValue
const std::string sasProcessUserFileInLogs
const std::string sasEntryDefinitionFormat
const std::string sasProcessBatchFileInLogs
const std::string sasTransmissionSpectrumGroupName
const std::string sasInstrumentGroupName
std::vector< double > MantidVec
typedef for the data storage used in Mantid matrix workspaces
Definition: cow_ptr.h:172
std::string to_string(const wide_integer< Bits, Signed > &n)
@ Input
An input workspace.
Definition: Property.h:53
@ Output
An output workspace.
Definition: Property.h:54