spiceitup 1.3.4__tar.gz → 2.0.0__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 (184) hide show
  1. {spiceitup-1.3.4/spiceitup.egg-info → spiceitup-2.0.0}/PKG-INFO +7 -10
  2. {spiceitup-1.3.4 → spiceitup-2.0.0}/README.md +5 -3
  3. {spiceitup-1.3.4 → spiceitup-2.0.0}/pyproject.toml +0 -0
  4. {spiceitup-1.3.4 → spiceitup-2.0.0}/setup.py +3 -19
  5. spiceitup-2.0.0/spiceitup/__main__.py +6 -0
  6. spiceitup-1.3.4/spiceitup/__main__.py → spiceitup-2.0.0/spiceitup/main_call.py +11 -9
  7. {spiceitup-1.3.4 → spiceitup-2.0.0}/spiceitup/run.py +43 -33
  8. {spiceitup-1.3.4 → spiceitup-2.0.0/spiceitup.egg-info}/PKG-INFO +7 -10
  9. spiceitup-2.0.0/spiceitup.egg-info/SOURCES.txt +12 -0
  10. spiceitup-2.0.0/spiceitup.egg-info/requires.txt +1 -0
  11. spiceitup-1.3.4/MANIFEST.in +0 -1
  12. spiceitup-1.3.4/spiceitup/__init__.py +0 -0
  13. spiceitup-1.3.4/spiceitup/__pycache__/__main__.cpython-313.pyc +0 -0
  14. spiceitup-1.3.4/spiceitup/__pycache__/run.cpython-313.pyc +0 -0
  15. spiceitup-1.3.4/spiceitup/debug.log +0 -19
  16. spiceitup-1.3.4/spiceitup/docs/Qt_cursors.png +0 -0
  17. spiceitup-1.3.4/spiceitup/docs/__init__.py +0 -0
  18. spiceitup-1.3.4/spiceitup/docs/code_conventions.txt +0 -38
  19. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2023_06_13.md +0 -112
  20. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2023_07_07.md +0 -111
  21. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2023_09_26.md +0 -109
  22. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2023_11_28.md +0 -114
  23. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2024_06_26.md +0 -110
  24. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2024_07_12.md +0 -110
  25. spiceitup-1.3.4/spiceitup/docs/codimd_backup/2024_08_29_TBC.md +0 -121
  26. spiceitup-1.3.4/spiceitup/docs/layout.drawio +0 -1
  27. spiceitup-1.3.4/spiceitup/docs/layout.png +0 -0
  28. spiceitup-1.3.4/spiceitup/docs/menu_layout.ods +0 -0
  29. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20240912.xlsx +0 -0
  30. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241002.xlsx +0 -0
  31. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241007.xlsx +0 -0
  32. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241021.xlsx +0 -0
  33. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241102.xlsx +0 -0
  34. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241118.xlsx +0 -0
  35. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241129.xlsx +0 -0
  36. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20241209.xlsx +0 -0
  37. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20250120.xlsx +0 -0
  38. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20250123.xlsx +0 -0
  39. spiceitup-1.3.4/spiceitup/docs/microsoft365_backup/SPICE_Quicklook_Tasks_20250217.xlsx +0 -0
  40. spiceitup-1.3.4/spiceitup/docs/plots_layout.ods +0 -0
  41. spiceitup-1.3.4/spiceitup/docs/user_manual/fit_maps.png +0 -0
  42. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/1.png +0 -0
  43. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/2.png +0 -0
  44. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/3.png +0 -0
  45. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/4.png +0 -0
  46. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/5.png +0 -0
  47. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/6.png +0 -0
  48. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/7.png +0 -0
  49. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/8.png +0 -0
  50. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/9.png +0 -0
  51. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/Screenshot 2025-02-13 115310.png +0 -0
  52. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/fit_maps.png +0 -0
  53. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/footer.png +0 -0
  54. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/full.png +0 -0
  55. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/full.xcf +0 -0
  56. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/lambda.png +0 -0
  57. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/left_menu.png +0 -0
  58. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/3D_1.png +0 -0
  59. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/3D_2.png +0 -0
  60. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/footer.png +0 -0
  61. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/lambda.png +0 -0
  62. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/lambda_y.png +0 -0
  63. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/left_menu.png +0 -0
  64. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/ppt1.png +0 -0
  65. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/profile.png +0 -0
  66. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/red_bars.png +0 -0
  67. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/x.png +0 -0
  68. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/x_y.png +0 -0
  69. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1/y.png +0 -0
  70. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt1.pdf +0 -0
  71. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/ppt_screenshots.pptx +0 -0
  72. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/several_x_y.png +0 -0
  73. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/x.png +0 -0
  74. spiceitup-1.3.4/spiceitup/docs/user_manual/screenshot_2025/y.png +0 -0
  75. spiceitup-1.3.4/spiceitup/docs/user_manual/several_x_y.png +0 -0
  76. spiceitup-1.3.4/spiceitup/docs/user_manual/user_documentation.docx +0 -0
  77. spiceitup-1.3.4/spiceitup/docs/user_manual/user_documentation.pdf +0 -0
  78. spiceitup-1.3.4/spiceitup/docs/user_manual/user_manual.pptx +0 -0
  79. spiceitup-1.3.4/spiceitup/docs/user_manual/~$er_documentation.docx +0 -0
  80. spiceitup-1.3.4/spiceitup/docs/windows_installation.pdf +0 -0
  81. spiceitup-1.3.4/spiceitup/images/__init__.py +0 -0
  82. spiceitup-1.3.4/spiceitup/images/icon.png +0 -0
  83. spiceitup-1.3.4/spiceitup/images/info.png +0 -0
  84. spiceitup-1.3.4/spiceitup/images/info2.png +0 -0
  85. spiceitup-1.3.4/spiceitup/images/info_old.png +0 -0
  86. spiceitup-1.3.4/spiceitup/layout/__init__.py +0 -0
  87. spiceitup-1.3.4/spiceitup/layout/__pycache__/flow_layout.cpython-313.pyc +0 -0
  88. spiceitup-1.3.4/spiceitup/layout/flow_layout.py +0 -91
  89. spiceitup-1.3.4/spiceitup/layout/flow_layout_edited.py +0 -98
  90. spiceitup-1.3.4/spiceitup/layout/flow_layout_old.py +0 -96
  91. spiceitup-1.3.4/spiceitup/logs/__init__.py +0 -0
  92. spiceitup-1.3.4/spiceitup/logs/__pycache__/log.cpython-313.pyc +0 -0
  93. spiceitup-1.3.4/spiceitup/logs/log.py +0 -41
  94. spiceitup-1.3.4/spiceitup/logs/show_debug_console.sh +0 -5
  95. spiceitup-1.3.4/spiceitup/main/__init__.py +0 -0
  96. spiceitup-1.3.4/spiceitup/main/__pycache__/footer.cpython-313.pyc +0 -0
  97. spiceitup-1.3.4/spiceitup/main/__pycache__/header.cpython-313.pyc +0 -0
  98. spiceitup-1.3.4/spiceitup/main/__pycache__/menu.cpython-313.pyc +0 -0
  99. spiceitup-1.3.4/spiceitup/main/__pycache__/menu_bar.cpython-313.pyc +0 -0
  100. spiceitup-1.3.4/spiceitup/main/__pycache__/w.cpython-313.pyc +0 -0
  101. spiceitup-1.3.4/spiceitup/main/__pycache__/winc.cpython-313.pyc +0 -0
  102. spiceitup-1.3.4/spiceitup/main/footer.py +0 -229
  103. spiceitup-1.3.4/spiceitup/main/header.py +0 -153
  104. spiceitup-1.3.4/spiceitup/main/menu.py +0 -624
  105. spiceitup-1.3.4/spiceitup/main/menu_bar.py +0 -183
  106. spiceitup-1.3.4/spiceitup/main/w.py +0 -28
  107. spiceitup-1.3.4/spiceitup/main/winc.py +0 -508
  108. spiceitup-1.3.4/spiceitup/plot/__init__.py +0 -0
  109. spiceitup-1.3.4/spiceitup/plot/__pycache__/plot_line.cpython-313.pyc +0 -0
  110. spiceitup-1.3.4/spiceitup/plot/__pycache__/plot_map.cpython-313.pyc +0 -0
  111. spiceitup-1.3.4/spiceitup/plot/plot_line.py +0 -182
  112. spiceitup-1.3.4/spiceitup/plot/plot_map.py +0 -537
  113. spiceitup-1.3.4/spiceitup/pres_notes.txt +0 -4
  114. spiceitup-1.3.4/spiceitup/processing/__init__.py +0 -0
  115. spiceitup-1.3.4/spiceitup/processing/__pycache__/dh.cpython-313.pyc +0 -0
  116. spiceitup-1.3.4/spiceitup/processing/__pycache__/fit.cpython-313.pyc +0 -0
  117. spiceitup-1.3.4/spiceitup/processing/dh.py +0 -376
  118. spiceitup-1.3.4/spiceitup/processing/fit.py +0 -55
  119. spiceitup-1.3.4/spiceitup/processing/threads/__init__.py +0 -0
  120. spiceitup-1.3.4/spiceitup/processing/threads/__pycache__/run_thread.cpython-313.pyc +0 -0
  121. spiceitup-1.3.4/spiceitup/processing/threads/__pycache__/thread_worker.cpython-313.pyc +0 -0
  122. spiceitup-1.3.4/spiceitup/processing/threads/run_thread.py +0 -137
  123. spiceitup-1.3.4/spiceitup/processing/threads/thread_worker.py +0 -20
  124. spiceitup-1.3.4/spiceitup/processing/threads/workers/__init__.py +0 -0
  125. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/compute_average.cpython-313.pyc +0 -0
  126. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/generate_fit_maps.cpython-313.pyc +0 -0
  127. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/load_plot_map.cpython-313.pyc +0 -0
  128. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/make_process_available.cpython-313.pyc +0 -0
  129. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/out_of_sync.cpython-313.pyc +0 -0
  130. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/update_levels.cpython-313.pyc +0 -0
  131. spiceitup-1.3.4/spiceitup/processing/threads/workers/__pycache__/update_profile.cpython-313.pyc +0 -0
  132. spiceitup-1.3.4/spiceitup/processing/threads/workers/compute_average.py +0 -34
  133. spiceitup-1.3.4/spiceitup/processing/threads/workers/generate_fit_maps.py +0 -65
  134. spiceitup-1.3.4/spiceitup/processing/threads/workers/how_to_add_a_worker.txt +0 -26
  135. spiceitup-1.3.4/spiceitup/processing/threads/workers/load_plot_map.py +0 -21
  136. spiceitup-1.3.4/spiceitup/processing/threads/workers/make_process_available.py +0 -17
  137. spiceitup-1.3.4/spiceitup/processing/threads/workers/out_of_sync.py +0 -30
  138. spiceitup-1.3.4/spiceitup/processing/threads/workers/update_levels.py +0 -37
  139. spiceitup-1.3.4/spiceitup/processing/threads/workers/update_profile.py +0 -77
  140. spiceitup-1.3.4/spiceitup/settings/__init__.py +0 -0
  141. spiceitup-1.3.4/spiceitup/settings/__pycache__/const.cpython-313.pyc +0 -0
  142. spiceitup-1.3.4/spiceitup/settings/const.py +0 -134
  143. spiceitup-1.3.4/spiceitup/settings/recent_files.txt +0 -10
  144. spiceitup-1.3.4/spiceitup/settings/states/.gitkeep +0 -0
  145. spiceitup-1.3.4/spiceitup/settings/states/__init__.py +0 -0
  146. spiceitup-1.3.4/spiceitup/settings/states/test.json +0 -1
  147. spiceitup-1.3.4/spiceitup/settings/states/test2.json +0 -1
  148. spiceitup-1.3.4/spiceitup/settings/states/test3.json +0 -1
  149. spiceitup-1.3.4/spiceitup/settings/states/weird_state.json +0 -1
  150. spiceitup-1.3.4/spiceitup/style/__init__.py +0 -0
  151. spiceitup-1.3.4/spiceitup/style/style.css +0 -32
  152. spiceitup-1.3.4/spiceitup/style/style_debug.css +0 -13
  153. spiceitup-1.3.4/spiceitup/toolbox/__init__.py +0 -0
  154. spiceitup-1.3.4/spiceitup/toolbox/__pycache__/binning.cpython-313.pyc +0 -0
  155. spiceitup-1.3.4/spiceitup/toolbox/__pycache__/clickable_qlabel.cpython-313.pyc +0 -0
  156. spiceitup-1.3.4/spiceitup/toolbox/binning.py +0 -60
  157. spiceitup-1.3.4/spiceitup/toolbox/clickable_qlabel.py +0 -9
  158. spiceitup-1.3.4/spiceitup/toolbox/filter2D_tests.py +0 -27
  159. spiceitup-1.3.4/spiceitup/toolbox/icones_claude.png +0 -0
  160. spiceitup-1.3.4/spiceitup/toolbox/icons.png +0 -0
  161. spiceitup-1.3.4/spiceitup/toolbox/images/__init__.py +0 -0
  162. spiceitup-1.3.4/spiceitup/toolbox/images/map_x_y.png +0 -0
  163. spiceitup-1.3.4/spiceitup/toolbox/images/test.jpg +0 -0
  164. spiceitup-1.3.4/spiceitup/toolbox/level_methods.py +0 -23
  165. spiceitup-1.3.4/spiceitup/toolbox/multithreading.py +0 -22
  166. spiceitup-1.3.4/spiceitup/toolbox/pyqtgraph_examples.py +0 -10
  167. spiceitup-1.3.4/spiceitup/toolbox/pyqtgraph_plot_example.py +0 -104
  168. spiceitup-1.3.4/spiceitup/toolbox/scipy_fit.py +0 -29
  169. spiceitup-1.3.4/spiceitup/toolbox/scipy_fit_gaussian.py +0 -39
  170. spiceitup-1.3.4/spiceitup/toolbox/show_icons.py +0 -29
  171. spiceitup-1.3.4/spiceitup/toolbox/signal_thread_ex.py +0 -16
  172. spiceitup-1.3.4/spiceitup/toolbox/small_pyqtgraph.py +0 -91
  173. spiceitup-1.3.4/spiceitup/toolbox/small_pyqtgraph2.py +0 -94
  174. spiceitup-1.3.4/spiceitup/toolbox/test.py +0 -63
  175. spiceitup-1.3.4/spiceitup/utils/__init__.py +0 -0
  176. spiceitup-1.3.4/spiceitup/utils/__pycache__/internal_utils.cpython-313.pyc +0 -0
  177. spiceitup-1.3.4/spiceitup/utils/internal_utils.py +0 -188
  178. spiceitup-1.3.4/spiceitup/utils/special_chars.py +0 -5
  179. spiceitup-1.3.4/spiceitup.egg-info/SOURCES.txt +0 -179
  180. spiceitup-1.3.4/spiceitup.egg-info/requires.txt +0 -6
  181. {spiceitup-1.3.4 → spiceitup-2.0.0}/setup.cfg +0 -0
  182. {spiceitup-1.3.4 → spiceitup-2.0.0}/spiceitup.egg-info/dependency_links.txt +0 -0
  183. {spiceitup-1.3.4 → spiceitup-2.0.0}/spiceitup.egg-info/entry_points.txt +0 -0
  184. {spiceitup-1.3.4 → spiceitup-2.0.0}/spiceitup.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spiceitup
