Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 47 additions & 8 deletions MStruct/libmstruct.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,22 @@ 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");
MStruct::PowderPattern &data = dynamic_cast<MStruct::PowderPattern&>(obj);
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<ObjCryst::Crystal&>(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,
Expand Down Expand Up @@ -239,8 +247,10 @@ BOOST_PYTHON_MODULE(libMStruct)
def("CreateCrystalFromXML", &_XMLLoadCrystal, return_value_policy<manage_new_object>());
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<reference_existing_object>());
def("GetPowderPattern", _gRefinableObjRegistry_GetPowderPattern, return_value_policy<reference_existing_object>());
def("GetCrystal", _gRefinableObjRegistry_GetCrystal, return_value_policy<reference_existing_object>());
def("GetPar", _GetParExtString, return_value_policy<reference_existing_object>());
def("CalcUnitCellMass", (REAL (*)(const ObjCryst::Crystal&)) &MStruct::CalcUnitCellMass, (bp::arg("crystal")));
//def("Create_ReflectionProfile", &_Create_ReflectionProfile);

class_<ObjCryst::Restraint, boost::noncopyable>("Restraint");
Expand Down Expand Up @@ -268,8 +278,30 @@ BOOST_PYTHON_MODULE(libMStruct)
return_value_policy<copy_const_reference>())
.def("PrepareForRefinement", &ObjCryst::RefinableObj::PrepareForRefinement)
.def("Print", &ObjCryst::RefinableObj::Print)
;

// Virtual
.def("GetClassName", &ObjCryst::RefinableObj::GetClassName,
&ObjCryst::RefinableObj::GetClassName,
return_value_policy<copy_const_reference>())
.def("GetName", &ObjCryst::RefinableObj::GetName,
&ObjCryst::RefinableObj::GetName,
return_value_policy<copy_const_reference>());

class_<ObjCryst::ScatteringData, bases<ObjCryst::RefinableObj>, boost::noncopyable>(
"ScatteringData", no_init)
.def("GetCrystal", (ObjCryst::Crystal& (ObjCryst::ScatteringData::*)()) &ObjCryst::ScatteringData::GetCrystal,
return_internal_reference<>())
.def("HasCrystal", &ObjCryst::ScatteringData::HasCrystal);

class_<ObjCryst::PowderPatternComponent, bases<ObjCryst::RefinableObj>, boost::noncopyable>
("_ObjCryst::PowderPatternComponent", no_init)
.def("GetParentPowderPattern",
(ObjCryst::PowderPattern& (ObjCryst::PowderPatternComponent::*)())
&ObjCryst::PowderPatternComponent::GetParentPowderPattern,
return_internal_reference<>());

class_<ObjCryst::PowderPatternDiffraction, bases<ObjCryst::PowderPatternComponent, ObjCryst::ScatteringData> >(
"_Obj_Cryst_PowderPatternDiffraction", no_init);

class_<MStruct::PowderPattern, bases<ObjCryst::RefinableObj> >("PowderPattern")
.def(init<>())
.def("SetPowderPatternObs", &_SetPowderPatternObs)
Expand All @@ -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_<MStruct::PseudoVoigtBroadeningEffect>("PseudoVoigtBroadeningEffect")
.def(init<>())
.def("SetParentProfile", &_SetParentProfile<MStruct::PseudoVoigtBroadeningEffect, MStruct::ReflectionProfile>);

class_<ObjCryst::Crystal>("Crystal");
class_<ObjCryst::Crystal, bases<ObjCryst::RefinableObj> >("Crystal")
.def("GetVolume", (REAL (ObjCryst::Crystal::*) () const) &ObjCryst::Crystal::GetVolume);

//class_<ReflectionProfile, boost::noncopyable>("ReflectionProfile", no_init);
class_<MStruct::ReflectionProfile>("ReflectionProfile", init<ObjCryst::Crystal&, ObjCryst::Radiation&>())
Expand All @@ -315,8 +354,8 @@ BOOST_PYTHON_MODULE(libMStruct)
class_<ObjCryst::Radiation>("Radiation", init<const std::string, REAL>())
//.def("GetWavelength", &ObjCryst::Radiation::GetWavelength)
.def("Print", &ObjCryst::Radiation::Print);

class_<MStruct::PowderPatternDiffraction>("PowderPatternDiffraction")
class_<MStruct::PowderPatternDiffraction, bases<ObjCryst::PowderPatternDiffraction> >("PowderPatternDiffraction")
.def(init<>())
.def("SetProfile", &_SetProfile)
.def("SetIsIgnoringImagScattFact", &MStruct::PowderPatternDiffraction::SetIsIgnoringImagScattFact)
Expand Down
26 changes: 13 additions & 13 deletions doc/source/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

<!--
| | Windows | MacOS | Linux |
| | Windows | macOS | Linux |
| native binaries | available | - | - |
| native source | ask authors | - | 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 :-)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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
```

Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion libmstruct/SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -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."\
Expand Down