xrayscatteringtools 1.0.0__tar.gz → 1.0.2__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.
Files changed (56) hide show
  1. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/PKG-INFO +1 -1
  2. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/pyproject.toml +1 -1
  3. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/masking.py +16 -7
  4. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/io.py +9 -2
  5. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/.gitattributes +0 -0
  6. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/.github/workflows/tests.yml +0 -0
  7. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/.gitignore +0 -0
  8. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/LICENSE +0 -0
  9. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/README.md +0 -0
  10. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/__init__.py +0 -0
  11. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/__init__.py +0 -0
  12. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/data/Zn_attenuation_length.h5 +0 -0
  13. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/data/attenuation_lengths.h5 +0 -0
  14. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/geometry_calibration.py +0 -0
  15. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/scattering_corrections.py +0 -0
  16. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/calib/timetool_calibration.py +0 -0
  17. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/data/Jungfrau4M.h5 +0 -0
  18. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/epicsArch.py +0 -0
  19. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/plotting.py +0 -0
  20. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/__init__.py +0 -0
  21. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/IAM/Compton_Factors.npy +0 -0
  22. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/IAM/Scattering_Factors.npy +0 -0
  23. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/geometries/SF6__CCSD_T_DHK__aug_cc_pV5Z_DK.h5 +0 -0
  24. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/geometries/make_geometry_h5.py +0 -0
  25. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/patterns/SF6__CCSD__aug_cc_pVDZ.h5 +0 -0
  26. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/patterns/SF6__HF__aug_cc_pVDZ.h5 +0 -0
  27. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/patterns/SF6__MP2__aug_cc_pVDZ.h5 +0 -0
  28. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/data/patterns/convert_ab_initio_to_h5.py +0 -0
  29. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/geometries.py +0 -0
  30. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/geometries.pyi +0 -0
  31. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/iam.py +0 -0
  32. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/patterns.py +0 -0
  33. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/theory/patterns.pyi +0 -0
  34. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/src/xrayscatteringtools/utils.py +0 -0
  35. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/__init__.py +0 -0
  36. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/DMP_D.xyz +0 -0
  37. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/DMP_L1.xyz +0 -0
  38. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/DMP_L2.xyz +0 -0
  39. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/DMP_ground.xyz +0 -0
  40. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/azav_test.ipynb +0 -0
  41. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/calib_test.ipynb +0 -0
  42. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/geometries_test.ipynb +0 -0
  43. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/iam_oriented_test.ipynb +0 -0
  44. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/iam_pattern_test.ipynb +0 -0
  45. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/old/patterns_test.ipynb +0 -0
  46. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/sf6_test.xyz +0 -0
  47. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_geometries.py +0 -0
  48. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_geometry_calibration.py +0 -0
  49. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_iam.py +0 -0
  50. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_io.py +0 -0
  51. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_masking.py +0 -0
  52. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_patterns.py +0 -0
  53. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_plotting.py +0 -0
  54. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_scattering_corrections.py +0 -0
  55. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_timetool_calibration.py +0 -0
  56. {xrayscatteringtools-1.0.0 → xrayscatteringtools-1.0.2}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xrayscatteringtools
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: A library for gas phase analysis at the CXI endstation
5
5
  Project-URL: Homepage, https://github.com/Weber-Group/xrayscatteringtools
