xrd_simulator

Tools for simulating x-ray diffraction. Detailed documentation is found at the below link.

https://github.com/fable-3dxrd/xrd_simulator

Science Score: 57.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 10 DOI reference(s) in README
  • Academic publication links
  • Committers with academic emails
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (12.0%) to scientific vocabulary

Keywords

diffraction diffraction-analysis diffraction-pattern polycrystal xray-crystallography xray-diffraction xray-diffraction-analysis xray-images xrd
Last synced: 6 months ago · JSON representation ·

Repository

Tools for simulating x-ray diffraction. Detailed documentation is found at the below link.

Basic Info
Statistics
  • Stars: 32
  • Watchers: 1
  • Forks: 13
  • Open Issues: 1
  • Releases: 0
Topics
diffraction diffraction-analysis diffraction-pattern polycrystal xray-crystallography xray-diffraction xray-diffraction-analysis xray-images xrd
Created over 4 years ago · Last pushed 9 months ago
Metadata Files
Readme License Citation

README.rst

.. image:: https://github.com/FABLE-3DXRD/xrd_simulator/blob/main/docs/source/images/logo.png?raw=true

.. image:: https://img.shields.io/pypi/pyversions/xrd-simulator.svg?
	:target: https://pypi.org/project/xrd-simulator/

.. image:: https://github.com/FABLE-3DXRD/xrd_simulator/actions/workflows/python-package-run-tests-linux-py38.yml/badge.svg?
	:target: https://github.com/FABLE-3DXRD/xrd_simulator/actions/workflows/python-package-run-tests-linux-py38.yml

.. image:: https://github.com/FABLE-3DXRD/xrd_simulator/actions/workflows/pages/pages-build-deployment/badge.svg?
	:target: https://github.com/FABLE-3DXRD/xrd_simulator/actions/workflows/pages/pages-build-deployment/

.. image:: https://badge.fury.io/py/xrd-simulator.svg?
	:target: https://pypi.org/project/xrd-simulator/

.. image:: https://anaconda.org/conda-forge/vsc-install/badges/platforms.svg?
	:target: https://anaconda.org/conda-forge/xrd_simulator/

.. image:: https://anaconda.org/conda-forge/xrd_simulator/badges/latest_release_relative_date.svg?
	:target: https://anaconda.org/conda-forge/xrd_simulator/

===================================================================================================
Simulate X-ray Diffraction from Polycrystals in 3D.
===================================================================================================
.. image:: https://img.shields.io/badge/stability-alpha-f4d03f.svg?
	:target: https://github.com/FABLE-3DXRD/xrd_simulator/


The **X**-**R** ay **D** iffraction **SIMULATOR** package defines polycrystals as a mesh of tetrahedral single crystals
and simulates diffraction as collected by a 2D discretized detector array while the sample is rocked
around an arbitrary rotation axis. The full journal paper associated to the release of this code can be found here:

*xrd_simulator: 3D X-ray diffraction simulation software supporting 3D polycrystalline microstructure morphology descriptions
Henningsson, A. & Hall, S. A. (2023). J. Appl. Cryst. 56, 282-292.*
`https://doi.org/10.1107/S1600576722011001`_

``xrd_simulator`` was originally developed with the hope to answer questions about measurement optimization in
scanning x-ray diffraction experiments. However, ``xrd_simulator`` can simulate a wide range of experimental
diffraction setups. The essential idea is that the sample and beam topology can be arbitrarily specified,
and their interaction simulated as the sample is rocked. This means that standard "non-powder" experiments
such as `scanning-3dxrd`_ and full-field `3dxrd`_ (or HEDM if you like) can be simulated as well as more advanced
measurement sequences such as helical scans for instance. It is also possible to simulate `powder like`_
scenarios using orientation density functions as input.

===================================================================================================
Introduction
===================================================================================================
Before reading all the boring documentation (`which is hosted here`_) let's dive into some end to end
examples to get us started on a good flavour.

