From 85e05cbbe68e36601d90c65dead5c4dfd6eb8365 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Mon, 11 Aug 2025 21:24:27 +0200 Subject: [PATCH 01/14] [Feature] Implement fragpipe reader --- .../constants/const_files/pg_reader.yaml | 19 ++++++++ alphabase/pg_reader/fragpipe_pg_reader.py | 47 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 alphabase/pg_reader/fragpipe_pg_reader.py diff --git a/alphabase/constants/const_files/pg_reader.yaml b/alphabase/constants/const_files/pg_reader.yaml index 541b23a2..d0c2803a 100644 --- a/alphabase/constants/const_files/pg_reader.yaml +++ b/alphabase/constants/const_files/pg_reader.yaml @@ -87,3 +87,22 @@ spectronaut: # At the beginning (^) of the string, match open square bracket "\\[", any number of digits "[0-9]+", closed square bracket "\\]" # Square brackets are special characters -> need to be escaped with "\[". The backslash itself needs to be escaped -> "\\[" "default": "^\\[[0-9]+\\]" + + +# https://fragpipe.nesvilab.org/docs/tutorial_fragpipe_outputs.html#combined_proteintsv +fragpipe: + reader_type: "fragpipe" + column_mapping: + "proteins": "Entry Name" + "uniprot_ids": "Protein ID" + "genes": "Gene Names" + "description": "Description" + + measurement_regex: + "raw": "Intensity$" + "razor": "Razor Intensity$" + "unique": "Unique Intensity$" + "total": "Total Intensity$" + "lfq": "MaxLFQ Intensity$" + "lfq_unique": "MaxLFQ Unique Intensity$" + "lfq_total": "MaxLFQ Total Intensity$" diff --git a/alphabase/pg_reader/fragpipe_pg_reader.py b/alphabase/pg_reader/fragpipe_pg_reader.py new file mode 100644 index 00000000..454a49a3 --- /dev/null +++ b/alphabase/pg_reader/fragpipe_pg_reader.py @@ -0,0 +1,47 @@ +"""FragPipe protein group reader.""" + +from typing import Literal, Optional, Union + +from .pg_reader import PGReaderBase, pg_reader_provider + + +class FragPipePGReader(PGReaderBase): + """Reader for `protein.tsv` reports from FragPipe. + + Example: + ------- + Per default, the reader will return the raw intensities from the `razor` method. Additional protein features are stored + in the dataframe index, samples are stored as columns. + + .. code-block:: python + + # Get raw intensities + reader = FragPipePGReader() + results = reader.import_file(download_path) + + + References: + ---------- + - FragPipe Documentation https://fragpipe.nesvilab.org/docs/tutorial_fragpipe_outputs.html#proteintsv + + """ + + _reader_type: str = "fragpipe" + + def __init__( # noqa: D107 inherited from base class + self, + *, + column_mapping: Optional[dict[str, str]] = None, + measurement_regex: Union[ + Literal[ + "raw", "razor", "unique", "total", "lfq", "lfq_unique", "lfq_total" + ], + None, + ] = "razor", + ): + super().__init__( + column_mapping=column_mapping, measurement_regex=measurement_regex + ) + + +pg_reader_provider.register_reader("fragpipe", reader_class=FragPipePGReader) From 4a46205eca58707cb2898252e2aab44a752ea2c5 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Mon, 11 Aug 2025 21:24:46 +0200 Subject: [PATCH 02/14] [API] Expose FragPipeReader to users --- alphabase/pg_reader/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/alphabase/pg_reader/__init__.py b/alphabase/pg_reader/__init__.py index 144a871e..459e7588 100644 --- a/alphabase/pg_reader/__init__.py +++ b/alphabase/pg_reader/__init__.py @@ -1,6 +1,7 @@ from .alphadia_pg_reader import AlphaDiaPGReader from .alphapept_pg_reader import AlphaPeptPGReader from .diann_pg_reader import DiannPGReader +from .fragpipe_pg_reader import FragPipePGReader from .maxquant_pg_reader import MaxQuantPGReader from .pg_reader import pg_reader_provider from .spectronaut_reader import SpectronautPGReader @@ -12,4 +13,5 @@ "AlphaPeptPGReader", "MaxQuantPGReader", "SpectronautPGReader", + "FragPipePGReader", ] From 808547b9010ebb35c8942b58b6bd85bfe8fd8e91 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Mon, 11 Aug 2025 21:25:23 +0200 Subject: [PATCH 03/14] [Tests] Add integration test for FragPipeReader --- tests/integration/test_pg_reader_provider.py | 9 +++++++++ tests/integration/test_pg_readers.py | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/tests/integration/test_pg_reader_provider.py b/tests/integration/test_pg_reader_provider.py index 2d58736c..084a5c95 100644 --- a/tests/integration/test_pg_reader_provider.py +++ b/tests/integration/test_pg_reader_provider.py @@ -4,6 +4,7 @@ AlphaDiaPGReader, AlphaPeptPGReader, DiannPGReader, + FragPipePGReader, MaxQuantPGReader, SpectronautPGReader, pg_reader_provider, @@ -48,3 +49,11 @@ def test_reader_provider(self) -> None: reader = pg_reader_provider.get_reader("spectronaut") assert isinstance(reader, SpectronautPGReader) + + +class TestFragPipePGReaderProvider: + def test_reader_provider(self) -> None: + """Test whether reader provider initializes FragPipe protein group reader correctly.""" + reader = pg_reader_provider.get_reader("fragpipe") + + assert isinstance(reader, FragPipePGReader) diff --git a/tests/integration/test_pg_readers.py b/tests/integration/test_pg_readers.py index b43b85ee..c0bb9827 100644 --- a/tests/integration/test_pg_readers.py +++ b/tests/integration/test_pg_readers.py @@ -7,6 +7,7 @@ AlphaDiaPGReader, AlphaPeptPGReader, DiannPGReader, + FragPipePGReader, MaxQuantPGReader, SpectronautPGReader, ) @@ -195,3 +196,19 @@ def test_import_real_file_parqet(self, example_spectronaut_parquet: str) -> None result_df = reader.import_file(file_path=file_path) pd.testing.assert_frame_equal(result_df, reference) + + +class TestFragPipePGReader: + def test_import_real_file(self, example_fragpipe_tsv: str) -> None: + """Test import of real FragPipe file""" + reader = FragPipePGReader() + + result_df = reader.import_file(example_fragpipe_tsv) + + assert result_df.shape == (10, 20) + assert result_df.index.names == [ + PGCols.PROTEINS, + PGCols.UNIPROT_IDS, + PGCols.GENES, + PGCols.DESCRIPTION, + ] From 38b995dffaee1972fb3790ca472790e55c7c48c3 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Mon, 11 Aug 2025 21:29:21 +0200 Subject: [PATCH 04/14] [Fix] Fix typo in URL --- alphabase/constants/const_files/pg_reader.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alphabase/constants/const_files/pg_reader.yaml b/alphabase/constants/const_files/pg_reader.yaml index d0c2803a..9c1e6bdc 100644 --- a/alphabase/constants/const_files/pg_reader.yaml +++ b/alphabase/constants/const_files/pg_reader.yaml @@ -89,7 +89,7 @@ spectronaut: "default": "^\\[[0-9]+\\]" -# https://fragpipe.nesvilab.org/docs/tutorial_fragpipe_outputs.html#combined_proteintsv +# https://fragpipe.nesvilab.org/docs/tutorial_fragpipe_outputs.html#proteintsv fragpipe: reader_type: "fragpipe" column_mapping: From deccde6f1c95f1c8edf436ce7e2f2df493ada394 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Sat, 23 Aug 2025 12:49:44 +0200 Subject: [PATCH 05/14] [Test] Update tests to work with local data (FragPipe PG reader) --- tests/integration/conftest.py | 25 +++++++++++++++++++++++++ tests/integration/test_pg_readers.py | 12 ++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 4bae62d7..1da056d0 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -193,3 +193,28 @@ def example_spectronaut_parquet(tmp_path) -> Path: REF_URL = "https://datashare.biochem.mpg.de/s/nhxU8NZXQt35BWw" return get_remote_data_with_ref(url=URL, ref_url=REF_URL, directory=tmp_path) + + +@pytest.fixture(scope="function") +def example_fragpipe_tsv(tmp_path) -> Path: + """Get and parse real FragPipe protein group report matrix (protein.tsv).""" + TEST_FILE_NAME = "pg_fragpipe" + TEST_DATA = """Protein Group SubGroup Protein Protein ID Entry Name Gene Names Protein Length Coverage Organism Protein Existence Description Protein Probability Top Peptide Probability Unique Stripped Peptides Summarized Total Spectral Count Summarized Unique Spectral Count S1 Razor Intensity S2 Razor Intensity S3 Razor Intensity S4 Razor Intensity S5 Razor Intensity S6 Razor Intensity S7 Razor Intensity S8 Razor Intensity S9 Razor Intensity S10 Razor Intensity S11 Razor Intensity S12 Razor Intensity S13 Razor Intensity S14 Razor Intensity S15 Razor Intensity S16 Razor Intensity S17 Razor Intensity S18 Razor Intensity S19 Razor Intensity S20 Razor Intensity +679 a sp|P02790|HEMO_HUMAN P02790 HEMO_HUMAN HPX 462 82.9 Homo sapiens OX=9606 1:Experimental evidence at protein level Hemopexin 1.0 0.9990000000000001 95 25026 25025 2216637.5 2295583.8 1240315.4 106460.28 1019385.2 2596973.0 3091005.2 2327599.5 2323380.0 3109355.8 2113776.8 2301295.2 2451093.5 142603.97 946154.75 3126271.8 2970801.5 2399545.8 3020956.8 3691187.2 +680 a sp|P02792|FRIL_HUMAN P02792 FRIL_HUMAN FTL 175 40.6 Homo sapiens OX=9606 1:Experimental evidence at protein level Ferritin light chain 1.0 0.9990000000000001 18 69 67 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +681 a sp|P02794|FRIH_HUMAN P02794 FRIH_HUMAN FTH1 183 53.6 Homo sapiens OX=9606 1:Experimental evidence at protein level Ferritin heavy chain 1.0 0.9990000000000001 15 15 15 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +682 a sp|P03951|FA11_HUMAN P03951 FA11_HUMAN F11 625 20.2 Homo sapiens OX=9606 1:Experimental evidence at protein level Coagulation factor XI 1.0 0.9990000000000001 11 18 18 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +683 a sp|P03952|KLKB1_HUMAN P03952 KLKB1_HUMAN KLKB1 638 41.7 Homo sapiens OX=9606 1:Experimental evidence at protein level Plasma kallikrein 1.0 0.9990000000000001 23 1022 1022 0.0 85066.71 0.0 0.0 74640.38 118894.164 111398.06 59677.086 45627.31200000001 36386.727 38690.133 70755.9 70384.055 102087.5 106722.82 102985.125 99397.76 45197.56 54068.883 45319.242 +684 a sp|P04003|C4BPA_HUMAN P04003 C4BPA_HUMAN C4BPA 597 40.2 Homo sapiens OX=9606 1:Experimental evidence at protein level C4b-binding protein alpha chain 1.0 0.9990000000000001 26 1645 1645 0.0 0.0 0.0 0.0 0.0 112257.234 30634.523 112197.33 107021.34 95892.05 100655.766 77396.234 78481.19 0.0 0.0 0.0 55184.43 25498.191000000006 43999.35 32183.307 +685 a sp|P04004|VTNC_HUMAN P04004 VTNC_HUMAN VTN 478 51.0 Homo sapiens OX=9606 1:Experimental evidence at protein level Vitronectin 1.0 0.9990000000000001 41 10829 10812 426109.1 531158.4 280231.38 972440.7 925719.9 1446606.2 841194.25 850832.94 911400.2 461015.6 349032.28 877507.94 1113970.9 980389.94 1374961.0 1188514.5 870155.6 1299377.1 1360895.5 614073.56 +686 a sp|P04040|CATA_HUMAN P04040 CATA_HUMAN CAT 527 43.8 Homo sapiens 1:Experimental evidence at protein level Catalase 1.0 0.9990000000000001 18 23 23 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +687 a sp|P04070|PROC_HUMAN P04070 PROC_HUMAN PROC 461 43.4 Homo sapiens OX=9606 1:Experimental evidence at protein level Vitamin K-dependent protein C 1.0 0.9990000000000001 15 65 65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39016.97 0.0 0.0 0.0 +688 a sp|P04114|APOB_HUMAN P04114 APOB_HUMAN APOB 4563 75.5 Homo sapiens OX=9606 1:Experimental evidence at protein level Apolipoprotein B-100 1.0 0.9990000000000001 573 103725 103716 603013.44 923688.06 591751.25 491850.03 397211.94 506224.94 319749.8 263752.28 390402.94 443494.1 498007.12 230024.48 265819.75 687710.9 762252.1 422017.75 1020169.75 196046.12 318726.28 480642.72 +""" + + file_path = write_test_data( + data=TEST_DATA, directory=tmp_path, test_case_name=TEST_FILE_NAME + ) + reference = get_local_reference_data(test_case_name=TEST_FILE_NAME) + + return file_path, reference diff --git a/tests/integration/test_pg_readers.py b/tests/integration/test_pg_readers.py index c0bb9827..76fa76a4 100644 --- a/tests/integration/test_pg_readers.py +++ b/tests/integration/test_pg_readers.py @@ -201,14 +201,10 @@ def test_import_real_file_parqet(self, example_spectronaut_parquet: str) -> None class TestFragPipePGReader: def test_import_real_file(self, example_fragpipe_tsv: str) -> None: """Test import of real FragPipe file""" + file_path, reference = example_fragpipe_tsv + reader = FragPipePGReader() - result_df = reader.import_file(example_fragpipe_tsv) + result_df = reader.import_file(file_path=file_path) - assert result_df.shape == (10, 20) - assert result_df.index.names == [ - PGCols.PROTEINS, - PGCols.UNIPROT_IDS, - PGCols.GENES, - PGCols.DESCRIPTION, - ] + pd.testing.assert_frame_equal(result_df, reference) From 6cbe7d95b8d638b2b663338683640b5f8b67ab46 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Sat, 23 Aug 2025 12:50:06 +0200 Subject: [PATCH 06/14] [Test-data] Add test reference data (PG fragpipe) --- .../reference_pg_fragpipe.parquet | Bin 0 -> 17172 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/integration/reference_data/reference_pg_fragpipe.parquet diff --git a/tests/integration/reference_data/reference_pg_fragpipe.parquet b/tests/integration/reference_data/reference_pg_fragpipe.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e775179856e90ea7f5dca175732222b5a65dcbf4 GIT binary patch literal 17172 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 Date: Tue, 12 Aug 2025 00:23:21 +0200 Subject: [PATCH 07/14] [Feature] Add MZTab protein group reader --- .../constants/const_files/pg_reader.yaml | 14 ++- alphabase/pg_reader/mztab_pg_reader.py | 103 ++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 alphabase/pg_reader/mztab_pg_reader.py diff --git a/alphabase/constants/const_files/pg_reader.yaml b/alphabase/constants/const_files/pg_reader.yaml index 9c1e6bdc..9d86db1e 100644 --- a/alphabase/constants/const_files/pg_reader.yaml +++ b/alphabase/constants/const_files/pg_reader.yaml @@ -97,7 +97,6 @@ fragpipe: "uniprot_ids": "Protein ID" "genes": "Gene Names" "description": "Description" - measurement_regex: "raw": "Intensity$" "razor": "Razor Intensity$" @@ -106,3 +105,16 @@ fragpipe: "lfq": "MaxLFQ Intensity$" "lfq_unique": "MaxLFQ Unique Intensity$" "lfq_total": "MaxLFQ Total Intensity$" + + +# mzTab +# version 2.0.0 (2019-03) +mztab: + reader_type: "mztab" + column_mapping: + "uniprot_ids": "accession" + "description": "description" + "source_db": "database" + measurement_regex: + "assay": "^protein_abundance_assay\\[[0-9]+\\]" # The protein's abundance as measured in the given assay through whatever technique was employed + "study_variable": "^protein_abundance_study_variable\\[[0-9]+\\]" # The protein's abundance as measured in the given study variable (condition) through whatever technique was employed diff --git a/alphabase/pg_reader/mztab_pg_reader.py b/alphabase/pg_reader/mztab_pg_reader.py new file mode 100644 index 00000000..de72a652 --- /dev/null +++ b/alphabase/pg_reader/mztab_pg_reader.py @@ -0,0 +1,103 @@ +"""FragPipe protein group reader.""" + +from pathlib import Path + +import pandas as pd + +from .pg_reader import PGReaderBase, pg_reader_provider + + +class MZTabPGReader(PGReaderBase): + """Reader for MZTab search engine output. + + MZTab is a standardized tab-delimited format for reporting proteomics and metabolomics results. + The format organizes data into distinct sections: metadata (MTD), protein groups (PRH/PRT), + peptides (PEH/PEP), PSMs (PSH/PSM), and small molecules (SMH/SML), with each section identified + by specific three-letter prefixes. This reader extracts protein-level quantification data from + the PRT lines, which contain protein abundances across samples or study variables. + + Example: + ------- + Per default, the reader will return the raw intensities from the `razor` method. Additional protein features are stored + in the dataframe index, samples are stored as columns. + + .. code-block:: python + + from alphabase.pg_reader import MZTabPGReader + + # Get raw intensities + reader = MZTabPGReader() + results = reader.import_file(path) + + + References: + ---------- + - Griss, J. et al. The mzTab Data Exchange Format: Communicating Mass-spectrometry-based Proteomics and Metabolomics Experimental Results to a Wider Audience*. Molecular & Cellular Proteomics 13, 2765-2775 (2014). + - Official MZTab Repository: https://github.com/HUPO-PSI/mzTab.git + - Official documentation: https://hupo-psi.github.io/mzTab/ + + """ + + _reader_type: str = "mztab" + + _PROTEIN_ROW_INDICATOR: str = "PRT" + _PROTEIN_HEADER_INDICATOR: str = "PRH" + _SEPARATOR: str = "\t" + + def _load_file(self, file_path: str) -> pd.DataFrame: + """Load MZTab file and extract protein data section. + + Parameters + ---------- + file_path : str + Path to MZTab file + + Returns + ------- + pd.DataFrame + DataFrame containing protein data from MZTab file + + Notes + ----- + Protein lines are indicated with a leading `PRT`. The protein metadata header is + indicated with a leading `PRH`. The file is tab separated. + + Raises + ------ + ValueError + If no protein data or metadata is found in the file + + """ + file_path = Path(file_path) + protein_header = None + protein_rows = [] + + with file_path.open() as f: + for line in f: + line_stripped = line.strip() + + if line_stripped.startswith(self._PROTEIN_HEADER_INDICATOR): + # Protein header line - remove 'PRH' prefix and parse columns + header_content = line_stripped[3:].strip() + protein_header = header_content.split(self._SEPARATOR) + + elif line_stripped.startswith(self._PROTEIN_ROW_INDICATOR): + # Protein data line - remove 'PRT' prefix and parse data + row_content = line_stripped[3:].strip() + protein_rows.append(row_content.split(self._SEPARATOR)) + + # Validate that we found protein data + if protein_header is None: + raise ValueError( + f"No protein header ({self._PROTEIN_HEADER_INDICATOR}) found in MZTab file" + ) + + if not protein_rows: + raise ValueError( + f"No protein data rows ({self._PROTEIN_ROW_INDICATOR}) found in MZTab file" + ) + + return pd.DataFrame(protein_rows, columns=protein_header) + + +pg_reader_provider.register_reader("mztab", reader_class=MZTabPGReader) From 6699facb05ba4214a3a137abb9b9747fecd6cbe3 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Tue, 12 Aug 2025 00:24:15 +0200 Subject: [PATCH 08/14] [API] Expose MZTab to users --- alphabase/pg_reader/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/alphabase/pg_reader/__init__.py b/alphabase/pg_reader/__init__.py index 459e7588..c16e3971 100644 --- a/alphabase/pg_reader/__init__.py +++ b/alphabase/pg_reader/__init__.py @@ -3,6 +3,7 @@ from .diann_pg_reader import DiannPGReader from .fragpipe_pg_reader import FragPipePGReader from .maxquant_pg_reader import MaxQuantPGReader +from .mztab_pg_reader import MZTabPGReader from .pg_reader import pg_reader_provider from .spectronaut_reader import SpectronautPGReader @@ -14,4 +15,5 @@ "MaxQuantPGReader", "SpectronautPGReader", "FragPipePGReader", + "MZTabPGReader", ] From 8e0e8c5fdfd2d659c3156f7653b167a731c71363 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Tue, 12 Aug 2025 00:33:12 +0200 Subject: [PATCH 09/14] [Tests] Add integration tests --- tests/integration/test_pg_reader_provider.py | 9 +++++++++ tests/integration/test_pg_readers.py | 1 + 2 files changed, 10 insertions(+) diff --git a/tests/integration/test_pg_reader_provider.py b/tests/integration/test_pg_reader_provider.py index 084a5c95..5d5d1f7a 100644 --- a/tests/integration/test_pg_reader_provider.py +++ b/tests/integration/test_pg_reader_provider.py @@ -6,6 +6,7 @@ DiannPGReader, FragPipePGReader, MaxQuantPGReader, + MZTabPGReader, SpectronautPGReader, pg_reader_provider, ) @@ -57,3 +58,11 @@ def test_reader_provider(self) -> None: reader = pg_reader_provider.get_reader("fragpipe") assert isinstance(reader, FragPipePGReader) + + +class TestMZTabPGReaderProvider: + def test_reader_provider(self) -> None: + """Test whether reader provider initializes MZTab protein group reader correctly.""" + reader = pg_reader_provider.get_reader("mztab") + + assert isinstance(reader, MZTabPGReader) diff --git a/tests/integration/test_pg_readers.py b/tests/integration/test_pg_readers.py index 76fa76a4..ca524edb 100644 --- a/tests/integration/test_pg_readers.py +++ b/tests/integration/test_pg_readers.py @@ -9,6 +9,7 @@ DiannPGReader, FragPipePGReader, MaxQuantPGReader, + MZTabPGReader, SpectronautPGReader, ) from alphabase.pg_reader.keys import PGCols From 2a2848ebd9fd2965fbce837989e313ee05edee42 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Tue, 12 Aug 2025 00:33:38 +0200 Subject: [PATCH 10/14] [Refactor] Set correct default values --- alphabase/pg_reader/mztab_pg_reader.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/alphabase/pg_reader/mztab_pg_reader.py b/alphabase/pg_reader/mztab_pg_reader.py index de72a652..3219c25d 100644 --- a/alphabase/pg_reader/mztab_pg_reader.py +++ b/alphabase/pg_reader/mztab_pg_reader.py @@ -1,6 +1,7 @@ """FragPipe protein group reader.""" from pathlib import Path +from typing import Literal, Optional, Union import pandas as pd @@ -44,6 +45,18 @@ class MZTabPGReader(PGReaderBase): _PROTEIN_HEADER_INDICATOR: str = "PRH" _SEPARATOR: str = "\t" + def __init__( # noqa: D107 inherited from base class + self, + *, + column_mapping: Optional[dict[str, str]] = None, + measurement_regex: Union[ + str, Literal["assay", "study_variable"], None # noqa: PYI051 raw and lfq are special cases and not equivalent to string + ] = "assay", + ): + super().__init__( + column_mapping=column_mapping, measurement_regex=measurement_regex + ) + def _load_file(self, file_path: str) -> pd.DataFrame: """Load MZTab file and extract protein data section. From 00c72f02aed296017355783d2f2c302ad1060aa0 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Tue, 12 Aug 2025 00:33:12 +0200 Subject: [PATCH 11/14] [Tests] Add integration tests --- tests/integration/conftest.py | 9 +++++++++ tests/integration/test_pg_readers.py | 15 +++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 1da056d0..331706b8 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -218,3 +218,12 @@ def example_fragpipe_tsv(tmp_path) -> Path: reference = get_local_reference_data(test_case_name=TEST_FILE_NAME) return file_path, reference + + +@pytest.fixture(scope="function") +def example_mztab(tmp_path) -> Path: + """Get and parse real MZTab report""" + URL = "https://datashare.biochem.mpg.de/s/ayieQHU9zjY89cl" + + download_path = DataShareDownloader(url=URL, output_dir=tmp_path).download() + return download_path diff --git a/tests/integration/test_pg_readers.py b/tests/integration/test_pg_readers.py index ca524edb..f9742c5b 100644 --- a/tests/integration/test_pg_readers.py +++ b/tests/integration/test_pg_readers.py @@ -209,3 +209,18 @@ def test_import_real_file(self, example_fragpipe_tsv: str) -> None: result_df = reader.import_file(file_path=file_path) pd.testing.assert_frame_equal(result_df, reference) + + +class TestMZTabPGReader: + def test_import_real_file(self, example_mztab: str) -> None: + """Test import of real MZTab file""" + reader = MZTabPGReader() + + result_df = reader.import_file(example_mztab) + + assert result_df.shape == (1249, 4) + assert result_df.index.names == [ + PGCols.UNIPROT_IDS, + PGCols.DESCRIPTION, + PGCols.SOURCE_DB, + ] From 86eeb7a7eb02b56d779c2200592829bb9cf9a175 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Sat, 23 Aug 2025 13:11:55 +0200 Subject: [PATCH 12/14] [Test] Refactor mztab integration test so that it runs with local data --- tests/integration/conftest.py | 24 ++++++++++++++++++++++-- tests/integration/test_pg_readers.py | 21 ++++++++++++++------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 331706b8..ce29948e 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -224,6 +224,26 @@ def example_fragpipe_tsv(tmp_path) -> Path: def example_mztab(tmp_path) -> Path: """Get and parse real MZTab report""" URL = "https://datashare.biochem.mpg.de/s/ayieQHU9zjY89cl" + REF_URL = "https://datashare.biochem.mpg.de/s/o7K2FEAmpmLUglS" - download_path = DataShareDownloader(url=URL, output_dir=tmp_path).download() - return download_path + return get_remote_data_with_ref(url=URL, ref_url=REF_URL, directory=tmp_path) + + +@pytest.fixture(scope="function") +def example_mztab_minimal(tmp_path) -> Path: + """Get and parse minimal MZTab report for local testing""" + TEST_FILE_NAME = "pg_mztab_minimal" + TEST_DATA = """COM Only variable modifications can be reported when the original source is a PRIDE XML file + +PRH accession description taxid species database database_version search_engine best_search_engine_score[1] search_engine_score[1]_ms_run[1] num_psms_ms_run[1] num_peptides_distinct_ms_run[1] num_peptides_unique_ms_run[1] ambiguity_members modifications protein_coverage protein_abundance_assay[1] protein_abundance_assay[2] protein_abundance_assay[3] protein_abundance_assay[4] +PRT 223462890 Spna2 protein [Mus musculus] 10090 Mus musculus (Mouse) NCBInr_2010_10 nr_101020.fasta [MS, MS:1001207, Mascot, ] 6539.67 6539.67 157 92 null null null 0 1 0.853 0.864 0.791 +PRT 19855078 RecName: Full=Sodium/potassium-transporting ATPase subunit alpha-3; Short=Na(+)/K(+) ATPase alpha-3 subunit; AltName: Full=Na(+)/K(+) ATPase alpha(III) subunit; AltName: Full=Sodium pump subunit alpha-3 10090 Mus musculus (Mouse) NCBInr_2010_10 nr_101020.fasta [MS, MS:1001207, Mascot, ] 6331.91 6331.91 144 49 null null 32-MOD:00425,525-MOD:00425,606-MOD:00425,725-MOD:00425,739-MOD:00425,940-MOD:00425 0 null null null null +PRT 21450277 sodium/potassium-transporting ATPase subunit alpha-1 precursor [Mus musculus] 10090 Mus musculus (Mouse) NCBInr_2010_10 nr_101020.fasta [MS, MS:1001207, Mascot, ] 4577.11 4577.11 112 39 null null 42-MOD:00425,616-MOD:00425,749-MOD:00425,950-MOD:00425 0 1 0.776 0.819 0.687 +PRT 6978545 sodium/potassium-transporting ATPase subunit alpha-2 precursor [Rattus norvegicus] 10090 Mus musculus (Mouse) NCBInr_2010_10 nr_101020.fasta [MS, MS:1001207, Mascot, ] 4342.81 4342.81 108 42 null null 40-MOD:00425,613-MOD:00425,746-MOD:00425,947-MOD:00425 0 1 0.784 0.848 0.693 + """ + file_path = write_test_data( + data=TEST_DATA, directory=tmp_path, test_case_name=TEST_FILE_NAME + ) + reference = get_local_reference_data(test_case_name=TEST_FILE_NAME) + + return file_path, reference diff --git a/tests/integration/test_pg_readers.py b/tests/integration/test_pg_readers.py index f9742c5b..13875838 100644 --- a/tests/integration/test_pg_readers.py +++ b/tests/integration/test_pg_readers.py @@ -214,13 +214,20 @@ def test_import_real_file(self, example_fragpipe_tsv: str) -> None: class TestMZTabPGReader: def test_import_real_file(self, example_mztab: str) -> None: """Test import of real MZTab file""" + file_path, reference = example_mztab + reader = MZTabPGReader() - result_df = reader.import_file(example_mztab) + result_df = reader.import_file(file_path=file_path) - assert result_df.shape == (1249, 4) - assert result_df.index.names == [ - PGCols.UNIPROT_IDS, - PGCols.DESCRIPTION, - PGCols.SOURCE_DB, - ] + pd.testing.assert_frame_equal(result_df, reference) + + def test_import_minimal_example(self, example_mztab_minimal: str) -> None: + """Test import of minimal example MZTab file""" + file_path, reference = example_mztab_minimal + + reader = MZTabPGReader() + + result_df = reader.import_file(file_path=file_path) + + pd.testing.assert_frame_equal(result_df, reference) From 15545aa193af0d26d21e3c81845aa2c223a020cf Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Sat, 23 Aug 2025 13:12:17 +0200 Subject: [PATCH 13/14] [Test-data] Add local test data (mzTAB PG Reader) --- .../reference_pg_mztab_minimal.parquet | Bin 0 -> 6116 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/integration/reference_data/reference_pg_mztab_minimal.parquet diff --git a/tests/integration/reference_data/reference_pg_mztab_minimal.parquet b/tests/integration/reference_data/reference_pg_mztab_minimal.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2bd11b55127e3292e9a2fa3683d96dec862d6663 GIT binary patch literal 6116 zcmeHLOK;=W6{h?ex$}TM4Fx%vHmZ^c4&nz%NtQTifKc-26Bv-~`}V zY7O*Y_4nTKz^A7FLSXdN82U!6kA8b`nPz)7W676+Cuw#PcxC{;+2hC#oG?4PxU!K< zc=H=<^kwj%HxBn=&$Kn)|NZf$w4K|UC z$Kn%=-ROye{{GT&lfRuK|1{k<`pfBm{Olg+>{+JBgsfK6Q8hF4aND&*hHJ~N?%Ib> zLC&jkQ8d*1p$r`HhkH#$bB%SY>4>%s-&UQLXxdh@cs$u%`6BChM}+6Q&^-IJ_vET^8=$w6AR1veEz+k#DLlCR|_G_HLS(A ziO}tzFKh!Fd-g42{mJi%Wf~}}vfHwot^05J2>#Ez#E(pJcas+#2ex1~Tc>JGlVKAR zoW$cyPz-fSH)6ipq`6!`djNw_nr5j^(}5Q9qLhg@FzGEM~NY`Lx)B6)`(Z@oJe ze6tsoMe-Rp)Lp~0!}miE z!$V~vyb=lzRR{DsC<@_2c=OgBVGtEBe-t*M_W}^QUxCK4rs~Sk=$vQ%$mv)}5gC-5 zii*%p=$)N`peZ#}*+KJ$>WGTyh@k!`teT(>%^R&f*w3sc!;c?7Co{?-{NjR)a7Wm^ zLie>;BX2xj0rEXhywDbNcyV5y?)C7BUV@jWdp*2jm*C~;UM;V4*)keX=Y&^l`CMX- zT0SSdTFcLCz*q{6h+f|+PV1H`I?WbNeO;4UVylBP-|C31Rn0qCX@c|&)r*;1^`6i=mG z$&t)$?Gr5}<;{{SmQx)m${&jY-_2|7THfGwnJIQ)o)QJt#dBuyR4Er4)e?JB(F)2| zn$s!_YbyfnmKhJbTJ|v2PQk4Rw4QG?Ym!;Ar8L5fbx^!DDv6Na)VcfjIYNAnUC}}Krs%5?o7*u61 zzmd<`T2+WQB!;&nL&kWe5})1LuW83+dW5^&0sV{v{^|1qKDolFk}X-1&ekj7AHa1h zOzF5%E_N$rUD_^D8sc3wbY05w$C8n8faeDAY|92qRRtYuSk9 zD|`EC!~6;09V*qURBD#zOG~+4C3N=uU#9CqgV4OdVI#>>;mUW zd*^xOahQcO%$~7ZX_S8#kFR3pzm6~Jn&S(_ERK1o0Vj}4C|4)M(u5jgUQ^sms$~;m z1Zrcq5-nJA4r&Gy!*O|S@xZXOjB|_EyxcxtD-?|$SArUnE;MAL1o_BzP;G%c zv_+xNsgw(G^bWZghwsocWb7x!D0O5;Kb1681M{8jy;ysz!D%RmLAPHYm}wjrTRR+d8 z2rt&S3cN1DQxRTr|0?i02+u)yXB@iRfYU3mD-N81FE7~NXrn#<;X@nppNRA>(1$^5 v7x^6@JrN99V(T+kbyj7|TE!Q)Q14k`f literal 0 HcmV?d00001 From 0343aeb81cf33e114ed6e4cf5c77e6276f3d24b3 Mon Sep 17 00:00:00 2001 From: Lucas Diedrich Date: Tue, 12 Aug 2025 00:53:30 +0200 Subject: [PATCH 14/14] [Doc] Add PG-reader API docs --- docs/api.rst | 1 + docs/modules_pg_reader.rst | 17 +++++++++++++++++ docs/pg_reader/alphadia_pg_reader.rst | 7 +++++++ docs/pg_reader/alphapept_pg_reader.rst | 7 +++++++ docs/pg_reader/diann_pg_reader.rst | 7 +++++++ docs/pg_reader/fragpipe_pg_reader.rst | 7 +++++++ docs/pg_reader/maxquant_pg_reader.rst | 7 +++++++ docs/pg_reader/mztab_pg_reader.rst | 7 +++++++ docs/pg_reader/pg_base.rst | 7 +++++++ docs/pg_reader/spectronaut_pg_reader.rst | 7 +++++++ 10 files changed, 74 insertions(+) create mode 100644 docs/modules_pg_reader.rst create mode 100644 docs/pg_reader/alphadia_pg_reader.rst create mode 100644 docs/pg_reader/alphapept_pg_reader.rst create mode 100644 docs/pg_reader/diann_pg_reader.rst create mode 100644 docs/pg_reader/fragpipe_pg_reader.rst create mode 100644 docs/pg_reader/maxquant_pg_reader.rst create mode 100644 docs/pg_reader/mztab_pg_reader.rst create mode 100644 docs/pg_reader/pg_base.rst create mode 100644 docs/pg_reader/spectronaut_pg_reader.rst diff --git a/docs/api.rst b/docs/api.rst index 7a4c8218..72a33557 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -36,6 +36,7 @@ Reader :maxdepth: 2 modules_psm_reader + modules_pg_reader I/O diff --git a/docs/modules_pg_reader.rst b/docs/modules_pg_reader.rst new file mode 100644 index 00000000..cc27886d --- /dev/null +++ b/docs/modules_pg_reader.rst @@ -0,0 +1,17 @@ +alphabase.pg_reader +=========================== + +All pg_readers can be accessed by +:obj:`pg_reader_provider `. + +.. toctree:: + :maxdepth: 1 + + pg_reader/pg_base + pg_reader/alphadia_pg_reader + pg_reader/alphapept_pg_reader + pg_reader/diann_pg_reader + pg_reader/fragpipe_pg_reader + pg_reader/maxquant_pg_reader + pg_reader/mztab_pg_reader + pg_reader/spectronaut_pg_reader diff --git a/docs/pg_reader/alphadia_pg_reader.rst b/docs/pg_reader/alphadia_pg_reader.rst new file mode 100644 index 00000000..c4c79426 --- /dev/null +++ b/docs/pg_reader/alphadia_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.alphadia_pg_reader +====================================== + +.. automodule:: alphabase.pg_reader.alphadia_pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/alphapept_pg_reader.rst b/docs/pg_reader/alphapept_pg_reader.rst new file mode 100644 index 00000000..e1d08593 --- /dev/null +++ b/docs/pg_reader/alphapept_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.alphapept_pg_reader +======================================= + +.. automodule:: alphabase.pg_reader.alphapept_pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/diann_pg_reader.rst b/docs/pg_reader/diann_pg_reader.rst new file mode 100644 index 00000000..15a7d0e8 --- /dev/null +++ b/docs/pg_reader/diann_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.diann_pg_reader +=================================== + +.. automodule:: alphabase.pg_reader.diann_pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/fragpipe_pg_reader.rst b/docs/pg_reader/fragpipe_pg_reader.rst new file mode 100644 index 00000000..fff83518 --- /dev/null +++ b/docs/pg_reader/fragpipe_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.fragpipe_pg_reader +====================================== + +.. automodule:: alphabase.pg_reader.fragpipe_pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/maxquant_pg_reader.rst b/docs/pg_reader/maxquant_pg_reader.rst new file mode 100644 index 00000000..5744f171 --- /dev/null +++ b/docs/pg_reader/maxquant_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.maxquant_pg_reader +====================================== + +.. automodule:: alphabase.pg_reader.maxquant_pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/mztab_pg_reader.rst b/docs/pg_reader/mztab_pg_reader.rst new file mode 100644 index 00000000..69475764 --- /dev/null +++ b/docs/pg_reader/mztab_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.mztab_pg_reader +====================================== + +.. automodule:: alphabase.pg_reader.mztab_pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/pg_base.rst b/docs/pg_reader/pg_base.rst new file mode 100644 index 00000000..a18e1710 --- /dev/null +++ b/docs/pg_reader/pg_base.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.base +======================== + +.. automodule:: alphabase.pg_reader.pg_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/pg_reader/spectronaut_pg_reader.rst b/docs/pg_reader/spectronaut_pg_reader.rst new file mode 100644 index 00000000..5bc39fca --- /dev/null +++ b/docs/pg_reader/spectronaut_pg_reader.rst @@ -0,0 +1,7 @@ +alphabase.pg_reader.spectronaut_reader +====================================== + +.. automodule:: alphabase.pg_reader.spectronaut_reader + :members: + :undoc-members: + :show-inheritance: