Working with DiffPy

DiffPy is a free and open source software project to provide python software for diffraction analysis and the study of the atomic structure of materials.

The scattering can be calculated from a diffpy.Structure.structure.Structure directly.

>>> from diffpy.Structure import Structure, Lattice, Atom  # doctest: +SKIP
>>> from javelin.fourier import Fourier  # doctest: +SKIP
>>> stru = Structure([Atom('C',[0,0,0]), Atom('C',[1,0,0]),
...                   Atom('C',[0,1,0]), Atom('C',[1,1,0])],
...                  lattice=Lattice(1,1,1,90,90,120))  # doctest: +SKIP
>>> print(stru)  # doctest: +SKIP
lattice=Lattice(a=1, b=1, c=1, alpha=90, beta=90, gamma=120)
C    0.000000 0.000000 0.000000 1.0000
C    1.000000 0.000000 0.000000 1.0000
C    0.000000 1.000000 0.000000 1.0000
C    1.000000 1.000000 0.000000 1.0000
>>> type(stru)  # doctest: +SKIP
<class 'diffpy.Structure.structure.Structure'>
>>> four = Fourier()  # doctest: +SKIP
>>> four.grid.bins = 201, 201  # doctest: +SKIP
>>> four.grid.r1 = -2, 2  # doctest: +SKIP
>>> four.grid.r2 = -2, 2  # doctest: +SKIP
>>> results = four.calc(stru)  # doctest: +SKIP
Working on atom number 6 Total atoms: 4
>>> results.plot()  # doctest: +SKIP
<matplotlib.collections.QuadMesh object at ...>

(Source code, png, hires.png, pdf)

../_images/diffpy-1.png

Convert structure from diffpy to javelin

A diffpy.Structure.structure.Structure can be converted to javelin.structure.Structure simply by initializing the javelin structure from the diffpy structure.

>>> from diffpy.Structure import Structure as diffpy_Structure, Lattice, Atom  # doctest: +SKIP
>>> from javelin.structure import Structure  # doctest: +SKIP
>>> stru = diffpy_Structure([Atom('C',[0,0,0]),Atom('C',[1,1,1])], lattice=Lattice(1,1,1,90,90,120))  # doctest: +SKIP
>>> print(stru)  # doctest: +SKIP
lattice=Lattice(a=1, b=1, c=1, alpha=90, beta=90, gamma=120)
C    0.000000 0.000000 0.000000 1.0000
C    1.000000 1.000000 1.000000 1.0000
>>> type(stru)  # doctest: +SKIP
<class 'diffpy.Structure.structure.Structure'>
>>> javelin_stru = Structure(stru)  # doctest: +SKIP
>>> print(javelin_stru)  # doctest: +SKIP
Structure(C2, a=1.0, b=1.0, c=1.0, alpha=90.0, beta=90.0, gamma=120.0)
>>> type(javelin_stru)  # doctest: +SKIP
<class 'javelin.structure.Structure'>

Convert structure from javelin to diffpy

>>> type(javelin_stru)  # doctest: +SKIP
<class 'javelin.structure.Structure'>
>>> diffpy_stru = diffpy_Structure([Atom(e, x) for e, x in zip(javelin_stru.element, javelin_stru.xyz)],
...                                lattice=Lattice(*javelin_stru.unitcell.cell))  # doctest: +SKIP
>>> print(diffpy_stru)  # doctest: +SKIP
lattice=Lattice(a=1, b=1, c=1, alpha=90, beta=90, gamma=120)
C    0.000000 0.000000 0.000000 1.0000
C    1.000000 1.000000 1.000000 1.0000
>>> type(diffpy_stru)  # doctest: +SKIP
<class 'diffpy.Structure.structure.Structure'>

File IO

DiffPy file loaders can be utilized by javelin.

>>> from diffpy.Structure.Parsers import getParser  # doctest: +SKIP
>>> from javelin.structure import Structure  # doctest: +SKIP
>>> p = getParser('auto')  # doctest: +SKIP
>>> graphite = Structure(p.parseFile('tests/data/graphite.cif'))  # doctest: +SKIP
>>> print(graphite)  # doctest: +SKIP
Structure(C4, a=2.456, b=2.456, c=6.696, alpha=90.0, beta=90.0, gamma=120.0)
>>> type(graphite)  # doctest: +SKIP
<class 'javelin.structure.Structure'>
>>> pzn = Structure(p.parseFile('tests/data/pzn.stru'))  # doctest: +SKIP
>>> print(pzn)  # doctest: +SKIP
Structure(O9Pb3Nb2Zn1, a=12.18, b=4.06, c=4.06, alpha=90.0, beta=90.0, gamma=90.0)
>>> type(pzn)  # doctest: +SKIP
<class 'javelin.structure.Structure'>