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.
Files changed (198) hide show
  1. dasmixer-0.3.0/LICENSE.txt +21 -0
  2. dasmixer-0.3.0/PKG-INFO +187 -0
  3. dasmixer-0.3.0/README.md +140 -0
  4. dasmixer-0.3.0/dasmixer/__init__.py +1 -0
  5. dasmixer-0.3.0/dasmixer/__main__.py +5 -0
  6. dasmixer-0.3.0/dasmixer/api/__init__.py +5 -0
  7. dasmixer-0.3.0/dasmixer/api/calculations/__init__.py +0 -0
  8. dasmixer-0.3.0/dasmixer/api/calculations/peptides/__init__.py +1 -0
  9. dasmixer-0.3.0/dasmixer/api/calculations/peptides/matching.py +161 -0
  10. dasmixer-0.3.0/dasmixer/api/calculations/peptides/protein_map.py +529 -0
  11. dasmixer-0.3.0/dasmixer/api/calculations/ppm/__init__.py +2 -0
  12. dasmixer-0.3.0/dasmixer/api/calculations/ppm/dataclasses.py +16 -0
  13. dasmixer-0.3.0/dasmixer/api/calculations/ppm/seqfixer.py +613 -0
  14. dasmixer-0.3.0/dasmixer/api/calculations/proteins/__init__.py +0 -0
  15. dasmixer-0.3.0/dasmixer/api/calculations/proteins/enrich.py +43 -0
  16. dasmixer-0.3.0/dasmixer/api/calculations/proteins/lfq.py +115 -0
  17. dasmixer-0.3.0/dasmixer/api/calculations/proteins/map_identifications.py +59 -0
  18. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/__init__.py +96 -0
  19. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/algorithms.py +433 -0
  20. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/exceptions.py +33 -0
  21. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/prediction.py +615 -0
  22. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/protein.py +688 -0
  23. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/sample.py +369 -0
  24. dasmixer-0.3.0/dasmixer/api/calculations/proteins/sempai/utils.py +353 -0
  25. dasmixer-0.3.0/dasmixer/api/calculations/spectra/__init__.py +21 -0
  26. dasmixer-0.3.0/dasmixer/api/calculations/spectra/coverage_worker.py +196 -0
  27. dasmixer-0.3.0/dasmixer/api/calculations/spectra/identification_processor.py +257 -0
  28. dasmixer-0.3.0/dasmixer/api/calculations/spectra/ion_match.py +285 -0
  29. dasmixer-0.3.0/dasmixer/api/calculations/spectra/plot_flow.py +35 -0
  30. dasmixer-0.3.0/dasmixer/api/calculations/spectra/plot_matches.py +224 -0
  31. dasmixer-0.3.0/dasmixer/api/config.py +226 -0
  32. dasmixer-0.3.0/dasmixer/api/export/__init__.py +1 -0
  33. dasmixer-0.3.0/dasmixer/api/export/joined_export.py +217 -0
  34. dasmixer-0.3.0/dasmixer/api/export/mgf_export.py +324 -0
  35. dasmixer-0.3.0/dasmixer/api/export/mztab_export.py +320 -0
  36. dasmixer-0.3.0/dasmixer/api/export/shared_state.py +43 -0
  37. dasmixer-0.3.0/dasmixer/api/export/system_export.py +204 -0
  38. dasmixer-0.3.0/dasmixer/api/inputs/__init__.py +80 -0
  39. dasmixer-0.3.0/dasmixer/api/inputs/base.py +67 -0
  40. dasmixer-0.3.0/dasmixer/api/inputs/peptides/MQ_Evidences.py +96 -0
  41. dasmixer-0.3.0/dasmixer/api/inputs/peptides/PLGS.py +133 -0
  42. dasmixer-0.3.0/dasmixer/api/inputs/peptides/PowerNovo2.py +65 -0
  43. dasmixer-0.3.0/dasmixer/api/inputs/peptides/__init__.py +26 -0
  44. dasmixer-0.3.0/dasmixer/api/inputs/peptides/base.py +121 -0
  45. dasmixer-0.3.0/dasmixer/api/inputs/peptides/table_importer.py +528 -0
  46. dasmixer-0.3.0/dasmixer/api/inputs/proteins/__init__.py +1 -0
  47. dasmixer-0.3.0/dasmixer/api/inputs/proteins/fasta.py +201 -0
  48. dasmixer-0.3.0/dasmixer/api/inputs/registry.py +155 -0
  49. dasmixer-0.3.0/dasmixer/api/inputs/registry_new.py +155 -0
  50. dasmixer-0.3.0/dasmixer/api/inputs/spectra/__init__.py +10 -0
  51. dasmixer-0.3.0/dasmixer/api/inputs/spectra/base.py +100 -0
  52. dasmixer-0.3.0/dasmixer/api/inputs/spectra/mgf.py +178 -0
  53. dasmixer-0.3.0/dasmixer/api/inputs/spectra/plgs_mgf_with_leid.py +5 -0
  54. dasmixer-0.3.0/dasmixer/api/plugin_loader.py +351 -0
  55. dasmixer-0.3.0/dasmixer/api/project/__init__.py +6 -0
  56. dasmixer-0.3.0/dasmixer/api/project/array_utils.py +34 -0
  57. dasmixer-0.3.0/dasmixer/api/project/core/__init__.py +6 -0
  58. dasmixer-0.3.0/dasmixer/api/project/core/base.py +124 -0
  59. dasmixer-0.3.0/dasmixer/api/project/core/lifecycle.py +169 -0
  60. dasmixer-0.3.0/dasmixer/api/project/dataclasses.py +245 -0
  61. dasmixer-0.3.0/dasmixer/api/project/migrations.py +122 -0
  62. dasmixer-0.3.0/dasmixer/api/project/mixins/__init__.py +25 -0
  63. dasmixer-0.3.0/dasmixer/api/project/mixins/fast_ident_match_mixin.py +5 -0
  64. dasmixer-0.3.0/dasmixer/api/project/mixins/identification_mixin.py +499 -0
  65. dasmixer-0.3.0/dasmixer/api/project/mixins/peptide_mixin.py +614 -0
  66. dasmixer-0.3.0/dasmixer/api/project/mixins/plot_mixin.py +249 -0
  67. dasmixer-0.3.0/dasmixer/api/project/mixins/protein_mixin.py +832 -0
  68. dasmixer-0.3.0/dasmixer/api/project/mixins/query_mixin.py +49 -0
  69. dasmixer-0.3.0/dasmixer/api/project/mixins/report_mixin.py +80 -0
  70. dasmixer-0.3.0/dasmixer/api/project/mixins/sample_mixin.py +399 -0
  71. dasmixer-0.3.0/dasmixer/api/project/mixins/spectra_mixin.py +334 -0
  72. dasmixer-0.3.0/dasmixer/api/project/mixins/subset_mixin.py +104 -0
  73. dasmixer-0.3.0/dasmixer/api/project/mixins/tool_mixin.py +107 -0
  74. dasmixer-0.3.0/dasmixer/api/project/project.py +72 -0
  75. dasmixer-0.3.0/dasmixer/api/project/project_spectra_mapping.py +58 -0
  76. dasmixer-0.3.0/dasmixer/api/project/schema.py +258 -0
  77. dasmixer-0.3.0/dasmixer/api/reporting/__init__.py +14 -0
  78. dasmixer-0.3.0/dasmixer/api/reporting/base.py +611 -0
  79. dasmixer-0.3.0/dasmixer/api/reporting/registry.py +66 -0
  80. dasmixer-0.3.0/dasmixer/api/reporting/reports/__init__.py +18 -0
  81. dasmixer-0.3.0/dasmixer/api/reporting/reports/coverage_report.py +300 -0
  82. dasmixer-0.3.0/dasmixer/api/reporting/reports/pca_report.py +338 -0
  83. dasmixer-0.3.0/dasmixer/api/reporting/reports/sample_report.py +96 -0
  84. dasmixer-0.3.0/dasmixer/api/reporting/reports/toolmatch_report.py +245 -0
  85. dasmixer-0.3.0/dasmixer/api/reporting/reports/upset.py +297 -0
  86. dasmixer-0.3.0/dasmixer/api/reporting/reports/volcano_report.py +240 -0
  87. dasmixer-0.3.0/dasmixer/api/reporting/templates/report.html.j2 +213 -0
  88. dasmixer-0.3.0/dasmixer/api/reporting/viewer.py +58 -0
  89. dasmixer-0.3.0/dasmixer/cli/__init__.py +3 -0
  90. dasmixer-0.3.0/dasmixer/cli/commands/__init__.py +3 -0
  91. dasmixer-0.3.0/dasmixer/cli/commands/import_data.py +281 -0
  92. dasmixer-0.3.0/dasmixer/cli/commands/project.py +56 -0
  93. dasmixer-0.3.0/dasmixer/cli/commands/subset.py +146 -0
  94. dasmixer-0.3.0/dasmixer/gui/__init__.py +3 -0
  95. dasmixer-0.3.0/dasmixer/gui/actions/__init__.py +21 -0
  96. dasmixer-0.3.0/dasmixer/gui/actions/base.py +47 -0
  97. dasmixer-0.3.0/dasmixer/gui/actions/ion_actions.py +343 -0
  98. dasmixer-0.3.0/dasmixer/gui/actions/lfq_action.py +112 -0
  99. dasmixer-0.3.0/dasmixer/gui/actions/protein_ident_action.py +113 -0
  100. dasmixer-0.3.0/dasmixer/gui/actions/protein_map_action.py +150 -0
  101. dasmixer-0.3.0/dasmixer/gui/app.py +554 -0
  102. dasmixer-0.3.0/dasmixer/gui/components/__init__.py +16 -0
  103. dasmixer-0.3.0/dasmixer/gui/components/base_plot_view.py +419 -0
  104. dasmixer-0.3.0/dasmixer/gui/components/base_table_and_plot_view.py +58 -0
  105. dasmixer-0.3.0/dasmixer/gui/components/base_table_view.py +738 -0
  106. dasmixer-0.3.0/dasmixer/gui/components/plotly_viewer.py +166 -0
  107. dasmixer-0.3.0/dasmixer/gui/components/progress_dialog.py +68 -0
  108. dasmixer-0.3.0/dasmixer/gui/components/report_form.py +386 -0
  109. dasmixer-0.3.0/dasmixer/gui/components/sample_select_dialog.py +115 -0
  110. dasmixer-0.3.0/dasmixer/gui/utils.py +77 -0
  111. dasmixer-0.3.0/dasmixer/gui/views/__init__.py +3 -0
  112. dasmixer-0.3.0/dasmixer/gui/views/manage_samples_view.py +832 -0
  113. dasmixer-0.3.0/dasmixer/gui/views/plugins_view.py +400 -0
  114. dasmixer-0.3.0/dasmixer/gui/views/project_view.py +233 -0
  115. dasmixer-0.3.0/dasmixer/gui/views/settings_view.py +520 -0
  116. dasmixer-0.3.0/dasmixer/gui/views/start_view.py +169 -0
  117. dasmixer-0.3.0/dasmixer/gui/views/tabs/__init__.py +1 -0
  118. dasmixer-0.3.0/dasmixer/gui/views/tabs/export/__init__.py +1 -0
  119. dasmixer-0.3.0/dasmixer/gui/views/tabs/export/export_tab.py +52 -0
  120. dasmixer-0.3.0/dasmixer/gui/views/tabs/export/joined_section.py +152 -0
  121. dasmixer-0.3.0/dasmixer/gui/views/tabs/export/mgf_section.py +217 -0
  122. dasmixer-0.3.0/dasmixer/gui/views/tabs/export/mztab_section.py +166 -0
  123. dasmixer-0.3.0/dasmixer/gui/views/tabs/export/system_section.py +111 -0
  124. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/README.md +202 -0
  125. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/__init__.py +6 -0
  126. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/actions_section.py +196 -0
  127. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/base_section.py +103 -0
  128. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/base_section_old.py +89 -0
  129. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/dialogs/__init__.py +5 -0
  130. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/dialogs/load_fasta_dialog.py +175 -0
  131. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/dialogs/progress_dialog.py +236 -0
  132. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/fasta_section.py +118 -0
  133. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/ion_calculations.py +236 -0
  134. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/ion_settings_section.py +235 -0
  135. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/matching_section.py +88 -0
  136. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/peptide_ion_plot_view.py +105 -0
  137. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/peptide_ion_table_view.py +314 -0
  138. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/peptides_tab_new.py +200 -0
  139. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/search_section.py +329 -0
  140. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/shared_state.py +68 -0
  141. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides/tool_settings_section.py +571 -0
  142. dasmixer-0.3.0/dasmixer/gui/views/tabs/peptides_tab.py +1038 -0
  143. dasmixer-0.3.0/dasmixer/gui/views/tabs/plots/__init__.py +5 -0
  144. dasmixer-0.3.0/dasmixer/gui/views/tabs/plots/plots_tab.py +558 -0
  145. dasmixer-0.3.0/dasmixer/gui/views/tabs/plots/templates/plots_export.html.j2 +50 -0
  146. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/README.md +136 -0
  147. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/__init__.py +5 -0
  148. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/base_section.py +103 -0
  149. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/detection_section.py +136 -0
  150. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/enrichment_section.py +87 -0
  151. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/lfq_section.py +304 -0
  152. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/protein_concentration_plot_view.py +264 -0
  153. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/protein_identifications_table_view.py +217 -0
  154. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/protein_statistics_table_view.py +178 -0
  155. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/proteins_tab.py +221 -0
  156. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/shared_state.py +52 -0
  157. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins/table_section.py +163 -0
  158. dasmixer-0.3.0/dasmixer/gui/views/tabs/proteins_tab_old.py +48 -0
  159. dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/__init__.py +5 -0
  160. dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/report_item.py +441 -0
  161. dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/reports_tab.py +160 -0
  162. dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/settings_section.py +172 -0
  163. dasmixer-0.3.0/dasmixer/gui/views/tabs/reports/shared_state.py +20 -0
  164. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/README.md +147 -0
  165. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/__init__.py +5 -0
  166. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/base_section.py +83 -0
  167. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/constants.py +29 -0
  168. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/__init__.py +17 -0
  169. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/add_tool_dialog.py +154 -0
  170. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/group_dialog.py +192 -0
  171. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_mode_dialog.py +147 -0
  172. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_pattern_dialog.py +492 -0
  173. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_single_dialog.py +307 -0
  174. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/import_stacked_dialog.py +292 -0
  175. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/sample_dialog.py +165 -0
  176. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/dialogs/tool_dialog.py +210 -0
  177. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/groups_section.py +174 -0
  178. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/import_handlers.py +517 -0
  179. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/import_section.py +21 -0
  180. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/samples_section.py +959 -0
  181. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/samples_summary_section.py +144 -0
  182. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/samples_tab.py +261 -0
  183. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/shared_state.py +30 -0
  184. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples/tools_section.py +169 -0
  185. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples_tab.py +1445 -0
  186. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples_tab_old.py +4 -0
  187. dasmixer-0.3.0/dasmixer/gui/views/tabs/samples_tab_patch.txt +140 -0
  188. dasmixer-0.3.0/dasmixer/main.py +157 -0
  189. dasmixer-0.3.0/dasmixer/utils/__init__.py +5 -0
  190. dasmixer-0.3.0/dasmixer/utils/lic.py +18 -0
  191. dasmixer-0.3.0/dasmixer/utils/logger.py +54 -0
  192. dasmixer-0.3.0/dasmixer/utils/mq_evidences.py +54 -0
  193. dasmixer-0.3.0/dasmixer/utils/ppm.py +159 -0
  194. dasmixer-0.3.0/dasmixer/utils/seek_files.py +25 -0
  195. dasmixer-0.3.0/dasmixer/utils/seqfixer_utils.py +168 -0
  196. dasmixer-0.3.0/dasmixer/utils/show_pathways.py +31 -0
  197. dasmixer-0.3.0/dasmixer/versions.py +13 -0
  198. 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.
@@ -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
+
@@ -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__
@@ -0,0 +1,5 @@
1
+ """Entry point for python -m dasmixer."""
2
+ from dasmixer.main import app
3
+
4
+ if __name__ == '__main__':
5
+ app()
@@ -0,0 +1,5 @@
1
+ """DASMixer API package."""
2
+
3
+ from .project.project import Project
4
+
5
+ __all__ = ['Project']
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']]