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.
- {dcscope-2.25.0 → dcscope-2.25.2}/CHANGELOG +10 -0
- {dcscope-2.25.0/dcscope.egg-info → dcscope-2.25.2}/PKG-INFO +2 -2
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/_version.py +3 -3
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/main.py +20 -8
- dcscope-2.25.2/dcscope/gui/settings.py +41 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/core.py +3 -2
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/filter_ray.py +47 -59
- {dcscope-2.25.0 → dcscope-2.25.2/dcscope.egg-info}/PKG-INFO +2 -2
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/SOURCES.txt +1 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/requires.txt +1 -1
- {dcscope-2.25.0 → dcscope-2.25.2}/pyproject.toml +1 -1
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_filter.py +99 -1
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_pipeline_filter_ray.py +66 -25
- {dcscope-2.25.0 → dcscope-2.25.2}/.github/workflows/check.yml +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/.github/workflows/deploy_github.yml +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/.github/workflows/deploy_pypi.yml +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/.gitignore +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/.readthedocs.yml +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/LICENSE +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/MANIFEST.in +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/README.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/DCscope.icns +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/DCscope.ico +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/DCscopeLauncher.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/Readme.md +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/hook-dcscope.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/macos_DCscope.spec +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/macos_build_app.sh +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/macos_build_requirements.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_DCscope.spec +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_build_requirements.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_dcscope.iss_dummy +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/build-recipes/win_make_iss.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/__main__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/extensions.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_basins.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_basins.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_filter.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_filter.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_log.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_log.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_meta.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_meta.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_plot.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_slot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_slot.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_tables.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_tables.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_view.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/ana_view.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/dlg_slot_reorder.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/analysis/dlg_slot_reorder.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/bulk/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/bulk/bulk_emodulus.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/bulk/bulk_emodulus.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_dataset.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_dataset.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_results.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_lme4_results.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_stats.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/compute/comp_stats.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/dcor/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/dcor/dcor.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2data.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2data.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2filter.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2filter.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/export/e2plot.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/helpers.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/main.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/Readme.md +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/block_matrix.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/block_matrix.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/data_matrix.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_dataset.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_dataset.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_element.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_element.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_filter.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/dm_filter.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/plot_matrix.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/pm_element.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/pm_plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/matrix/pm_plot.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/pipeline_plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/pipeline_plot.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/preferences.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/preferences.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_main.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_main.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_scatter.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/quick_view/qv_style.css +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/update.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/bg_thread.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/bulk_list.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/bulk_list.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/double_spin_box_nan.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/feature_combobox.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/get_path.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/key_value_table_widget.css +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/key_value_table_widget.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/mdi_subwindow_wo_close.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/qrangeslider.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/rangecontrol.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/rangecontrol.ui +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/simple_image_view.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/simple_plot_widget.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/so_colorbaritem.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/gui/widgets/wait_cursor.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/idiom.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/COPYING-ICONS +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/COPYING.LIB +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/README +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/application-exit.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/code-context.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-cancel.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-close.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-messages.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-ok-apply.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/dialog-ok.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/document-open-folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/document-open.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/document-save.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/documentinfo.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/draw-watercolor.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/edit-clear-all.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/edit-clear.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/edit-paste.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/globe.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/gtk-preferences.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/list-add.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/messagebox_warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/object-columns.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/object-order-lower.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/object-rows.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/office-chart-line-stacked.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/office-chart-ring.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/office-chart-scatter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/path-mode-polyline.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/preferences-activities.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/remove.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/search.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/show-grid.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/special_paste.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/tools-wizard.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-calendar-list.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-filter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-list-tree.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/view-statistics.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/16/visibility.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/application-exit.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/code-context.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-cancel.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-close.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-messages.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-ok-apply.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/dialog-ok.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/document-open-folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/document-open.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/document-save.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/documentinfo.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/draw-watercolor.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/edit-clear-all.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/edit-clear.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/edit-paste.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/globe.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/gtk-preferences.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/list-add.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/messagebox_warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/object-columns.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/object-order-lower.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/object-rows.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/office-chart-line-stacked.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/office-chart-ring.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/office-chart-scatter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/path-mode-polyline.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/preferences-activities.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/remove.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/special_paste.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/tools-wizard.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-calendar-list.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-filter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-list-tree.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/view-statistics.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/22/visibility.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/application-exit.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/code-context.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-cancel.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-close.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-messages.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-ok-apply.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/dialog-ok.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/document-open-folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/document-open.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/document-save.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/documentinfo.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/draw-watercolor.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/edit-clear-all.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/edit-clear.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/edit-paste.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/globe.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/gtk-preferences.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/list-add.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/messagebox_warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/object-columns.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/object-order-lower.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/object-rows.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/office-chart-line-stacked.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/office-chart-ring.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/office-chart-scatter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/path-mode-polyline.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/preferences-activities.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/remove.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/special_paste.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/tools-wizard.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-calendar-list.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-filter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-list-tree.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/view-statistics.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/24/visibility.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/application-exit.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-cancel.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-messages.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-ok-apply.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/dialog-ok.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/document-open-folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/document-open.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/document-save.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/gtk-preferences.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/object-order-lower.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/view-filter.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/actions/32/view-list-tree.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/16/folder-cloud.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/16/folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/22/folder-cloud.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/22/folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/24/folder-cloud.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/24/folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/32/folder-cloud.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/32/folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/64/folder-cloud.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/places/64/folder.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-error.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-information.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-question.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/16/dialog-warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-error.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-information.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-question.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/22/dialog-warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-error.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-information.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-question.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/24/dialog-warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-error.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-information.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-question.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/breeze/status/64/dialog-warning.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/collect_icons.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/dcor.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/edit-copy-anew.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/emodulus.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/filter_ray.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/region_channel.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/region_reservoir.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/rlang.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/dcscope/statistical_significance.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon-theme/index.theme +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/icon.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/img/splash.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/meta_tool.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/__init__.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/dataslot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/filter.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/pipeline/plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/plot_cache.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/session.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope/util.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/dependency_links.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/entry_points.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/dcscope.egg-info/top_level.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/README.md +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/Readme.md +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_icon.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_large_white.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_large_white.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/dcscope_splash.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/favicon.ico +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/artwork/favicon.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/conf.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/data/extension_fl1_density.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/dcscope.bib +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/extensions/fancy_include.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/extensions/github_changelog.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/extensions/rtd_pdf.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/ATTRIBUTION +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/area.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/aspect.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/brightness.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/deform.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/deform.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/fluorescence.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/fluorescence.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/inert_ratio.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/inert_ratio.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_countrate.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_countrate.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_area.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_area.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_porosity.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_porosity.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_ratios.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_filter_ratios.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_time.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_time.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_15um.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_20um.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_30um.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/qg_youngs_modulus_40um.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/rtdc-setup.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/volume.jpg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/figures/volume.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/index.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/requirements.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/.gitignore +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/CD66+_CD14-.poly +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots.sh +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_dcor.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_emodulus.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_export.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_extensions.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_lme4.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_lme4_diff.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_qg_statistics.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/make_scrots_ui.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_dcor_dlg.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_badtemp.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_config.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_feature.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_emodulus_other.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_export_data.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_extensions.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_diff_init.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_diff_results.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_init.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_lme4_results.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_statistics_folder.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/qg_statistics_init.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/scrots.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_basins.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_filter.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_logs.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_meta.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_plot.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_slot.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_ana_tables.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_block_matrix.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_main.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_qv_event.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_qv_poly.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/scrots/ui_qv_settings.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_changelog.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_devs.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_getting_started.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_imprint.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_interface.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_batch_stats.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_consistency_check.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_dcor.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_export_data.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_extensions.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_filtering.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_lme4.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_qg_youngs_modulus.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_quick_guides.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_rtdc_basics.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/docs/sec_z_bib.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/setup.cfg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/README.md +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/conftest.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/artificial_with_image_bg.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/blood_rbc_leukocytes.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/blood_rbc_qpi_data.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/calibration_beads_47.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/cytoshot_blood.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/ext_feat_anc_plugin_ca.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/extreme_shear.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/naiad-capture_blood_pipeline.rtdc +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_1_0_basic.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_1_2_plot_color_emodulus.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_1_6_no_events.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_5_0_dcor_lme4.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/data/version_2_5_0_dcor_lme4_diff.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/requirements.txt +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_extensions.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_ana_meta.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_basic.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_bulk_emodulus.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_compute_lme4.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_compute_stats.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_emodulus.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_export_data.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_export_filter.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_export_plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_matrix.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_pipeline_plot.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_plotting.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_quickview.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_reorder_datasets.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_gui_update.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_pipeline_core.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_session.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests/test_util.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/.gitignore +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/Readme.rst +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export.py +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export.so2 +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_log-large-points-export-png_expected.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_log-large-points-export-svg_expected.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-export-png_expected.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-export-svg_expected.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot1-export-png_expected.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot1-export-svg_expected.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot2-export-png_expected.png +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-and-contour-subplot2-export-svg_expected.svg +0 -0
- {dcscope-2.25.0 → dcscope-2.25.2}/tests-manual/plot-export_scatter-long-title-export-png_expected.png +0 -0
- {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.
|
|
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.
|
|
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.
|
|
32
|
-
__version_tuple__ = version_tuple = (2, 25,
|
|
31
|
+
__version__ = version = '2.25.2'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 25, 2)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
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=
|
|
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
|
-
|
|
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,
|
|
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,
|
|
681
|
-
'
|
|
682
|
-
|
|
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,
|
|
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(
|
|
468
|
-
|
|
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
|
-
#:
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
33
|
-
"""Add a filter
|
|
34
|
-
|
|
30
|
+
def _add_segment(self, ds, filt):
|
|
31
|
+
"""Add a filter segment"""
|
|
32
|
+
ds.reset_filter()
|
|
35
33
|
filt.update_dataset(ds)
|
|
36
|
-
self.
|
|
37
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
95
|
-
|
|
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
|
-
|
|
100
|
-
# do not modify
|
|
101
|
-
ds = self._new_child(rtdc_ds
|
|
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
|
-
|
|
116
|
-
|
|
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.
|
|
121
|
-
# just create a new
|
|
122
|
-
ds = self.
|
|
123
|
-
elif filt.hash != self.
|
|
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
|
-
#
|
|
126
|
-
self.
|
|
127
|
-
|
|
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
|
-
#
|
|
132
|
-
|
|
133
|
-
|
|
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 =
|
|
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,
|
|
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 =
|
|
158
|
+
self._filters = filters
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dcscope
|
|
3
|
-
Version: 2.25.
|
|
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.
|
|
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
|
|
@@ -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) ==
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
assert
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
ds4 = ray.get_dataset(
|
|
100
|
-
assert len(ds4) ==
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|