3
- Version: 1.3.4
3
+ Version: 2.0.0
4
4
  Summary: Quicklook tool for level 2 SPICE imaging
5
5
  Home-page: https://git.ias.u-psud.fr/spice/data_quicklook
6
6
  Author: David Picard
@@ -9,12 +9,7 @@ Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Requires-Python: >=3.7
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: PyQt5
13
- Requires-Dist: sunraster
14
- Requires-Dist: pyqtgraph
15
- Requires-Dist: qdarkgraystyle
16
- Requires-Dist: scipy
17
- Requires-Dist: opencv-python-headless
12
+ Requires-Dist: requirements.txt
18
13
  Dynamic: author
19
14
  Dynamic: author-email
20
15
  Dynamic: classifier
@@ -25,7 +20,7 @@ Dynamic: requires-dist
25
20
  Dynamic: requires-python
26
21
  Dynamic: summary
27
22
 
28
- # SPICE data quicklook in PyQt5 / PyQtGraph
23
+ # SPICE data quicklook in PyQt6 / PyQtGraph
29
24
 
30
25
  This graphical user interface (GUI) allows you to have a quick look in the SPICE data (provide level 2 '.fits' files in input). You will be able to navigate dynamically in the data thanks to sliders which update the maps I(x,y) ; I(lambda,y), the curve I(lambda) and more.
