From 4c7df46c7c5baf12cba327939d335f5e24aa3f45 Mon Sep 17 00:00:00 2001 From: Zdenek <32390711+zdemat@users.noreply.github.com> Date: Wed, 21 Feb 2024 17:03:09 +0100 Subject: [PATCH 1/8] Update index.md --- doc/source/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/index.md b/doc/source/index.md index 887481e..6d2af81 100644 --- a/doc/source/index.md +++ b/doc/source/index.md @@ -10,7 +10,7 @@ MStruct projects provides two main components: - **mstruct** program for powder diffraction data refinement - **python module** for either interactive or automated powder diffraction analysis -Windows, MacOS and Linux are all supported. However the level of intagration is varying. +Windows, macOS and Linux are all supported. However the level of intagration is varying. See the table below for a quick overview. | | Windows | macOS | Linux | @@ -20,7 +20,7 @@ See the table below for a quick overview. | Anaconda | available | available | available | In short: -- **Windows binaries** are small (few MBs), easy to download and run but you will - miss the Python module. Maybe you do not care. +- **Windows binaries** are small (few MBs), easy to download and run. - **Anaconda** is the most universal. You will get all MStruct features without limitations but you need to have Anaconda enviroment. Anaconda occupies around 2-3 GBs. However you may use it also for something else. You will need to compile MStruct yourself, short instructions are provided, we tested it but some issues are hard to exluclude with any effort (just try it). + There is a less demanding *Miniconda* alternative. - **Linux native compilation** will give you all features and will not use much space. Compilation process is similar to Anaconda. Use of Anaconda is still adviced mainly in order to protect your system against dirty MStruct features :-) From 29c2a04da99ba5d03994d5b44d8258e28d623ef0 Mon Sep 17 00:00:00 2001 From: Zdenek <32390711+zdemat@users.noreply.github.com> Date: Wed, 21 Feb 2024 18:24:28 +0100 Subject: [PATCH 7/8] Update index.md --- doc/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/index.md b/doc/source/index.md index 6070fea..070208b 100644 --- a/doc/source/index.md +++ b/doc/source/index.md @@ -33,7 +33,7 @@ In short: 2-3 GBs. However you may use it also for something else. You will need to compile MStruct yourself, short instructions are provided, we tested it but some issues are hard to exluclude with any effort (just try it). - There is a less demanding *Miniconda* alternative. + There is a less demanding **Miniconda** alternative. - **Linux native compilation** will give you all features and will not use much space. Compilation process is similar to Anaconda. Use of Anaconda is still adviced mainly in order to protect your system against dirty MStruct features :-) From b1e62d4e97cf5ae62cad84af6f2ed7e30f6ff398 Mon Sep 17 00:00:00 2001 From: Zdenek Matej Date: Fri, 8 Mar 2024 02:23:29 +0100 Subject: [PATCH 8/8] Adding python methods for QPA --- MStruct/libmstruct.cpp | 55 ++++++++++++++++++++++++++++++++++++------ libmstruct/SConstruct | 2 +- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/MStruct/libmstruct.cpp b/MStruct/libmstruct.cpp index db9662e..4a19cb8 100755 --- a/MStruct/libmstruct.cpp +++ b/MStruct/libmstruct.cpp @@ -147,7 +147,7 @@ MStruct::ReflectionProfile * _Create_ReflectionProfile(ObjCryst::Crystal* crysta } */ -MStruct::PowderPattern& _gRefinableObjRegistry_GetPowderpattern(const std::string& name) +MStruct::PowderPattern& _gRefinableObjRegistry_GetPowderPattern(const std::string& name) { // Get PowderPattern object ObjCryst::RefinableObj &obj = ObjCryst::gRefinableObjRegistry.GetObj(name, "MStruct::PowderPattern"); @@ -155,6 +155,14 @@ MStruct::PowderPattern& _gRefinableObjRegistry_GetPowderpattern(const std::strin return data; } +ObjCryst::Crystal& _gRefinableObjRegistry_GetCrystal(const std::string& name) +{ + // Get Crystal object + ObjCryst::RefinableObj &obj = ObjCryst::gRefinableObjRegistry.GetObj(name, "Crystal"); + ObjCryst::Crystal &crystal = dynamic_cast(obj); + return crystal; +} + // credit: @vincefn, https://github.com/diffpy/pyobjcryst/blob/main/src/extensions/lsq_ext.cpp /*bool _LSQ_SafeRefine(MStruct::LSQNumObj & lsq, REAL maxChi2factor, int nbCycle, bool useLevenbergMarquardt, @@ -239,8 +247,10 @@ BOOST_PYTHON_MODULE(libMStruct) def("CreateCrystalFromXML", &_XMLLoadCrystal, return_value_policy()); def("XMLCrystFileLoadAllObject", (void (*)(const std::string&)) &MStruct::XMLCrystFileLoadAllObject, (bp::arg("name"))); def("XMLCrystFileSaveGlobal", (void (*)(const std::string&)) &ObjCryst::XMLCrystFileSaveGlobal, (bp::arg("name"))); - def("GetPowderPattern", _gRefinableObjRegistry_GetPowderpattern, return_value_policy()); + def("GetPowderPattern", _gRefinableObjRegistry_GetPowderPattern, return_value_policy()); + def("GetCrystal", _gRefinableObjRegistry_GetCrystal, return_value_policy()); def("GetPar", _GetParExtString, return_value_policy()); + def("CalcUnitCellMass", (REAL (*)(const ObjCryst::Crystal&)) &MStruct::CalcUnitCellMass, (bp::arg("crystal"))); //def("Create_ReflectionProfile", &_Create_ReflectionProfile); class_("Restraint"); @@ -268,8 +278,30 @@ BOOST_PYTHON_MODULE(libMStruct) return_value_policy()) .def("PrepareForRefinement", &ObjCryst::RefinableObj::PrepareForRefinement) .def("Print", &ObjCryst::RefinableObj::Print) - ; - + // Virtual + .def("GetClassName", &ObjCryst::RefinableObj::GetClassName, + &ObjCryst::RefinableObj::GetClassName, + return_value_policy()) + .def("GetName", &ObjCryst::RefinableObj::GetName, + &ObjCryst::RefinableObj::GetName, + return_value_policy()); + + class_, boost::noncopyable>( + "ScatteringData", no_init) + .def("GetCrystal", (ObjCryst::Crystal& (ObjCryst::ScatteringData::*)()) &ObjCryst::ScatteringData::GetCrystal, + return_internal_reference<>()) + .def("HasCrystal", &ObjCryst::ScatteringData::HasCrystal); + + class_, boost::noncopyable> + ("_ObjCryst::PowderPatternComponent", no_init) + .def("GetParentPowderPattern", + (ObjCryst::PowderPattern& (ObjCryst::PowderPatternComponent::*)()) + &ObjCryst::PowderPatternComponent::GetParentPowderPattern, + return_internal_reference<>()); + + class_ >( + "_Obj_Cryst_PowderPatternDiffraction", no_init); + class_ >("PowderPattern") .def(init<>()) .def("SetPowderPatternObs", &_SetPowderPatternObs) @@ -289,13 +321,20 @@ BOOST_PYTHON_MODULE(libMStruct) .def("Print", &MStruct::PowderPattern::Print) .def("AddComponent", &MStruct::PowderPattern::AddPowderPatternComponent) .def("AddComponent", &_AddPowderPatternComponent) - .def("FitScaleFactorForRw", &MStruct::PowderPattern::FitScaleFactorForRw); + .def("GetNbPowderPatternComponent", &ObjCryst::PowderPattern::GetNbPowderPatternComponent) + .def("GetPowderPatternComponent", (ObjCryst::PowderPatternComponent& (ObjCryst::PowderPattern::*) (const int)) + &ObjCryst::PowderPattern::GetPowderPatternComponent, return_internal_reference<>()) + .def("FitScaleFactorForRw", &MStruct::PowderPattern::FitScaleFactorForRw) + .def("GetScaleFactor", (REAL (MStruct::PowderPattern::*) (const int) const) &ObjCryst::PowderPattern::GetScaleFactor) + .def("GetScaleFactor", (REAL (MStruct::PowderPattern::*) (const ObjCryst::PowderPatternComponent&) const) &ObjCryst::PowderPattern::GetScaleFactor) + .def("SetScaleFactor", (void (MStruct::PowderPattern::*) (const int, REAL)) &ObjCryst::PowderPattern::SetScaleFactor); class_("PseudoVoigtBroadeningEffect") .def(init<>()) .def("SetParentProfile", &_SetParentProfile); - class_("Crystal"); + class_ >("Crystal") + .def("GetVolume", (REAL (ObjCryst::Crystal::*) () const) &ObjCryst::Crystal::GetVolume); //class_("ReflectionProfile", no_init); class_("ReflectionProfile", init()) @@ -315,8 +354,8 @@ BOOST_PYTHON_MODULE(libMStruct) class_("Radiation", init()) //.def("GetWavelength", &ObjCryst::Radiation::GetWavelength) .def("Print", &ObjCryst::Radiation::Print); - - class_("PowderPatternDiffraction") + + class_ >("PowderPatternDiffraction") .def(init<>()) .def("SetProfile", &_SetProfile) .def("SetIsIgnoringImagScattFact", &MStruct::PowderPatternDiffraction::SetIsIgnoringImagScattFact) diff --git a/libmstruct/SConstruct b/libmstruct/SConstruct index 4d392b7..4c75d18 100644 --- a/libmstruct/SConstruct +++ b/libmstruct/SConstruct @@ -42,7 +42,7 @@ env = DefaultEnvironment().Clone() # Variables definitions below work only with 0.98.1 or later. env.EnsureSConsVersion(0, 98, 1) -env['version_str'] = "0.15.8" +env['version_str'] = "0.15.9" #Adds option for selecting desired python version AddOption('--python-version', dest='python_version', type='string', help="Python version to build libmstruct against."\