dasmixer 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dasmixer/__init__.py +1 -0
- dasmixer/__main__.py +5 -0
- dasmixer/api/__init__.py +5 -0
- dasmixer/api/calculations/__init__.py +0 -0
- dasmixer/api/calculations/peptides/__init__.py +1 -0
- dasmixer/api/calculations/peptides/matching.py +161 -0
- dasmixer/api/calculations/peptides/protein_map.py +529 -0
- dasmixer/api/calculations/ppm/__init__.py +2 -0
- dasmixer/api/calculations/ppm/dataclasses.py +16 -0
- dasmixer/api/calculations/ppm/seqfixer.py +613 -0
- dasmixer/api/calculations/proteins/__init__.py +0 -0
- dasmixer/api/calculations/proteins/enrich.py +43 -0
- dasmixer/api/calculations/proteins/lfq.py +115 -0
- dasmixer/api/calculations/proteins/map_identifications.py +59 -0
- dasmixer/api/calculations/proteins/sempai/__init__.py +96 -0
- dasmixer/api/calculations/proteins/sempai/algorithms.py +433 -0
- dasmixer/api/calculations/proteins/sempai/exceptions.py +33 -0
- dasmixer/api/calculations/proteins/sempai/prediction.py +615 -0
- dasmixer/api/calculations/proteins/sempai/protein.py +688 -0
- dasmixer/api/calculations/proteins/sempai/sample.py +369 -0
- dasmixer/api/calculations/proteins/sempai/utils.py +353 -0
- dasmixer/api/calculations/spectra/__init__.py +21 -0
- dasmixer/api/calculations/spectra/coverage_worker.py +196 -0
- dasmixer/api/calculations/spectra/identification_processor.py +257 -0
- dasmixer/api/calculations/spectra/ion_match.py +285 -0
- dasmixer/api/calculations/spectra/plot_flow.py +35 -0
- dasmixer/api/calculations/spectra/plot_matches.py +224 -0
- dasmixer/api/config.py +226 -0
- dasmixer/api/export/__init__.py +1 -0
- dasmixer/api/export/joined_export.py +217 -0
- dasmixer/api/export/mgf_export.py +324 -0
- dasmixer/api/export/mztab_export.py +320 -0
- dasmixer/api/export/shared_state.py +43 -0
- dasmixer/api/export/system_export.py +204 -0
- dasmixer/api/inputs/__init__.py +80 -0
- dasmixer/api/inputs/base.py +67 -0
- dasmixer/api/inputs/peptides/MQ_Evidences.py +96 -0
- dasmixer/api/inputs/peptides/PLGS.py +133 -0
- dasmixer/api/inputs/peptides/PowerNovo2.py +65 -0
- dasmixer/api/inputs/peptides/__init__.py +26 -0
- dasmixer/api/inputs/peptides/base.py +121 -0
- dasmixer/api/inputs/peptides/table_importer.py +528 -0
- dasmixer/api/inputs/proteins/__init__.py +1 -0
- dasmixer/api/inputs/proteins/fasta.py +201 -0
- dasmixer/api/inputs/registry.py +155 -0
- dasmixer/api/inputs/registry_new.py +155 -0
- dasmixer/api/inputs/spectra/__init__.py +10 -0
- dasmixer/api/inputs/spectra/base.py +100 -0
- dasmixer/api/inputs/spectra/mgf.py +178 -0
- dasmixer/api/inputs/spectra/plgs_mgf_with_leid.py +5 -0
- dasmixer/api/plugin_loader.py +351 -0
- dasmixer/api/project/__init__.py +6 -0
- dasmixer/api/project/array_utils.py +34 -0
- dasmixer/api/project/core/__init__.py +6 -0
- dasmixer/api/project/core/base.py +124 -0
- dasmixer/api/project/core/lifecycle.py +169 -0
- dasmixer/api/project/dataclasses.py +245 -0
- dasmixer/api/project/migrations.py +122 -0
- dasmixer/api/project/mixins/__init__.py +25 -0
- dasmixer/api/project/mixins/fast_ident_match_mixin.py +5 -0
- dasmixer/api/project/mixins/identification_mixin.py +499 -0
- dasmixer/api/project/mixins/peptide_mixin.py +614 -0
- dasmixer/api/project/mixins/plot_mixin.py +249 -0
- dasmixer/api/project/mixins/protein_mixin.py +832 -0
- dasmixer/api/project/mixins/query_mixin.py +49 -0
- dasmixer/api/project/mixins/report_mixin.py +80 -0
- dasmixer/api/project/mixins/sample_mixin.py +399 -0
- dasmixer/api/project/mixins/spectra_mixin.py +334 -0
- dasmixer/api/project/mixins/subset_mixin.py +104 -0
- dasmixer/api/project/mixins/tool_mixin.py +107 -0
- dasmixer/api/project/project.py +72 -0
- dasmixer/api/project/project_spectra_mapping.py +58 -0
- dasmixer/api/project/schema.py +258 -0
- dasmixer/api/reporting/__init__.py +14 -0
- dasmixer/api/reporting/base.py +611 -0
- dasmixer/api/reporting/registry.py +66 -0
- dasmixer/api/reporting/reports/__init__.py +18 -0
- dasmixer/api/reporting/reports/coverage_report.py +300 -0
- dasmixer/api/reporting/reports/pca_report.py +338 -0
- dasmixer/api/reporting/reports/sample_report.py +96 -0
- dasmixer/api/reporting/reports/toolmatch_report.py +245 -0
- dasmixer/api/reporting/reports/upset.py +297 -0
- dasmixer/api/reporting/reports/volcano_report.py +240 -0
- dasmixer/api/reporting/templates/report.html.j2 +213 -0
- dasmixer/api/reporting/viewer.py +58 -0
- dasmixer/cli/__init__.py +3 -0
- dasmixer/cli/commands/__init__.py +3 -0
- dasmixer/cli/commands/import_data.py +281 -0
- dasmixer/cli/commands/project.py +56 -0
- dasmixer/cli/commands/subset.py +146 -0
- dasmixer/gui/__init__.py +3 -0
- dasmixer/gui/actions/__init__.py +21 -0
- dasmixer/gui/actions/base.py +47 -0
- dasmixer/gui/actions/ion_actions.py +343 -0
- dasmixer/gui/actions/lfq_action.py +112 -0
- dasmixer/gui/actions/protein_ident_action.py +113 -0
- dasmixer/gui/actions/protein_map_action.py +150 -0
- dasmixer/gui/app.py +554 -0
- dasmixer/gui/components/__init__.py +16 -0
- dasmixer/gui/components/base_plot_view.py +419 -0
- dasmixer/gui/components/base_table_and_plot_view.py +58 -0
- dasmixer/gui/components/base_table_view.py +738 -0
- dasmixer/gui/components/plotly_viewer.py +166 -0
- dasmixer/gui/components/progress_dialog.py +68 -0
- dasmixer/gui/components/report_form.py +386 -0
- dasmixer/gui/components/sample_select_dialog.py +115 -0
- dasmixer/gui/utils.py +77 -0
- dasmixer/gui/views/__init__.py +3 -0
- dasmixer/gui/views/manage_samples_view.py +832 -0
- dasmixer/gui/views/plugins_view.py +400 -0
- dasmixer/gui/views/project_view.py +233 -0
- dasmixer/gui/views/settings_view.py +520 -0
- dasmixer/gui/views/start_view.py +169 -0
- dasmixer/gui/views/tabs/__init__.py +1 -0
- dasmixer/gui/views/tabs/export/__init__.py +1 -0
- dasmixer/gui/views/tabs/export/export_tab.py +52 -0
- dasmixer/gui/views/tabs/export/joined_section.py +152 -0
- dasmixer/gui/views/tabs/export/mgf_section.py +217 -0
- dasmixer/gui/views/tabs/export/mztab_section.py +166 -0
- dasmixer/gui/views/tabs/export/system_section.py +111 -0
- dasmixer/gui/views/tabs/peptides/README.md +202 -0
- dasmixer/gui/views/tabs/peptides/__init__.py +6 -0
- dasmixer/gui/views/tabs/peptides/actions_section.py +196 -0
- dasmixer/gui/views/tabs/peptides/base_section.py +103 -0
- dasmixer/gui/views/tabs/peptides/base_section_old.py +89 -0
- dasmixer/gui/views/tabs/peptides/dialogs/__init__.py +5 -0
- dasmixer/gui/views/tabs/peptides/dialogs/load_fasta_dialog.py +175 -0
- dasmixer/gui/views/tabs/peptides/dialogs/progress_dialog.py +236 -0
- dasmixer/gui/views/tabs/peptides/fasta_section.py +118 -0
- dasmixer/gui/views/tabs/peptides/ion_calculations.py +236 -0
- dasmixer/gui/views/tabs/peptides/ion_settings_section.py +235 -0
- dasmixer/gui/views/tabs/peptides/matching_section.py +88 -0
- dasmixer/gui/views/tabs/peptides/peptide_ion_plot_view.py +105 -0
- dasmixer/gui/views/tabs/peptides/peptide_ion_table_view.py +314 -0
- dasmixer/gui/views/tabs/peptides/peptides_tab_new.py +200 -0
- dasmixer/gui/views/tabs/peptides/search_section.py +329 -0
- dasmixer/gui/views/tabs/peptides/shared_state.py +68 -0
- dasmixer/gui/views/tabs/peptides/tool_settings_section.py +571 -0
- dasmixer/gui/views/tabs/peptides_tab.py +1038 -0
- dasmixer/gui/views/tabs/plots/__init__.py +5 -0
- dasmixer/gui/views/tabs/plots/plots_tab.py +558 -0
- dasmixer/gui/views/tabs/plots/templates/plots_export.html.j2 +50 -0
- dasmixer/gui/views/tabs/proteins/README.md +136 -0
- dasmixer/gui/views/tabs/proteins/__init__.py +5 -0
- dasmixer/gui/views/tabs/proteins/base_section.py +103 -0
- dasmixer/gui/views/tabs/proteins/detection_section.py +136 -0
- dasmixer/gui/views/tabs/proteins/enrichment_section.py +87 -0
- dasmixer/gui/views/tabs/proteins/lfq_section.py +304 -0
- dasmixer/gui/views/tabs/proteins/protein_concentration_plot_view.py +264 -0
- dasmixer/gui/views/tabs/proteins/protein_identifications_table_view.py +217 -0
- dasmixer/gui/views/tabs/proteins/protein_statistics_table_view.py +178 -0
- dasmixer/gui/views/tabs/proteins/proteins_tab.py +221 -0
- dasmixer/gui/views/tabs/proteins/shared_state.py +52 -0
- dasmixer/gui/views/tabs/proteins/table_section.py +163 -0
- dasmixer/gui/views/tabs/proteins_tab_old.py +48 -0
- dasmixer/gui/views/tabs/reports/__init__.py +5 -0
- dasmixer/gui/views/tabs/reports/report_item.py +441 -0
- dasmixer/gui/views/tabs/reports/reports_tab.py +160 -0
- dasmixer/gui/views/tabs/reports/settings_section.py +172 -0
- dasmixer/gui/views/tabs/reports/shared_state.py +20 -0
- dasmixer/gui/views/tabs/samples/README.md +147 -0
- dasmixer/gui/views/tabs/samples/__init__.py +5 -0
- dasmixer/gui/views/tabs/samples/base_section.py +83 -0
- dasmixer/gui/views/tabs/samples/constants.py +29 -0
- dasmixer/gui/views/tabs/samples/dialogs/__init__.py +17 -0
- dasmixer/gui/views/tabs/samples/dialogs/add_tool_dialog.py +154 -0
- dasmixer/gui/views/tabs/samples/dialogs/group_dialog.py +192 -0
- dasmixer/gui/views/tabs/samples/dialogs/import_mode_dialog.py +147 -0
- dasmixer/gui/views/tabs/samples/dialogs/import_pattern_dialog.py +492 -0
- dasmixer/gui/views/tabs/samples/dialogs/import_single_dialog.py +307 -0
- dasmixer/gui/views/tabs/samples/dialogs/import_stacked_dialog.py +292 -0
- dasmixer/gui/views/tabs/samples/dialogs/sample_dialog.py +165 -0
- dasmixer/gui/views/tabs/samples/dialogs/tool_dialog.py +210 -0
- dasmixer/gui/views/tabs/samples/groups_section.py +174 -0
- dasmixer/gui/views/tabs/samples/import_handlers.py +517 -0
- dasmixer/gui/views/tabs/samples/import_section.py +21 -0
- dasmixer/gui/views/tabs/samples/samples_section.py +959 -0
- dasmixer/gui/views/tabs/samples/samples_summary_section.py +144 -0
- dasmixer/gui/views/tabs/samples/samples_tab.py +261 -0
- dasmixer/gui/views/tabs/samples/shared_state.py +30 -0
- dasmixer/gui/views/tabs/samples/tools_section.py +169 -0
- dasmixer/gui/views/tabs/samples_tab.py +1445 -0
- dasmixer/gui/views/tabs/samples_tab_old.py +4 -0
- dasmixer/gui/views/tabs/samples_tab_patch.txt +140 -0
- dasmixer/main.py +157 -0
- dasmixer/utils/__init__.py +5 -0
- dasmixer/utils/lic.py +18 -0
- dasmixer/utils/logger.py +54 -0
- dasmixer/utils/mq_evidences.py +54 -0
- dasmixer/utils/ppm.py +159 -0
- dasmixer/utils/seek_files.py +25 -0
- dasmixer/utils/seqfixer_utils.py +168 -0
- dasmixer/utils/show_pathways.py +31 -0
- dasmixer/versions.py +13 -0
- dasmixer-0.3.0.dist-info/METADATA +187 -0
- dasmixer-0.3.0.dist-info/RECORD +199 -0
- dasmixer-0.3.0.dist-info/WHEEL +4 -0
- dasmixer-0.3.0.dist-info/entry_points.txt +3 -0
- dasmixer-0.3.0.dist-info/licenses/LICENSE.txt +21 -0
dasmixer/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from dasmixer.versions import APP_VERSION as __version__
|
dasmixer/__main__.py
ADDED
dasmixer/api/__init__.py
ADDED
|
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']]
|