31
26
 
@@ -58,7 +53,9 @@ Run with `spiceitup`
58
53
  `pip install numpy --upgrade`
59
54
 
60
55
  #### B.2) Run the app
61
- `python3 spiceitup/main.py` or use an IDE like pycharm (which will install the requirements automatically), open this folder as a project and run `run.py`
56
+ `cd spiceitup`
57
+ `python3 run.py`
58
+ or use an IDE like pycharm (which will install the requirements automatically), open this folder as a project and run `run.py`
62
59
 
63
60
  #### B.3) Troubleshooting
64
61
  Error known:
@@ -68,7 +65,7 @@ In this case, try to do: `sudo apt-get install --reinstall libxcb-xinerama0`
68
65
 
69
66
  **spiceitup: command not found**
70
67
  In this case check if spiceitup is here: `$(python -m site --user-base)/bin"`
71
- Then add it to $PATH: `export PATH="$PATH:$(python -m site --user-base)/bin"`
68
+ Then add it to \$PATH: `export PATH="$PATH:$(python -m site --user-base)/bin"`
72
69
  Run again `spiceitup`
73
70
 
74
71
  **No module spiceitup**
@@ -1,4 +1,4 @@
1
- # SPICE data quicklook in PyQt5 / PyQtGraph
1
+ # SPICE data quicklook in PyQt6 / PyQtGraph
2
2
 