6
6
  Project-URL: Issues, https://github.com/Weber-Group/xrayscatteringtools/issues
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "xrayscatteringtools"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "A library for gas phase analysis at the CXI endstation"
9
9
  authors = [
10
10
  { name = "David Romano", email = "david_j_romano@brown.edu" }
@@ -22,7 +22,6 @@ logger = logging.getLogger(__name__)
22
22
  _KEYS_TO_COMBINE = [
23
23
  'lightStatus/xray',
24
24
  'lightStatus/laser',
25
- 'jungfrau4M/azav_azav',
26
25
  ]
27
26
  _KEYS_TO_SUM = [
28
27
  'Sums/jungfrau4M_calib_xrayOn_thresADU1',
@@ -214,9 +213,19 @@ class MaskMaker:
214
213
  ub : float, optional
215
214
  Upper ``arcsinh`` intensity cutoff.
216
215
  """
217
- # Compute average dark image (xray-off frames only)
218
- dark_num_shots = np.sum(~self.dark_data['lightStatus/xray'].astype(bool))
219
- dark_avg = np.array(self.dark_data['Sums/jungfrau4M_calib_dropped'] / dark_num_shots)
216
+
217
+ if np.sum(~self.dark_data['lightStatus/xray'].astype(bool)) == 0:
218
+ logger.warning(
219
+ f"EVR Codes indicate no dropped (dark) shots in run {self.dark_run_number}. "
220
+ "Double check that this is a proper dark (not pedestal) run. This warning can be ignored if the run is correct, as sometimes the EVR codes are not perfectly reliable."
221
+ )
222
+ # Compute average dark image (xray-off frames only)
223
+ dark_num_shots = len(self.dark_data['lightStatus/xray'])
224
+ dark_avg = np.array(self.dark_data['Sums/jungfrau4M_calib'] / dark_num_shots)
225
+ else:
226
+ dark_num_shots = np.sum(~self.dark_data['lightStatus/xray'].astype(bool))
227
+ dark_avg = np.array(self.dark_data['Sums/jungfrau4M_calib_dropped'] / dark_num_shots)
228
+
220
229
  dark_arcsinh = np.arcsinh(dark_avg)
221
230
 
222
231
  if plotting:
@@ -244,7 +253,7 @@ class MaskMaker:
244
253
  raise ValueError(f"Lower bound ({lb}) must be less than upper bound ({ub}).")
245
254
 
246
255
  # Build the mask
247
- self.dark_mask = (dark_arcsinh >= lb) & (dark_arcsinh <= ub)
256
+ self.dark_mask = np.logical_and(self.dark_mask,(dark_arcsinh >= lb) & (dark_arcsinh <= ub))
248
257
 
249
258
  if plotting:
250
259
  dark_avg_masked = np.where(self.dark_mask, dark_avg, np.nan)
@@ -483,7 +492,7 @@ class MaskMaker:
483
492
 
484
493
  # Compute the q-map
485
494
  q_map = compute_q_map(J4M.x, J4M.y, x0, y0, z0, tx, ty, keV, z_off)
486
- q_bins = np.linspace(np.nanmin(q_map), np.nanmax(q_map), n_q_bins)
495
+ q_bins = np.linspace(np.nanmin(q_map[~np.isnan(sample_avg_masked)]), np.nanmax(q_map[~np.isnan(sample_avg_masked)]), n_q_bins)
487
496
 
488
497
  for q_idx, q_lo in tqdm(enumerate(q_bins[:-1]), total=len(q_bins) - 1):
489
498
  q_hi = q_bins[q_idx + 1]
@@ -632,7 +641,7 @@ class MaskMaker:
632
641
  sample_avg_corrected = sample_avg_masked / thompson_corr
633
642
 
634
643
  q_map = compute_q_map(J4M.x, J4M.y, x0, y0, z0, tx, ty, keV, z_off)
635
- q_bins = np.linspace(np.nanmin(q_map), np.nanmax(q_map), n_q_bins)
644
+ q_bins = np.linspace(np.nanmin(q_map[~np.isnan(sample_avg_masked)]), np.nanmax(q_map[~np.isnan(sample_avg_masked)]), n_q_bins)
636
645
  q_centers = (q_bins[:-1] + q_bins[1:]) / 2
637
646
 
638
647
  means = np.empty(len(q_centers))
@@ -1,3 +1,5 @@
1
+ import glob
2
+ import os
1
3
  import numpy as np
2
4
  import h5py
3
5
  from .epicsArch import EpicsArchive
@@ -99,8 +101,13 @@ def combineRuns(runNumbers, folders, keys_to_combine, keys_to_sum, keys_to_check
99
101
  data_array = []
100
102
  for i, runNumber in enumerate(tqdm(runNumbers, desc="Loading Runs")):
101
103
  data = {}
102
- experiment = folders[i].split('/')[6]
103
- filename = f'{folders[i]}{experiment}_Run{runNumToString(runNumber)}.h5'
104
+ run_suffix = f'_Run{runNumToString(runNumber)}.h5'
105
+ matches = sorted(glob.glob(os.path.join(folders[i], f'*{run_suffix}')))
106
+ if len(matches) == 0:
107
+ raise FileNotFoundError(f"No files found in {folders[i]} matching pattern '*{run_suffix}'")
108
+ elif len(matches) > 1:
109
+ raise FileExistsError(f"Multiple files found in {folders[i]} matching pattern '*{run_suffix}': {matches}")
110
+ filename = matches[0]
104
111
  print('Loading: ' + filename)
105
112
  with h5py.File(filename, 'r') as f:
106
113
  # Print all keys and shapes without loading data