advisor-scattering 0.5.2__py3-none-any.whl → 0.9.1__py3-none-any.whl

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.
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Dialog for importing orientation from diffraction test data."""
4
+
5
+ from PyQt5.QtCore import Qt
6
+ from PyQt5.QtWidgets import (QDialog, QDoubleSpinBox, QFormLayout, QGroupBox,
7
+ QHBoxLayout, QHeaderView, QLabel, QMessageBox,
8
+ QPushButton, QTableWidget, QTableWidgetItem,
9
+ QVBoxLayout)
10
+
11
+ from advisor.domain.orientation import fit_orientation_from_diffraction_tests
12
+
13
+
14
+ class DiffractionTestDialog(QDialog):
15
+ """Dialog for entering diffraction test data and calculating orientation.
16
+
17
+ This dialog allows users to input multiple diffraction tests (H, K, L, energy,
18
+ tth, theta, phi, chi) and calculates the optimal Euler angles (roll, pitch, yaw)
19
+ that best fit the data.
20
+ """
21
+
22
+ def __init__(self, lattice_params: dict, parent=None):
23
+ """Initialize the dialog.
24
+
25
+ Args:
26
+ lattice_params: Dictionary containing lattice parameters (a, b, c, alpha, beta, gamma)
27
+ parent: Parent widget
28
+ """
29
+ super().__init__(parent)
30
+ self.lattice_params = lattice_params
31
+ self.result = None # Will store (roll, pitch, yaw) on success
32
+
33
+ self.setWindowTitle("Import Orientation from Diffraction Tests")
34
+ self.setMinimumWidth(800)
35
+ self.setMinimumHeight(550)
36
+
37
+ self._init_ui()
38
+
39
+ def _init_ui(self):
40
+ """Initialize the UI components."""
41
+ layout = QVBoxLayout(self)
42
+
43
+ # Instructions label
44
+ instructions = QLabel(
45
+ "Enter diffraction test data below. Each row represents a measurement "
46
+ "with known HKL indices and measured angles. At least one test is required."
47
+ )
48
+ instructions.setWordWrap(True)
49
+ layout.addWidget(instructions)
50
+
51
+ # Table for diffraction tests
52
+ self.table = QTableWidget()
53
+ self.table.setColumnCount(8)
54
+ self.table.setHorizontalHeaderLabels(
55
+ ["H", "K", "L", "Energy (eV)", "tth (°)", "θ (°)", "φ (°)", "χ (°)"]
56
+ )
57
+
58
+ # Set column resize mode
59
+ header = self.table.horizontalHeader()
60
+ for i in range(8):
61
+ header.setSectionResizeMode(i, QHeaderView.Stretch)
62
+
63
+ # Add initial empty rows
64
+ self._add_row()
65
+ self._add_row()
66
+
67
+ layout.addWidget(self.table)
68
+
69
+ # Row management buttons
70
+ row_buttons_layout = QHBoxLayout()
71
+
72
+ add_row_btn = QPushButton("Add Row")
73
+ add_row_btn.clicked.connect(self._add_row)
74
+ row_buttons_layout.addWidget(add_row_btn)
75
+
76
+ remove_row_btn = QPushButton("Remove Selected Row")
77
+ remove_row_btn.clicked.connect(self._remove_selected_row)
78
+ row_buttons_layout.addWidget(remove_row_btn)
79
+
80
+ row_buttons_layout.addStretch()
81
+ layout.addLayout(row_buttons_layout)
82
+
83
+ # Results display area
84
+ self.results_group = QGroupBox("Calculated Orientation")
85
+ results_layout = QFormLayout(self.results_group)
86
+
87
+ self.roll_result = QDoubleSpinBox()
88
+ self.roll_result.setRange(-180, 180)
89
+ self.roll_result.setDecimals(4)
90
+ self.roll_result.setReadOnly(True)
91
+ self.roll_result.setSuffix(" °")
92
+ results_layout.addRow("Roll:", self.roll_result)
93
+
94
+ self.pitch_result = QDoubleSpinBox()
95
+ self.pitch_result.setRange(-180, 180)
96
+ self.pitch_result.setDecimals(4)
97
+ self.pitch_result.setReadOnly(True)
98
+ self.pitch_result.setSuffix(" °")
99
+ results_layout.addRow("Pitch:", self.pitch_result)
100
+
101
+ self.yaw_result = QDoubleSpinBox()
102
+ self.yaw_result.setRange(-180, 180)
103
+ self.yaw_result.setDecimals(4)
104
+ self.yaw_result.setReadOnly(True)
105
+ self.yaw_result.setSuffix(" °")
106
+ results_layout.addRow("Yaw:", self.yaw_result)
107
+
108
+ self.error_label = QLabel("Residual Error: --")
109
+ results_layout.addRow(self.error_label)
110
+
111
+ self.results_group.setVisible(False)
112
+ layout.addWidget(self.results_group)
113
+
114
+ # Action buttons
115
+ button_layout = QHBoxLayout()
116
+
117
+ self.calculate_btn = QPushButton("Calculate Orientation")
118
+ self.calculate_btn.clicked.connect(self._calculate_orientation)
119
+ button_layout.addWidget(self.calculate_btn)
120
+
121
+ self.apply_btn = QPushButton("Apply and Close")
122
+ self.apply_btn.clicked.connect(self._apply_and_close)
123
+ self.apply_btn.setEnabled(False)
124
+ button_layout.addWidget(self.apply_btn)
125
+
126
+ cancel_btn = QPushButton("Cancel")
127
+ cancel_btn.clicked.connect(self.reject)
128
+ button_layout.addWidget(cancel_btn)
129
+
130
+ layout.addLayout(button_layout)
131
+
132
+ def _add_row(self):
133
+ """Add a new empty row to the table."""
134
+ row = self.table.rowCount()
135
+ self.table.insertRow(row)
136
+
137
+ # Set default values (H, K, L, energy, tth, theta, phi, chi)
138
+ defaults = [0.0, 0.0, 0.0, 2200.0, 90.0, 45.0, 0.0, 0.0]
139
+ for col, default in enumerate(defaults):
140
+ item = QTableWidgetItem(str(default))
141
+ item.setTextAlignment(Qt.AlignCenter)
142
+ self.table.setItem(row, col, item)
143
+
144
+ def _remove_selected_row(self):
145
+ """Remove the currently selected row."""
146
+ current_row = self.table.currentRow()
147
+ if current_row >= 0:
148
+ self.table.removeRow(current_row)
149
+ elif self.table.rowCount() > 0:
150
+ # If no row selected, remove the last row
151
+ self.table.removeRow(self.table.rowCount() - 1)
152
+
153
+ def _get_diffraction_tests(self) -> list:
154
+ """Extract diffraction test data from the table.
155
+
156
+ Returns:
157
+ List of dictionaries containing test data, or None if validation fails.
158
+ """
159
+ tests = []
160
+ for row in range(self.table.rowCount()):
161
+ try:
162
+ test = {
163
+ "H": float(self.table.item(row, 0).text()),
164
+ "K": float(self.table.item(row, 1).text()),
165
+ "L": float(self.table.item(row, 2).text()),
166
+ "energy": float(self.table.item(row, 3).text()),
167
+ "tth": float(self.table.item(row, 4).text()),
168
+ "theta": float(self.table.item(row, 5).text()),
169
+ "phi": float(self.table.item(row, 6).text()),
170
+ "chi": float(self.table.item(row, 7).text()),
171
+ }
172
+ tests.append(test)
173
+ except (ValueError, AttributeError) as e:
174
+ QMessageBox.warning(
175
+ self,
176
+ "Invalid Input",
177
+ f"Row {row + 1} contains invalid data. Please enter numeric values.\n\nError: {e}",
178
+ )
179
+ return None
180
+
181
+ if not tests:
182
+ QMessageBox.warning(
183
+ self,
184
+ "No Data",
185
+ "Please enter at least one diffraction test.",
186
+ )
187
+ return None
188
+
189
+ return tests
190
+
191
+ def _calculate_orientation(self):
192
+ """Calculate the optimal orientation from the entered data."""
193
+ tests = self._get_diffraction_tests()
194
+ if tests is None:
195
+ return
196
+
197
+ # Run the fitting algorithm
198
+ result = fit_orientation_from_diffraction_tests(
199
+ self.lattice_params, tests
200
+ )
201
+
202
+ if not result["success"]:
203
+ QMessageBox.warning(
204
+ self,
205
+ "Calculation Failed",
206
+ f"Failed to calculate orientation:\n\n{result.get('message', 'Unknown error')}",
207
+ )
208
+ return
209
+
210
+ # Display results (overwrites any previous results)
211
+ self.roll_result.setValue(result["roll"])
212
+ self.pitch_result.setValue(result["pitch"])
213
+ self.yaw_result.setValue(result["yaw"])
214
+ self.error_label.setText(f"Residual Error: {result['residual_error']:.6f}")
215
+
216
+ # Update group title to indicate results are current
217
+ self.results_group.setTitle("Calculated Orientation (Updated)")
218
+ self.results_group.setVisible(True)
219
+ self.apply_btn.setEnabled(True)
220
+
221
+ # Store result for later retrieval
222
+ self.result = {
223
+ "roll": result["roll"],
224
+ "pitch": result["pitch"],
225
+ "yaw": result["yaw"],
226
+ }
227
+
228
+ # Show detailed errors if available
229
+ if result.get("individual_errors"):
230
+ error_text = "Individual test errors:\n"
231
+ for i, err in enumerate(result["individual_errors"]):
232
+ error_text += (
233
+ f" Test {i+1}: ΔH={err['H_error']:.4f}, "
234
+ f"ΔK={err['K_error']:.4f}, ΔL={err['L_error']:.4f}\n"
235
+ )
236
+ QMessageBox.information(
237
+ self,
238
+ "Calculation Complete",
239
+ f"Orientation calculated successfully!\n\n"
240
+ f"Roll: {result['roll']:.4f}°\n"
241
+ f"Pitch: {result['pitch']:.4f}°\n"
242
+ f"Yaw: {result['yaw']:.4f}°\n\n"
243
+ f"Residual Error: {result['residual_error']:.6f}\n\n"
244
+ f"{error_text}",
245
+ )
246
+
247
+ def _apply_and_close(self):
248
+ """Apply the calculated orientation and close the dialog."""
249
+ if self.result is not None:
250
+ self.accept()
251
+ else:
252
+ QMessageBox.warning(
253
+ self,
254
+ "No Result",
255
+ "Please calculate the orientation first.",
256
+ )
257
+
258
+ def get_result(self) -> dict:
259
+ """Get the calculated orientation.
260
+
261
+ Returns:
262
+ Dictionary with roll, pitch, yaw values, or None if not calculated.
263
+ """
264
+ return self.result
advisor/ui/init_window.py CHANGED
@@ -19,6 +19,7 @@ from PyQt5.QtGui import QDragEnterEvent, QDropEvent
19
19
  from advisor.domain import UnitConverter
20
20
  from advisor.ui.utils import readcif
21
21
  from advisor.ui.visualizers import CoordinateVisualizer, UnitcellVisualizer
22
+ from advisor.ui.dialogs import DiffractionTestDialog
22
23
 
23
24
 
24
25
  class DragDropLineEdit(QLineEdit):
@@ -219,6 +220,14 @@ class InitWindow(QWidget):
219
220
  self.yaw_input.valueChanged.connect(self.update_visualization)
220
221
  euler_layout.addRow("Yaw:", self.yaw_input)
221
222
 
223
+ # Add "Import from Diffraction Test" button
224
+ self.import_orientation_btn = QPushButton("Import from Diffraction Test")
225
+ self.import_orientation_btn.setToolTip(
226
+ "Calculate Euler angles from known diffraction measurements"
227
+ )
228
+ self.import_orientation_btn.clicked.connect(self.open_diffraction_test_dialog)
229
+ euler_layout.addRow(self.import_orientation_btn)
230
+
222
231
  # Add euler group to main layout at (0,2)
223
232
  layout.addWidget(euler_group, 0, 2)
224
233
 
@@ -283,6 +292,30 @@ class InitWindow(QWidget):
283
292
  self.file_path_input.setText(file_path)
284
293
  # on_cif_file_changed will be triggered by textChanged
285
294
 
295
+ @pyqtSlot()
296
+ def open_diffraction_test_dialog(self):
297
+ """Open the diffraction test dialog to import orientation from measurements."""
298
+ # Gather current lattice parameters
299
+ lattice_params = {
300
+ "a": self.a_input.value(),
301
+ "b": self.b_input.value(),
302
+ "c": self.c_input.value(),
303
+ "alpha": self.alpha_input.value(),
304
+ "beta": self.beta_input.value(),
305
+ "gamma": self.gamma_input.value(),
306
+ }
307
+
308
+ # Open the dialog
309
+ dialog = DiffractionTestDialog(lattice_params, self)
310
+ if dialog.exec_() == DiffractionTestDialog.Accepted:
311
+ result = dialog.get_result()
312
+ if result is not None:
313
+ # Apply the calculated Euler angles
314
+ self.roll_input.setValue(result["roll"])
315
+ self.pitch_input.setValue(result["pitch"])
316
+ self.yaw_input.setValue(result["yaw"])
317
+ # update_visualization will be triggered by valueChanged signals
318
+
286
319
  def set_lattice_inputs_enabled(self, enabled: bool):
287
320
  """Enable/disable lattice parameter inputs (a,b,c,alpha,beta,gamma)."""
288
321
  self.a_input.setEnabled(enabled)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: advisor-scattering
3
- Version: 0.5.2
3
+ Version: 0.9.1
4
4
  Summary: Advisor-Scattering: Advanced Visual X-ray Scattering Toolkit for Reciprocal-space visualization and calculation
5
5
  Author: Xunyang Hong
6
6
  License: MIT
@@ -42,25 +42,17 @@ or use the link below to view the demo video.
42
42
  ## Install
43
43
  - Python 3.8+ with PyQt5, numpy, scipy, matplotlib, Dans_Diffraction (see `requirements.txt`).
44
44
 
45
- From PyPI:
45
+ It is recommened to install from PyPI:
46
46
  ```bash
47
47
  pip install advisor-scattering
48
48
  ```
49
49
 
50
- From source:
51
- ```bash
52
- python -m venv .venv
53
- source .venv/bin/activate # .venv\Scripts\activate on Windows
54
- pip install -r requirements.txt
55
- pip install .
56
- ```
57
-
58
50
  ## Run
59
51
  ```bash
60
- advisor-scattering
61
- # or
62
52
  advisor
63
53
  # or
54
+ advisor-scattering
55
+ # or
64
56
  python -m advisor
65
57
  ```
66
58
 
@@ -2,28 +2,30 @@ advisor/__init__.py,sha256=9gmF8qfMHMVLbmvWW_20KkHU5zOCwUmmFHtju21klPQ,103
2
2
  advisor/__main__.py,sha256=FueZKRQwCGBKNtk4W_Z9yYpsI0YB5WiVREWyZXmSl8A,124
3
3
  advisor/app.py,sha256=52DxOOlZV_NHUzsnuYCCo_cI48D2THKE1m0-1ZVoNvE,1165
4
4
  advisor/controllers/__init__.py,sha256=DEzJDUTJcRrbe7ZYnYsQQ3NvnyayNwTafcQmY7aRtrw,198
5
- advisor/controllers/app_controller.py,sha256=cl7sKgfyz9J2o7RLgP18mExNjU_FDK5rUPrdmI15b1g,2344
5
+ advisor/controllers/app_controller.py,sha256=CGqlhez9467JMZZeMbnbF-HwqwCayoYIfajy4vRBZtE,2433
6
6
  advisor/controllers/feature_controller.py,sha256=6_XOck8ipQxbef24y16tCE08q7OUT0gs285d5tF5XRs,642
7
- advisor/domain/__init__.py,sha256=Lkpnerzg6qHzk-u4jOAU1rg6rYY4iIorIECdOTPd2DY,536
7
+ advisor/domain/__init__.py,sha256=SuMfLp1CJFqrpBE6UeyVe9BWdjbBlcwuHRTBN-UsOzg,733
8
8
  advisor/domain/geometry.py,sha256=E8YmecQpBh7PQeJIamOlPo2aBgJSbhyBlrYS02uxFMg,6856
9
+ advisor/domain/orientation.py,sha256=PDPxosByY_Yo7FePUAZLsrN1OcH4_kUiF8TwC5jFGL8,7649
10
+ advisor/domain/orientation_calculator.py,sha256=5AKd5OqsQWTKgB3kv83aM7eLq9TEAlPXJ-C79X65dV8,5872
9
11
  advisor/domain/unit_converter.py,sha256=D20FvdV7_ilAX7KDPxQ1GDCA6IxdjjcQ2QBiahb3lLI,2085
10
12
  advisor/domain/core/__init__.py,sha256=UPDQYo7-5f9Ghx3p6qlwljTLhHsxlGmEl_MvdaHM2Jg,173
11
- advisor/domain/core/lab.py,sha256=pLA5DhG_LMbJhbEABN53BU0FdTUAZbA38jiPjXzd29g,4871
12
- advisor/domain/core/lattice.py,sha256=UXxkZG6iHGLXwHPEH6VQLXAg274rD3BTpq4ObDIOxIg,2728
13
- advisor/domain/core/sample.py,sha256=iMPvQprPGllp6WfwnsESzNode4tujYNbVHhcNL6Uhuk,4105
14
- advisor/features/__init__.py,sha256=wQYN67pLXVgxmsoG70WJ51BnE9ACUgbpx-G740KHsEA,272
13
+ advisor/domain/core/lab.py,sha256=_IbRVbPvffkM73f41uJ3R43ZeZ6LOxNOrywWz_DDT_8,5129
14
+ advisor/domain/core/lattice.py,sha256=339_veWj1KFTAwuH37-vx5a9wjUfQzJI6MoSxMm8tX8,2757
15
+ advisor/domain/core/sample.py,sha256=zz0qMlpeGHEXmmkoY1GtOBI5-uK4hhOVeLjuje6-Osc,4278
16
+ advisor/features/__init__.py,sha256=Arhqas6uY2uJp58ttNEVap9gRYE0uOVw1dA6gtB9544,330
15
17
  advisor/features/scattering_geometry/controllers/__init__.py,sha256=2V9KZMlxjHpsBIdkphveylQgL9z6BV09DaufqQcLX_Y,169
16
18
  advisor/features/scattering_geometry/controllers/scattering_geometry_controller.py,sha256=QGcm5_y8EPNYUF_FM9xViVzPJs6qh1dB_OA3fjoKAEg,1076
17
19
  advisor/features/scattering_geometry/domain/__init__.py,sha256=BsK0j9-RJiK0-g0qB3DH8qoSqlEZNAPBQb7eXYrg0oU,142
18
- advisor/features/scattering_geometry/domain/brillouin_calculator.py,sha256=zkLtk1aBEbj_SMFb9Zs4gy3-rkB0D1zjhLf9rs9NinY,12760
19
- advisor/features/scattering_geometry/domain/core.py,sha256=iRVzEDgwbGJ2TeQAV_p_tM3E8ftlo7N-NK1u1c4zfVM,18647
20
+ advisor/features/scattering_geometry/domain/brillouin_calculator.py,sha256=pMpjq5HbutFzWubo-x7goOY2N_7OjqALYZN8zGQkfsQ,16044
21
+ advisor/features/scattering_geometry/domain/core.py,sha256=2JdHNjdl_GnyhOr0iGRMgTK1JlYFg6WA0uWe0mYUgyY,20149
20
22
  advisor/features/scattering_geometry/ui/__init__.py,sha256=9Lm-sc1Q3KeQ-0kKJneD10MWuqyDgh29QDAVdHghh1Q,154
21
- advisor/features/scattering_geometry/ui/scattering_geometry_tab.py,sha256=Ya0ad12y6aZi3YdA6JRI9zjajEi5t2yhXQZP9LS3H3E,28020
23
+ advisor/features/scattering_geometry/ui/scattering_geometry_tab.py,sha256=GHczdi74GxCxo3svF7oBdXrbTilLZ4ODkTuatJrfTkE,29448
22
24
  advisor/features/scattering_geometry/ui/components/__init__.py,sha256=OsX27CeUv5gznYXmkZWqeXwcskf4DmxOH6xJ0-cUwDg,358
23
25
  advisor/features/scattering_geometry/ui/components/angles_to_hkl_components.py,sha256=l6kPM7b95nvNsp1Eg0kmWIfFPTtmuGQyDol_mnx7lOs,4889
24
- advisor/features/scattering_geometry/ui/components/hk_angles_components.py,sha256=xq7rthCPYgHG6vvz8GziD6e8Q18XURaAktAni0CdC74,15751
25
- advisor/features/scattering_geometry/ui/components/hkl_scan_components.py,sha256=GU8vgGgy5sAuG15ohLrqQJXEjYDRe8Zfxwb3NEEqT90,19119
26
- advisor/features/scattering_geometry/ui/components/hkl_to_angles_components.py,sha256=rIh9-4zgidVlvvddF_fzBNlksKMRrsDva9UijkUvXJs,11101
26
+ advisor/features/scattering_geometry/ui/components/hk_angles_components.py,sha256=ZkzRASVeII5dF5_WfwmVBrRwYWTCDNvE05VNa6idxGo,20538
27
+ advisor/features/scattering_geometry/ui/components/hkl_scan_components.py,sha256=JLzbkK1zM8CZm2WZvDyRg-Twwmt46KNKGr1DG7MPfXs,20522
28
+ advisor/features/scattering_geometry/ui/components/hkl_to_angles_components.py,sha256=0J-CXiBCTOoLjFK5-PgY0PjZSG1aU7sYrE-MilJSAEA,15834
27
29
  advisor/features/structure_factor/controllers/__init__.py,sha256=aGyA8cXJ64HfULWo6_6D4azt4Hs8qJ6wH_OW6BClv9Y,158
28
30
  advisor/features/structure_factor/controllers/structure_factor_controller.py,sha256=4PBHg8lPXcQA7Tpocu3A3GzGQP2IZP8CNPH6PILHyWw,975
29
31
  advisor/features/structure_factor/domain/__init__.py,sha256=lNxY4RcTYCSboXpAWJfib29WqYg6o4jesbNk-Z279rU,159
@@ -49,10 +51,12 @@ advisor/resources/icons/sf_calculator.jpg,sha256=W7e89x2K6np5l200hklRfdh0pkA3SGz
49
51
  advisor/resources/icons/sf_calculator.png,sha256=ArnSfIQo8Gc8uWQhpG7DTCBNFcuVGXDIiQ7Yb-x9D_M,44466
50
52
  advisor/resources/qss/styles.qss,sha256=R29qftSIvN0AI1UVsLSsHcUImIYGnbbuF_1LvViF3mg,8070
51
53
  advisor/ui/__init__.py,sha256=isDNFKHsZq1s8Och-5tHcFC5FAJA653x4r5DYGsVowU,202
52
- advisor/ui/init_window.py,sha256=pOxGUfKcObnQKcGDKtEbBmQ18yOOfwEY1SxhHO3DRqs,22273
54
+ advisor/ui/init_window.py,sha256=dQTTLNNiBVyDtSKqFOPicg3Su75ikfCKBB8Avy6_6_4,23751
53
55
  advisor/ui/main_window.py,sha256=I5vCpPPQCwaSag538YPQC_bgarVJGQ1ryuxjWxuMP-0,6170
54
56
  advisor/ui/tab_interface.py,sha256=8okMV0NurIyEGxRf-YXHrjftzWyMzXcea3cdt3i1FtE,1180
55
57
  advisor/ui/tips.py,sha256=5iP28xJvKBkdgvo3eDD2kzV52FEeT_Sd8ivtWlhi0Xs,742
58
+ advisor/ui/dialogs/__init__.py,sha256=yFeoZOe0euOXeie-fqwJquZ9Vhl8mtszIWg1aunawXI,197
59
+ advisor/ui/dialogs/diffraction_test_dialog.py,sha256=33MZCYlSn0ZhSp-Q5Cj1n0xbgbtSJugCD-KaiZCmxcY,9608
56
60
  advisor/ui/utils/__init__.py,sha256=U_IwI_KEtmKLMKw6e2ko7GkUa50-PvkeMFS_6QfHoyg,84
57
61
  advisor/ui/utils/readcif.py,sha256=tRuz1WSBr8XWkgf6VUOlS5aTf2LYDi8CY4peJ1_0bjI,4554
58
62
  advisor/ui/visualizers/HKLScan2DVisualizer.py,sha256=Q8_MWKiyzrFk4-3S50Ro7_4I_ERbSagG52686lPSuFo,8706
@@ -62,8 +66,8 @@ advisor/ui/visualizers/scattering_visualizer.py,sha256=iyjTgy1WbqI7G0BpiJ59CKFCI
62
66
  advisor/ui/visualizers/structure_factor_visualizer.py,sha256=Rt9ui7Qv4vvDCWiuIngoYzHJlFVef8M_h3BBRcmuFTc,15866
63
67
  advisor/ui/visualizers/structure_factor_visualizer_2d.py,sha256=xA1hrp7pKIfgD1G_Pt-uemHggmKf-7QC94dS-GasZI4,8119
64
68
  advisor/ui/visualizers/unitcell_visualizer.py,sha256=gwpMkU1YIu-8zkKVu5bHpyu_iLbzYEYTbVArchNMLOI,21384
65
- advisor_scattering-0.5.2.dist-info/METADATA,sha256=0-JbQeeYH27llKjMRSoDGo4Hhs6jQ6ubMPFpiuNd3Q8,4786
66
- advisor_scattering-0.5.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
67
- advisor_scattering-0.5.2.dist-info/entry_points.txt,sha256=b__0W6TTAPUTc0UIUyHdxvxtsVz025Y-QNrMKzt8b9o,83
68
- advisor_scattering-0.5.2.dist-info/top_level.txt,sha256=4YoJT7oclQ2yU-4KY0AB36cfAZG9yAI1tJNHrxEioMA,8
69
- advisor_scattering-0.5.2.dist-info/RECORD,,
69
+ advisor_scattering-0.9.1.dist-info/METADATA,sha256=rg86280T-GTYofxoa9BMwSJcNEcP_Rmf8JoHECbDP60,4658
70
+ advisor_scattering-0.9.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
71
+ advisor_scattering-0.9.1.dist-info/entry_points.txt,sha256=b__0W6TTAPUTc0UIUyHdxvxtsVz025Y-QNrMKzt8b9o,83
72
+ advisor_scattering-0.9.1.dist-info/top_level.txt,sha256=4YoJT7oclQ2yU-4KY0AB36cfAZG9yAI1tJNHrxEioMA,8
73
+ advisor_scattering-0.9.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5