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/doc/source/index.md b/doc/source/index.md index 887481e..070208b 100644 --- a/doc/source/index.md +++ b/doc/source/index.md @@ -10,30 +10,30 @@ 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 | |:--------------- |:-------------:|:---------:|:---------:| -| native binaries | available | - | - | -| native source | ask authors | - | available | +| native binaries | available | - | available | +| native source | depricated | - | available | | 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 :-) @@ -83,7 +83,7 @@ git clone https://github.com/xray-group/mstruct.git ##### Installing Anaconda [Anaconda](https://www.anaconda.com) is a popular Python data science platform and -scientific software for personal computers with Windows, MacOS or Linux. +scientific software for personal computers with Windows, macOS or Linux. The most straighforward way is to get a graphical [installer](https://www.anaconda.com/download/) - no need to sign (web download) @@ -262,18 +262,18 @@ tricks from Honza ```bash # (optional) gls, fftw3, lapack, python and scons are required -sudo apt-get install libgsl-dev fftw3-dev liblapack-dev python-dev scons +sudo apt-get install libgsl-dev libfftw3-dev liblapack-dev libpython3.11-dev scons # (optional) boost>=1.63 is required, we may want to use a specific one -export B=~/sw/boost_1_67_0 -export CPPPATH=$B/include:$CPPPATH/ +export B=~/sw/boost_1_78_0 +export CPPPATH=$B/include:$CPPPATH export LIBRARY_PATH=$B/lib:$LIBRARY_PATH export LD_LIBRARY_PATH=$B/lib:$LD_LIBRARY_PATH # (optional) prepare user env for installation (define prefix) export P=~/.local # (optional) make sure we have place for python modules -mkdir -p $P/lib/python2.7/site-packages +mkdir -p $P/lib/python3.11/site-packages # build library scons -j4 libmstruct @@ -286,7 +286,7 @@ scons -j4 install prefix=$P # (optional) we may want to activate the installation export PATH=$P/bin:$PATH -export PYTHONPATH=$P/lib/python2.7/site-packages:$PYTHONATH +export PYTHONPATH=$P/lib/python3.11/site-packages:$PYTHONATH export LD_LIBRARY_PATH=$P/lib:$LD_LIBRARY_PATH ``` @@ -313,7 +313,7 @@ links to plotting tools ### Instructions You should have `mstruct` binary running on your laptop. It should be pretty straighforward -for Windows, unfortunately for MacOS or Linux you need to compile the source. *No stress in +for Windows, unfortunately for macOS or Linux you need to compile the source. *No stress in case you fail, we will make it working at the beginning of the course.* ### Time plan 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."\