The ``xrd_simulator`` is built around four python objects which reflect a diffraction experiment:

   * A **beam** of x-rays (using the ``xrd_simulator.beam`` module)
   * A 2D area **detector** (using the ``xrd_simulator.detector`` module)
   * A 3D **polycrystal** sample (using the ``xrd_simulator.polycrystal`` module)
   * A rigid body sample **motion** (using the ``xrd_simulator.motion`` module)

Once these objects are defined it is possible to let the **detector** collect scattering of the **polycrystal**
as the sample undergoes the prescribed rigid body **motion** while being illuminated by the xray **beam**.

Let's go ahead and build ourselves some x-rays:

   .. code:: python

      import numpy as np
      from xrd_simulator.beam import Beam
      # The beam of xrays is represented as a convex polyhedron
      # We specify the vertices in a numpy array.
      beam_vertices = np.array([
          [-1e6, -500., -500.],
          [-1e6, 500., -500.],
          [-1e6, 500., 500.],
          [-1e6, -500., 500.],
          [1e6, -500., -500.],
          [1e6, 500., -500.],
          [1e6, 500., 500.],
          [1e6, -500., 500.]])

      beam = Beam(
          beam_vertices,
          xray_propagation_direction=np.array([1., 0., 0.]),
          wavelength=0.28523,
          polarization_vector=np.array([0., 1., 0.]))

We will also need to define a detector:

   .. code:: python

      from xrd_simulator.detector import Detector
      # The detector plane is defined by it's corner coordinates det_corner_0,det_corner_1,det_corner_2
      detector = Detector(pixel_size_z=75.0,
                          pixel_size_y=55.0,
                          det_corner_0=np.array([142938.3, -38400., -38400.]),
                          det_corner_1=np.array([142938.3, 38400., -38400.]),
                          det_corner_2=np.array([142938.3, -38400., 38400.]))

Next we go ahead and produce a sample, to do this we need to first define a mesh that
describes the topology of the sample, in this example we make the sample shaped as a ball:

   .. code:: python

      from xrd_simulator.mesh import TetraMesh
      # xrd_simulator supports several ways to generate a mesh, here we
      # generate meshed solid sphere using a level set.
      mesh = TetraMesh.generate_mesh_from_levelset(
          level_set=lambda x: np.linalg.norm(x) - 768.0,
          bounding_radius=769.0,
          max_cell_circumradius=450.)

Every element in the sample is composed of some material, or "phase", we define the present phases
in a list of ``xrd_simulator.phase.Phase`` objects, in this example only a single phase is present:

   .. code:: python

      from xrd_simulator.phase import Phase
      quartz = Phase(unit_cell=[4.926, 4.926, 5.4189, 90., 90., 120.],
                     sgname='P3221',  # (Quartz)
                     path_to_cif_file=None  # phases can be defined from crystalographic information files
                     )

The polycrystal sample can now be created. In this example the crystal elements have random orientations
and the strain is uniformly zero in the sample:

   .. code:: python

      from scipy.spatial.transform import Rotation as R
      from xrd_simulator.polycrystal import Polycrystal
      orientation = R.random(mesh.number_of_elements).as_matrix()
      polycrystal = Polycrystal(mesh,
                                orientation,
                                strain=np.zeros((3, 3)),
                                phases=quartz,
                                element_phase_map=None)

We may save the polycrystal to disc by using the builtin ``save()`` command as

   .. code:: python

      polycrystal.save('my_polycrystal', save_mesh_as_xdmf=True)

We can visualize the sample by loading the .xdmf file into your favorite 3D rendering program.
In `paraview`_ the sampled colored by one of its Euler angles looks like this:

.. image:: https://github.com/FABLE-3DXRD/xrd_simulator/blob/main/docs/source/images/example_polycrystal_readme.png?raw=true
   :align: center

We can now define some motion of the sample over which to integrate the diffraction signal:

   .. code:: python

      from xrd_simulator.motion import RigidBodyMotion
      motion = RigidBodyMotion(rotation_axis=np.array([0, 1/np.sqrt(2), -1/np.sqrt(2)]),
                               rotation_angle=np.radians(1.0),
                               translation=np.array([123, -153.3, 3.42]))

Now that we have an experimental setup we may collect diffraction by letting the beam and detector
interact with the sample:

   .. code:: python

      polycrystal.diffract(beam, detector, motion)
      diffraction_pattern = detector.render(frames_to_render=0,
                                              lorentz=False,
                                              polarization=False,
                                              structure_factor=False,
                                              method="project")

The resulting rendered detector frame will look something like the below. Note that the positions of the diffraction spots may vary as the crystal orientations were randomly generated!:

   .. code:: python

      import matplotlib.pyplot as plt
      fig,ax = plt.subplots(1,1)
      ax.imshow(diffraction_pattern, cmap='gray')
      plt.show()

.. image:: https://github.com/FABLE-3DXRD/xrd_simulator/blob/main/docs/source/images/diffraction_pattern.png?raw=true
   :align: center

To compute several frames simply change the motion and collect the diffraction again. The sample may be moved before
each computation using the same or another motion.

   .. code:: python

      polycrystal.transform(motion, time=1.0)
      polycrystal.diffract(beam, detector, motion)

Many more options for experimental setups and intensity rendering exist, have fun experimenting!
The above example code can be found as a `single .py file here.`_

======================================
Installation
======================================

Anaconda installation (Linux and Macos)
=============================================
``xrd_simulator`` is distributed on the `conda-forge channel`_ and the preferred way to install
the xrd_simulator package is via `Anaconda`_::

   conda create -n xrd_simulator
   conda activate xrd_simulator
   conda install -c conda-forge xrd_simulator

This is meant to work across OS-systems and requires an `Anaconda`_ installation.

(The conda-forge feedstock of ``xrd_simulator`` `can be found here.`_)

Anaconda installation (Windows)
======================================
To install with anaconda on windows you must make sure that external dependencies of `pygalmesh`_ are preinstalled
on your system. Documentation on installing these package `can be found elsewhere.`_

Pip Installation
======================================
Pip installation is possible, however, external dependencies of `pygalmesh`_ must the be preinstalled
on your system. Installation of these will be OS dependent and documentation
`can be found elsewhere.`_::

   pip install xrd-simulator

Source installation
===============================
Naturally one may also install from the sources::

   git clone https://github.com/FABLE-3DXRD/xrd_simulator.git
   cd xrd_simulator
   python setup.py install

This will then again require the `pygalmesh`_ dependencies to be resolved beforehand.

Credits
===============================
``xrd_simulator`` makes good use of xfab and pygalmesh. The source code of these repos can be found here:

* `https://github.com/FABLE-3DXRD/xfab`_
* `https://github.com/nschloe/pygalmesh`_

Citation
===============================
If you feel that ``xrd_simulator`` was helpful in your research we would love for you to cite us.

*xrd_simulator: 3D X-ray diffraction simulation software supporting 3D polycrystalline microstructure morphology descriptions
Henningsson, A. & Hall, S. A. (2023). J. Appl. Cryst. 56, 282-292.*
`https://doi.org/10.1107/S1600576722011001`_

.. _https://doi.org/10.1107/S1600576722011001: https://doi.org/10.1107/S1600576722011001

.. _https://github.com/FABLE-3DXRD/xfab: https://github.com/FABLE-3DXRD/xfab

.. _https://github.com/marmakoide/miniball: https://github.com/marmakoide/miniball

.. _Anaconda: https://www.anaconda.com/products/individual

.. _pygalmesh: https://github.com/nschloe/pygalmesh

.. _https://github.com/nschloe/pygalmesh: https://github.com/nschloe/pygalmesh

.. _can be found elsewhere.: https://github.com/nschloe/pygalmesh#installation

.. _scanning-3dxrd: https://doi.org/10.1107/S1600576720001016

.. _3dxrd: https://en.wikipedia.org/wiki/3DXRD

.. _powder like: https://en.wikipedia.org/wiki/Powder_diffraction

.. _which is hosted here: https://FABLE-3DXRD.github.io/xrd_simulator/

.. _which is hosted here: https://FABLE-3DXRD.github.io/xrd_simulator/

.. _single .py file here.: https://github.com/FABLE-3DXRD/xrd_simulator/blob/main/docs/source/examples/readme_tutorial.py

.. _paraview: https://www.paraview.org/

