nxs-analysis-tools 0.1.6__tar.gz → 0.1.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nxs-analysis-tools might be problematic. Click here for more details.
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/PKG-INFO +1 -1
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/pyproject.toml +2 -2
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/_meta/__init__.py +1 -1
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/__init__.py +2 -1
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/chess.py +37 -10
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/datareduction.py +179 -2
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/LICENSE +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/MANIFEST.in +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/README.md +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/setup.cfg +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/setup.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/fitting.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/pairdistribution.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools.egg-info/SOURCES.txt +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_accurate_highlight.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_chess.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_chess_fitting.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_datareduction.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_ellipsoidal_window.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_fitting.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_lmfit.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_mask_plotting.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_pairdistribution.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_plot_slice_axes_types.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_plot_slice_with_ndarray.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_rotate_data.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_sum_axis.py +0 -0
- {nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_symmetrizer_rectangular_plane.py +0 -0
|
@@ -6,7 +6,7 @@ build-backend = 'setuptools.build_meta'
|
|
|
6
6
|
|
|
7
7
|
[project]
|
|
8
8
|
name = 'nxs-analysis-tools'
|
|
9
|
-
version = '0.1.
|
|
9
|
+
version = '0.1.7'
|
|
10
10
|
description = 'Reduce and transform nexus format (.nxs) scattering data.'
|
|
11
11
|
readme = 'README.md'
|
|
12
12
|
requires-python = '>=3.7'
|
|
@@ -71,7 +71,7 @@ dev = [
|
|
|
71
71
|
'DOI' = 'https://doi.org/10.5281/zenodo.15186359'
|
|
72
72
|
|
|
73
73
|
[tool.bumpver]
|
|
74
|
-
current_version = "0.1.
|
|
74
|
+
current_version = "0.1.7"
|
|
75
75
|
version_pattern = "MAJOR.MINOR.PATCH[-TAG]"
|
|
76
76
|
tag_pattern = "vMAJOR.MINOR.PATCH[-TAG]"
|
|
77
77
|
commit_message = "Bump version {old_version} -> {new_version}"
|
|
@@ -11,4 +11,5 @@ from .chess import TempDependence
|
|
|
11
11
|
__all__ = ['load_data', 'load_transform', 'plot_slice', 'Scissors',
|
|
12
12
|
'reciprocal_lattice_params', 'rotate_data', 'rotate_data_2D',
|
|
13
13
|
'convert_to_inverse_angstroms', 'array_to_nxdata', 'Padder',
|
|
14
|
-
'rebin_nxdata', 'rebin_3d', 'rebin_1d'
|
|
14
|
+
'rebin_nxdata', 'rebin_3d', 'rebin_1d', 'TempDependence',
|
|
15
|
+
'animate_slice_temp', 'animate_slice_axis']
|
|
@@ -103,18 +103,28 @@ class TempDependence:
|
|
|
103
103
|
Plot raw data and fitted models for each temperature.
|
|
104
104
|
fit_peak_simple():
|
|
105
105
|
Perform a basic fit using a pseudo-Voigt peak shape, linear background, and no constraints.
|
|
106
|
-
plot_order_parameter():
|
|
106
|
+
plot_order_parameter(ax, **kwargs):
|
|
107
107
|
Plot the temperature dependence of the peakheight parameter.
|
|
108
108
|
print_fit_report():
|
|
109
109
|
Print the fit report for each temperature.
|
|
110
110
|
"""
|
|
111
111
|
|
|
112
|
-
def __init__(self):
|
|
112
|
+
def __init__(self, sample_directory=None):
|
|
113
113
|
"""
|
|
114
|
-
Initialize the TempDependence class
|
|
114
|
+
Initialize the TempDependence class.
|
|
115
|
+
|
|
116
|
+
Parameters
|
|
117
|
+
----------
|
|
118
|
+
sample_directory : str, optional
|
|
119
|
+
Path to the directory containing the temperature folders.
|
|
120
|
+
If None, no directory is set initially.
|
|
115
121
|
"""
|
|
116
122
|
|
|
117
|
-
|
|
123
|
+
if sample_directory is None:
|
|
124
|
+
self.sample_directory = None
|
|
125
|
+
else:
|
|
126
|
+
self.set_sample_directory(sample_directory)
|
|
127
|
+
|
|
118
128
|
self.xlabel = ''
|
|
119
129
|
self.datasets = {}
|
|
120
130
|
self.temperatures = []
|
|
@@ -138,7 +148,7 @@ class TempDependence:
|
|
|
138
148
|
|
|
139
149
|
def find_temperatures(self):
|
|
140
150
|
"""
|
|
141
|
-
Set the list of temperatures by automatically scanning the sample directory.
|
|
151
|
+
Set the list of temperatures by automatically scanning the sample directory for .nxs files from nxrefine.
|
|
142
152
|
"""
|
|
143
153
|
|
|
144
154
|
# Assert that self.sample_directory must exist
|
|
@@ -454,7 +464,7 @@ class TempDependence:
|
|
|
454
464
|
|
|
455
465
|
Parameters
|
|
456
466
|
----------
|
|
457
|
-
ax : matplotlib.axes.Axes
|
|
467
|
+
ax : :class:`matplotlib.axes.Axes`, optional
|
|
458
468
|
The axes on which to plot the heatmap. If None, a new figure and axes
|
|
459
469
|
are created. The default is None.
|
|
460
470
|
**kwargs
|
|
@@ -707,7 +717,7 @@ class TempDependence:
|
|
|
707
717
|
Amount to vertically offset each linecut for clarity.
|
|
708
718
|
cmap : str, default='viridis'
|
|
709
719
|
Name of the matplotlib colormap used to distinguish different temperatures.
|
|
710
|
-
ax : matplotlib.axes.Axes or None, default=None
|
|
720
|
+
ax : :class:`matplotlib.axes.Axes` or None, default=None
|
|
711
721
|
Axis object to plot on. If None, a new figure and axis are created.
|
|
712
722
|
|
|
713
723
|
The function:
|
|
@@ -754,9 +764,10 @@ class TempDependence:
|
|
|
754
764
|
LinearModel(prefix='background')])
|
|
755
765
|
linecutmodel.make_params()
|
|
756
766
|
linecutmodel.guess()
|
|
767
|
+
linecutmodel.params.set('peakamplitude', min=0)
|
|
757
768
|
linecutmodel.fit()
|
|
758
769
|
|
|
759
|
-
def plot_order_parameter(self):
|
|
770
|
+
def plot_order_parameter(self, ax=None, **kwargs):
|
|
760
771
|
"""
|
|
761
772
|
Plot the temperature dependence of the peak height (order parameter).
|
|
762
773
|
|
|
@@ -764,6 +775,14 @@ class TempDependence:
|
|
|
764
775
|
line cut fit stored in `linecutmodels` and plots it as a function
|
|
765
776
|
of temperature using matplotlib.
|
|
766
777
|
|
|
778
|
+
Parameters
|
|
779
|
+
----------
|
|
780
|
+
ax : :class:`matplotlib.axes.Axes`, optional
|
|
781
|
+
Axis object to plot on. If None, a new figure and axis are created.
|
|
782
|
+
**kwargs
|
|
783
|
+
Keyword arguments to be passed to the plot function.
|
|
784
|
+
|
|
785
|
+
|
|
767
786
|
Returns
|
|
768
787
|
-------
|
|
769
788
|
Figure
|
|
@@ -786,11 +805,19 @@ class TempDependence:
|
|
|
786
805
|
|
|
787
806
|
# Extract the peakheight at every temperature
|
|
788
807
|
for T in self.temperatures:
|
|
808
|
+
|
|
809
|
+
# Verify that the fit has already been completed
|
|
810
|
+
if self.linecutmodels[T].modelresult is None:
|
|
811
|
+
raise AttributeError("Model result is empty. Have you fit the data to a model?")
|
|
812
|
+
|
|
789
813
|
peakheights.append(self.linecutmodels[T].modelresult.params['peakheight'].value)
|
|
790
814
|
|
|
791
815
|
# Plot the peakheights vs. temperature
|
|
792
|
-
|
|
793
|
-
|
|
816
|
+
if ax is None:
|
|
817
|
+
fig, ax = plt.subplots()
|
|
818
|
+
else:
|
|
819
|
+
fig = ax.figure
|
|
820
|
+
ax.plot(temperatures, peakheights, **kwargs)
|
|
794
821
|
ax.set(xlabel='$T$ (K)', ylabel='peakheight')
|
|
795
822
|
return fig, ax
|
|
796
823
|
|
{nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/datareduction.py
RENAMED
|
@@ -2,22 +2,27 @@
|
|
|
2
2
|
Reduces scattering data into 2D and 1D datasets.
|
|
3
3
|
"""
|
|
4
4
|
import os
|
|
5
|
+
import io
|
|
6
|
+
import warnings
|
|
5
7
|
import numpy as np
|
|
6
8
|
import matplotlib.pyplot as plt
|
|
7
9
|
from matplotlib.transforms import Affine2D
|
|
8
10
|
from matplotlib.markers import MarkerStyle
|
|
9
11
|
from matplotlib.ticker import MultipleLocator
|
|
12
|
+
import matplotlib.animation as animation
|
|
10
13
|
from matplotlib import colors
|
|
11
14
|
from matplotlib import patches
|
|
12
|
-
from IPython.display import display, Markdown
|
|
15
|
+
from IPython.display import display, Markdown, HTML, Image
|
|
13
16
|
from nexusformat.nexus import NXfield, NXdata, nxload, NeXusError, NXroot, NXentry, nxsave
|
|
14
17
|
from scipy import ndimage
|
|
15
18
|
|
|
19
|
+
|
|
16
20
|
# Specify items on which users are allowed to perform standalone imports
|
|
17
21
|
__all__ = ['load_data', 'load_transform', 'plot_slice', 'Scissors',
|
|
18
22
|
'reciprocal_lattice_params', 'rotate_data', 'rotate_data_2D',
|
|
19
23
|
'convert_to_inverse_angstroms', 'array_to_nxdata', 'Padder',
|
|
20
|
-
'rebin_nxdata', 'rebin_3d', 'rebin_1d'
|
|
24
|
+
'rebin_nxdata', 'rebin_3d', 'rebin_1d', 'animate_slice_temp',
|
|
25
|
+
'animate_slice_axis']
|
|
21
26
|
|
|
22
27
|
|
|
23
28
|
def load_data(path, print_tree=True):
|
|
@@ -407,6 +412,9 @@ def plot_slice(data, X=None, Y=None, sum_axis=None, transpose=False, vmin=None,
|
|
|
407
412
|
# Use the 2D template to create a new nxdata
|
|
408
413
|
data = array_to_nxdata(arr, data[slice_obj])
|
|
409
414
|
|
|
415
|
+
if data.ndim != 2:
|
|
416
|
+
raise ValueError("Slice data must be 2D.")
|
|
417
|
+
|
|
410
418
|
# If the data is of type ndarray, then convert to NXdata
|
|
411
419
|
if is_array:
|
|
412
420
|
# Convert X to NXfield if it is not already
|
|
@@ -600,6 +608,175 @@ def plot_slice(data, X=None, Y=None, sum_axis=None, transpose=False, vmin=None,
|
|
|
600
608
|
# Return the quadmesh object
|
|
601
609
|
return p
|
|
602
610
|
|
|
611
|
+
def animate_slice_temp(temp_dependence, slice_obj, ax=None, interval=500, save_gif=False, filename='animation',
|
|
612
|
+
title=True, title_fmt='d', plot_slice_kwargs=None, ax_kwargs=None):
|
|
613
|
+
"""
|
|
614
|
+
Animate 2D slices from a temperature-dependent dataset.
|
|
615
|
+
|
|
616
|
+
Creates a matplotlib animation by extracting 2D slices from each dataset
|
|
617
|
+
in a TempDependence object and animating them in sequence by temperature.
|
|
618
|
+
Optionally displays the animation inline and/or saves it as a GIF.
|
|
619
|
+
|
|
620
|
+
Parameters
|
|
621
|
+
----------
|
|
622
|
+
temp_dependence : nxs_analysis_tools.chess.TempDependence
|
|
623
|
+
Object holding datasets at various temperatures.
|
|
624
|
+
slice_obj : list of slice or None
|
|
625
|
+
Slice object to apply to each dataset; None entries are treated as ':'.
|
|
626
|
+
ax : matplotlib.axes.Axes, optional
|
|
627
|
+
The axes object to plot on. If None, a new figure and axes will be created.
|
|
628
|
+
interval : int, optional
|
|
629
|
+
Delay between frames in milliseconds. Default is 500.
|
|
630
|
+
save_gif : bool, optional
|
|
631
|
+
If True, saves the animation to a .gif file. Default is False.
|
|
632
|
+
filename : str, optional
|
|
633
|
+
Filename (without extension) for saved .gif. Default is 'animation'.
|
|
634
|
+
title : bool, optional
|
|
635
|
+
If True, displays the temperature in the title of each frame. Default is True.
|
|
636
|
+
title_fmt : str, optional
|
|
637
|
+
Format string for temperature values (e.g., '.2f' for 2 decimals). Default is 'd' (integer).
|
|
638
|
+
plot_slice_kwargs : dict, optional
|
|
639
|
+
Additional keyword arguments passed to `plot_slice`.
|
|
640
|
+
ax_kwargs : dict, optional
|
|
641
|
+
Keyword arguments passed to `ax.set`.
|
|
642
|
+
|
|
643
|
+
Returns
|
|
644
|
+
-------
|
|
645
|
+
ani : matplotlib.animation.FuncAnimation
|
|
646
|
+
The resulting animation object.
|
|
647
|
+
"""
|
|
648
|
+
if ax is None:
|
|
649
|
+
fig,ax = plt.subplots() # Generate a new figure and axis
|
|
650
|
+
else:
|
|
651
|
+
fig = ax.figure # Get the figure from the provided axis
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
if plot_slice_kwargs is None:
|
|
655
|
+
plot_slice_kwargs = {}
|
|
656
|
+
if ax_kwargs is None:
|
|
657
|
+
ax_kwargs = {}
|
|
658
|
+
|
|
659
|
+
# Normalize the slice object
|
|
660
|
+
normalized_slice = [slice(None) if s is None else s for s in slice_obj]
|
|
661
|
+
|
|
662
|
+
# Warn if colorbar is requested
|
|
663
|
+
if plot_slice_kwargs.get('cbar', False):
|
|
664
|
+
warnings.warn("Colorbar is not supported in animation and will be ignored.", UserWarning)
|
|
665
|
+
plot_slice_kwargs['cbar'] = False
|
|
666
|
+
elif 'cbar' not in plot_slice_kwargs.keys():
|
|
667
|
+
plot_slice_kwargs['cbar'] = False
|
|
668
|
+
|
|
669
|
+
def update(temp):
|
|
670
|
+
ax.clear()
|
|
671
|
+
dataset = temp_dependence.datasets[temp]
|
|
672
|
+
plot_slice(dataset[tuple(normalized_slice)], ax=ax, **plot_slice_kwargs)
|
|
673
|
+
ax.set(**ax_kwargs)
|
|
674
|
+
|
|
675
|
+
if title:
|
|
676
|
+
try:
|
|
677
|
+
formatted_temp = f"{int(temp):{title_fmt}}"
|
|
678
|
+
except ValueError:
|
|
679
|
+
raise ValueError(f"Invalid title_fmt '{title_fmt}' for temperature value '{temp}'")
|
|
680
|
+
ax.set(title=f'$T$={formatted_temp}')
|
|
681
|
+
|
|
682
|
+
ani = animation.FuncAnimation(fig, update,
|
|
683
|
+
frames=temp_dependence.temperatures,
|
|
684
|
+
interval=interval, repeat=False)
|
|
685
|
+
|
|
686
|
+
display(HTML(ani.to_jshtml()))
|
|
687
|
+
|
|
688
|
+
if save_gif:
|
|
689
|
+
gif_file = f'{filename}.gif'
|
|
690
|
+
writer = animation.PillowWriter(fps=1000 / interval)
|
|
691
|
+
ani.save(gif_file, writer=writer)
|
|
692
|
+
with open(gif_file, 'rb') as f:
|
|
693
|
+
display(Image(f.read(), format='gif'))
|
|
694
|
+
|
|
695
|
+
return ani
|
|
696
|
+
|
|
697
|
+
def animate_slice_axis(data, axis, axis_values, ax=None, interval=500, save_gif=False, filename='animation', title=True, title_fmt='.2f', plot_slice_kwargs={}, ax_kwargs={}):
|
|
698
|
+
"""
|
|
699
|
+
Animate 2D slices of a 3D dataset along a given axis.
|
|
700
|
+
|
|
701
|
+
Creates a matplotlib animation by sweeping through 2D slices of a 3D
|
|
702
|
+
dataset along the specified axis. Optionally displays the animation
|
|
703
|
+
inline (e.g., in Jupyter) and/or saves it as a GIF.
|
|
704
|
+
|
|
705
|
+
Parameters
|
|
706
|
+
----------
|
|
707
|
+
data : nexusformat.nexus.NXdata
|
|
708
|
+
The 3D dataset to visualize.
|
|
709
|
+
axis : int
|
|
710
|
+
The axis along which to animate (must be 0, 1, or 2).
|
|
711
|
+
axis_values : iterable
|
|
712
|
+
The values along the animation axis to use as animation frames.
|
|
713
|
+
ax : matplotlib.axes.Axes, optional
|
|
714
|
+
The axes object to plot on. If None, a new figure and axes will be created.
|
|
715
|
+
interval : int, optional
|
|
716
|
+
Delay between frames in milliseconds. Default is 500.
|
|
717
|
+
save_gif : bool, optional
|
|
718
|
+
If True, saves the animation as a .gif file. Default is False.
|
|
719
|
+
filename : str, optional
|
|
720
|
+
Filename (without extension) to use for the saved .gif. Default is 'animation'.
|
|
721
|
+
title : bool, optional
|
|
722
|
+
If True, displays the axis value as a title for each frame. Default is True.
|
|
723
|
+
title_fmt : str, optional
|
|
724
|
+
Format string for axis value in the title (e.g., '.2f' for 2 decimals). Default is '.2f'.
|
|
725
|
+
plot_slice_kwargs : dict, optional
|
|
726
|
+
Additional keyword arguments passed to `plot_slice`.
|
|
727
|
+
ax_kwargs : dict, optional
|
|
728
|
+
Keyword arguments passed to `ax.set` to update axis settings.
|
|
729
|
+
|
|
730
|
+
Returns
|
|
731
|
+
-------
|
|
732
|
+
ani : matplotlib.animation.FuncAnimation
|
|
733
|
+
The animation object.
|
|
734
|
+
"""
|
|
735
|
+
if ax is None:
|
|
736
|
+
fig,ax = plt.subplots() # Generate a new figure and axis
|
|
737
|
+
else:
|
|
738
|
+
fig = ax.figure # Get the figure from the provided axis
|
|
739
|
+
|
|
740
|
+
if axis not in [0, 1, 2]:
|
|
741
|
+
raise ValueError("axis must be either 0, 1, or 2.")
|
|
742
|
+
|
|
743
|
+
if plot_slice_kwargs.get('cbar', False):
|
|
744
|
+
warnings.warn("Colorbar is not supported in animation and will be ignored.", UserWarning)
|
|
745
|
+
plot_slice_kwargs['cbar'] = False
|
|
746
|
+
elif 'cbar' not in plot_slice_kwargs.keys():
|
|
747
|
+
plot_slice_kwargs['cbar'] = False
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
def update(parameter):
|
|
752
|
+
ax.clear()
|
|
753
|
+
|
|
754
|
+
# Construct slicing object for the selected axis
|
|
755
|
+
slice_obj = [slice(None)] * 3
|
|
756
|
+
slice_obj[axis] = parameter
|
|
757
|
+
|
|
758
|
+
# Plot the 2D slice
|
|
759
|
+
plot_slice(data[tuple(slice_obj)], ax=ax, **plot_slice_kwargs)
|
|
760
|
+
ax.set(**ax_kwargs)
|
|
761
|
+
|
|
762
|
+
if title:
|
|
763
|
+
axis_label = data.axes[axis]
|
|
764
|
+
ax.set(title=f'${axis_label}$={parameter:{title_fmt}}')
|
|
765
|
+
|
|
766
|
+
ani = animation.FuncAnimation(fig, update, frames=axis_values, interval=interval, repeat=False)
|
|
767
|
+
|
|
768
|
+
display(HTML(ani.to_jshtml()))
|
|
769
|
+
|
|
770
|
+
if save_gif:
|
|
771
|
+
gif_file = f'{filename}.gif'
|
|
772
|
+
writergif = animation.PillowWriter(fps=1000/interval)
|
|
773
|
+
ani.save(gif_file, writer=writergif)
|
|
774
|
+
display(HTML(ani.to_jshtml()))
|
|
775
|
+
with open(gif_file, 'rb') as file:
|
|
776
|
+
display(Image(file.read(), format='gif'))
|
|
777
|
+
|
|
778
|
+
return ani
|
|
779
|
+
|
|
603
780
|
|
|
604
781
|
class Scissors:
|
|
605
782
|
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools/pairdistribution.py
RENAMED
|
File without changes
|
{nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/src/nxs_analysis_tools.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nxs_analysis_tools-0.1.6 → nxs_analysis_tools-0.1.7}/tests/test_symmetrizer_rectangular_plane.py
RENAMED
|
File without changes
|