Package: debyecalculator
DebyeCalculatorWelcome toDebyeCalculator! This is a simple tool for calculating the scattering intensity $I(Q)$ through the Debye scattering equation, the Total Scattering Structure Function $S(Q)$, the Reduced Total Scattering Function $F(Q)$, and the Reduced Atomic Pair Distribution Function $G(r)$ from an atomic structure.
The Debye scattering equation can be used to compute the scattering pattern of any atomic structure and is commonly used to study both crystalline and non-crystalline materials with a range of scattering techniques like powder diffraction, total scattering with pair distribution function and small-angle scattering. Although the Debye scattering equation is extremely versatile, the computation of the double sum, which scales O(N2), has limited the practical use of the equation.
Here, we provide an optimised code for the calculation of the Debye scattering equation on Graphics processing units (GPUs) which accelerate the calculations with orders of magnitudes.InstallationPrerequisitesInstall with pipInstall locallyGPU supportUsageInteractive modeExample usagePartial GrAdditional implementation detailsAuthorsCiteContributing to the softwareReporting issuesSeeking supportInstallationPrerequisitesDebyeCalculatorrequires Python version >=3.7, <3.12. If needed, create an environment with any of these Python versions:condacreate-ndebyecalculator_envpython=3.9condaactivatedebyecalculator_envBefore installing theDebyeCalculatorpackage, ensure that you have PyTorch installed. Follow the instructions on the official PyTorch website to install the appropriate version for your system:PyTorch Installation Guide.NOTE: Installing anearlier versionof PyTorch (<=1.13.1) will be necessary if you're running Python 3.7, since the latest PyTorch version requires Python 3.8 or higher.Install withpipRun the following command to install theDebyeCalculatorpackage. (Requires: Python >=3.7, <3.12)pip install debyecalculatorInstall locallyClone the repogit clone https://github.com/FrederikLizakJohansen/DebyeCalculator.gitRun the following command to install theDebyeCalculatorpackage. (Requires: Python >=3.7, <3.12)python -m pip install .Testing the local installationTo ensure that the installation is set up correctly and your environment is ready to go, we recommend running the included unit tests.First, make sure you havepytestinstalled. If not, you can install it using:pipinstallpytestAfter installing the package, open a terminal or command prompt and navigate to the root directory of the package. Then run the following command to execute the tests:pytestGPU SupportTheDebyeCalculatorpackage supports GPU acceleration using PyTorch with CUDA. Follow these steps to enable GPU support:1. Verify GPU AvailabilityAfter installing PyTorch with CUDA, you can check if your GPU is available by running the following code snippet in a Python environment:importtorchprint("CUDA available:",torch.cuda.is_available())2. Specify GPU Device in DebyeCalculatorWhen creating an instance of DebyeCalculator, you can specify the device as 'cuda' to utilize GPU acceleration:fromdebyecalculatorimportDebyeCalculatorcalc=DebyeCalculator(device='cuda')UsageInteractive mode at Google ColabFollow the instructions in ourInteractive Google Colab notebookand try to play around.IMPORTANT:CHANGES TO INTERACTIVE MODE AS OF JANUARY 2024 (DebyeCalculator version >=1.0.5)
In the lastest version of DebyeCalculator, we are unfortunately experiences some issues with Google Colab that does not allow the package to display theinteract()widget. If you experience any related issues, please refer to thisstatementfor further clarification and workarounds.Example usagefromdebyecalculatorimportDebyeCalculatorimporttorch# Initialise calculator objectcalc=DebyeCalculator(qmin=1.0,qmax=8.0,qstep=0.01)# Define structure sourcesxyz_file="some_path/some_file.xyz"cif_file="some_path/some_file.cif"structure_tuple=(["Fe","Fe","O","O"],torch.tensor([[0.5377,0.7068,0.8589],[0.1576,0.1456,0.8799],[0.5932,0.0204,0.6759],[0.6946,0.4114,0.4869]]))# Print object to view all parametersprint(calc)## [OUTPUT] DebyeCalculator{'qmin': 1.0, 'qmax': 8.0, 'qstep': 0.01, 'rmin': 0.0, 'rmax': 20.0, ...}# Calculate Powder (X-ray) Diffraction from XYZ-fileQ,I=calc.iq(structure_source=xyz_file)# Calculate Powder (X-ray) Diffraction from CIFQ,I=calc.iq(structure_source=cif_file,radii=5)# radii is the radius of the particle in Å# Calculate Powder (X-ray) Diffraction from TupleQ,I=calc.iq(structure_source=structure_tuple)# Update parameters for Small Angle (Neutron) Scatteringcalc.update_parameters(qmin=0.0,qmax=3.0,qstep=0.01,radiation_type="neutron")# Calculate Small Angle (Neutron) ScatteringQ,I=calc.iq(structure_source=xyz_file)# Update parameters for Total Scattering with Pair Distribution Function analysiscalc.update_parameters(qmin=1.0,qmax=30.0,qstep=0.1,radiation_type="xray")# Calculate Pair Distribution Functionr,G=calc.gr(structure_source=xyz_file).....Partial Gr# Create a mask for oxygen atoms
mask = [atom == "O" for atom in structure_tuple[0]]

# Apply the mask to the structure_tuple
structure_tuple = (
    [atom for atom, m in zip(structure_tuple[0], mask) if m],
    structure_tuple[1][mask]
)

# Calculate Pair Distribution Function
r_partial, Gr_partial = calc.gr(structure_source=structure_tuple)Additional implementation detailsSee thedocsfolder.AuthorsFrederik L. Johansen1, 2Andy S. Anker11Department of Chemistry & Nano-Science Center, University of Copenhagen, Denmark2Department of Computer Science, University of Copenhagen, DenmarkShould there be any questions, desired improvements or bugs please contact us on GitHub or
through email:frjo@di.ku.dkandansoan@dtu.dk.CiteIf you use our code or our results, please consider citing our paper. Thanks in advance!@article{Johansen_anker2023debye,
title={A GPU-Accelerated Open-Source Python Package for Calculating Powder Diffraction, Small-Angle-, and Total Scattering with the Debye Scattering Equation},
author={Frederik L. Johansen, Andy S. Anker, Ulrik Friis-Jensen, Erik B. Dam, Kirsten M. Ø. Jensen, Raghavendra Selvan},
journal={ChemRxiv}
year={2023}}Contributing to the softwareWe welcome contributions to our software! To contribute, please follow these steps:Fork the repository.Make your changes in a new branch.Submit a pull request.We'll review your changes and merge them if they meet our quality standards, including passing all unit tests. To ensure that your changes pass the unit tests, please run the tests locally before submitting your pull request. You can also view the test results on our GitHub repository using GitHub Actions.Reporting issuesIf you encounter any issues or problems with our software, please report them by opening an issue on our GitHub repository. Please include as much detail as possible, including steps to reproduce the issue and any error messages you received.Seeking supportIf you need help using our software, please reach out to us on our GitHub repository. We'll do our best to assist you and answer any questions you have.References[1]Waasmaier, D., & Kirfel, A. (1995). New analytical scattering-factor functions for free atoms and ions. Acta Crystallographica Section A, 51(3), 416–431.https://doi.org/10.1107/S0108767394013292