.. _can be found here.: https://github.com/conda-forge/xrd_simulator-feedstock

.. _conda-forge channel: https://anaconda.org/conda-forge/xrd_simulator

Owner

  • Name: FABLE-3DXRD
  • Login: FABLE-3DXRD
  • Kind: organization

Citation (CITATION.cff)

cff-version: 1.2.0
message: "If you use this software, please cite it as below."
authors:
- family-names: "Henningsson"
  given-names: "Axel"
  orcid: "https://orcid.org/0000-0001-6967-9726"
- family-names: "Hall"
  given-names: "Stephen A."
title: "xrd_simulator"
version: 0.4.1
date-released: 2023-02-01
url: "https://github.com/FABLE-3DXRD/xrd_simulator"
preferred-citation:
  type: article
  authors:
  - family-names: "Henningsson"
    given-names: "Axel"
    orcid: "https://orcid.org/0000-0001-6967-9726"
  - family-names: "Hall"
    given-names: "Stephen A."
  doi: "10.1107/S160057672201100"
  journal: "Journal of Applied Crystallography"
  month: 2
  start: 282 # First page number
  end: 292 # Last page number
  title: "xrd_simulator: 3D X-ray diffraction simulation software supporting 3D polycrystalline microstructure morphology descriptions"
  issue: 1
  volume: 56
  year: 2023

GitHub Events

Total
  • Issues event: 6
  • Watch event: 11
  • Issue comment event: 9
  • Push event: 22
  • Fork event: 5
  • Create event: 1
Last Year
  • Issues event: 6
  • Watch event: 11
  • Issue comment event: 9
  • Push event: 22
  • Fork event: 5
  • Create event: 1

Committers

Last synced: almost 3 years ago

All Time
  • Total Commits: 355
  • Total Committers: 3
  • Avg Commits per committer: 118.333
  • Development Distribution Score (DDS): 0.462
Past Year
  • Commits: 49
  • Committers: 1
  • Avg Commits per committer: 49.0
  • Development Distribution Score (DDS): 0.0
Top Committers
Name Email Commits
Axel Henningsson n****n@g****m 191
Axel Henningsson n****m 148
Axel Henningsson 3****n@u****m 16

Issues and Pull Requests

Last synced: 6 months ago

All Time
  • Total issues: 13
  • Total pull requests: 5
  • Average time to close issues: 6 days
  • Average time to close pull requests: about 1 month
  • Total issue authors: 8
  • Total pull request authors: 3
  • Average comments per issue: 1.08
  • Average comments per pull request: 9.4
  • Merged pull requests: 4
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 4
  • Pull requests: 0
  • Average time to close issues: 2 days
  • Average time to close pull requests: N/A
  • Issue authors: 4
  • Pull request authors: 0
  • Average comments per issue: 1.0
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • vamatya (5)
  • AxelHenningsson (2)
  • poautran (1)
  • harrison1125 (1)
  • Marcraven (1)
  • jonwright (1)
  • EricShmeric (1)
  • ravipurohit1991 (1)
Pull Request Authors
  • Marcraven (2)
  • vamatya (2)
  • AxelHenningsson (1)
Top Labels
Issue Labels
bug (1) enhancement (1) question (1)
Pull Request Labels

Packages

  • Total packages: 1
  • Total downloads: unknown
  • Total dependent packages: 0
  • Total dependent repositories: 0
  • Total versions: 8
conda-forge.org: xrd_simulator

The xrd_simulator package defines polycrystals as a mesh of tetrahedral single crystals and simulates diffraction as collected by a 2D discretized detector array while the sample is rocked around an arbitrary rotation axis.

  • Versions: 8
  • Dependent Packages: 0
  • Dependent Repositories: 0
Rankings
Dependent repos count: 34.0%
Average: 48.8%
Dependent packages count: 51.2%
Stargazers count: 52.6%
Forks count: 57.4%
Last synced: 6 months ago

Dependencies

.github/workflows/python-package-conda-linux-py38.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite
.github/workflows/python-package-conda-macos-py38.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite
.github/workflows/python-package-run-tests-linux-py38.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite
.github/workflows/python-package-run-tests-macos-py38.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite