dcscope 2.25.0__tar.gz → 2.25.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 (441) hide show
  1. {dcscope-2.25.0 → dcscope-2.25.2}/CHANGELOG +10 -0
  2. {dcscope-2.25.0/dcscope.egg-info → dcscope-2.25.2}/PKG-INFO +2 -2
  3. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/_version.py +3 -3
  4. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/main.py +20 -8
  5. dcscope-2.25.2/dcscope/gui/settings.py +41 -0
  6. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/core.py +3 -2
  7. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/filter_ray.py +47 -59
  8. {dcscope-2.25.0 → dcscope-2.25.2/dcscope.egg-info}/PKG-INFO +2 -2
  9. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/SOURCES.txt +1 -0
  10. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/requires.txt +1 -1
  11. {dcscope-2.25.0 → dcscope-2.25.2}/pyproject.toml +1 -1
  12. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_filter.py +99 -1
  13. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_pipeline_filter_ray.py +66 -25
  14. {dcscope-2.25.0 → dcscope-2.25.2}/.github/workflows/check.yml +0 -0
  15. {dcscope-2.25.0 → dcscope-2.25.2}/.github/workflows/deploy_github.yml +0 -0
  16. {dcscope-2.25.0 → dcscope-2.25.2}/.github/workflows/deploy_pypi.yml +0 -0
  17. {dcscope-2.25.0 → dcscope-2.25.2}/.gitignore +0 -0
  18. {dcscope-2.25.0 → dcscope-2.25.2}/.readthedocs.yml +0 -0
  19. {dcscope-2.25.0 → dcscope-2.25.2}/LICENSE +0 -0
  20. {dcscope-2.25.0 → dcscope-2.25.2}/MANIFEST.in +0 -0
  21. {dcscope-2.25.0 → dcscope-2.25.2}/README.rst +0 -0
  22. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/DCscope.icns +0 -0
  23. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/DCscope.ico +0 -0
  24. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/DCscopeLauncher.py +0 -0
  25. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/Readme.md +0 -0
  26. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/hook-dcscope.py +0 -0
  27. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/macos_DCscope.spec +0 -0
  28. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/macos_build_app.sh +0 -0
  29. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/macos_build_requirements.txt +0 -0
  30. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_DCscope.spec +0 -0
  31. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_build_requirements.txt +0 -0
  32. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_dcscope.iss_dummy +0 -0
  33. {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_make_iss.py +0 -0
  34. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/__init__.py +0 -0
  35. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/__main__.py +0 -0
  36. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/extensions.py +0 -0
  37. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/__init__.py +0 -0
  38. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/__init__.py +0 -0
  39. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_basins.py +0 -0
  40. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_basins.ui +0 -0
  41. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_filter.py +0 -0
  42. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_filter.ui +0 -0
  43. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_log.py +0 -0
  44. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_log.ui +0 -0
  45. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_meta.py +0 -0
  46. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_meta.ui +0 -0
  47. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_plot.py +0 -0
  48. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_plot.ui +0 -0
  49. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_slot.py +0 -0
  50. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_slot.ui +0 -0
  51. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_tables.py +0 -0
  52. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_tables.ui +0 -0
  53. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_view.py +0 -0
  54. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_view.ui +0 -0
  55. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/dlg_slot_reorder.py +0 -0
  56. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/dlg_slot_reorder.ui +0 -0
  57. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/bulk/__init__.py +0 -0
  58. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/bulk/bulk_emodulus.py +0 -0
  59. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/bulk/bulk_emodulus.ui +0 -0
  60. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/__init__.py +0 -0
  61. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4.py +0 -0
  62. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4.ui +0 -0
  63. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_dataset.py +0 -0
  64. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_dataset.ui +0 -0
  65. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_results.py +0 -0
  66. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_results.ui +0 -0
  67. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_stats.py +0 -0
  68. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_stats.ui +0 -0
  69. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/dcor/__init__.py +0 -0
  70. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/dcor/dcor.ui +0 -0
  71. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/__init__.py +0 -0
  72. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2data.py +0 -0
  73. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2data.ui +0 -0
  74. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2filter.py +0 -0
  75. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2filter.ui +0 -0
  76. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2plot.py +0 -0
  77. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2plot.ui +0 -0
  78. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/helpers.py +0 -0
  79. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/main.ui +0 -0
  80. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/Readme.md +0 -0
  81. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/__init__.py +0 -0
  82. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/block_matrix.py +0 -0
  83. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/block_matrix.ui +0 -0
  84. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/data_matrix.py +0 -0
  85. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_dataset.py +0 -0
  86. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_dataset.ui +0 -0
  87. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_element.py +0 -0
  88. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_element.ui +0 -0
  89. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_filter.py +0 -0
  90. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_filter.ui +0 -0
  91. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/plot_matrix.py +0 -0
  92. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/pm_element.py +0 -0
  93. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/pm_plot.py +0 -0
  94. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/pm_plot.ui +0 -0
  95. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/pipeline_plot.py +0 -0
  96. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/pipeline_plot.ui +0 -0
  97. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/preferences.py +0 -0
  98. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/preferences.ui +0 -0
  99. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/__init__.py +0 -0
  100. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_main.py +0 -0
  101. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_main.ui +0 -0
  102. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_scatter.py +0 -0
  103. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_style.css +0 -0
  104. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/update.py +0 -0
  105. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/__init__.py +0 -0
  106. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/bg_thread.py +0 -0
  107. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/bulk_list.py +0 -0
  108. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/bulk_list.ui +0 -0
  109. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/double_spin_box_nan.py +0 -0
  110. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/feature_combobox.py +0 -0
  111. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/get_path.py +0 -0
  112. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/key_value_table_widget.css +0 -0
  113. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/key_value_table_widget.py +0 -0
  114. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/mdi_subwindow_wo_close.py +0 -0
  115. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/qrangeslider.py +0 -0
  116. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/rangecontrol.py +0 -0
  117. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/rangecontrol.ui +0 -0
  118. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/simple_image_view.py +0 -0
  119. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/simple_plot_widget.py +0 -0
  120. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/so_colorbaritem.py +0 -0
  121. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/wait_cursor.py +0 -0
  122. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/idiom.py +0 -0
  123. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/__init__.py +0 -0
  124. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/COPYING-ICONS +0 -0
  125. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/COPYING.LIB +0 -0
  126. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/README +0 -0
  127. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/application-exit.svg +0 -0
  128. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/code-context.svg +0 -0
  129. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-cancel.svg +0 -0
  130. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-close.svg +0 -0
  131. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-messages.svg +0 -0
  132. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-ok-apply.svg +0 -0
  133. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-ok.svg +0 -0
  134. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/document-open-folder.svg +0 -0
  135. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/document-open.svg +0 -0
  136. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/document-save.svg +0 -0
  137. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/documentinfo.svg +0 -0
  138. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/draw-watercolor.svg +0 -0
  139. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/edit-clear-all.svg +0 -0
  140. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/edit-clear.svg +0 -0
  141. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/edit-paste.svg +0 -0
  142. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/globe.svg +0 -0
  143. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/gtk-preferences.svg +0 -0
  144. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/list-add.svg +0 -0
  145. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/messagebox_warning.svg +0 -0
  146. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/object-columns.svg +0 -0
  147. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/object-order-lower.svg +0 -0
  148. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/object-rows.svg +0 -0
  149. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/office-chart-line-stacked.svg +0 -0
  150. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/office-chart-ring.svg +0 -0
  151. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/office-chart-scatter.svg +0 -0
  152. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/path-mode-polyline.svg +0 -0
  153. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/preferences-activities.svg +0 -0
  154. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/remove.svg +0 -0
  155. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/search.svg +0 -0
  156. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/show-grid.svg +0 -0
  157. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/special_paste.svg +0 -0
  158. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/tools-wizard.svg +0 -0
  159. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-calendar-list.svg +0 -0
  160. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-filter.svg +0 -0
  161. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-list-tree.svg +0 -0
  162. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-statistics.svg +0 -0
  163. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/visibility.svg +0 -0
  164. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/application-exit.svg +0 -0
  165. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/code-context.svg +0 -0
  166. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-cancel.svg +0 -0
  167. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-close.svg +0 -0
  168. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-messages.svg +0 -0
  169. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-ok-apply.svg +0 -0
  170. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-ok.svg +0 -0
  171. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/document-open-folder.svg +0 -0
  172. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/document-open.svg +0 -0
  173. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/document-save.svg +0 -0
  174. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/documentinfo.svg +0 -0
  175. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/draw-watercolor.svg +0 -0
  176. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/edit-clear-all.svg +0 -0
  177. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/edit-clear.svg +0 -0
  178. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/edit-paste.svg +0 -0
  179. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/globe.svg +0 -0
  180. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/gtk-preferences.svg +0 -0
  181. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/list-add.svg +0 -0
  182. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/messagebox_warning.svg +0 -0
  183. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/object-columns.svg +0 -0
  184. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/object-order-lower.svg +0 -0
  185. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/object-rows.svg +0 -0
  186. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/office-chart-line-stacked.svg +0 -0
  187. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/office-chart-ring.svg +0 -0
  188. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/office-chart-scatter.svg +0 -0
  189. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/path-mode-polyline.svg +0 -0
  190. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/preferences-activities.svg +0 -0
  191. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/remove.svg +0 -0
  192. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/special_paste.svg +0 -0
  193. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/tools-wizard.svg +0 -0
  194. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-calendar-list.svg +0 -0
  195. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-filter.svg +0 -0
  196. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-list-tree.svg +0 -0
  197. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-statistics.svg +0 -0
  198. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/visibility.svg +0 -0
  199. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/application-exit.svg +0 -0
  200. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/code-context.svg +0 -0
  201. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-cancel.svg +0 -0
  202. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-close.svg +0 -0
  203. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-messages.svg +0 -0
  204. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-ok-apply.svg +0 -0
  205. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-ok.svg +0 -0
  206. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/document-open-folder.svg +0 -0
  207. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/document-open.svg +0 -0
  208. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/document-save.svg +0 -0
  209. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/documentinfo.svg +0 -0
  210. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/draw-watercolor.svg +0 -0
  211. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/edit-clear-all.svg +0 -0
  212. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/edit-clear.svg +0 -0
  213. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/edit-paste.svg +0 -0
  214. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/globe.svg +0 -0
  215. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/gtk-preferences.svg +0 -0
  216. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/list-add.svg +0 -0
  217. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/messagebox_warning.svg +0 -0
  218. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/object-columns.svg +0 -0
  219. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/object-order-lower.svg +0 -0
  220. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/object-rows.svg +0 -0
  221. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/office-chart-line-stacked.svg +0 -0
  222. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/office-chart-ring.svg +0 -0
  223. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/office-chart-scatter.svg +0 -0
  224. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/path-mode-polyline.svg +0 -0
  225. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/preferences-activities.svg +0 -0
  226. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/remove.svg +0 -0
  227. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/special_paste.svg +0 -0
  228. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/tools-wizard.svg +0 -0
  229. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-calendar-list.svg +0 -0
  230. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-filter.svg +0 -0
  231. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-list-tree.svg +0 -0
  232. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-statistics.svg +0 -0
  233. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/visibility.svg +0 -0
  234. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/application-exit.svg +0 -0
  235. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-cancel.svg +0 -0
  236. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-messages.svg +0 -0
  237. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-ok-apply.svg +0 -0
  238. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-ok.svg +0 -0
  239. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/document-open-folder.svg +0 -0
  240. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/document-open.svg +0 -0
  241. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/document-save.svg +0 -0
  242. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/gtk-preferences.svg +0 -0
  243. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/object-order-lower.svg +0 -0
  244. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/view-filter.svg +0 -0
  245. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/view-list-tree.svg +0 -0
  246. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/16/folder-cloud.svg +0 -0
  247. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/16/folder.svg +0 -0
  248. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/22/folder-cloud.svg +0 -0
  249. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/22/folder.svg +0 -0
  250. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/24/folder-cloud.svg +0 -0
  251. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/24/folder.svg +0 -0
  252. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/32/folder-cloud.svg +0 -0
  253. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/32/folder.svg +0 -0
  254. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/64/folder-cloud.svg +0 -0
  255. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/64/folder.svg +0 -0
  256. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-error.svg +0 -0
  257. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-information.svg +0 -0
  258. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-question.svg +0 -0
  259. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-warning.svg +0 -0
  260. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-error.svg +0 -0
  261. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-information.svg +0 -0
  262. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-question.svg +0 -0
  263. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-warning.svg +0 -0
  264. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-error.svg +0 -0
  265. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-information.svg +0 -0
  266. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-question.svg +0 -0
  267. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-warning.svg +0 -0
  268. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-error.svg +0 -0
  269. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-information.svg +0 -0
  270. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-question.svg +0 -0
  271. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-warning.svg +0 -0
  272. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/collect_icons.py +0 -0
  273. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/dcor.png +0 -0
  274. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/edit-copy-anew.svg +0 -0
  275. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/emodulus.svg +0 -0
  276. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/filter_ray.svg +0 -0
  277. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/region_channel.svg +0 -0
  278. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/region_reservoir.svg +0 -0
  279. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/rlang.svg +0 -0
  280. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/statistical_significance.svg +0 -0
  281. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/index.theme +0 -0
  282. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon.png +0 -0
  283. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/splash.png +0 -0
  284. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/meta_tool.py +0 -0
  285. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/__init__.py +0 -0
  286. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/dataslot.py +0 -0
  287. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/filter.py +0 -0
  288. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/plot.py +0 -0
  289. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/plot_cache.py +0 -0
  290. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/session.py +0 -0
  291. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/util.py +0 -0
  292. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/dependency_links.txt +0 -0
  293. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/entry_points.txt +0 -0
  294. {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/top_level.txt +0 -0
  295. {dcscope-2.25.0 → dcscope-2.25.2}/docs/README.md +0 -0
  296. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/Readme.md +0 -0
  297. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_icon.svg +0 -0
  298. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_large_white.png +0 -0
  299. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_large_white.svg +0 -0
  300. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_splash.svg +0 -0
  301. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/favicon.ico +0 -0
  302. {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/favicon.svg +0 -0
  303. {dcscope-2.25.0 → dcscope-2.25.2}/docs/conf.py +0 -0
  304. {dcscope-2.25.0 → dcscope-2.25.2}/docs/data/extension_fl1_density.py +0 -0
  305. {dcscope-2.25.0 → dcscope-2.25.2}/docs/dcscope.bib +0 -0
  306. {dcscope-2.25.0 → dcscope-2.25.2}/docs/extensions/fancy_include.py +0 -0
  307. {dcscope-2.25.0 → dcscope-2.25.2}/docs/extensions/github_changelog.py +0 -0
  308. {dcscope-2.25.0 → dcscope-2.25.2}/docs/extensions/rtd_pdf.py +0 -0
  309. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/ATTRIBUTION +0 -0
  310. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/area.png +0 -0
  311. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/aspect.jpg +0 -0
  312. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/brightness.jpg +0 -0
  313. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/deform.jpg +0 -0
  314. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/deform.py +0 -0
  315. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/fluorescence.jpg +0 -0
  316. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/fluorescence.py +0 -0
  317. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/inert_ratio.jpg +0 -0
  318. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/inert_ratio.py +0 -0
  319. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_countrate.jpg +0 -0
  320. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_countrate.py +0 -0
  321. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_area.jpg +0 -0
  322. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_area.py +0 -0
  323. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_porosity.jpg +0 -0
  324. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_porosity.py +0 -0
  325. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_ratios.jpg +0 -0
  326. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_ratios.py +0 -0
  327. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_time.jpg +0 -0
  328. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_time.py +0 -0
  329. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus.py +0 -0
  330. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_15um.png +0 -0
  331. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_20um.png +0 -0
  332. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_30um.png +0 -0
  333. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_40um.png +0 -0
  334. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/rtdc-setup.jpg +0 -0
  335. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/volume.jpg +0 -0
  336. {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/volume.py +0 -0
  337. {dcscope-2.25.0 → dcscope-2.25.2}/docs/index.rst +0 -0
  338. {dcscope-2.25.0 → dcscope-2.25.2}/docs/requirements.txt +0 -0
  339. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/.gitignore +0 -0
  340. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/CD66+_CD14-.poly +0 -0
  341. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots.sh +0 -0
  342. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_dcor.py +0 -0
  343. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_emodulus.py +0 -0
  344. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_export.py +0 -0
  345. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_extensions.py +0 -0
  346. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_lme4.py +0 -0
  347. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_lme4_diff.py +0 -0
  348. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_statistics.py +0 -0
  349. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_ui.py +0 -0
  350. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_dcor_dlg.png +0 -0
  351. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_badtemp.png +0 -0
  352. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_config.png +0 -0
  353. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_feature.png +0 -0
  354. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_other.png +0 -0
  355. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_export_data.png +0 -0
  356. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_extensions.png +0 -0
  357. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_diff_init.png +0 -0
  358. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_diff_results.png +0 -0
  359. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_init.png +0 -0
  360. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_results.png +0 -0
  361. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_statistics_folder.png +0 -0
  362. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_statistics_init.png +0 -0
  363. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/scrots.so2 +0 -0
  364. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_basins.png +0 -0
  365. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_filter.png +0 -0
  366. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_logs.png +0 -0
  367. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_meta.png +0 -0
  368. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_plot.png +0 -0
  369. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_slot.png +0 -0
  370. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_tables.png +0 -0
  371. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_block_matrix.png +0 -0
  372. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_main.png +0 -0
  373. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_qv_event.png +0 -0
  374. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_qv_poly.png +0 -0
  375. {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_qv_settings.png +0 -0
  376. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_changelog.rst +0 -0
  377. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_devs.rst +0 -0
  378. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_getting_started.rst +0 -0
  379. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_imprint.rst +0 -0
  380. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_interface.rst +0 -0
  381. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_batch_stats.rst +0 -0
  382. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_consistency_check.rst +0 -0
  383. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_dcor.rst +0 -0
  384. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_export_data.rst +0 -0
  385. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_extensions.rst +0 -0
  386. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_filtering.rst +0 -0
  387. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_lme4.rst +0 -0
  388. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_youngs_modulus.rst +0 -0
  389. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_quick_guides.rst +0 -0
  390. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_rtdc_basics.rst +0 -0
  391. {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_z_bib.rst +0 -0
  392. {dcscope-2.25.0 → dcscope-2.25.2}/setup.cfg +0 -0
  393. {dcscope-2.25.0 → dcscope-2.25.2}/tests/README.md +0 -0
  394. {dcscope-2.25.0 → dcscope-2.25.2}/tests/conftest.py +0 -0
  395. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/artificial_with_image_bg.rtdc +0 -0
  396. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/blood_rbc_leukocytes.rtdc +0 -0
  397. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/blood_rbc_qpi_data.rtdc +0 -0
  398. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/calibration_beads_47.rtdc +0 -0
  399. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/cytoshot_blood.rtdc +0 -0
  400. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/ext_feat_anc_plugin_ca.py +0 -0
  401. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/extreme_shear.rtdc +0 -0
  402. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/naiad-capture_blood_pipeline.rtdc +0 -0
  403. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_1_0_basic.so2 +0 -0
  404. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_1_2_plot_color_emodulus.so2 +0 -0
  405. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_1_6_no_events.so2 +0 -0
  406. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_5_0_dcor_lme4.so2 +0 -0
  407. {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_5_0_dcor_lme4_diff.so2 +0 -0
  408. {dcscope-2.25.0 → dcscope-2.25.2}/tests/requirements.txt +0 -0
  409. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_extensions.py +0 -0
  410. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_ana_meta.py +0 -0
  411. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_basic.py +0 -0
  412. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_bulk_emodulus.py +0 -0
  413. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_compute_lme4.py +0 -0
  414. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_compute_stats.py +0 -0
  415. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_emodulus.py +0 -0
  416. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_export_data.py +0 -0
  417. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_export_filter.py +0 -0
  418. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_export_plot.py +0 -0
  419. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_matrix.py +0 -0
  420. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_pipeline_plot.py +0 -0
  421. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_plotting.py +0 -0
  422. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_quickview.py +0 -0
  423. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_reorder_datasets.py +0 -0
  424. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_update.py +0 -0
  425. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_pipeline_core.py +0 -0
  426. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_session.py +0 -0
  427. {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_util.py +0 -0
  428. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/.gitignore +0 -0
  429. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/Readme.rst +0 -0
  430. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export.py +0 -0
  431. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export.so2 +0 -0
  432. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_log-large-points-export-png_expected.png +0 -0
  433. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_log-large-points-export-svg_expected.svg +0 -0
  434. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-export-png_expected.png +0 -0
  435. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-export-svg_expected.svg +0 -0
  436. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot1-export-png_expected.png +0 -0
  437. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot1-export-svg_expected.svg +0 -0
  438. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot2-export-png_expected.png +0 -0
  439. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot2-export-svg_expected.svg +0 -0
  440. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-long-title-export-png_expected.png +0 -0
  441. {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/run-tests.sh +0 -0
@@ -1,3 +1,13 @@
1
+ 2.25.2
2
+ - fix: check directory existence when loading files (#227)
3
+ 2.25.1
4
+ - fix: removing a box filter did not clear the filter in some cases
5
+ - ref: do not allow specifying filters in `FilterRay.get_dataset()`
6
+ - ref: unify hashing caching of datasets in `FilterRay.segments`
7
+ - ref: remove ambiguous `FilterRay.root_child` workaround
8
+ - ref: simplify `FilterRay.get_final_child`
9
+ - tests: improve `FilterRay` test coverage
10
+ - setup: bump dclab to 0.67.4 (correct `reset_filter` method)
1
11
  2.25.0
2
12
  - feat: increase width of dataset tile in block matrix via settings (#225)
3
13
  - fix: IndexError when trying to view the logs of a log-less dataset
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dcscope
3
- Version: 2.25.0
3
+ Version: 2.25.2
4
4
  Summary: User interface for deformability cytometry (DC)
5
5
  Author: Benedikt Hartmann, Eoghan O'Connell, Maximilian Schlögel, Paul Müller, Raghava Alajangi
6
6
  Maintainer-email: Paul Müller <dev@craban.de>
@@ -16,7 +16,7 @@ Classifier: Intended Audience :: Science/Research
16
16
  Requires-Python: <4,>=3.9
17
17
  Description-Content-Type: text/x-rst
18
18
  License-File: LICENSE
19
- Requires-Dist: dclab[dcor,export,http,s3]>=0.67.3
19
+ Requires-Dist: dclab[dcor,export,http,s3]>=0.67.4
20
20
  Requires-Dist: h5py>=2.8.0
21
21
  Requires-Dist: numpy>=1.21
22
22
  Requires-Dist: pygments
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.25.0'
32
- __version_tuple__ = version_tuple = (2, 25, 0)
31
+ __version__ = version = '2.25.2'
32
+ __version_tuple__ = version_tuple = (2, 25, 2)
33
33
 
34
- __commit_id__ = commit_id = 'gd56e9d0fe'
34
+ __commit_id__ = commit_id = 'g7db9e4d5b'
@@ -28,6 +28,7 @@ from .helpers import connect_pp_mod_signals
28
28
  from . import pipeline_plot
29
29
  from . import preferences
30
30
  from . import quick_view
31
+ from . import settings
31
32
  from . import update
32
33
  from . import widgets
33
34
 
@@ -270,7 +271,7 @@ class DCscope(QtWidgets.QMainWindow):
270
271
  fnames, _ = QtWidgets.QFileDialog.getOpenFileNames(
271
272
  parent=self,
272
273
  caption="Select an RT-DC measurement",
273
- directory=self.settings.value("paths/add dataset", ""),
274
+ directory=settings.get_dir("add_dataset", self.settings),
274
275
  filter="RT-DC Files (*.rtdc)")
275
276
  else:
276
277
  fnames = paths
@@ -290,8 +291,7 @@ class DCscope(QtWidgets.QMainWindow):
290
291
  path = fn
291
292
  else:
292
293
  path = pathlib.Path(fn)
293
- self.settings.setValue("paths/add dataset",
294
- str(path.parent))
294
+ settings.set_dir("add_dataset", path, self.settings)
295
295
  # add a filter if we don't have one already
296
296
  if self.pipeline.num_filters == 0:
297
297
  self.add_filter()
@@ -662,8 +662,12 @@ class DCscope(QtWidgets.QMainWindow):
662
662
  """
663
663
  if path is None:
664
664
  path, _ = QtWidgets.QFileDialog.getOpenFileName(
665
- self, 'Select Filter', '', 'Filters formats (*.poly *.sof)')
665
+ parent=self,
666
+ caption='Select Filter',
667
+ directory=settings.get_dir("filters", self.settings),
668
+ filter='Filters formats (*.poly *.sof)')
666
669
  if path:
670
+ settings.set_dir("filters", path, self.settings)
667
671
  with self.pipeline.lock:
668
672
  session.import_filters(path, self.pipeline)
669
673
  self.pp_mod_send.emit(
@@ -677,10 +681,14 @@ class DCscope(QtWidgets.QMainWindow):
677
681
  return
678
682
  if path is None:
679
683
  path, _ = QtWidgets.QFileDialog.getOpenFileName(
680
- self, 'Open session', '', 'DCscope session (*.so2)',
681
- 'DCscope session (*.so2)',
682
- QtWidgets.QFileDialog.Option.DontUseNativeDialog)
684
+ parent=self,
685
+ caption='Open session',
686
+ directory=settings.get_dir("session", self.settings),
687
+ filter='DCscope session (*.so2)',
688
+ initialFilter='DCscope session (*.so2)',
689
+ options=QtWidgets.QFileDialog.Option.DontUseNativeDialog)
683
690
  if path:
691
+ settings.set_dir("session", path, self.settings)
684
692
  with self.pipeline.lock:
685
693
  search_paths = []
686
694
  while True:
@@ -724,8 +732,12 @@ class DCscope(QtWidgets.QMainWindow):
724
732
  @QtCore.pyqtSlot()
725
733
  def on_action_save(self):
726
734
  path, _ = QtWidgets.QFileDialog.getSaveFileName(
727
- self, 'Save session', '', 'DCscope session (*.so2)')
735
+ parent=self,
736
+ caption='Save session',
737
+ directory=settings.get_dir("session", self.settings),
738
+ filter='DCscope session (*.so2)')
728
739
  if path:
740
+ settings.set_dir("session", path, self.settings)
729
741
  if not path.endswith(".so2"):
730
742
  path += ".so2"
731
743
  session.save_session(path, self.pipeline)
@@ -0,0 +1,41 @@
1
+ import pathlib
2
+ from PyQt6 import QtCore
3
+
4
+
5
+ def get_dir(topic: str,
6
+ settings: QtCore.QSettings
7
+ ) -> str:
8
+ """Given a QSettings instance, return a directory
9
+
10
+ If writable is `True`, return a writable directory
11
+ """
12
+ location = settings.value(f"paths/{topic}", "")
13
+
14
+ if not location:
15
+ # use default value
16
+ location = QtCore.QStandardPaths.standardLocations(
17
+ QtCore.QStandardPaths.StandardLocation.HomeLocation)[0]
18
+ else:
19
+ # check whether the location exists
20
+ path = pathlib.Path(location)
21
+ if not path.is_dir():
22
+ for pp in path.parents:
23
+ if pp.is_dir():
24
+ location = str(pp)
25
+ break
26
+ else:
27
+ location = "."
28
+
29
+ return location or "."
30
+
31
+
32
+ def set_dir(topic: str,
33
+ path: pathlib.Path | str,
34
+ settings: QtCore.QSettings,
35
+ ):
36
+ """Given a QSettings instance, save a directory topic"""
37
+ path = pathlib.Path(path)
38
+ if path.exists():
39
+ if not path.is_dir():
40
+ path = path.parent
41
+ settings.setValue(f"paths/{topic}", str(path))
@@ -464,8 +464,9 @@ class Pipeline(object):
464
464
  filters = self.get_filters_for_slot(slot_id=slot_id,
465
465
  max_filter_index=filt_index)
466
466
  # filter ray magic
467
- ray = self.get_ray(slot.identifier)
468
- ds = ray.get_dataset(filters, apply_filter=apply_filter)
467
+ ray = self.get_ray(slot_id)
468
+ ray.set_filters(filters)
469
+ ds = ray.get_dataset(apply_filter=apply_filter)
469
470
  return ds
470
471
 
471
472
  def get_datasets(self, filt_index=-1, apply_filter=True):
@@ -12,29 +12,28 @@ class FilterRay(object):
12
12
  self.identifier = slot.identifier
13
13
  #: slot defining the ray
14
14
  self.slot = slot
15
- #: list of RTDCBase (hierarchy children)
16
- self.steps = []
17
- #: corresponds to hashes of the applied filters
18
- self.step_hashes = []
15
+ #: segments of the filter ray, consisting of hash, previous, and
16
+ #: next dataset
17
+ self.segments = []
19
18
  # holds the filters (protected so that users use set_filters)
20
19
  self._filters = []
21
20
  # used for testing (incremented when the ray is cut)
22
21
  self._generation = 0
23
22
  # used for checking validity of the ray
24
23
  self._slot_hash = "unset"
25
- self._root_child = None
26
24
 
27
25
  def __repr__(self):
28
26
  repre = "<Pipeline Filter Ray '{}' at {}>".format(self.identifier,
29
27
  hex(id(self)))
30
28
  return repre
31
29
 
32
- def _add_step(self, ds, filt):
33
- """Add a filter step"""
34
- self.step_hashes.append(filt.hash)
30
+ def _add_segment(self, ds, filt):
31
+ """Add a filter segment"""
32
+ ds.reset_filter()
35
33
  filt.update_dataset(ds)
36
- self.steps.append(ds)
37
- return self._new_child(ds, filt)
34
+ child = self._new_child(ds, filt)
35
+ self.segments.append([filt.hash, ds, child])
36
+ return child
38
37
 
39
38
  def _new_child(self, ds, filt=None, apply_filter=False):
40
39
  identifier = self.slot.identifier
@@ -58,21 +57,7 @@ class FilterRay(object):
58
57
  """
59
58
  return self._filters
60
59
 
61
- @property
62
- def root_child(self):
63
- """This is the first element in self.steps
64
- (Will return a dataset even if self.steps is empty)
65
- """
66
- if self._slot_hash != self.slot.hash:
67
- # reset everything (e.g. emodulus recipe might have changed)
68
- self.steps = []
69
- self.step_hashes = []
70
- self._root_child = self._new_child(self.slot.get_dataset(),
71
- apply_filter=True)
72
- self._slot_hash = self.slot.hash
73
- return self._root_child
74
-
75
- def get_final_child(self, rtdc_ds=None, apply_filter=True):
60
+ def get_final_child(self, rtdc_ds=None, filters=None, apply_filter=True):
76
61
  """Return the final ray child of `rtdc_ds`
77
62
 
78
63
  If `rtdc_ds` is None, then the dataset of the current
@@ -86,19 +71,27 @@ class FilterRay(object):
86
71
  is applied to other data on disk e.g. when computing
87
72
  statistics. For regular use of the filter ray in a
88
73
  pipeline, use :func:`get_dataset`.
74
+
75
+ .. versionchanged:: 2.25.1
76
+ The dataset returned is a clean child dataset without any
77
+ filters defined.
78
+
89
79
  """
90
- filters = self.filters
80
+ if filters is None:
81
+ filters = self.filters
82
+ external_filt = False
83
+ else:
84
+ external_filt = True
91
85
 
92
86
  if rtdc_ds is None:
93
87
  # normal case
94
- external = False
95
- rtdc_ds = self.slot.get_dataset()
96
- ds = self.root_child
88
+ external_ds = False
89
+ ds = self.slot.get_dataset()
97
90
  else:
98
91
  # ray is applied to other data
99
- external = True
100
- # do not modify rtdc_ds (create a child to work with)
101
- ds = self._new_child(rtdc_ds, apply_filter=True)
92
+ external_ds = True
93
+ # do not modify the original dataset (create a child to work with)
94
+ ds = self._new_child(rtdc_ds)
102
95
 
103
96
  # Dear future self,
104
97
  #
@@ -107,48 +100,46 @@ class FilterRay(object):
107
100
  # Sincerely,
108
101
  # past self
109
102
 
103
+ filters = [f for f in filters if f.filter_used]
104
+
110
105
  if filters:
111
106
  # apply all filters
112
107
  for ii, filt in enumerate(filters):
113
108
  # remember the previous hierarchy parent
114
109
  # (ds is always used for the next iteration)
115
- prev_ds = ds
116
- if external:
117
- # do not touch self.steps or self.step_hashes
110
+ if external_ds or external_filt:
111
+ # do not touch self.segments
118
112
  filt.update_dataset(ds)
119
113
  ds = self._new_child(ds, filt)
120
- elif len(self.steps) < ii+1:
121
- # just create a new step
122
- ds = self._add_step(ds, filt)
123
- elif filt.hash != self.step_hashes[ii]:
114
+ elif len(self.segments) < ii + 1:
115
+ # just create a new segment
116
+ ds = self._add_segment(ds, filt)
117
+ elif filt.hash != self.segments[ii][0]:
124
118
  # the filter ray is changing here;
125
- # cut it and add a new step
126
- self.steps = self.steps[:ii]
127
- self.step_hashes = self.step_hashes[:ii]
128
- ds = self._add_step(ds, filt)
119
+ # trim it and add a new segment
120
+ self.segments = self.segments[:ii]
121
+ ds = self._add_segment(ds, filt)
129
122
  self._generation += 1 # for testing
130
123
  else:
131
- # the filters match so far
132
- if len(self.steps) > ii + 1: # next child exists
133
- ds = self.steps[ii + 1]
134
- else: # next child does not exist
135
- ds = self._new_child(ds, filt)
136
- # we now have the entire filter pipeline in self.steps
137
- final_ds = prev_ds
124
+ # reuse previous segment
125
+ ds = self.segments[ii][2]
126
+ final_ds = ds
138
127
  else:
139
- final_ds = rtdc_ds
128
+ final_ds = ds
129
+
130
+ if not external_ds:
131
+ ds.reset_filter()
132
+
140
133
  if apply_filter:
141
134
  final_ds.apply_filter()
135
+
142
136
  return final_ds
143
137
 
144
- def get_dataset(self, filters=None, apply_filter=True):
138
+ def get_dataset(self, apply_filter=True):
145
139
  """Return the dataset that corresponds to applying these filters
146
140
 
147
141
  Parameters
148
142
  ----------
149
- filters: list of Filter or None
150
- Filters used for computing the dataset hierarchy. If set
151
- to None, the current filters in `self.filters` are used.
152
143
  apply_filter: bool
153
144
  Whether to apply all filters and update the metadata of
154
145
  the requested dataset. This should be True if you are
@@ -157,9 +148,6 @@ class FilterRay(object):
157
148
  apply some more filters and then call `rejuvenate`
158
149
  yourself.
159
150
  """
160
- if filters is not None:
161
- # put the filters in place
162
- self.set_filters(filters)
163
151
  # compute the final hierarchy child
164
152
  ds = self.get_final_child(apply_filter=apply_filter)
165
153
  return ds
@@ -167,4 +155,4 @@ class FilterRay(object):
167
155
  def set_filters(self, filters):
168
156
  """Set the filters of the current ray"""
169
157
  # only take into account active filters
170
- self._filters = [f for f in filters if f.filter_used]
158
+ self._filters = filters
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dcscope
3
- Version: 2.25.0
3
+ Version: 2.25.2
4
4
  Summary: User interface for deformability cytometry (DC)
5
5
  Author: Benedikt Hartmann, Eoghan O'Connell, Maximilian Schlögel, Paul Müller, Raghava Alajangi
6
6
  Maintainer-email: Paul Müller <dev@craban.de>
@@ -16,7 +16,7 @@ Classifier: Intended Audience :: Science/Research
16
16
  Requires-Python: <4,>=3.9
17
17
  Description-Content-Type: text/x-rst
18
18
  License-File: LICENSE
19
- Requires-Dist: dclab[dcor,export,http,s3]>=0.67.3
19
+ Requires-Dist: dclab[dcor,export,http,s3]>=0.67.4
20
20
  Requires-Dist: h5py>=2.8.0
21
21
  Requires-Dist: numpy>=1.21
22
22
  Requires-Dist: pygments
@@ -43,6 +43,7 @@ dcscope/gui/pipeline_plot.py
43
43
  dcscope/gui/pipeline_plot.ui
44
44
  dcscope/gui/preferences.py
45
45
  dcscope/gui/preferences.ui
46
+ dcscope/gui/settings.py
46
47
  dcscope/gui/update.py
47
48
  dcscope/gui/analysis/__init__.py
48
49
  dcscope/gui/analysis/ana_basins.py
@@ -1,4 +1,4 @@
1
- dclab[dcor,export,http,s3]>=0.67.3
1
+ dclab[dcor,export,http,s3]>=0.67.4
2
2
  h5py>=2.8.0
3
3
  numpy>=1.21
4
4
  pygments
@@ -30,7 +30,7 @@ classifiers = [
30
30
  ]
31
31
  license = "GPL-3.0-or-later"
32
32
  dependencies = [
33
- "dclab[dcor,export,http,s3]>=0.67.3",
33
+ "dclab[dcor,export,http,s3]>=0.67.4",
34
34
  "h5py>=2.8.0",
35
35
  "numpy>=1.21", # CVE-2021-33430
36
36
  "pygments",
@@ -101,6 +101,104 @@ def test_box_filter_selection_no_preselection_issue_67(qtbot):
101
101
  qtbot.mouseClick(wf.toolButton_moreless, QtCore.Qt.MouseButton.LeftButton)
102
102
 
103
103
 
104
+ def test_filter_min_max_delete(qtbot):
105
+ """Create a box filter, apply it, and delete it again"""
106
+ path = make_fake_dataset()
107
+
108
+ mw = DCscope()
109
+ qtbot.addWidget(mw)
110
+
111
+ # add the file
112
+ mw.add_dataslot(paths=[path, path])
113
+
114
+ assert len(mw.pipeline.slot_ids) == 2, "we added that"
115
+ assert len(mw.pipeline.filter_ids) == 1, "automatically added"
116
+ # sanity check
117
+ ds10 = dclab.new_dataset(mw.pipeline.get_dataset(0))
118
+ ds20 = dclab.new_dataset(mw.pipeline.get_dataset(0))
119
+ assert np.max(ds10["area_um"]) > 20
120
+ assert np.max(ds20["area_um"]) > 20
121
+
122
+ # open the filter edit in the Analysis View
123
+ fe = mw.block_matrix.get_widget(filt_plot_id=mw.pipeline.filter_ids[0])
124
+ qtbot.mouseClick(fe.toolButton_modify, QtCore.Qt.MouseButton.LeftButton)
125
+
126
+ # box filtering
127
+ wf = mw.widget_ana_view.widget_filter
128
+ mw.widget_ana_view.tabWidget.setCurrentWidget(
129
+ mw.widget_ana_view.tab_filter)
130
+
131
+ # enable selection
132
+ qtbot.mouseClick(wf.toolButton_moreless, QtCore.Qt.MouseButton.LeftButton)
133
+ # find the porosity item and click the checkbox
134
+ rc = wf._box_range_controls["area_um"]
135
+ qtbot.mouseClick(rc.checkBox, QtCore.Qt.MouseButton.LeftButton)
136
+ # disable selection
137
+ qtbot.mouseClick(wf.toolButton_moreless, QtCore.Qt.MouseButton.LeftButton)
138
+
139
+ # set the range control for area from 20 to 30 µm
140
+ rc.doubleSpinBox_min.setValue(20)
141
+ rc.doubleSpinBox_max.setValue(30)
142
+
143
+ # click apply
144
+ qtbot.mouseClick(wf.pushButton_apply, QtCore.Qt.MouseButton.LeftButton)
145
+
146
+ # make sure this worked
147
+ assert rc.read_pipeline_state()["end"] == 30
148
+ box_filters = mw.pipeline.filters[0].__getstate__()["box filters"]
149
+ assert box_filters["area_um"]["end"] == 30
150
+ assert box_filters["area_um"]["active"] is True
151
+
152
+ # activate the filter for both datasets
153
+ me1 = mw.block_matrix.get_widget(filt_plot_id=mw.pipeline.filter_ids[0],
154
+ slot_id=mw.pipeline.slot_ids[0]
155
+ )
156
+ qtbot.mouseClick(me1, QtCore.Qt.MouseButton.LeftButton)
157
+ me2 = mw.block_matrix.get_widget(filt_plot_id=mw.pipeline.filter_ids[0],
158
+ slot_id=mw.pipeline.slot_ids[1]
159
+ )
160
+ qtbot.mouseClick(me2, QtCore.Qt.MouseButton.LeftButton)
161
+
162
+ QtWidgets.QApplication.processEvents(
163
+ QEventLoop.ProcessEventsFlag.AllEvents, 500)
164
+
165
+ assert len(mw.pipeline.get_filters_for_slot(mw.pipeline.slot_ids[0])) == 1
166
+ assert len(mw.pipeline.get_filters_for_slot(mw.pipeline.slot_ids[1])) == 1
167
+
168
+ # get the datasets from the pipeline and check that they are filtered
169
+ ds1a = dclab.new_dataset(mw.pipeline.get_dataset(0))
170
+ ds2a = dclab.new_dataset(mw.pipeline.get_dataset(1))
171
+
172
+ # This is expected
173
+ assert np.max(ds1a["area_um"]) < 30
174
+ assert np.max(ds2a["area_um"]) < 30
175
+
176
+ # Now, remove the box filter!
177
+ qtbot.mouseClick(wf.toolButton_moreless, QtCore.Qt.MouseButton.LeftButton)
178
+ # find the porosity item and click the checkbox
179
+ rc = wf._box_range_controls["area_um"]
180
+ qtbot.mouseClick(rc.checkBox, QtCore.Qt.MouseButton.LeftButton)
181
+ # disable selection
182
+ qtbot.mouseClick(wf.toolButton_moreless, QtCore.Qt.MouseButton.LeftButton)
183
+
184
+ # click apply
185
+ qtbot.mouseClick(wf.pushButton_apply, QtCore.Qt.MouseButton.LeftButton)
186
+ QtWidgets.QApplication.processEvents(
187
+ QEventLoop.ProcessEventsFlag.AllEvents, 500)
188
+
189
+ # make sure this worked
190
+ box_filters = mw.pipeline.filters[0].__getstate__()["box filters"]
191
+ assert "area_um" not in box_filters
192
+
193
+ # get the datasets from the pipeline and check that they are filtered
194
+ ds1b = dclab.new_dataset(mw.pipeline.get_dataset(0))
195
+ ds2b = dclab.new_dataset(mw.pipeline.get_dataset(1))
196
+
197
+ # This was the bug. The filters were not removed correctly.
198
+ assert np.max(ds1b["area_um"]) > 30
199
+ assert np.max(ds2b["area_um"]) > 30
200
+
201
+
104
202
  def test_filter_min_max_inf(qtbot):
105
203
  path = make_fake_dataset()
106
204
 
@@ -199,7 +297,7 @@ def test_polygon_filter_basic(qtbot):
199
297
  ds = mw.pipeline.get_dataset(0)
200
298
  assert ds_slot is not ds
201
299
  assert np.sum(ds.filter.all) == 5
202
- assert len(ds) == 47
300
+ assert len(ds) == 5
203
301
 
204
302
 
205
303
  def test_polygon_filter_delete(qtbot):
@@ -18,9 +18,11 @@ def test_get_heredity():
18
18
  filt1.boxdict["area_um"] = {"start": np.min(ds["area_um"]),
19
19
  "end": np.mean(ds["area_um"]),
20
20
  "active": True}
21
+
21
22
  # this one does nothing (and should be ignored)
22
- filt2 = pipeline.Filter()
23
- filt2.filter_used = False
23
+ fign2 = pipeline.Filter()
24
+ fign2.filter_used = False
25
+
24
26
  # another one with simple things
25
27
  filt3 = pipeline.Filter()
26
28
  filt3.boxdict["deform"] = {"start": np.min(ds["deform"]),
@@ -28,38 +30,46 @@ def test_get_heredity():
28
30
  "active": True}
29
31
 
30
32
  # simple
31
- ds1 = ray.get_dataset(filters=[filt1, filt2], apply_filter=True)
33
+ ray.set_filters([filt1, fign2])
34
+ ds1 = ray.get_dataset()
32
35
  assert ray._generation == 0
33
36
 
34
37
  # leaving out a filter that does nothing will not change anything
35
- ds2 = ray.get_dataset(filters=[filt1], apply_filter=True)
38
+ ray.set_filters([filt1])
39
+ ds2 = ray.get_dataset()
36
40
  assert ray._generation == 0
37
41
  assert ds1 is ds2
38
42
 
39
43
  # changing the order will not change anything either
40
- ds3 = ray.get_dataset(filters=[filt2, filt1], apply_filter=True)
44
+ ray.set_filters([fign2, filt1])
45
+ ds3 = ray.get_dataset()
41
46
  assert ray._generation == 0
42
47
  assert ds1 is ds3
43
48
 
44
49
  # adding a new filter will change the dataset
45
- ds4 = ray.get_dataset(filters=[filt1, filt2, filt3], apply_filter=True)
50
+ ray.set_filters([filt1, fign2, filt3])
51
+ ds4 = ray.get_dataset()
46
52
  assert ray._generation == 0
47
53
  assert ds1 is not ds4
54
+
48
55
  assert ds1 is ds4.hparent
49
56
 
50
57
  # going back does not increment the generation...
51
- ds5 = ray.get_dataset(filters=[filt1, filt2], apply_filter=True)
58
+ ray.set_filters([filt1, fign2])
59
+ ds5 = ray.get_dataset()
52
60
  assert ray._generation == 0
53
61
  assert ds1 is ds5
54
62
 
55
63
  # ...but changing the order is
56
- ds5 = ray.get_dataset(filters=[filt3, filt1, filt2], apply_filter=True)
64
+ ray.set_filters([filt3, filt1, fign2])
65
+ ds5 = ray.get_dataset()
57
66
  assert ray._generation == 1
58
67
  assert ds1 is not ds5
59
68
  assert ds3 is not ds5
60
69
 
61
70
  # and then again, when we remove a filter, we get something different
62
- ds6 = ray.get_dataset(filters=[filt3, filt1], apply_filter=True)
71
+ ray.set_filters([filt3, filt1])
72
+ ds6 = ray.get_dataset()
63
73
  assert ray._generation == 1
64
74
  assert ds1 is not ds6
65
75
  assert ds5 is ds6 # b/c filt2 does nothing
@@ -71,6 +81,7 @@ def test_filtering():
71
81
  # initialize
72
82
  slot = pipeline.Dataslot(path)
73
83
  ds = slot.get_dataset()
84
+ assert len(ds) == 47
74
85
  ray = pipeline.FilterRay(slot)
75
86
 
76
87
  # come up with a few filters
@@ -79,30 +90,60 @@ def test_filtering():
79
90
  filt1.boxdict["area_um"] = {"start": np.min(ds["area_um"]),
80
91
  "end": np.mean(ds["area_um"]),
81
92
  "active": True}
93
+
82
94
  # this one does nothing (and should be ignored)
83
- filt2 = pipeline.Filter()
84
- filt2.filter_used = False
95
+ fign2 = pipeline.Filter()
96
+ fign2.filter_used = False
97
+
85
98
  # another one with simple things
86
99
  filt3 = pipeline.Filter()
87
100
  filt3.boxdict["deform"] = {"start": np.min(ds["deform"]),
88
101
  "end": np.mean(ds["deform"]),
89
102
  "active": True}
90
103
 
91
- ds2 = ray.get_dataset(filters=[filt2, filt1], apply_filter=True)
92
- assert len(ds2) == 47
93
- ds3 = ray.get_dataset(filters=[filt1, filt3], apply_filter=True)
94
- assert len(ds3) == 22
104
+ ray.set_filters([fign2])
105
+ ds1 = ray.get_dataset()
106
+ assert len(ds1) == 47, "filter two, nothing happens"
107
+ assert np.sum(ds1.filter.all) == len(ds)
108
+
109
+ ray.set_filters([fign2, filt1])
110
+ ds2 = ray.get_dataset()
111
+ assert len(ds2) == 22, "filter two applied first, no events removed"
95
112
  assert np.sum(ds2.filter.all) == 22
113
+
114
+ ray.set_filters([filt1, filt3])
115
+ ds3 = ray.get_dataset()
116
+ assert len(ds3) == 12, "filter one applied first"
96
117
  assert np.sum(ds3.filter.all) == 12
97
- ds1 = ray.get_dataset(filters=[filt2], apply_filter=True)
98
- assert np.sum(ds1.filter.all) == len(ds)
99
- ds4 = ray.get_dataset(filters=[filt1, filt2], apply_filter=True)
100
- assert len(ds4) == 47
118
+
119
+ ray.set_filters([filt1, fign2])
120
+ ds4 = ray.get_dataset()
121
+ assert len(ds4) == 22, "filter one applied first, filter two ignored"
122
+ assert np.sum(ds4.filter.all) == 22
101
123
 
102
124
 
103
- if __name__ == "__main__":
104
- # Run all tests
105
- loc = locals()
106
- for key in list(loc.keys()):
107
- if key.startswith("test_") and hasattr(loc[key], "__call__"):
108
- loc[key]()
125
+ def test_remove_filter():
126
+ path = pathlib.Path(__file__).parent / "data" / "calibration_beads_47.rtdc"
127
+
128
+ # initialize
129
+ slot = pipeline.Dataslot(path)
130
+ ds = slot.get_dataset()
131
+ assert len(ds) == 47
132
+ ray = pipeline.FilterRay(slot)
133
+
134
+ # come up with a few filters
135
+ # this does some simple things
136
+ filt1 = pipeline.Filter()
137
+ filt1.boxdict["area_um"] = {"start": np.min(ds["area_um"]),
138
+ "end": np.mean(ds["area_um"]),
139
+ "active": True}
140
+
141
+ ray.set_filters([filt1])
142
+ ds1 = ray.get_dataset()
143
+ assert len(ds1) == 22
144
+ assert np.sum(ds1.filter.all) == 22
145
+
146
+ ray.set_filters([])
147
+ ds2 = ray.get_dataset()
148
+ assert len(ds2) == 47
149
+ assert np.sum(ds2.filter.all) == 47