diff --git a/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h b/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h index 4da6479689a84ca3e4f31840d32b7aee7109b9ca..08827662b66706980c7070665fb3228042d9eee2 100644 --- a/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h +++ b/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h @@ -34,16 +34,17 @@ public: }; static ValidationErrors validateInputs(MaterialParameters params); - void setMaterial(const std::string chemicalSymbol, const int atomicNumber, - const int massNumber); - void setNumberDensity(const double rho_m, const double rho, - const double zParameter, const double unitCellVolume); + void setMaterialParameters(MaterialParameters params); + std::unique_ptr<Kernel::Material> buildMaterial(); void setScatteringInfo(double coherentXSection, double incoherentXSection, double attenuationXSection, double scatteringXSection); - std::unique_ptr<Kernel::Material> buildMaterial(); - private: Kernel::MaterialBuilder builder; + void setMaterial(const std::string chemicalSymbol, const int atomicNumber, + const int massNumber); + void setNumberDensity(const double rho_m, const double rho, + const double zParameter, const double unitCellVolume); + static bool isEmpty(const double toCheck); }; } // namespace DataHandling diff --git a/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h b/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h index 0e702cdbb4d8786791e134b7fbb304861ea499be..bbb6c60b08a25d3b45e793699ffca75f0c7c6941 100644 --- a/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h +++ b/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h @@ -9,7 +9,7 @@ #include "MantidAPI/DistributedAlgorithm.h" #include "MantidKernel/NeutronAtom.h" - +#include "MantidDataHandling/ReadMaterial.h" namespace Mantid { namespace DataHandling { @@ -48,6 +48,8 @@ private: /// Print out the list of information for the material void fixNeutron(PhysicalConstants::NeutronAtom &neutron, double coh_xs, double inc_xs, double abs_xs, double tot_xs); + + ReadMaterial::MaterialParameters params; }; } // namespace DataHandling } // namespace Mantid diff --git a/Framework/DataHandling/src/ReadMaterial.cpp b/Framework/DataHandling/src/ReadMaterial.cpp index a7dd7d8bb4f6d6bb82b2e306c033a72d8d30062d..2b8e0652c7739af1d628497369fd337044502899 100644 --- a/Framework/DataHandling/src/ReadMaterial.cpp +++ b/Framework/DataHandling/src/ReadMaterial.cpp @@ -50,6 +50,11 @@ ValidationErrors ReadMaterial::validateInputs(const MaterialParameters params) { return result; } +void ReadMaterial::setMaterialParameters(MaterialParameters params){ + setMaterial(params.chemicalSymbol, params.atomicNumber, params.massNumber); + setNumberDensity(params.sampleMassDensity, params.sampleNumberDensity,params.zParameter,params.unitCellVolume); +} + std::unique_ptr<Kernel::Material> ReadMaterial::buildMaterial() { return std::make_unique<Kernel::Material>(builder.build()); } diff --git a/Framework/DataHandling/src/SetSampleMaterial.cpp b/Framework/DataHandling/src/SetSampleMaterial.cpp index b544cf7c3161253941fc37b2e1e1bf7aa80f7341..6633697e4ca93de6683afcd928b6d7781e563b08 100644 --- a/Framework/DataHandling/src/SetSampleMaterial.cpp +++ b/Framework/DataHandling/src/SetSampleMaterial.cpp @@ -8,7 +8,6 @@ #include "MantidAPI/ExperimentInfo.h" #include "MantidAPI/Sample.h" #include "MantidAPI/Workspace.h" -#include "MantidDataHandling/ReadMaterial.h" #include "MantidGeometry/Crystal/OrientedLattice.h" #include "MantidKernel/Atom.h" #include "MantidKernel/BoundedValidator.h" @@ -109,18 +108,13 @@ void SetSampleMaterial::init() { } std::map<std::string, std::string> SetSampleMaterial::validateInputs() { - ReadMaterial::MaterialParameters params = [this]() -> auto { - ReadMaterial::MaterialParameters setMaterial; - setMaterial.chemicalSymbol = getPropertyValue("ChemicalFormula"); - setMaterial.atomicNumber = getProperty("AtomicNumber"); - setMaterial.massNumber = getProperty("MassNumber"); - setMaterial.sampleNumberDensity = getProperty("SampleNumberDensity"); - setMaterial.zParameter = getProperty("ZParameter"); - setMaterial.unitCellVolume = getProperty("UnitCellVolume"); - setMaterial.sampleMassDensity = getProperty("SampleMassDensity"); - return setMaterial; - } - (); + params.chemicalSymbol = getPropertyValue("ChemicalFormula"); + params.atomicNumber = getProperty("AtomicNumber"); + params.massNumber = getProperty("MassNumber"); + params.sampleNumberDensity = getProperty("SampleNumberDensity"); + params.zParameter = getProperty("ZParameter"); + params.unitCellVolume = getProperty("UnitCellVolume"); + params.sampleMassDensity = getProperty("SampleMassDensity"); auto result = ReadMaterial::validateInputs(params); return result; @@ -164,13 +158,9 @@ void SetSampleMaterial::exec() { ReadMaterial reader; const std::string chemicalSymbol = getProperty("ChemicalFormula"); - reader.setMaterial(chemicalSymbol, getProperty("AtomicNumber"), - getProperty("MassNumber")); + reader.setMaterialParameters(params); double rho = getProperty("SampleNumberDensity"); // in atoms / Angstroms^3 - reader.setNumberDensity(getProperty("SampleMassDensity"), rho, - getProperty("ZParameter"), - getProperty("UnitCellVolume")); // get the scattering information - this will override table values reader.setScatteringInfo( diff --git a/Framework/DataHandling/test/ReadMaterialTest.h b/Framework/DataHandling/test/ReadMaterialTest.h index f48ea57b2d339cdb6c234e5b4e3b46c9dac72029..c4a6bdd12bb18e78fe634ff43c9fdb91d3177f35 100644 --- a/Framework/DataHandling/test/ReadMaterialTest.h +++ b/Framework/DataHandling/test/ReadMaterialTest.h @@ -19,7 +19,7 @@ public: static void destroySuite(ReadMaterialTest *suite) { delete suite; } void testSuccessfullValidateInputsFormula() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = FORMULA; setMaterial.atomicNumber = 0; @@ -36,7 +36,7 @@ public: } void testSuccessfullValidateInputsAtomicNumber() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -53,7 +53,7 @@ public: } void testFailureValidateInputsFormulaPlusAtomicNumber() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = FORMULA; setMaterial.atomicNumber = 1; @@ -71,7 +71,7 @@ public: } void testFailureValidateInputsNoMaterial() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 0; @@ -88,7 +88,7 @@ public: } void testSuccessfullValidateInputsSampleNumber() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -105,7 +105,7 @@ public: } void testSuccessfullValidateInputsZParam() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -122,7 +122,7 @@ public: } void testSuccessfullValidateInputsSampleMass() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -139,7 +139,7 @@ public: } void testFailureValidateInputsSampleNumberAndZParam() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -157,7 +157,7 @@ public: } void testFailureValidateInputsZParamWithSampleMass() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -175,7 +175,7 @@ public: } void testFailureValidateInputsZParamWithoutUnitCell() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -193,7 +193,7 @@ public: } void testFailureValidateInputsSampleNumWithSampleMass() { - ReadMaterial::MaterialParameters params = [this]() -> auto { + const ReadMaterial::MaterialParameters params = [this]() -> auto { ReadMaterial::MaterialParameters setMaterial; setMaterial.chemicalSymbol = EMPTY; setMaterial.atomicNumber = 1; @@ -212,30 +212,75 @@ public: } void testMaterialIsCorrect() { + const ReadMaterial::MaterialParameters params = [this]() -> auto { + ReadMaterial::MaterialParameters setMaterial; + setMaterial.chemicalSymbol = FORMULA; + setMaterial.atomicNumber = 0; + setMaterial.massNumber = 0; + setMaterial.sampleNumberDensity = 1; + setMaterial.zParameter = EMPTY_DOUBLE_VAL; + setMaterial.unitCellVolume = EMPTY_DOUBLE_VAL; + setMaterial.sampleMassDensity = EMPTY_DOUBLE_VAL; + return setMaterial; + } + (); ReadMaterial reader; - reader.setMaterial(FORMULA, 0, 0); - reader.setNumberDensity(EMPTY_DOUBLE_VAL, 1, EMPTY_DOUBLE_VAL, - EMPTY_DOUBLE_VAL); + reader.setMaterialParameters(params); reader.setScatteringInfo(1, 2, 3, 4); auto material = reader.buildMaterial(); - compareMaterial(material, 1, 1, 2, 3, 4, FORMULA); + Kernel::MaterialBuilder builder; + builder.setFormula(FORMULA); + builder.setNumberDensity(1); + builder.setCoherentXSection(1); + builder.setIncoherentXSection(2); + builder.setAbsorptionXSection(3); + builder.setTotalScatterXSection(4); + auto check = builder.build(); + compareMaterial(material, check); } void testGenerateScatteringInfo() { + const ReadMaterial::MaterialParameters params = [this]() -> auto { + ReadMaterial::MaterialParameters setMaterial; + setMaterial.chemicalSymbol = FORMULA; + setMaterial.atomicNumber = 0; + setMaterial.massNumber = 0; + setMaterial.sampleNumberDensity = 1; + setMaterial.zParameter = EMPTY_DOUBLE_VAL; + setMaterial.unitCellVolume = EMPTY_DOUBLE_VAL; + setMaterial.sampleMassDensity = EMPTY_DOUBLE_VAL; + return setMaterial; + } + (); ReadMaterial reader; - reader.setMaterial(FORMULA, 0, 0); - reader.setNumberDensity(EMPTY_DOUBLE_VAL, 1, EMPTY_DOUBLE_VAL, - EMPTY_DOUBLE_VAL); + reader.setMaterialParameters(params); auto material = reader.buildMaterial(); - compareMaterial(material, 1, 0.0184000000, 5.0800000022, 5.0800000022, - 5.1000000044, FORMULA); + Kernel::MaterialBuilder builder; + builder.setFormula(FORMULA); + builder.setNumberDensity(1); + builder.setCoherentXSection(0.0184000000); + builder.setIncoherentXSection(5.0800000022); + builder.setAbsorptionXSection(5.0800000022); + builder.setTotalScatterXSection(5.1000000044); + auto check = builder.build(); + compareMaterial(material, check); } void testNoMaterialFailure() { + const ReadMaterial::MaterialParameters params = [this]() -> auto { + ReadMaterial::MaterialParameters setMaterial; + setMaterial.chemicalSymbol = EMPTY; + setMaterial.atomicNumber = 0; + setMaterial.massNumber = 0; + setMaterial.sampleNumberDensity = 1; + setMaterial.zParameter = EMPTY_DOUBLE_VAL; + setMaterial.unitCellVolume = EMPTY_DOUBLE_VAL; + setMaterial.sampleMassDensity = EMPTY_DOUBLE_VAL; + return setMaterial; + } + (); ReadMaterial reader; - reader.setMaterial(EMPTY, 0, 0); - reader.setNumberDensity(EMPTY_DOUBLE_VAL, 1, EMPTY_DOUBLE_VAL, - EMPTY_DOUBLE_VAL); + reader.setMaterialParameters(params); reader.setScatteringInfo(EMPTY_DOUBLE_VAL, EMPTY_DOUBLE_VAL, EMPTY_DOUBLE_VAL, EMPTY_DOUBLE_VAL); TS_ASSERT_THROWS(reader.buildMaterial(), std::runtime_error); @@ -245,25 +290,20 @@ private: const double EMPTY_DOUBLE_VAL = 8.9884656743115785e+307; const std::string EMPTY = ""; const std::string FORMULA = "V"; - - void compareMaterial(std::unique_ptr<Material> &material, - const double numberDensity, - const double coherentXSection, - const double incoherentXSection, - const double absorbXSection, const double totalXSection, - const std::string &formula) { - std::vector<Material::FormulaUnit> checkFormula = - Material::parseChemicalFormula(formula); + void compareMaterial(const std::unique_ptr<Material> &material, + const Material &check) { + std::vector<Material::FormulaUnit> checkFormula = check.chemicalFormula(); std::vector<Material::FormulaUnit> materialFormula = material->chemicalFormula(); - TS_ASSERT_EQUALS(material->numberDensity(), numberDensity); - TS_ASSERT_DELTA(material->cohScatterXSection(), coherentXSection, - 0.00000001); - TS_ASSERT_DELTA(material->incohScatterXSection(), incoherentXSection, + TS_ASSERT_EQUALS(material->numberDensity(), check.numberDensity()); + TS_ASSERT_DELTA(material->cohScatterXSection(), check.cohScatterXSection(), 0.00000001); - TS_ASSERT_DELTA(material->absorbXSection(), absorbXSection, 0.00000001); - TS_ASSERT_DELTA(material->totalScatterXSection(), totalXSection, + TS_ASSERT_DELTA(material->incohScatterXSection(), + check.incohScatterXSection(), 0.00000001); + TS_ASSERT_DELTA(material->absorbXSection(), check.absorbXSection(), 0.00000001); + TS_ASSERT_DELTA(material->totalScatterXSection(), + check.totalScatterXSection(), 0.00000001); TS_ASSERT_EQUALS(checkFormula[0].multiplicity, materialFormula[0].multiplicity); TS_ASSERT_EQUALS(checkFormula.size(), materialFormula.size())