3
3
  This graphical user interface (GUI) allows you to have a quick look in the SPICE data (provide level 2 '.fits' files in input). You will be able to navigate dynamically in the data thanks to sliders which update the maps I(x,y) ; I(lambda,y), the curve I(lambda) and more.
4
4
 
@@ -31,7 +31,9 @@ Run with `spiceitup`
31
31
  `pip install numpy --upgrade`
32
32
 
33
33
  #### B.2) Run the app
34
- `python3 spiceitup/main.py` or use an IDE like pycharm (which will install the requirements automatically), open this folder as a project and run `run.py`
34
+ `cd spiceitup`
35
+ `python3 run.py`
36
+ or use an IDE like pycharm (which will install the requirements automatically), open this folder as a project and run `run.py`
35
37
 
36
38
  #### B.3) Troubleshooting
37
39
  Error known:
@@ -41,7 +43,7 @@ In this case, try to do: `sudo apt-get install --reinstall libxcb-xinerama0`
41
43
 
42
44
  **spiceitup: command not found**
43
45
  In this case check if spiceitup is here: `$(python -m site --user-base)/bin"`
44
- Then add it to $PATH: `export PATH="$PATH:$(python -m site --user-base)/bin"`
46
+ Then add it to \$PATH: `export PATH="$PATH:$(python -m site --user-base)/bin"`
45
47
  Run again `spiceitup`
46
48
 
47
49
  **No module spiceitup**
File without changes
@@ -3,33 +3,17 @@ import os
3
3
  from importlib_metadata import entry_points
4
4
  from setuptools import setup, find_packages
5
5
 
6
- def load_requirements(filename):
7
- with open('/srv/data_quicklook/' + filename, 'r') as f:
8
- return [
9
- line.strip()
10
- for line in f
11
- if line.strip() and not line.startswith('#')
12
- ]
13
-
14
6
  setup(
15
7
  name='spiceitup',
16
- version='1.3.4',
8
+ version='2.0.0',
17
9
  description='Quicklook tool for level 2 SPICE imaging',
18
10
  long_description=open('README.md').read(),
19
11
  long_description_content_type='text/markdown',
20
12
  author='David Picard',
21
13
  author_email='david.picard@universite-paris-saclay.fr',
22
14
  url='https://git.ias.u-psud.fr/spice/data_quicklook',
23
- packages=find_packages(),
24
- include_package_data=True,
25
- install_requires=[
26
- "PyQt5",
27
- "sunraster",
28
- "pyqtgraph",
29
- "qdarkgraystyle",
30
- "scipy",
31
- "opencv-python-headless"
32
- ],
15
+ packages=['spiceitup'],
16
+ install_requires='requirements.txt',
33
17
  classifiers=[
34
18
  'Programming Language :: Python :: 3',
35
19
  'License :: OSI Approved :: MIT License',
@@ -0,0 +1,6 @@
1
+ # handles call from pip install
2
+
3
+ from main_call import main
4
+
5
+ if __name__ == '__main__':
6
+ main()
@@ -1,12 +1,15 @@
1
1
  import sys
2
2
  import warnings
3
- import os
4
- from .settings.const import Const
5
- from .run import Main
6
- from PyQt5.QtGui import *
7
- from PyQt5.QtWidgets import *
3
+ from pathlib import Path
4
+
5
+ from run import Main
6
+ from settings.const import Const
7
+ from PyQt6.QtGui import *
8
+ from PyQt6.QtWidgets import *
9
+
8
10
 
9
11
  def main():
12
+ project_path = str(Path(__file__).resolve().parent)
10
13
  warnings.filterwarnings("ignore")
11
14
  # Used to prevent to show All-NaN RuntimeWarning
12
15
  # Slices in the data cube can be filled with NaN
@@ -16,14 +19,13 @@ def main():
16
19
  app = QApplication(sys.argv)
17
20
  else:
18
21
  app = QApplication.instance()
19
-
20
- win = Main()
22
+ win = Main(project_path)
21
23
  win.applyStyle(app)
22
24
  win.resize(Const.window_width, Const.window_height)
23
- win.setWindowIcon(QIcon('images/icon.png'))
25
+ win.setWindowIcon(QIcon(win.project_path + '/images/icon.png'))
24
26
  win.show()
25
27
 
26
28
  sys.exit(app.exec())
27
29
 
28
30
  if __name__ == '__main__':
29
- main()
31
+ print('To run the app, run "python run.py"')
@@ -1,20 +1,24 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ import os
1
4
  import sys
2
5
  import warnings
3
6
 
4
7
  from os import path
5
- from .logs.log import Log
6
- from .plot.plot_map import PlotMap
7
- from .settings.const import *
8
- from .utils.internal_utils import *
9
- from PyQt5.QtGui import *
10
- from PyQt5.QtCore import *
11
- from PyQt5.QtWidgets import *
12
- from .main.footer import Footer
13
- from .main.header import Header
14
- from .main.menu_bar import MenuBar
8
+ from pathlib import Path
9
+
10
+ from logs.log import Log
11
+ from plot.plot_map import PlotMap
12
+ from utils.internal_utils import *
13
+ from PyQt6.QtGui import *
14
+ from PyQt6.QtCore import *
15
+ from PyQt6.QtWidgets import *
16
+ from main.footer import Footer
17
+ from main.header import Header
18
+ from main.menu_bar import MenuBar
15
19
  import qdarkgraystyle
16
- from .main.menu import Menu
17
- from .main.winc import WindowsContainer
20
+ from main.menu import Menu
21
+ from main.winc import WindowsContainer
18
22
 
19
23
  class Main(QMainWindow):
20
24
  windows = [] # list of Window objects, see Window.py
@@ -44,12 +48,13 @@ class Main(QMainWindow):
44
48
  lambda_I_bar_moves = False # avoid recursive behavior when moving I(lambda)'s vertical bar
45
49
  updating_levels = [] # contains RunThread instances related to running levels process
46
50
  lambda_unit = True # Angstrom otherwise cube index
47
- qs_fit_label = {} # {'win_key': {'fit_1': QLabel(), 'fit_2': QLabel(), 'fit_3': QLabel()}, ...}
51
+ qs_fit_label = {} # {'win_key': {'fit_1': QLabel(), 'fit_2': QLabel(), 'fit_3': QLabel()}, ...}
48
52
  nb_available_bin = {} # {'win_key': <nb>} in order to hide fit if nb < 4
49
53
  python_state = None # when not None, a state is being restored
50
54
 
51
- def __init__(self, parent=None):
55
+ def __init__(self, project_path, parent=None):
52
56
  super(QMainWindow, self).__init__(parent)
57
+ self.project_path = project_path
53
58
  Log.p('------------------------- Application was run')
54
59
  self.initialization()
55
60
  central_widget = QFrame()
@@ -64,29 +69,29 @@ class Main(QMainWindow):
64
69
  self.f_header = Header(self)
65
70
  self.m_menu_bar = MenuBar(self)
66
71
 
67
- s1 = QSplitter(Qt.Horizontal)
68
- # win_label.setStyleSheet("border: 1px solid black;")
69
-
72
+ s1 = QSplitter(Qt.Orientation.Horizontal)
73
+ #win_label.setStyleSheet("border: 1px solid black;")
74
+
70
75
  s1.addWidget(self.f_menu)
71
76
  s1.addWidget(self.f_winc)
72
77
  s1.setSizes(split_w_pc(0.2))
73
78
 
74
- s2 = QSplitter(Qt.Vertical)
79
+ s2 = QSplitter(Qt.Orientation.Vertical)
75
80
  s2.addWidget(s1)
76
81
  s2.addWidget(self.f_footer)
77
82
  s2.setSizes(split_h_pc(0.85))
78
-
79
- s0 = QSplitter(Qt.Vertical)
83
+
84
+ s0 = QSplitter(Qt.Orientation.Vertical)
80
85
  s0.addWidget(self.f_header)
81
86
  s0.addWidget(s2)
82
87
  s0.setSizes(split_h_pc(0.05))
83
-
88
+
84
89
  hbox.addWidget(s0)
85
90
 
86
91
  QApplication.setStyle(QStyleFactory.create('Cleanlooks'))
87
92
 
88
- self.setWindowTitle('SPICE-IT Quicklook')
89
-
93
+ self.setWindowTitle('SPICE-IT-UP Quicklook')
94
+
90
95
  """def __del__(self):
91
96
  for th in self.th:
92
97
  th.quit()"""
@@ -131,7 +136,7 @@ class Main(QMainWindow):
131
136
  for plot_key, plot in plot_bloc.items():
132
137
  plots.append(plot)
133
138
  return plots # list of PlotMap and/or PlotLine
134
-
139
+
135
140
  def get_plots(self, given_plot_key):
136
141
  plots = []
137
142
  for win_key, plot_bloc in self.global_plots.items():
@@ -139,7 +144,7 @@ class Main(QMainWindow):
139
144
  if given_plot_key == plot_key:
140
145
  plots.append(plot)
141
146
  return plots # list of PlotMap or PlotLine
142
-
147
+
143
148
  def get_plot_bloc(self, given_plot):
144
149
  """plot_bloc is the parent element from a specific plot, it is a dict
145
150
  which is a value-element of global_plots and containing all the PlotMaps
@@ -156,16 +161,16 @@ class Main(QMainWindow):
156
161
  for key in keys:
157
162
  plot_bloc[key].main_plot_item.setXLink(None)
158
163
  plot_bloc[key].main_plot_item.setYLink(None)
159
-
164
+
160
165
  def link_axes(self, between_windows=False):
161
166
  previous_lambda_y = None
162
167
  previous_x_y = None
163
-
168
+
164
169
  self.unlink_axes()
165
170
  for win_key, plot_bloc in self.global_plots.items():
166
171
  # Zoom / Pane link
167
- # plot_bloc['x_y'].main_plot_item.setYLink(plot_bloc['lambda_y'].main_plot_item)
168
- # generates zoom issues
172
+ #plot_bloc['x_y'].main_plot_item.setYLink(plot_bloc['lambda_y'].main_plot_item)
173
+ #generates zoom issues
169
174
  if between_windows:
170
175
  if previous_lambda_y is not None: # not the first window
171
176
  PlotMap.link_maps(previous_x_y, plot_bloc['x_y'])
@@ -198,22 +203,27 @@ class Main(QMainWindow):
198
203
  elif plot_key == 'lambda_y':
199
204
  factor = self.f_menu.s_lambda_rescaling.value()
200
205
  return float(factor)
201
-
206
+
202
207
  def initialization(self):
203
208
  if not path.isdir(Const.default_data_path):
204
209
  Log.p(Const.default_data_path + ' does not exist.', 'warn')
205
210
  Const.default_data_path = ''
206
-
211
+
207
212
  def applyStyle(self, app):
208
213
  css_content = self.read_css()
209
214
  if Const.debug_mode:
210
215
  css_content += self.read_css(True)
211
216
  qdgs_css = qdarkgraystyle.load_stylesheet().replace('opacity: 100;', '') # Fix tooltip Windows issue
212
217
  app.setStyleSheet(qdgs_css + css_content)
213
-
218
+ #app.setStyleSheet(css_content)
219
+
214
220
  def read_css(self, debug=False):
215
221
  debug_str = '_debug' if debug else ''
216
- file = open(BASE_DIR + '/style/style' + debug_str + '.css', mode='r')
222
+ file = open(self.project_path + '/style/style' + debug_str + '.css', mode='r')
217
223
  css_content = file.read()
218
224
  file.close()
219
225
  return css_content
226
+
227
+ if __name__ == '__main__':
228
+ from main_call import main
229
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spiceitup
3
- Version: 1.3.4
3
+ Version: 2.0.0
4
4
  Summary: Quicklook tool for level 2 SPICE imaging
5
5
  Home-page: https://git.ias.u-psud.fr/spice/data_quicklook
6
6
  Author: David Picard
@@ -9,12 +9,7 @@ Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Requires-Python: >=3.7
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: PyQt5
13
- Requires-Dist: sunraster
14
- Requires-Dist: pyqtgraph
15
- Requires-Dist: qdarkgraystyle
16
- Requires-Dist: scipy
17
- Requires-Dist: opencv-python-headless
12
+ Requires-Dist: requirements.txt
18
13
  Dynamic: author
19
14
  Dynamic: author-email
20
15
  Dynamic: classifier
@@ -25,7 +20,7 @@ Dynamic: requires-dist
25
20
  Dynamic: requires-python
26
21
  Dynamic: summary
27
22
 
28
- # SPICE data quicklook in PyQt5 / PyQtGraph
23
+ # SPICE data quicklook in PyQt6 / PyQtGraph
29
24
 
30
25
  This graphical user interface (GUI) allows you to have a quick look in the SPICE data (provide level 2 '.fits' files in input). You will be able to navigate dynamically in the data thanks to sliders which update the maps I(x,y) ; I(lambda,y), the curve I(lambda) and more.
31
26
 
@@ -58,7 +53,9 @@ Run with `spiceitup`
58
53
  `pip install numpy --upgrade`
59
54
 
60
55
  #### B.2) Run the app
61
- `python3 spiceitup/main.py` or use an IDE like pycharm (which will install the requirements automatically), open this folder as a project and run `run.py`
56
+ `cd spiceitup`
57
+ `python3 run.py`
58
+ or use an IDE like pycharm (which will install the requirements automatically), open this folder as a project and run `run.py`
62
59
 
63
60
  #### B.3) Troubleshooting
64
61
  Error known:
@@ -68,7 +65,7 @@ In this case, try to do: `sudo apt-get install --reinstall libxcb-xinerama0`
68
65
 
69
66
  **spiceitup: command not found**
70
67
  In this case check if spiceitup is here: `$(python -m site --user-base)/bin"`
71
- Then add it to $PATH: `export PATH="$PATH:$(python -m site --user-base)/bin"`
68
+ Then add it to \$PATH: `export PATH="$PATH:$(python -m site --user-base)/bin"`
72
69
  Run again `spiceitup`
73
70
 
74
71
  **No module spiceitup**
@@ -0,0 +1,12 @@
1
+ README.md
2
+ pyproject.toml
3
+ setup.py
4
+ spiceitup/__main__.py
5
+ spiceitup/main_call.py
6
+ spiceitup/run.py
7
+ spiceitup.egg-info/PKG-INFO
8
+ spiceitup.egg-info/SOURCES.txt
9
+ spiceitup.egg-info/dependency_links.txt
10
+ spiceitup.egg-info/entry_points.txt
11
+ spiceitup.egg-info/requires.txt
12
+ spiceitup.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ requirements.txt
@@ -1 +0,0 @@
1
- recursive-include spiceitup *.*
File without changes
@@ -1,19 +0,0 @@
1
- 2025-11-02T16:44:48 INFO: ------------------------- Application was run
2
- 2025-11-02T16:44:48 INFO: /home/dpicard/Documents/fits/ does not exist.
3
- 2025-11-02T16:44:48 INFO: warn
4
- 2025-11-02T16:45:12 INFO: ------------------------- Application was run
5
- 2025-11-02T16:45:12 INFO: /home/dpicard/Documents/fits/ does not exist.
6
- 2025-11-02T16:45:12 INFO: warn
7
- 2025-11-02T16:45:54 INFO: ------------------------- Application was run
8
- 2025-11-02T16:45:54 INFO: /home/dpicard/Documents/fits/ does not exist.
9
- 2025-11-02T16:45:54 INFO: warn
10
- 2025-11-02T16:47:27 INFO: ------------------------- Application was run
11
- 2025-11-02T16:47:27 INFO: /home/dpicard/Documents/fits/ does not exist.
12
- 2025-11-02T16:47:27 INFO: warn
13
- 2025-11-02T16:48:09 INFO: Interrupting OutOfSync (t = -2)...
14
- 2025-11-02T16:51:15 INFO: Interrupting OutOfSync (t = -2)...
15
- 2025-11-02T16:51:23 INFO: Interrupting OutOfSync (t = -2)...
16
- 2025-11-02T16:51:36 INFO: Interrupting OutOfSync (t = -2)...
17
- 2025-11-02T16:51:45 INFO: Interrupting OutOfSync (t = -2)...
18
- 2025-11-10T13:10:16 INFO: ------------------------- Application was run
19
- 2025-11-10T13:10:29 INFO: Interrupting OutOfSync (t = -2)...
File without changes
@@ -1,38 +0,0 @@
1
- Variables: each variable which begins by a few letters and _ is a Qt object:
2
- > w only is a Window object
3
- > w_something for QWidget
4
- > a_something for actions (like a process on button click)
5
- > m_something for QMenu
6
- > ma_something for a menu action QAction
7
- > tb_something for a QToolBar
8
- > f_something for QFrame
9
- > q_something for any other Qt object like QFile, QLabel, ...
10
- > k_something is a QCheckbox
11
- > l_something, layouts (vbox, hbox, grid...)
12
- > r_something is a QRadioButton
13
- > wp_something is a PyQtGraph Widget (pg.GraphicsLayoutWidget)
14
- > iv_something is an ImageView
15
- > s_something is a QSlider bar
16
- > c_something is a QComboBox (like html <select> lists)
17
- > b_something is a QPushButton
18
- > i_something is a QLineEdit (like html <input type="text" />)
19
- > g_something is a QGroupBox
20
- > Thw_something is a custom worker thread
21
- > img_something is a QLabel containing a QPixmap (for png images)
22
- > pb_something is a QProgressBar
23
- > pf_something is a progress function triggered on thread signal, see run_thread.py
24
- > rt_something is a RunThread object (not needed except if a progress bar must be manually updated)
25
-
26
- > *s_something is a list (or dict) of * elements
27
- with * one related letter of the QObjects previously defined
28
-
29
- > self.something: self is only used when something is needed through the whole class, in
30
- this case we "declare" it at the top of the class by
31
- doing something = None (or '', [], {}, ... according to the type)
32
-
33
- Print / logs:
34
- from logs.log import Log
35
- Use Log.p('Your message', msg_type)
36
- with msg_type: info, warn or error (optional, default is info)
37
- It will print into debug.log (actually see log_file defined in settings.py)
38
- You can watch it in real time: watch -n 0.5 tail -n 110 debug.log
@@ -1,112 +0,0 @@
1
- ---
2
- tags: SPICE, Qt, Quicklook
3
- ---
4
- # 2023-06-13 Quicklook Qt meeting
5
- Participants: **David, Frédéric, Éric, Alfred**
6
- * [Next notes](https://codimd.math.cnrs.fr/l4T7u6INTHC3H7CXNMvuaw?both#)
7
-
8
- ## Questions
9
- (You can answer here :grinning:)
10
- - Do we want to suggest a **global export option**? This way you could choose which windows, plots, parameters... you want to export in one main popup. :arrow_right: ...
11
- * question was about exporting all maps.
12
- * Export button next to graph: call Pyqtgraph dialog (same right click) instead of direct output to PNG file with no option
13
- - Value scaling
14
- * Changing percentiles
15
- - To discuss: **loading** heavy data **files** can show **"Force quit"** for a little while (not critical but not clean either). Data loading were already moved to threads but we can't move "display-related" processes to threads (it must be done in the main process, otherwise blackout display issues come up).
16
- Pyqtgraph needs 100 ms to display a plot (even empty) which leads to e.g. for 8 windows: $0.100 \times 8 \times 6=4.8s$ :arrow_right: ...
17
- - Are plots **$I(x)$ and $I(y)$** useful to show somewhere? :arrow_right: ...
18
- - Could be a choice in the current I(λ) plot
19
- - Should fit maps be $(t,y)$ for sit and stare? :arrow_right: ...
20
- - Yes, maps are still 2D (t, y).
21
- - Intensity **level values and pourcentiles** are still "disconnected", is the current behavior good enough? :arrow_right: ...
22
- - Do show **"Reset zoom"** buttons for each plot or is a global button enough? :arrow_right: ...
23
- - No need
24
- - Is it useful to suggest to **hide processes in the footer** once they are done? :arrow_right: ...
25
- - Better order them by finished status before ordering them by date
26
- - Do people see all the buttons in the top menu bar? Claude's system seems to hide some of them. :arrow_right: ...
27
- - Yes
28
- - Linking $I(x,y)$ maps' **zoom/pane** with "fit maps" make the slider movements really slow, can we let these disconnected? :arrow_right: ...
29
- - Not so bad?
30
- - Next **main feature** to focus on? :arrow_right: ...
31
-
32
-
33
- ## Ready to be checked :checkered_flag:
34
-
35
- - By double-cliking you can aim a $(x,y)$ or $(\lambda,y)$ position in one shot instead of moving horizontal and vertical bars
36
- - OK
37
- - Show thread progresses in the footer
38
- - OK
39
- - When moving a slider, update everything in real time (i.e. other related sliders, $I(\lambda)$ plot, ...)
40
- - OK
41
- - Show mouse coordinates on mouse hover (+ $I$ value)
42
- - OK
43
- - Add a button to reset zoom (triggers "View All")
44
- - OK
45
- - Fix level option especially for $log$ and $sqrt$ methods (it crashed) and prevent user to click on "Apply" twice
46
- - OK
47
- - Automatically reset zoom (View All) on $I(\lambda)$ each time it must be updated
48
- - OK
49
- - Find a way to exclude dumbbells in fit maps generation (even better: the user can now select a small region of interest thanks to the grey bars in the $I(x,y)$ map before generating it)
50
- - Bars are not much visible
51
- - No need to redisplay the message each time
52
- - Fix: reload several data files crashed the app
53
- - Working up to now
54
- - Abort processes when user loads another data file (--> interrupted progress bar in the footer changes to red)
55
- - OK
56
- - Show more study and window details (slit, ...)
57
- - Change to show all as a list
58
- - Fix: moving the $y$ horizontal bar worked for the 1st window but didn't correctly for the other ones
59
- - OK
60
- - Add an offset $+ K$ in the gaussian fit
61
- - OK
62
- - But the NaNs seem to be considered as 0 for the fit and 1D fit plot, they should remain NaN. Also for the 2D map fit.
63
- - Review the layout of the local level option in order to put side by side a maximum of window blocs, e.g. to view all the $I(x,y)$ maps
64
- - OK
65
- - Remove the $y$ slider, the $y$ value is only handled by the horizontal bars
66
- - OK
67
- - Show number of current running threads
68
- - OK
69
- - Hide ROI and Menu buttons next to maps
70
- - OK
71
- - Clarify $x, y, \lambda, t$ next to NAXIS values
72
- - OK
73
- - Do not show NaN warnings, no reason to worry, they are in the data
74
- - OK
75
- - Sometimes by default, the right part of the $I(x,y)$ map was not visible, "View All" is triggered after loading the maps to fix it
76
- - OK
77
- - Moving hardly the 3rd dimension slider of the second map shouldn't freeze the app anymore
78
- - OK
79
- - Fix: the fit maps titles were wrong after moving the mouse over one of it
80
- - OK
81
- - Add pop-ups to explain what the user can do with fit maps
82
- - OK
83
-
84
- ## To do next (features)
85
- - **Keep zoom and pane state after updating the maps** (checkbox, apply average, levels, ...)
86
- :point_right: *This is solved by restoring ViewBox's state when maps are not "zoom-linked", find a way to make it work with "zoom-linked" maps.*
87
- - **Global export option**:question:
88
- - Not needed
89
- - **Set relevant names in image outputs** (instead of output.png)
90
- - Yes
91
- - **Adapt app to Full Spectrum input files**
92
- - **Show real units instead of cube indexes** (&#8491;, ", ...)
93
- - There could be a choice
94
- - **Remove triangles in level histograms**
95
- - Can be removed
96
- - **Show a relevant message if the user doesn't load a level 2 fits file**
97
- - Yes
98
- - *Cf. Trello board Data quicklook*
99
-
100
- ## To do next (optimization)
101
- - **Speed up data file loading**
102
- :point_right: *Still show "Force quit" (for a little while) if there are a lot of windows to display but processings that are updating the display can't be moved to threads in background :warning:*
103
- - **Double-check memory leak when generating window blocs**
104
- - Now crashes after loading a few tens of files (in a row; only the last file is open), this is better than before, but should still be improved.
105
- - **Is it not safe to use `curve_fit` in a thread?**
106
- - Seems to work.
107
- - **Secure menu, do not allow to change things while files are loading**
108
- - **Put "Refresh plots" in a thread to avoid freezes**
109
- - *Cf. Trello board Data quicklook*
110
-
111
- ## Ideas
112
- *Cf. Trello board Data quicklook*