dasmixer 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dasmixer-0.3.0/LICENSE.txt +21 -0
- dasmixer-0.3.0/PKG-INFO +187 -0
- dasmixer-0.3.0/README.md +140 -0
- dasmixer-0.3.0/dasmixer/__init__.py +1 -0
- dasmixer-0.3.0/dasmixer/__main__.py +5 -0
- dasmixer-0.3.0/dasmixer/api/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/api/calculations/__init__.py +0 -0
- dasmixer-0.3.0/dasmixer/api/calculations/peptides/__init__.py +1 -0
- dasmixer-0.3.0/dasmixer/api/calculations/peptides/matching.py +161 -0
- dasmixer-0.3.0/dasmixer/api/calculations/peptides/protein_map.py +529 -0
- dasmixer-0.3.0/dasmixer/api/calculations/ppm/__init__.py +2 -0
- dasmixer-0.3.0/dasmixer/api/calculations/ppm/dataclasses.py +16 -0
- dasmixer-0.3.0/dasmixer/api/calculations/ppm/seqfixer.py +613 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/__init__.py +0 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/enrich.py +43 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/lfq.py +115 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/map_identifications.py +59 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/__init__.py +96 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/algorithms.py +433 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/exceptions.py +33 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/prediction.py +615 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/protein.py +688 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/sample.py +369 -0
- dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/utils.py +353 -0
- dasmixer-0.3.0/dasmixer/api/calculations/spectra/__init__.py +21 -0
- dasmixer-0.3.0/dasmixer/api/calculations/spectra/coverage_worker.py +196 -0
- dasmixer-0.3.0/dasmixer/api/calculations/spectra/identification_processor.py +257 -0
- dasmixer-0.3.0/dasmixer/api/calculations/spectra/ion_match.py +285 -0
- dasmixer-0.3.0/dasmixer/api/calculations/spectra/plot_flow.py +35 -0
- dasmixer-0.3.0/dasmixer/api/calculations/spectra/plot_matches.py +224 -0
- dasmixer-0.3.0/dasmixer/api/config.py +226 -0
- dasmixer-0.3.0/dasmixer/api/export/__init__.py +1 -0
- dasmixer-0.3.0/dasmixer/api/export/joined_export.py +217 -0
- dasmixer-0.3.0/dasmixer/api/export/mgf_export.py +324 -0
- dasmixer-0.3.0/dasmixer/api/export/mztab_export.py +320 -0
- dasmixer-0.3.0/dasmixer/api/export/shared_state.py +43 -0
- dasmixer-0.3.0/dasmixer/api/export/system_export.py +204 -0
- dasmixer-0.3.0/dasmixer/api/inputs/__init__.py +80 -0
- dasmixer-0.3.0/dasmixer/api/inputs/base.py +67 -0
- dasmixer-0.3.0/dasmixer/api/inputs/peptides/MQ_Evidences.py +96 -0
- dasmixer-0.3.0/dasmixer/api/inputs/peptides/PLGS.py +133 -0
- dasmixer-0.3.0/dasmixer/api/inputs/peptides/PowerNovo2.py +65 -0
- dasmixer-0.3.0/dasmixer/api/inputs/peptides/__init__.py +26 -0
- dasmixer-0.3.0/dasmixer/api/inputs/peptides/base.py +121 -0
- dasmixer-0.3.0/dasmixer/api/inputs/peptides/table_importer.py +528 -0
- dasmixer-0.3.0/dasmixer/api/inputs/proteins/__init__.py +1 -0
- dasmixer-0.3.0/dasmixer/api/inputs/proteins/fasta.py +201 -0
- dasmixer-0.3.0/dasmixer/api/inputs/registry.py +155 -0
- dasmixer-0.3.0/dasmixer/api/inputs/registry_new.py +155 -0
- dasmixer-0.3.0/dasmixer/api/inputs/spectra/__init__.py +10 -0
- dasmixer-0.3.0/dasmixer/api/inputs/spectra/base.py +100 -0
- dasmixer-0.3.0/dasmixer/api/inputs/spectra/mgf.py +178 -0
- dasmixer-0.3.0/dasmixer/api/inputs/spectra/plgs_mgf_with_leid.py +5 -0
- dasmixer-0.3.0/dasmixer/api/plugin_loader.py +351 -0
- dasmixer-0.3.0/dasmixer/api/project/__init__.py +6 -0
- dasmixer-0.3.0/dasmixer/api/project/array_utils.py +34 -0
- dasmixer-0.3.0/dasmixer/api/project/core/__init__.py +6 -0
- dasmixer-0.3.0/dasmixer/api/project/core/base.py +124 -0
- dasmixer-0.3.0/dasmixer/api/project/core/lifecycle.py +169 -0
- dasmixer-0.3.0/dasmixer/api/project/dataclasses.py +245 -0
- dasmixer-0.3.0/dasmixer/api/project/migrations.py +122 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/__init__.py +25 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/fast_ident_match_mixin.py +5 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/identification_mixin.py +499 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/peptide_mixin.py +614 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/plot_mixin.py +249 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/protein_mixin.py +832 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/query_mixin.py +49 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/report_mixin.py +80 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/sample_mixin.py +399 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/spectra_mixin.py +334 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/subset_mixin.py +104 -0
- dasmixer-0.3.0/dasmixer/api/project/mixins/tool_mixin.py +107 -0
- dasmixer-0.3.0/dasmixer/api/project/project.py +72 -0
- dasmixer-0.3.0/dasmixer/api/project/project_spectra_mapping.py +58 -0
- dasmixer-0.3.0/dasmixer/api/project/schema.py +258 -0
- dasmixer-0.3.0/dasmixer/api/reporting/__init__.py +14 -0
- dasmixer-0.3.0/dasmixer/api/reporting/base.py +611 -0
- dasmixer-0.3.0/dasmixer/api/reporting/registry.py +66 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/__init__.py +18 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/coverage_report.py +300 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/pca_report.py +338 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/sample_report.py +96 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/toolmatch_report.py +245 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/upset.py +297 -0
- dasmixer-0.3.0/dasmixer/api/reporting/reports/volcano_report.py +240 -0
- dasmixer-0.3.0/dasmixer/api/reporting/templates/report.html.j2 +213 -0
- dasmixer-0.3.0/dasmixer/api/reporting/viewer.py +58 -0
- dasmixer-0.3.0/dasmixer/cli/__init__.py +3 -0
- dasmixer-0.3.0/dasmixer/cli/commands/__init__.py +3 -0
- dasmixer-0.3.0/dasmixer/cli/commands/import_data.py +281 -0
- dasmixer-0.3.0/dasmixer/cli/commands/project.py +56 -0
- dasmixer-0.3.0/dasmixer/cli/commands/subset.py +146 -0
- dasmixer-0.3.0/dasmixer/gui/__init__.py +3 -0
- dasmixer-0.3.0/dasmixer/gui/actions/__init__.py +21 -0
- dasmixer-0.3.0/dasmixer/gui/actions/base.py +47 -0
- dasmixer-0.3.0/dasmixer/gui/actions/ion_actions.py +343 -0
- dasmixer-0.3.0/dasmixer/gui/actions/lfq_action.py +112 -0
- dasmixer-0.3.0/dasmixer/gui/actions/protein_ident_action.py +113 -0
- dasmixer-0.3.0/dasmixer/gui/actions/protein_map_action.py +150 -0
- dasmixer-0.3.0/dasmixer/gui/app.py +554 -0
- dasmixer-0.3.0/dasmixer/gui/components/__init__.py +16 -0
- dasmixer-0.3.0/dasmixer/gui/components/base_plot_view.py +419 -0
- dasmixer-0.3.0/dasmixer/gui/components/base_table_and_plot_view.py +58 -0
- dasmixer-0.3.0/dasmixer/gui/components/base_table_view.py +738 -0
- dasmixer-0.3.0/dasmixer/gui/components/plotly_viewer.py +166 -0
- dasmixer-0.3.0/dasmixer/gui/components/progress_dialog.py +68 -0
- dasmixer-0.3.0/dasmixer/gui/components/report_form.py +386 -0
- dasmixer-0.3.0/dasmixer/gui/components/sample_select_dialog.py +115 -0
- dasmixer-0.3.0/dasmixer/gui/utils.py +77 -0
- dasmixer-0.3.0/dasmixer/gui/views/__init__.py +3 -0
- dasmixer-0.3.0/dasmixer/gui/views/manage_samples_view.py +832 -0
- dasmixer-0.3.0/dasmixer/gui/views/plugins_view.py +400 -0
- dasmixer-0.3.0/dasmixer/gui/views/project_view.py +233 -0
- dasmixer-0.3.0/dasmixer/gui/views/settings_view.py +520 -0
- dasmixer-0.3.0/dasmixer/gui/views/start_view.py +169 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/__init__.py +1 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/export/__init__.py +1 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/export/export_tab.py +52 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/export/joined_section.py +152 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/export/mgf_section.py +217 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/export/mztab_section.py +166 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/export/system_section.py +111 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/README.md +202 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/__init__.py +6 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/actions_section.py +196 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/base_section.py +103 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/base_section_old.py +89 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/dialogs/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/dialogs/load_fasta_dialog.py +175 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/dialogs/progress_dialog.py +236 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/fasta_section.py +118 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/ion_calculations.py +236 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/ion_settings_section.py +235 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/matching_section.py +88 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/peptide_ion_plot_view.py +105 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/peptide_ion_table_view.py +314 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/peptides_tab_new.py +200 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/search_section.py +329 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/shared_state.py +68 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/tool_settings_section.py +571 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides_tab.py +1038 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/plots/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/plots/plots_tab.py +558 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/plots/templates/plots_export.html.j2 +50 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/README.md +136 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/base_section.py +103 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/detection_section.py +136 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/enrichment_section.py +87 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/lfq_section.py +304 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/protein_concentration_plot_view.py +264 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/protein_identifications_table_view.py +217 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/protein_statistics_table_view.py +178 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/proteins_tab.py +221 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/shared_state.py +52 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/table_section.py +163 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins_tab_old.py +48 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/report_item.py +441 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/reports_tab.py +160 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/settings_section.py +172 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/shared_state.py +20 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/README.md +147 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/base_section.py +83 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/constants.py +29 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/__init__.py +17 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/add_tool_dialog.py +154 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/group_dialog.py +192 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_mode_dialog.py +147 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_pattern_dialog.py +492 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_single_dialog.py +307 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_stacked_dialog.py +292 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/sample_dialog.py +165 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/tool_dialog.py +210 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/groups_section.py +174 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/import_handlers.py +517 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/import_section.py +21 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/samples_section.py +959 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/samples_summary_section.py +144 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/samples_tab.py +261 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/shared_state.py +30 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/tools_section.py +169 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples_tab.py +1445 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples_tab_old.py +4 -0
- dasmixer-0.3.0/dasmixer/gui/views/tabs/samples_tab_patch.txt +140 -0
- dasmixer-0.3.0/dasmixer/main.py +157 -0
- dasmixer-0.3.0/dasmixer/utils/__init__.py +5 -0
- dasmixer-0.3.0/dasmixer/utils/lic.py +18 -0
- dasmixer-0.3.0/dasmixer/utils/logger.py +54 -0
- dasmixer-0.3.0/dasmixer/utils/mq_evidences.py +54 -0
- dasmixer-0.3.0/dasmixer/utils/ppm.py +159 -0
- dasmixer-0.3.0/dasmixer/utils/seek_files.py +25 -0
- dasmixer-0.3.0/dasmixer/utils/seqfixer_utils.py +168 -0
- dasmixer-0.3.0/dasmixer/utils/show_pathways.py +31 -0
- dasmixer-0.3.0/dasmixer/versions.py +13 -0
- dasmixer-0.3.0/pyproject.toml +68 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Laboratory of Structural Proteomics, IBMC, Moscow.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
dasmixer-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dasmixer
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary:
|
|
5
|
+
License-File: LICENSE.txt
|
|
6
|
+
Author: gluck
|
|
7
|
+
Author-email: glucksistemi@gmail.com
|
|
8
|
+
Requires-Python: <4.0, >=3.11
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
14
|
+
Requires-Dist: aiocsv (>=1.4.0,<2.0.0)
|
|
15
|
+
Requires-Dist: aiofiles (>=25.1.0,<26.0.0)
|
|
16
|
+
Requires-Dist: aiosqlite (>=0.22.1,<0.23.0)
|
|
17
|
+
Requires-Dist: docxtpl (>=0.20.2,<0.21.0)
|
|
18
|
+
Requires-Dist: flet[all] (>=0.80.4,<0.81.0)
|
|
19
|
+
Requires-Dist: html-for-docx (>=1.1.3,<2.0.0)
|
|
20
|
+
Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
|
|
21
|
+
Requires-Dist: kaleido (>=1.2.0,<2.0.0)
|
|
22
|
+
Requires-Dist: mztabwriter[pandas] (>=0.1.0,<0.2.0)
|
|
23
|
+
Requires-Dist: npysearch (>=1.3.1,<2.0.0) ; sys_platform != "win32"
|
|
24
|
+
Requires-Dist: npysearch @ https://github.com/protdb/npysearch/releases/download/v1.3.2/npysearch-1.3.2-cp312-cp312-win_amd64.whl ; sys_platform == "win32" and python_version == "3.12"
|
|
25
|
+
Requires-Dist: npysearch @ https://github.com/protdb/npysearch/releases/download/v1.3.2/npysearch-1.3.2-cp314-cp314-win_amd64.whl ; sys_platform == "win32" and python_version == "3.14"
|
|
26
|
+
Requires-Dist: numpy (>=2.4.1,<3.0.0)
|
|
27
|
+
Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
|
|
28
|
+
Requires-Dist: pandas (>=2.3.3,<3.0.0)
|
|
29
|
+
Requires-Dist: parse (>=1.20.2,<2.0.0)
|
|
30
|
+
Requires-Dist: peptacular (>=2.5.1,<3.0.0)
|
|
31
|
+
Requires-Dist: plotly (>=6.5.2,<7.0.0)
|
|
32
|
+
Requires-Dist: pydantic (>=2.12.5,<3.0.0)
|
|
33
|
+
Requires-Dist: pydantic-settings (>=2.12.0,<3.0.0)
|
|
34
|
+
Requires-Dist: pyteomics (>=4.7.5,<5.0.0)
|
|
35
|
+
Requires-Dist: pythonnet (==3.0.5) ; sys_platform == "win32" and python_version < "3.14"
|
|
36
|
+
Requires-Dist: pythonnet (==3.1.0rc0) ; sys_platform == "win32" and python_version == "3.14"
|
|
37
|
+
Requires-Dist: pywebview (>=6.1,<7.0) ; sys_platform == "win32"
|
|
38
|
+
Requires-Dist: pywebview[gtk] (>=6.1,<7.0) ; sys_platform == "linux"
|
|
39
|
+
Requires-Dist: scikit-learn (>=1.8.0,<2.0.0)
|
|
40
|
+
Requires-Dist: smart-round (>=1.0.1,<2.0.0)
|
|
41
|
+
Requires-Dist: tabulate (>=0.9.0,<0.10.0)
|
|
42
|
+
Requires-Dist: typer (>=0.21.1,<0.22.0)
|
|
43
|
+
Requires-Dist: uniprot-meta-tool (>=0.2.1,<0.3.0)
|
|
44
|
+
Requires-Dist: xlrd (>=2.0.2,<3.0.0)
|
|
45
|
+
Description-Content-Type: text/markdown
|
|
46
|
+
|
|
47
|
+
# DASMixer
|
|
48
|
+
|
|
49
|
+
**DASMixer** is a cross-platform desktop application for integrating and comparing peptide identification data from mass spectrometry experiments. It is designed to merge de novo sequencing results with library search identifications, perform full comparative proteomics workflows, and produce publication-ready reports.
|
|
50
|
+
|
|
51
|
+
Developed at the **Laboratory of Structural Proteomics, IBMC, Moscow**.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Key Features
|
|
56
|
+
|
|
57
|
+
### Data Loading
|
|
58
|
+
- Import spectra files in **MGF** format (MZML support planned)
|
|
59
|
+
- Import peptide identification results from:
|
|
60
|
+
- **PowerNovo 2** (de novo sequencing)
|
|
61
|
+
- **MaxQuant** (Evidence files)
|
|
62
|
+
- **PLGS** (Waters library search)
|
|
63
|
+
- Manage multiple spectra files and identification files per project
|
|
64
|
+
- Assign samples to comparison groups (subsets) for differential analysis
|
|
65
|
+
- Multi-file batch import via file-pattern matching (CLI & GUI)
|
|
66
|
+
|
|
67
|
+
### Peptide-Level Processing
|
|
68
|
+
- Merge and evaluate identifications across tools
|
|
69
|
+
- Set thresholds: PPM error, score, intensity coverage, sequence length, peak counts
|
|
70
|
+
- Calculate **ion coverage** (a, b, c, x, y, z ion types) with configurable parameters:
|
|
71
|
+
- Water/ammonia loss ions
|
|
72
|
+
- PPM-based matching tolerance
|
|
73
|
+
- Automatic **best-charge and isotope-offset correction** for de novo sequences
|
|
74
|
+
- Select preferred identification per spectrum (by PPM or intensity coverage)
|
|
75
|
+
- Interactive **ion annotation plots** via Plotly + PyWebView
|
|
76
|
+
|
|
77
|
+
### Protein-Level Processing
|
|
78
|
+
- Map peptides to protein sequences using **FASTA files** (via npysearch BLAST-like search)
|
|
79
|
+
- Support for partial sequence matches (for de novo identifications)
|
|
80
|
+
- Filter protein identifications by peptide count, unique evidence count
|
|
81
|
+
- Compute **sequence coverage** per protein per sample
|
|
82
|
+
- **LFQ quantification**: emPAI, iBAQ, NSAF, Top3 (via semPAI library)
|
|
83
|
+
- UniProt data enrichment (via uniprot-meta-tool)
|
|
84
|
+
|
|
85
|
+
### Reports and Export
|
|
86
|
+
- Built-in reports: PCA, Volcano plot, UpSet plot, Coverage report, Tool comparison, Sample summary
|
|
87
|
+
- Interactive preview in PyWebView
|
|
88
|
+
- Export to **HTML**, **XLSX**, **DOCX** formats
|
|
89
|
+
- Saved plots with configurable dimensions and font sizes
|
|
90
|
+
- Report history stored in project file
|
|
91
|
+
|
|
92
|
+
### Plugin System
|
|
93
|
+
- Install custom identification parsers (`.py` or `.zip` packages)
|
|
94
|
+
- Install custom report modules
|
|
95
|
+
- Manage plugins via GUI Plugins panel.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Installation
|
|
100
|
+
|
|
101
|
+
### From PyPI
|
|
102
|
+
```bash
|
|
103
|
+
pip install dasmixer
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Development setup (Poetry)
|
|
107
|
+
```bash
|
|
108
|
+
git clone git@github.com:protdb/dasmixer.git
|
|
109
|
+
cd dasmixer
|
|
110
|
+
poetry install
|
|
111
|
+
poetry run dasmixer
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Standalone windows executable:
|
|
115
|
+
|
|
116
|
+
**[Download latest version](https://github.com/protdb/dasmixer/releases/download/0.3.0/dasmixer0.3.0_Windows_x64.zip)**
|
|
117
|
+
|
|
118
|
+
Then you should unpack the archive and run dasmixer.exe from unpacking folder
|
|
119
|
+
|
|
120
|
+
**Requirements:** Python ≥ 3.11
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Usage
|
|
125
|
+
|
|
126
|
+
**[Read the instruction](docs/user/Instruction_DasMixer.pdf)**
|
|
127
|
+
|
|
128
|
+
Also check out the guide for the process [here](docs/user/workflow.md)
|
|
129
|
+
|
|
130
|
+
### Launch GUI
|
|
131
|
+
```bash
|
|
132
|
+
dasmixer # Start with empty screen
|
|
133
|
+
dasmixer project.dasmix # Open existing project in GUI
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Architecture
|
|
137
|
+
|
|
138
|
+
| Layer | Technology |
|
|
139
|
+
|---|---|
|
|
140
|
+
| GUI | Flet 0.80.5 |
|
|
141
|
+
| CLI | Typer |
|
|
142
|
+
| Interactive plots | Plotly + PyWebView |
|
|
143
|
+
| Data processing | Pandas, NumPy |
|
|
144
|
+
| Proteomics | Pyteomics, Peptacular, Npysearch |
|
|
145
|
+
| Project storage | SQLite (aiosqlite, async) |
|
|
146
|
+
| Configuration | Pydantic-settings |
|
|
147
|
+
| Export | openpyxl, html-for-docx, Kaleido |
|
|
148
|
+
|
|
149
|
+
The application exposes three parallel interfaces:
|
|
150
|
+
- **GUI** — desktop application window
|
|
151
|
+
- **CLI** — command-line tool (`dasmixer`)
|
|
152
|
+
- **Python API** — importable package for scripting
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Project File Format
|
|
160
|
+
|
|
161
|
+
Projects are stored as **single SQLite files** with the `.dasmix` extension. The database contains:
|
|
162
|
+
|
|
163
|
+
- Project metadata and settings
|
|
164
|
+
- Spectra (MGF data as compressed NumPy arrays)
|
|
165
|
+
- All identification data
|
|
166
|
+
- Protein sequences and identification results
|
|
167
|
+
- LFQ quantification results
|
|
168
|
+
- Generated reports and saved plots
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Documentation
|
|
173
|
+
|
|
174
|
+
| Document | Description |
|
|
175
|
+
|---|---|
|
|
176
|
+
| [docs/project/MASTER_SPEC_NEW.md](docs/project/MASTER_SPEC_NEW.md) | Full project specification and architecture overview |
|
|
177
|
+
| [docs/api/](docs/api/) | API reference for the Python package |
|
|
178
|
+
| [docs/gui/](docs/gui/) | GUI architecture and components |
|
|
179
|
+
| [docs/user/](docs/user/) | User guides (workflow, identification, proteins, reports) |
|
|
180
|
+
| [AGENTS.md](AGENTS.md) | AI agent development guide |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## License
|
|
185
|
+
|
|
186
|
+
Copyright © Laboratory of Structural Proteomics, IBMC, Moscow. All rights reserved.
|
|
187
|
+
|
dasmixer-0.3.0/README.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# DASMixer
|
|
2
|
+
|
|
3
|
+
**DASMixer** is a cross-platform desktop application for integrating and comparing peptide identification data from mass spectrometry experiments. It is designed to merge de novo sequencing results with library search identifications, perform full comparative proteomics workflows, and produce publication-ready reports.
|
|
4
|
+
|
|
5
|
+
Developed at the **Laboratory of Structural Proteomics, IBMC, Moscow**.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Key Features
|
|
10
|
+
|
|
11
|
+
### Data Loading
|
|
12
|
+
- Import spectra files in **MGF** format (MZML support planned)
|
|
13
|
+
- Import peptide identification results from:
|
|
14
|
+
- **PowerNovo 2** (de novo sequencing)
|
|
15
|
+
- **MaxQuant** (Evidence files)
|
|
16
|
+
- **PLGS** (Waters library search)
|
|
17
|
+
- Manage multiple spectra files and identification files per project
|
|
18
|
+
- Assign samples to comparison groups (subsets) for differential analysis
|
|
19
|
+
- Multi-file batch import via file-pattern matching (CLI & GUI)
|
|
20
|
+
|
|
21
|
+
### Peptide-Level Processing
|
|
22
|
+
- Merge and evaluate identifications across tools
|
|
23
|
+
- Set thresholds: PPM error, score, intensity coverage, sequence length, peak counts
|
|
24
|
+
- Calculate **ion coverage** (a, b, c, x, y, z ion types) with configurable parameters:
|
|
25
|
+
- Water/ammonia loss ions
|
|
26
|
+
- PPM-based matching tolerance
|
|
27
|
+
- Automatic **best-charge and isotope-offset correction** for de novo sequences
|
|
28
|
+
- Select preferred identification per spectrum (by PPM or intensity coverage)
|
|
29
|
+
- Interactive **ion annotation plots** via Plotly + PyWebView
|
|
30
|
+
|
|
31
|
+
### Protein-Level Processing
|
|
32
|
+
- Map peptides to protein sequences using **FASTA files** (via npysearch BLAST-like search)
|
|
33
|
+
- Support for partial sequence matches (for de novo identifications)
|
|
34
|
+
- Filter protein identifications by peptide count, unique evidence count
|
|
35
|
+
- Compute **sequence coverage** per protein per sample
|
|
36
|
+
- **LFQ quantification**: emPAI, iBAQ, NSAF, Top3 (via semPAI library)
|
|
37
|
+
- UniProt data enrichment (via uniprot-meta-tool)
|
|
38
|
+
|
|
39
|
+
### Reports and Export
|
|
40
|
+
- Built-in reports: PCA, Volcano plot, UpSet plot, Coverage report, Tool comparison, Sample summary
|
|
41
|
+
- Interactive preview in PyWebView
|
|
42
|
+
- Export to **HTML**, **XLSX**, **DOCX** formats
|
|
43
|
+
- Saved plots with configurable dimensions and font sizes
|
|
44
|
+
- Report history stored in project file
|
|
45
|
+
|
|
46
|
+
### Plugin System
|
|
47
|
+
- Install custom identification parsers (`.py` or `.zip` packages)
|
|
48
|
+
- Install custom report modules
|
|
49
|
+
- Manage plugins via GUI Plugins panel.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Installation
|
|
54
|
+
|
|
55
|
+
### From PyPI
|
|
56
|
+
```bash
|
|
57
|
+
pip install dasmixer
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Development setup (Poetry)
|
|
61
|
+
```bash
|
|
62
|
+
git clone git@github.com:protdb/dasmixer.git
|
|
63
|
+
cd dasmixer
|
|
64
|
+
poetry install
|
|
65
|
+
poetry run dasmixer
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Standalone windows executable:
|
|
69
|
+
|
|
70
|
+
**[Download latest version](https://github.com/protdb/dasmixer/releases/download/0.3.0/dasmixer0.3.0_Windows_x64.zip)**
|
|
71
|
+
|
|
72
|
+
Then you should unpack the archive and run dasmixer.exe from unpacking folder
|
|
73
|
+
|
|
74
|
+
**Requirements:** Python ≥ 3.11
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Usage
|
|
79
|
+
|
|
80
|
+
**[Read the instruction](docs/user/Instruction_DasMixer.pdf)**
|
|
81
|
+
|
|
82
|
+
Also check out the guide for the process [here](docs/user/workflow.md)
|
|
83
|
+
|
|
84
|
+
### Launch GUI
|
|
85
|
+
```bash
|
|
86
|
+
dasmixer # Start with empty screen
|
|
87
|
+
dasmixer project.dasmix # Open existing project in GUI
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Architecture
|
|
91
|
+
|
|
92
|
+
| Layer | Technology |
|
|
93
|
+
|---|---|
|
|
94
|
+
| GUI | Flet 0.80.5 |
|
|
95
|
+
| CLI | Typer |
|
|
96
|
+
| Interactive plots | Plotly + PyWebView |
|
|
97
|
+
| Data processing | Pandas, NumPy |
|
|
98
|
+
| Proteomics | Pyteomics, Peptacular, Npysearch |
|
|
99
|
+
| Project storage | SQLite (aiosqlite, async) |
|
|
100
|
+
| Configuration | Pydantic-settings |
|
|
101
|
+
| Export | openpyxl, html-for-docx, Kaleido |
|
|
102
|
+
|
|
103
|
+
The application exposes three parallel interfaces:
|
|
104
|
+
- **GUI** — desktop application window
|
|
105
|
+
- **CLI** — command-line tool (`dasmixer`)
|
|
106
|
+
- **Python API** — importable package for scripting
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Project File Format
|
|
114
|
+
|
|
115
|
+
Projects are stored as **single SQLite files** with the `.dasmix` extension. The database contains:
|
|
116
|
+
|
|
117
|
+
- Project metadata and settings
|
|
118
|
+
- Spectra (MGF data as compressed NumPy arrays)
|
|
119
|
+
- All identification data
|
|
120
|
+
- Protein sequences and identification results
|
|
121
|
+
- LFQ quantification results
|
|
122
|
+
- Generated reports and saved plots
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Documentation
|
|
127
|
+
|
|
128
|
+
| Document | Description |
|
|
129
|
+
|---|---|
|
|
130
|
+
| [docs/project/MASTER_SPEC_NEW.md](docs/project/MASTER_SPEC_NEW.md) | Full project specification and architecture overview |
|
|
131
|
+
| [docs/api/](docs/api/) | API reference for the Python package |
|
|
132
|
+
| [docs/gui/](docs/gui/) | GUI architecture and components |
|
|
133
|
+
| [docs/user/](docs/user/) | User guides (workflow, identification, proteins, reports) |
|
|
134
|
+
| [AGENTS.md](AGENTS.md) | AI agent development guide |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## License
|
|
139
|
+
|
|
140
|
+
Copyright © Laboratory of Structural Proteomics, IBMC, Moscow. All rights reserved.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from dasmixer.versions import APP_VERSION as __version__
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Peptide identification and matching."""
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""Peptide identification matching and selection."""
|
|
2
|
+
from typing import Literal
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
from dasmixer.api.project.project import Project
|
|
7
|
+
from dasmixer.utils.logger import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
async def select_preferred_identifications(
|
|
11
|
+
project: Project,
|
|
12
|
+
criterion: str,
|
|
13
|
+
tool_settings: dict[int, dict]
|
|
14
|
+
) -> int:
|
|
15
|
+
"""
|
|
16
|
+
Select preferred identifications for all spectra based on criterion.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
project: Project instance
|
|
20
|
+
criterion: Selection criterion — "ppm" or "intensity"
|
|
21
|
+
tool_settings: Tool-specific settings, mapping tool_id to:
|
|
22
|
+
- max_ppm: Maximum allowed PPM error (float)
|
|
23
|
+
- min_score: Minimum identification score (float)
|
|
24
|
+
- min_ion_intensity_coverage: Minimum % intensity coverage (float)
|
|
25
|
+
- use_protein_from_file: Use protein IDs from file (bool)
|
|
26
|
+
- min_protein_identity: Minimum protein sequence identity (float)
|
|
27
|
+
- denovo_correction: Apply de novo correction (bool)
|
|
28
|
+
- min_peptide_length: Minimum peptide length (int, default 7)
|
|
29
|
+
- max_peptide_length: Maximum peptide length (int, default 30)
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Number of spectra processed
|
|
33
|
+
"""
|
|
34
|
+
logger.info(f"Starting preferred identification selection (criterion: {criterion})")
|
|
35
|
+
logger.debug(f"Tool settings: {tool_settings}")
|
|
36
|
+
counter = 0
|
|
37
|
+
|
|
38
|
+
if criterion not in ("ppm", "intensity"):
|
|
39
|
+
raise ValueError(f"Invalid criterion: {criterion}. Must be 'ppm' or 'intensity'")
|
|
40
|
+
|
|
41
|
+
spectra_files = await project.get_spectra_files()
|
|
42
|
+
for _, spectra_file in spectra_files.iterrows():
|
|
43
|
+
idents_not_merged = []
|
|
44
|
+
for tool_id, tool_params in tool_settings.items():
|
|
45
|
+
idents = await project.get_identifications(spectra_file['id'], tool_id)
|
|
46
|
+
if tool_params.get("ignore_criteria", False):
|
|
47
|
+
idents_not_merged.append(idents.copy())
|
|
48
|
+
continue
|
|
49
|
+
max_ppm = tool_params.get("max_ppm", 50000)
|
|
50
|
+
min_score = tool_params.get("min_score", 0)
|
|
51
|
+
min_ion_intensity_coverage = tool_params["min_ion_intensity_coverage"]
|
|
52
|
+
min_len = tool_params.get("min_peptide_length", 7)
|
|
53
|
+
max_len = tool_params.get("max_peptide_length", 30)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
idents['canonical_length'] = idents['canonical_sequence'].str.len()
|
|
58
|
+
idents['ppm'] = idents['ppm'].abs()
|
|
59
|
+
if not tool_params.get("denovo_correction", False):
|
|
60
|
+
query = (
|
|
61
|
+
"ppm <= @max_ppm and "
|
|
62
|
+
"score >= @min_score and "
|
|
63
|
+
"intensity_coverage >= @min_ion_intensity_coverage and "
|
|
64
|
+
"canonical_length >= @min_len and "
|
|
65
|
+
"canonical_length <= @max_len"
|
|
66
|
+
)
|
|
67
|
+
else:
|
|
68
|
+
query = (
|
|
69
|
+
"ppm <= 50000 and "
|
|
70
|
+
"score >= @min_score and "
|
|
71
|
+
"intensity_coverage >= @min_ion_intensity_coverage and "
|
|
72
|
+
"canonical_length >= @min_len and "
|
|
73
|
+
"canonical_length <= @max_len"
|
|
74
|
+
)
|
|
75
|
+
idents_not_merged.append(idents.query(query).copy())
|
|
76
|
+
|
|
77
|
+
all_idents = pd.concat(idents_not_merged, ignore_index=True)
|
|
78
|
+
spectras = await project.get_spectra(spectra_file['id'])
|
|
79
|
+
|
|
80
|
+
for _, spectrum in spectras.iterrows():
|
|
81
|
+
spectra_id = spectrum['id']
|
|
82
|
+
spectra_idents = all_idents.query("spectre_id == @spectra_id")
|
|
83
|
+
if len(spectra_idents) == 0:
|
|
84
|
+
continue
|
|
85
|
+
if criterion == "ppm":
|
|
86
|
+
crit = 'ppm'
|
|
87
|
+
asc = True
|
|
88
|
+
else:
|
|
89
|
+
crit = 'intensity_coverage'
|
|
90
|
+
asc = False
|
|
91
|
+
best_id = spectra_idents.sort_values(crit, ascending=asc).iloc[0]['id']
|
|
92
|
+
await project.set_preferred_identification(spectra_id, best_id)
|
|
93
|
+
counter += 1
|
|
94
|
+
|
|
95
|
+
return counter
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
async def calculate_preferred_identifications_for_file(
|
|
99
|
+
project: Project,
|
|
100
|
+
spectra_file_id: int,
|
|
101
|
+
criterion: Literal['ppm', 'intensity'],
|
|
102
|
+
tool_settings: dict[int, dict]
|
|
103
|
+
) -> list[int]:
|
|
104
|
+
"""
|
|
105
|
+
Calculate preferred identification IDs for a single spectra file.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
project: Project instance
|
|
109
|
+
spectra_file_id: ID of spectra file to process
|
|
110
|
+
criterion: "ppm" or "intensity"
|
|
111
|
+
tool_settings: Tool-specific settings dict
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
List of identification IDs that should be marked as preferred
|
|
115
|
+
"""
|
|
116
|
+
if criterion not in ("ppm", "intensity"):
|
|
117
|
+
raise ValueError(f"Invalid criterion: {criterion}. Must be 'ppm' or 'intensity'")
|
|
118
|
+
|
|
119
|
+
idents_not_merged = []
|
|
120
|
+
for tool_id, tool_params in tool_settings.items():
|
|
121
|
+
max_ppm = tool_params.get("max_ppm", 50)
|
|
122
|
+
min_score = tool_params.get("min_score", 0)
|
|
123
|
+
min_ion_intensity_coverage = tool_params["min_ion_intensity_coverage"]
|
|
124
|
+
min_len = tool_params.get("min_peptide_length", 7)
|
|
125
|
+
max_len = tool_params.get("max_peptide_length", 30)
|
|
126
|
+
min_peaks = tool_params.get("min_spectre_peaks", 1)
|
|
127
|
+
top_peaks_count = tool_params.get("min_top_peaks", 1)
|
|
128
|
+
min_ions = tool_params.get("min_ions_covered", 1)
|
|
129
|
+
denovo_correction = tool_params.get("denovo_correction", False)
|
|
130
|
+
denovo_correction_ppm = tool_params.get("denovo_correction_ppm", 50000)
|
|
131
|
+
|
|
132
|
+
idents = await project.get_idents_for_preferred(
|
|
133
|
+
spectra_file_id=spectra_file_id,
|
|
134
|
+
tool_id=tool_id,
|
|
135
|
+
min_score=min_score,
|
|
136
|
+
max_abs_ppm=max_ppm if not denovo_correction else denovo_correction_ppm,
|
|
137
|
+
intensity_coverage=min_ion_intensity_coverage,
|
|
138
|
+
canonical_length=(min_len, max_len),
|
|
139
|
+
spectre_peaks_count=min_peaks,
|
|
140
|
+
ions_matched=min_ions,
|
|
141
|
+
top_peaks_covered=top_peaks_count,
|
|
142
|
+
)
|
|
143
|
+
logger.debug(idents)
|
|
144
|
+
logger.debug(f"{tool_id} {spectra_file_id}")
|
|
145
|
+
if denovo_correction:
|
|
146
|
+
idents['min_ppm'] = idents.apply(
|
|
147
|
+
lambda row: min(abs(row['ppm']), abs(row['matched_ppm'])), axis=1
|
|
148
|
+
)
|
|
149
|
+
idents = idents.query('min_ppm <= @max_ppm')
|
|
150
|
+
else:
|
|
151
|
+
try:
|
|
152
|
+
idents['min_ppm'] = idents['ppm'].abs()
|
|
153
|
+
except KeyError:
|
|
154
|
+
idents['min_ppm'] = None
|
|
155
|
+
idents_not_merged.append(idents.copy())
|
|
156
|
+
|
|
157
|
+
df = pd.concat(idents_not_merged, ignore_index=True)
|
|
158
|
+
if df.empty:
|
|
159
|
+
return []
|
|
160
|
+
idx = df.groupby('spectre_id')['min_ppm'].idxmin()
|
|
161
|
+
return [int(x) for x in df.loc[idx, 'id']]
|