diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d1cf7ce1..0db58b8f 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,9 +1,9 @@ [bumpversion] -current_version = 1.2.3 +current_version = 1.2.4 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P[a-z]+)(?P\d+))? -serialize = +serialize = {major}.{minor}.{patch} {major}.{minor}.{patch} @@ -13,8 +13,6 @@ serialize = [bumpversion:file:./alphabase/__init__.py] -[bumpversion:file:./settings.ini] - [bumpversion:file:./docs/conf.py] [bumpversion:file:./release/one_click_linux_gui/control] @@ -30,5 +28,6 @@ serialize = [bumpversion:file:./release/one_click_windows_gui/create_installer_windows.sh] [bumpversion:file:./release/one_click_windows_gui/alphabase_innoinstaller.iss] + search = {current_version} replace = {new_version} diff --git a/.github/workflows/_run_tests.yml b/.github/workflows/_run_tests.yml new file mode 100644 index 00000000..1243b0a8 --- /dev/null +++ b/.github/workflows/_run_tests.yml @@ -0,0 +1,46 @@ +# reusable workflow to run all tests +name: run-tests + +on: + workflow_call: + inputs: + os: + required: true + type: string + python-version: + required: true + type: string + install-script: + required: true + type: string +jobs: + pre-commit: + runs-on: ${{ inputs.os }} + steps: + - uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v3 + with: + miniconda-version: "latest" + auto-update-conda: true + python-version: ${{ inputs.python-version }} + - name: Conda info + shell: bash -l {0} + run: conda info + - name: Perform pip installation with all stable dependencies + shell: bash -l {0} + run: | + cd misc + . ./${{ inputs.install-script }} + - name: Install additional dependencies required for testing + shell: bash -l {0} + run: | + conda activate alphabase + pip install pytest nbmake==1.5.3 + conda deactivate + - name: Run tests + shell: bash -l {0} + run: | + conda activate alphabase + cd tests + . ./run_tests.sh + conda deactivate diff --git a/.github/workflows/branch-checks.yaml b/.github/workflows/branch-checks.yaml new file mode 100644 index 00000000..033909a7 --- /dev/null +++ b/.github/workflows/branch-checks.yaml @@ -0,0 +1,26 @@ +# checks to run on branches for each pull request +name: branch-checks + +on: + pull_request: + +jobs: + pre-commit: + name: Run all pre-commit hooks + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 + - uses: pre-commit/action@v3.0.1 + # For feature branches, we don't test the full matrix (os x [stable, loose]) in order to save time & resources. + run-tests-loose: + name: Test loose pip installation on ubuntu-latest + needs: pre-commit + strategy: + matrix: + os: [ubuntu-latest] + uses: ./.github/workflows/_run_tests.yml + with: + python-version: ${{ matrix.python-version }} + os: ${{ matrix.os }} + install-script: "loose_pip_install.sh" diff --git a/.github/workflows/github_action_test_dummy.yml b/.github/workflows/github_action_test_dummy.yml deleted file mode 100644 index adb3be18..00000000 --- a/.github/workflows/github_action_test_dummy.yml +++ /dev/null @@ -1,12 +0,0 @@ -on: - workflow_dispatch: - -name: Test new GitHub action workflow - - -jobs: - Version_bumped: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 diff --git a/.github/workflows/pip_installation.yml b/.github/workflows/pip_installation.yml index 3e101da6..4dc8bdbf 100644 --- a/.github/workflows/pip_installation.yml +++ b/.github/workflows/pip_installation.yml @@ -1,64 +1,38 @@ +# Perform pip installation and run all tests + +# For feature branches, we don't test the full matrix (os x [stable, loose]) in order to save time & resources. +# On each push to develop, the whole test matrix runs, additionally, its success is mandatory for merging to main. +# In the (assumed to be rare case) that these full matrix tests fail but the reduced matrix tests passed, +# we will learn about it latest before pushing to main. The merge that caused the issue can then be identified +# from the tests that ran on develop. on: push: - branches: [ main ] - pull_request: branches: [ main, development ] + pull_request: + branches: [ main ] workflow_dispatch: -name: Default installation and tests +name: Pip installation and tests jobs: stable_installation: name: Test stable pip installation on ${{ matrix.os }} - runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest, macos-latest-xlarge] - steps: - - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - miniconda-version: "latest" - auto-update-conda: true - python-version: ${{ matrix.python-version }} - - name: Conda info - shell: bash -l {0} - run: conda info - - name: Test pip installation with all stable dependencies - shell: bash -l {0} - run: | - cd misc - . ./stable_pip_install.sh - - name: Unittests - shell: bash -l {0} - run: | - conda activate alphabase - nbdev_test - conda deactivate + uses: ./.github/workflows/_run_tests.yml + with: + os: ${{ matrix.os }} + python-version: ${{ matrix.python-version }} + install-script: "stable_pip_install.sh" + loose_installation: name: Test loose pip installation on ${{ matrix.os }} - runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest, macos-latest-xlarge] - steps: - - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - miniconda-version: "latest" - auto-update-conda: true - python-version: ${{ matrix.python-version }} - - name: Conda info - shell: bash -l {0} - run: conda info - - name: Test pip installation with all loose dependencies - shell: bash -l {0} - run: | - cd misc - . ./loose_pip_install.sh - - name: Unittests - shell: bash -l {0} - run: | - conda activate alphabase - nbdev_test - conda deactivate + uses: ./.github/workflows/_run_tests.yml + with: + os: ${{ matrix.os }} + python-version: ${{ matrix.python-version }} + install-script: "loose_pip_install.sh" diff --git a/.github/workflows/publish_and_release.yaml b/.github/workflows/publish_and_release.yaml new file mode 100644 index 00000000..031e331f --- /dev/null +++ b/.github/workflows/publish_and_release.yaml @@ -0,0 +1,80 @@ +on: + # push: + # branches: [ main ] + workflow_dispatch: + + +name: Publish on PyPi and release on GitHub + +jobs: + Version_Bumped: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.master_version_bumped.outputs.version }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: ${{ matrix.python-version }} + - name: Master version bumped + id: master_version_bumped + shell: bash -l {0} + run: | + cd misc + . ./check_version.sh + echo "version=${current_version}" >> $GITHUB_OUTPUT + Create_PyPi_Release: + runs-on: ubuntu-latest + needs: Version_Bumped + steps: + - name: Checkout code + uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: ${{ matrix.python-version }} + - name: Conda info + shell: bash -l {0} + run: conda info + - name: Prepare distribution + shell: bash -l {0} + run: | + cd release/pypi + . ./prepare_pypi_wheel.sh + - name: Publish distribution to Test PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.TEST_PYPI_ALPHABASE_API_TOKEN }} + repository_url: https://test.pypi.org/legacy/ + - name: Test PyPI test release + shell: bash -l {0} + run: | + cd release/pypi + . ./install_test_pypi_wheel.sh + - name: Publish distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_ALPHABASE_API_TOKEN }} + Test_PyPi_Release: + name: Test_PyPi_version_on_${{ matrix.os }} + runs-on: ${{ matrix.os }} + needs: Create_PyPi_Release + strategy: + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + steps: + - uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: ${{ matrix.python-version }} + - name: Conda info + shell: bash -l {0} + run: conda info + - name: Test pip installation from PyPi + shell: bash -l {0} + run: | + cd release/pypi + . ./install_pypi_wheel.sh diff --git a/.github/workflows/publish_and_release.yml b/.github/workflows/publish_and_release.yml deleted file mode 100644 index 0357cf93..00000000 --- a/.github/workflows/publish_and_release.yml +++ /dev/null @@ -1,197 +0,0 @@ -on: - # push: - # branches: [ main ] - workflow_dispatch: - - -name: Publish on PyPi and release on GitHub - -jobs: - Version_Bumped: - runs-on: ubuntu-latest - outputs: - version: ${{ steps.master_version_bumped.outputs.version }} - steps: - - name: Checkout code - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: ${{ matrix.python-version }} - - name: Master version bumped - id: master_version_bumped - shell: bash -l {0} - run: | - cd misc - . ./check_version.sh - echo "version=${current_version}" >> $GITHUB_OUTPUT - # Create_Draft_On_GitHub: - # runs-on: ubuntu-latest - # needs: Version_Bumped - # outputs: - # upload_url: ${{ steps.draft_release.outputs.upload_url }} - # steps: - # - name: Draft Release - # id: draft_release - # uses: actions/create-release@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token - # with: - # tag_name: ${{ needs.Version_Bumped.outputs.version }} - # release_name: Release version ${{ needs.Version_Bumped.outputs.version }} - # draft: false - # prerelease: false - - - # Create_Linux_Release: - # runs-on: ubuntu-latest - # needs: Create_Draft_On_GitHub - # steps: - # - name: Checkout code - # uses: actions/checkout@v3 - # - uses: conda-incubator/setup-miniconda@v2 - # with: - # auto-update-conda: true - # python-version: ${{ matrix.python-version }} - # - name: Conda info - # shell: bash -l {0} - # run: conda info - # - name: Creating installer for Linux - # shell: bash -l {0} - # run: | - # cd release/one_click_linux_gui - # . ./create_installer_linux.sh - # - name: Test installer for Linux - # shell: bash -l {0} - # run: | - # sudo dpkg -i release/one_click_linux_gui/dist/AlphaBase_gui_installer_linux.deb - # - name: Upload Linux Installer - # id: upload-release-asset - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ needs.Create_Draft_On_GitHub.outputs.upload_url }} - # asset_path: release/one_click_linux_gui/dist/AlphaBase_gui_installer_linux.deb - # asset_name: AlphaBase_gui_installer_linux.deb - # asset_content_type: application/octet-stream - # Create_MacOS_Release: - # runs-on: macos-latest - # needs: Create_Draft_On_GitHub - # steps: - # - name: Checkout code - # uses: actions/checkout@v3 - # - uses: conda-incubator/setup-miniconda@v2 - # with: - # auto-update-conda: true - # python-version: ${{ matrix.python-version }} - # - name: Conda info - # shell: bash -l {0} - # run: conda info - # - name: Creating installer for MacOS - # shell: bash -l {0} - # run: | - # cd release/one_click_macos_gui - # . ./create_installer_macos.sh - # - name: Test installer for MacOS - # shell: bash -l {0} - # run: | - # sudo installer -pkg release/one_click_macos_gui/dist/AlphaBase_gui_installer_macos.pkg -target / - # - name: Upload MacOS Installer - # id: upload-release-asset - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ needs.Create_Draft_On_GitHub.outputs.upload_url }} - # asset_path: release/one_click_macos_gui/dist/AlphaBase_gui_installer_macos.pkg - # asset_name: AlphaBase_gui_installer_macos.pkg - # asset_content_type: application/octet-stream - # Create_Windows_Release: - # runs-on: windows-latest - # needs: Create_Draft_On_GitHub - # steps: - # - name: Checkout code - # uses: actions/checkout@v3 - # - uses: conda-incubator/setup-miniconda@v2 - # with: - # auto-update-conda: true - # python-version: ${{ matrix.python-version }} - # - name: Conda info - # shell: bash -l {0} - # run: conda info - # - name: Creating installer for Windows - # shell: bash -l {0} - # run: | - # cd release/one_click_windows_gui - # . ./create_installer_windows.sh - # - name: Test installer for Windows - # shell: bash -l {0} - # run: | - # cd release/one_click_windows_gui/dist/ - # echo "TODO, this test seems to freeze the runner..." - # # ./AlphaBase_gui_installer_windows.exe //verysilent //log=log.txt //noicons //tasks= //portable=1 - # # cat log.txt - # - name: Upload Windows Installer - # id: upload-release-asset - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ needs.Create_Draft_On_GitHub.outputs.upload_url }} - # asset_path: release/one_click_windows_gui/dist/AlphaBase_gui_installer_windows.exe - # asset_name: AlphaBase_gui_installer_windows.exe - # asset_content_type: application/octet-stream - Create_PyPi_Release: - runs-on: ubuntu-latest - needs: Version_Bumped - steps: - - name: Checkout code - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: ${{ matrix.python-version }} - - name: Conda info - shell: bash -l {0} - run: conda info - - name: Prepare distribution - shell: bash -l {0} - run: | - cd release/pypi - . ./prepare_pypi_wheel.sh - - name: Publish distribution to Test PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.TEST_PYPI_ALPHABASE_API_TOKEN }} - repository_url: https://test.pypi.org/legacy/ - - name: Test PyPI test release - shell: bash -l {0} - run: | - cd release/pypi - . ./install_test_pypi_wheel.sh - - name: Publish distribution to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.PYPI_ALPHABASE_API_TOKEN }} - Test_PyPi_Release: - name: Test_PyPi_version_on_${{ matrix.os }} - runs-on: ${{ matrix.os }} - needs: Create_PyPi_Release - strategy: - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - steps: - - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: ${{ matrix.python-version }} - - name: Conda info - shell: bash -l {0} - run: conda info - - name: Test pip installation from PyPi - shell: bash -l {0} - run: | - cd release/pypi - . ./install_pypi_wheel.sh diff --git a/.gitignore b/.gitignore index c3eb9ef4..a2252c51 100644 --- a/.gitignore +++ b/.gitignore @@ -144,4 +144,6 @@ _docs* # *sidebar.yml *_proc* # .gitconfig is now autogenerated -.gitconfig \ No newline at end of file +.gitconfig + +.idea diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..4e466212 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,14 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.0 + hooks: + - id: ruff-format + - id: ruff diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 359fe5ca..c4ec455e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -22,4 +22,4 @@ sphinx: # # Optionally set the version of Python and requirements required to build your docs python: install: - - requirements: extra_requirements/development.txt \ No newline at end of file + - requirements: extra_requirements/development.txt diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7b6017a7..63cb86c3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,4 +29,3 @@ ## Do you want to contribute to the documentation? * Docs are automatically created from the notebooks in the nbs folder. - diff --git a/README.md b/README.md index e1e8910a..9170690f 100644 --- a/README.md +++ b/README.md @@ -196,6 +196,20 @@ For an even more interactive participation, check out the [discussions](https://github.com/MannLabs/alphabase/discussions) and the [the Contributors License Agreement](misc/CLA.md). +### Notes for developers +#### pre-commit hooks +It is highly recommended to use the provided pre-commit hooks, as the CI pipeline enforces all checks therein to +pass in order to merge a branch. + +The hooks need to be installed once by +```bash +pre-commit install +``` +You can run the checks yourself using: +```bash +pre-commit run --all-files +``` + ------------------------------------------------------------------------ ## Changelog diff --git a/alphabase/__init__.py b/alphabase/__init__.py index 72b97e27..1541389d 100644 --- a/alphabase/__init__.py +++ b/alphabase/__init__.py @@ -2,7 +2,7 @@ __project__ = "alphabase" -__version__ = "1.2.3" +__version__ = "1.2.4" __license__ = "Apache" __description__ = "An infrastructure Python package of the AlphaX ecosystem" __author__ = "Mann Labs" diff --git a/alphabase/_modidx.py b/alphabase/_modidx.py deleted file mode 100644 index 71ff1545..00000000 --- a/alphabase/_modidx.py +++ /dev/null @@ -1,266 +0,0 @@ -# Autogenerated by nbdev - -d = { 'settings': { 'branch': 'main', - 'doc_baseurl': '/alphabase', - 'doc_host': 'https://MannLabs.github.io', - 'git_url': 'https://github.com/MannLabs/alphabase', - 'lib_path': 'alphabase'}, - 'syms': { 'alphabase.cli': {}, - 'alphabase.constants.aa': {}, - 'alphabase.constants.atom': {}, - 'alphabase.constants.element': {}, - 'alphabase.constants.isotope': {}, - 'alphabase.constants.modification': {}, - 'alphabase.gui': {}, - 'alphabase.io.hdf': {}, - 'alphabase.io.psm_reader.alphapept_reader': {}, - 'alphabase.io.psm_reader.dia_psm_reader': {}, - 'alphabase.io.psm_reader.dia_search_reader': {}, - 'alphabase.io.psm_reader.maxquant_reader': {}, - 'alphabase.io.psm_reader.msfragger_reader': {}, - 'alphabase.io.psm_reader.pfind_reader': {}, - 'alphabase.io.psm_reader.psm_reader': {}, - 'alphabase.io.tempmmap': {}, - 'alphabase.peptide.fragment': { 'alphabase.peptide.fragment.join_left': ( 'peptide/fragment.html#join_left', - 'alphabase/peptide/fragment.py')}, - 'alphabase.peptide.mass_calc': {}, - 'alphabase.peptide.mobility': {}, - 'alphabase.peptide.precursor': {}, - 'alphabase.protein.fasta': {}, - 'alphabase.protein.inference': {}, - 'alphabase.protein.lcp_digest': {}, - 'alphabase.protein.protein_level_decoy': {}, - 'alphabase.psm_reader.alphapept_reader': {}, - 'alphabase.psm_reader.dia_psm_reader': {}, - 'alphabase.psm_reader.maxquant_reader': {}, - 'alphabase.psm_reader.msfragger_reader': {}, - 'alphabase.psm_reader.pfind_reader': {}, - 'alphabase.psm_reader.psm_reader': {}, - 'alphabase.quant_reader': { 'alphabase.quant_reader.AcquisitionTableHandler': ( 'quant_reader/quant_reader.html#acquisitiontablehandler', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.__get_plexDIA_samplenames__': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.__get_plexdia_samplenames__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.__get_reformated_df__': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.__get_reformated_df__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.__get_samplename_without_mtraq_tag__': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.__get_samplename_without_mtraq_tag__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.__init__': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.__reformat_samples_if_necessary': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.__reformat_samples_if_necessary', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.__remove_possible_pre_existing_ml_table__': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.__remove_possible_pre_existing_ml_table__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.get_acquisition_info_df': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.get_acquisition_info_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.save_dataframe_as_new_acquisition_dataframe': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.save_dataframe_as_new_acquisition_dataframe', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHandler.update_ml_file_location_in_method_parameters_yaml': ( 'quant_reader/quant_reader.html#acquisitiontablehandler.update_ml_file_location_in_method_parameters_yaml', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaderFilter': ( 'quant_reader/quant_reader.html#acquisitiontableheaderfilter', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaderFilter.__init__': ( 'quant_reader/quant_reader.html#acquisitiontableheaderfilter.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaderFilter.filter_numeric_headers_if_specified': ( 'quant_reader/quant_reader.html#acquisitiontableheaderfilter.filter_numeric_headers_if_specified', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders': ( 'quant_reader/quant_reader.html#acquisitiontableheaders', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_all_levelnames__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_all_levelnames__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_included_levelnames__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_included_levelnames__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_ion_headers__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_ion_headers__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_ion_headers_grouped__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_ion_headers_grouped__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_levelname_mapping_dict': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_levelname_mapping_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_numeric_headers__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_numeric_headers__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_ordered_ion_hierarchy__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_ordered_ion_hierarchy__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__get_relevant_headers__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__get_relevant_headers__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__init__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableHeaders.__remove_possible_none_values_from_list__': ( 'quant_reader/quant_reader.html#acquisitiontableheaders.__remove_possible_none_values_from_list__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo': ( 'quant_reader/quant_reader.html#acquisitiontableinfo', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__check_if_input_file_is_already_formatted__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__check_if_input_file_is_already_formatted__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__get_input_file__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__get_input_file__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__get_input_type_and_config_dict__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__get_input_type_and_config_dict__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__get_last_ion_level_to_use__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__get_last_ion_level_to_use__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__get_location_of_original_file__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__get_location_of_original_file__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__get_original_filename_from_input_file__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__get_original_filename_from_input_file__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__get_sample_column__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__get_sample_column__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableInfo.__init__': ( 'quant_reader/quant_reader.html#acquisitiontableinfo.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableOutputPaths': ( 'quant_reader/quant_reader.html#acquisitiontableoutputpaths', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableOutputPaths.__get_method_parameters_yaml_path__': ( 'quant_reader/quant_reader.html#acquisitiontableoutputpaths.__get_method_parameters_yaml_path__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableOutputPaths.__get_output_file_name__': ( 'quant_reader/quant_reader.html#acquisitiontableoutputpaths.__get_output_file_name__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableOutputPaths.__init__': ( 'quant_reader/quant_reader.html#acquisitiontableoutputpaths.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater': ( 'quant_reader/quant_reader.html#acquisitiontablereformater', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater.__filter_reformated_df_if_necessary__': ( 'quant_reader/quant_reader.html#acquisitiontablereformater.__filter_reformated_df_if_necessary__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater.__filter_reformatted_dataframe_to_relevant_samples__': ( 'quant_reader/quant_reader.html#acquisitiontablereformater.__filter_reformatted_dataframe_to_relevant_samples__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater.__get_cols_to_use__': ( 'quant_reader/quant_reader.html#acquisitiontablereformater.__get_cols_to_use__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater.__init__': ( 'quant_reader/quant_reader.html#acquisitiontablereformater.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater.__initialize_iterator_with_specified_columns__': ( 'quant_reader/quant_reader.html#acquisitiontablereformater.__initialize_iterator_with_specified_columns__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.AcquisitionTableReformater.__reformatting_function__': ( 'quant_reader/quant_reader.html#acquisitiontablereformater.__reformatting_function__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.LongTableReformater': ( 'quant_reader/quant_reader.html#longtablereformater', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.LongTableReformater.__init__': ( 'quant_reader/quant_reader.html#longtablereformater.__init__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.LongTableReformater.__initialize_df_iterator__': ( 'quant_reader/quant_reader.html#longtablereformater.__initialize_df_iterator__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.LongTableReformater.__write_reformatted_df_to_file__': ( 'quant_reader/quant_reader.html#longtablereformater.__write_reformatted_df_to_file__', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.LongTableReformater.reformat_and_load_acquisition_data_frame': ( 'quant_reader/quant_reader.html#longtablereformater.reformat_and_load_acquisition_data_frame', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.LongTableReformater.reformat_and_save_acquisition_data_frame': ( 'quant_reader/quant_reader.html#longtablereformater.reformat_and_save_acquisition_data_frame', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader._get_input_type': ( 'quant_reader/quant_reader.html#_get_input_type', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.adapt_headers_on_extended_df': ( 'quant_reader/quant_reader.html#adapt_headers_on_extended_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.adapt_input_df_columns_in_case_of_plexDIA': ( 'quant_reader/quant_reader.html#adapt_input_df_columns_in_case_of_plexdia', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.adapt_subtable': ( 'quant_reader/quant_reader.html#adapt_subtable', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.add_columns_to_lfq_results_table': ( 'quant_reader/quant_reader.html#add_columns_to_lfq_results_table', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.add_ion_protein_headers_if_applicable': ( 'quant_reader/quant_reader.html#add_ion_protein_headers_if_applicable', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.add_merged_ionnames': ( 'quant_reader/quant_reader.html#add_merged_ionnames', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.add_mq_protein_group_ids_if_applicable_and_obtain_annotated_file': ( 'quant_reader/quant_reader.html#add_mq_protein_group_ids_if_applicable_and_obtain_annotated_file', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.annotate_mq_df': ( 'quant_reader/quant_reader.html#annotate_mq_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.check_for_processed_runs_in_results_folder': ( 'quant_reader/quant_reader.html#check_for_processed_runs_in_results_folder', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.clean_input_filename_if_necessary': ( 'quant_reader/quant_reader.html#clean_input_filename_if_necessary', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.create_id_to_protein_df': ( 'quant_reader/quant_reader.html#create_id_to_protein_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.determine_id_column_from_input_df': ( 'quant_reader/quant_reader.html#determine_id_column_from_input_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.extend_sampleID_column_for_plexDIA_case': ( 'quant_reader/quant_reader.html#extend_sampleid_column_for_plexdia_case', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.extend_sample_allcolumns_for_plexdia_case': ( 'quant_reader/quant_reader.html#extend_sample_allcolumns_for_plexdia_case', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.filter_columns_to_existing_columns': ( 'quant_reader/quant_reader.html#filter_columns_to_existing_columns', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.filter_input': ( 'quant_reader/quant_reader.html#filter_input', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_channel_ids_from_config_dict': ( 'quant_reader/quant_reader.html#get_channel_ids_from_config_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_input_type_and_config_dict': ( 'quant_reader/quant_reader.html#get_input_type_and_config_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_ionname_columns': ( 'quant_reader/quant_reader.html#get_ionname_columns', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_original_file_from_aq_reformat': ( 'quant_reader/quant_reader.html#get_original_file_from_aq_reformat', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_protein_column_input_table': ( 'quant_reader/quant_reader.html#get_protein_column_input_table', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_quant_ids_from_config_dict': ( 'quant_reader/quant_reader.html#get_quant_ids_from_config_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_quantitative_columns': ( 'quant_reader/quant_reader.html#get_quantitative_columns', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_relevant_columns': ( 'quant_reader/quant_reader.html#get_relevant_columns', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_relevant_columns_config_dict': ( 'quant_reader/quant_reader.html#get_relevant_columns_config_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_sample_ids_from_config_dict': ( 'quant_reader/quant_reader.html#get_sample_ids_from_config_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_standard_columns_for_input_type': ( 'quant_reader/quant_reader.html#get_standard_columns_for_input_type', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.get_type2relevant_cols': ( 'quant_reader/quant_reader.html#get_type2relevant_cols', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.import_config_dict': ( 'quant_reader/quant_reader.html#import_config_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.import_data': ( 'quant_reader/quant_reader.html#import_data', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.index_and_log_transform_input_df': ( 'quant_reader/quant_reader.html#index_and_log_transform_input_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.invert_dictionary': ( 'quant_reader/quant_reader.html#invert_dictionary', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.is_plexDIA_table': ( 'quant_reader/quant_reader.html#is_plexdia_table', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.load_config': ( 'quant_reader/quant_reader.html#load_config', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.load_input_file_and_de_duplicate_if_evidence': ( 'quant_reader/quant_reader.html#load_input_file_and_de_duplicate_if_evidence', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.load_samplemap': ( 'quant_reader/quant_reader.html#load_samplemap', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.merge_acquisition_df_parameter_df': ( 'quant_reader/quant_reader.html#merge_acquisition_df_parameter_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.merge_channel_and_sample_string': ( 'quant_reader/quant_reader.html#merge_channel_and_sample_string', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.merge_protein_and_ion_cols': ( 'quant_reader/quant_reader.html#merge_protein_and_ion_cols', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.merge_protein_cols_and_ion_dict': ( 'quant_reader/quant_reader.html#merge_protein_cols_and_ion_dict', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.merge_sample_id_and_channels': ( 'quant_reader/quant_reader.html#merge_sample_id_and_channels', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.parse_channel_from_peptide_column': ( 'quant_reader/quant_reader.html#parse_channel_from_peptide_column', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.prepare_loaded_tables': ( 'quant_reader/quant_reader.html#prepare_loaded_tables', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.process_with_dask': ( 'quant_reader/quant_reader.html#process_with_dask', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.reformat_and_save_input_file': ( 'quant_reader/quant_reader.html#reformat_and_save_input_file', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.reformat_and_write_longtable_according_to_config': ( 'quant_reader/quant_reader.html#reformat_and_write_longtable_according_to_config', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.reformat_and_write_wideformat_table': ( 'quant_reader/quant_reader.html#reformat_and_write_wideformat_table', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.remove_allnan_rows_input_df': ( 'quant_reader/quant_reader.html#remove_allnan_rows_input_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.remove_ids_not_occurring_in_mq_df': ( 'quant_reader/quant_reader.html#remove_ids_not_occurring_in_mq_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.remove_mtraq_modifications_from_ion_ids': ( 'quant_reader/quant_reader.html#remove_mtraq_modifications_from_ion_ids', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.reshape_input_df': ( 'quant_reader/quant_reader.html#reshape_input_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.save_annotated_mq_df': ( 'quant_reader/quant_reader.html#save_annotated_mq_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.set_mtraq_reduced_ion_column_into_dataframe': ( 'quant_reader/quant_reader.html#set_mtraq_reduced_ion_column_into_dataframe', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.show_diff': ( 'quant_reader/quant_reader.html#show_diff', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.sort_and_add_columns': ( 'quant_reader/quant_reader.html#sort_and_add_columns', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.split_extend_df': ( 'quant_reader/quant_reader.html#split_extend_df', - 'alphabase/quant_reader.py'), - 'alphabase.quant_reader.write_chunk_to_file': ( 'quant_reader/quant_reader.html#write_chunk_to_file', - 'alphabase/quant_reader.py')}, - 'alphabase.scoring.fdr': {}, - 'alphabase.scoring.feature_extraction_base': {}, - 'alphabase.scoring.ml_scoring': {}, - 'alphabase.spectral_library.base': {}, - 'alphabase.spectral_library.decoy': {}, - 'alphabase.spectral_library.flat': {}, - 'alphabase.spectral_library.reader': {}, - 'alphabase.spectral_library.reader_from_raw': {}, - 'alphabase.spectral_library.translate': {}, - 'alphabase.statistics.regression': {}, - 'alphabase.utils': {}, - 'alphabase.yaml_utils': {}}} diff --git a/alphabase/cli.py b/alphabase/cli.py index fcec3488..22fa93b8 100644 --- a/alphabase/cli.py +++ b/alphabase/cli.py @@ -1,2 +1,2 @@ def run(*args, **kwargs): - pass \ No newline at end of file + pass diff --git a/alphabase/constants/_const.py b/alphabase/constants/_const.py index 819b23a9..5fa3fed3 100644 --- a/alphabase/constants/_const.py +++ b/alphabase/constants/_const.py @@ -3,21 +3,16 @@ from alphabase.yaml_utils import load_yaml -CONST_FILE_FOLDER = os.path.join( - os.path.dirname(__file__), - "const_files" -) +CONST_FILE_FOLDER = os.path.join(os.path.dirname(__file__), "const_files") -common_const_dict:dict = load_yaml( +common_const_dict: dict = load_yaml( os.path.join(CONST_FILE_FOLDER, "common_constants.yaml") ) -# Only applied in peak and fragment dataframes to save RAM. +# Only applied in peak and fragment dataframes to save RAM. # Using float32 still keeps 0.1 ppm precision in any value range. # Default float dtype is "float64" for value calculation and other senarios. -PEAK_MZ_DTYPE:np.dtype = np.dtype( - common_const_dict["PEAK_MZ_DTYPE"] -).type -PEAK_INTENSITY_DTYPE:np.dtype = np.dtype( +PEAK_MZ_DTYPE: np.dtype = np.dtype(common_const_dict["PEAK_MZ_DTYPE"]).type +PEAK_INTENSITY_DTYPE: np.dtype = np.dtype( common_const_dict["PEAK_INTENSITY_DTYPE"] -).type \ No newline at end of file +).type diff --git a/alphabase/constants/aa.py b/alphabase/constants/aa.py index dcd8d0cd..a8c49a92 100644 --- a/alphabase/constants/aa.py +++ b/alphabase/constants/aa.py @@ -5,30 +5,30 @@ from alphabase.yaml_utils import load_yaml -from alphabase.constants.element import ( - calc_mass_from_formula, - MASS_H2O, parse_formula, - reset_elements +from alphabase.constants.atom import ( + calc_mass_from_formula, + MASS_H2O, + parse_formula, + reset_elements, ) from alphabase.constants._const import CONST_FILE_FOLDER # We use all 128 ASCII code to represent amino acids for flexible extensions in the future. -# The amino acid masses are stored in 128-lengh array :py:data:`AA_ASCII_MASS`. +# The amino acid masses are stored in 128-lengh array :py:data:`AA_ASCII_MASS`. # If an ASCII code is not in `AA_Formula`, the mass will be set as a large value to disable MS search. -AA_Formula:dict = load_yaml( - os.path.join(CONST_FILE_FOLDER, 'amino_acid.yaml') -) +AA_Formula: dict = load_yaml(os.path.join(CONST_FILE_FOLDER, "amino_acid.yaml")) #: AA mass array with ASCII code, mass of 'A' is AA_ASCII_MASS[ord('A')] -AA_ASCII_MASS:np.ndarray = np.ones(128)*1e8 +AA_ASCII_MASS: np.ndarray = np.ones(128) * 1e8 #: 128-len AA dataframe -AA_DF:pd.DataFrame = pd.DataFrame() +AA_DF: pd.DataFrame = pd.DataFrame() # AA formula to formula dict of dict. For example: {'K': {'C': n, 'O': m, ...}} -AA_Composition:dict = {} +AA_Composition: dict = {} + -def replace_atoms(atom_replace_dict:typing.Dict): +def replace_atoms(atom_replace_dict: typing.Dict): for aa, formula in list(AA_Formula.items()): atom_comp = dict(parse_formula(formula)) for atom_from, atom_to in atom_replace_dict.items(): @@ -37,58 +37,66 @@ def replace_atoms(atom_replace_dict:typing.Dict): del atom_comp[atom_from] AA_Formula[aa] = "".join([f"{atom}({n})" for atom, n in atom_comp.items()]) -def reset_AA_mass()->np.ndarray: + +def reset_AA_mass() -> np.ndarray: """AA mass in np.array with shape (128,)""" global AA_ASCII_MASS for aa, chem in AA_Formula.items(): AA_ASCII_MASS[ord(aa)] = calc_mass_from_formula(chem) return AA_ASCII_MASS + + reset_AA_mass() + def reset_AA_df(): global AA_DF AA_DF = pd.DataFrame() - AA_DF['aa'] = [chr(aa) for aa in range(len(AA_ASCII_MASS))] - AA_DF['formula'] = ['']*len(AA_ASCII_MASS) + AA_DF["aa"] = [chr(aa) for aa in range(len(AA_ASCII_MASS))] + AA_DF["formula"] = [""] * len(AA_ASCII_MASS) aa_idxes = [] formulas = [] for aa, formula in AA_Formula.items(): aa_idxes.append(ord(aa)) formulas.append(formula) - AA_DF.loc[aa_idxes, 'formula'] = formulas - AA_DF['mass'] = AA_ASCII_MASS + AA_DF.loc[aa_idxes, "formula"] = formulas + AA_DF["mass"] = AA_ASCII_MASS return AA_DF + + reset_AA_df() + def reset_AA_Composition(): global AA_Composition AA_Composition = {} for aa, formula, mass in AA_DF.values: - AA_Composition[aa] = dict( - parse_formula(formula) - ) + AA_Composition[aa] = dict(parse_formula(formula)) return AA_Composition + + reset_AA_Composition() -def reset_AA_atoms(atom_replace_dict:typing.Dict = {}): + +def reset_AA_atoms(atom_replace_dict: typing.Dict = {}): reset_elements() replace_atoms(atom_replace_dict) reset_AA_mass() reset_AA_df() reset_AA_Composition() -def update_an_AA(aa:str, formula:str): + +def update_an_AA(aa: str, formula: str): aa_idx = ord(aa) - AA_DF.loc[aa_idx,'formula'] = formula + AA_DF.loc[aa_idx, "formula"] = formula AA_ASCII_MASS[aa_idx] = calc_mass_from_formula(formula) - AA_DF.loc[aa_idx,'mass'] = AA_ASCII_MASS[aa_idx] + AA_DF.loc[aa_idx, "mass"] = AA_ASCII_MASS[aa_idx] AA_Formula[aa] = formula AA_Composition[aa] = dict(parse_formula(formula)) -def calc_AA_masses( - sequence: str -)->np.ndarray: - ''' + +def calc_AA_masses(sequence: str) -> np.ndarray: + """ Parameters ---------- sequence : str @@ -98,13 +106,12 @@ def calc_AA_masses( ------- np.ndarray Masses of each amino acid. - ''' - return AA_ASCII_MASS[np.array(sequence,'c').view(np.int8)] + """ + return AA_ASCII_MASS[np.array(sequence, "c").view(np.int8)] -def calc_AA_masses_for_same_len_seqs( - sequence_array: np.ndarray -)->np.ndarray: - ''' + +def calc_AA_masses_for_same_len_seqs(sequence_array: np.ndarray) -> np.ndarray: + """ Calculate AA masses for the array of same-len AA sequences. Parameters @@ -121,17 +128,16 @@ def calc_AA_masses_for_same_len_seqs( ------- ValueError If sequences are not with the same length. - ''' + """ return AA_ASCII_MASS[ - # we use np.int32 here because unicode str + # we use np.int32 here because unicode str # uses 4 bytes for a char. - np.array(sequence_array).view(np.int32) + np.array(sequence_array).view(np.int32) ].reshape(len(sequence_array), -1) -def calc_sequence_masses_for_same_len_seqs( - sequence_array: np.ndarray -)->np.ndarray: - ''' + +def calc_sequence_masses_for_same_len_seqs(sequence_array: np.ndarray) -> np.ndarray: + """ Calculate sequence masses for the array of same-len AA sequences. Parameters @@ -143,34 +149,29 @@ def calc_sequence_masses_for_same_len_seqs( ------- np.ndarray 1-D (array_size, sequence_len) array of masses. - + Raises ------- ValueError If sequences are not with the same length. - ''' - return np.sum( - calc_AA_masses_for_same_len_seqs(sequence_array), - axis=1 - )+MASS_H2O + """ + return np.sum(calc_AA_masses_for_same_len_seqs(sequence_array), axis=1) + MASS_H2O -def calc_AA_masses_for_var_len_seqs( - sequence_array: np.ndarray -)->np.ndarray: - ''' +def calc_AA_masses_for_var_len_seqs(sequence_array: np.ndarray) -> np.ndarray: + """ We recommend to use `calc_AA_masses_for_same_len_seqs` as it is much faster. Parameters ---------- sequence_array : np.ndarray Sequences with variable lengths. - + Returns ------- np.ndarray 1D array of masses, zero values are padded to fill the max length. - ''' - return AA_ASCII_MASS[ - np.array(sequence_array).view(np.int32) - ].reshape(len(sequence_array), -1) + """ + return AA_ASCII_MASS[np.array(sequence_array).view(np.int32)].reshape( + len(sequence_array), -1 + ) diff --git a/alphabase/constants/atom.py b/alphabase/constants/atom.py index 5f2b2cf0..b53b5e38 100644 --- a/alphabase/constants/atom.py +++ b/alphabase/constants/atom.py @@ -5,26 +5,22 @@ from alphabase.yaml_utils import load_yaml -from alphabase.constants._const import ( - CONST_FILE_FOLDER, - common_const_dict -) +from alphabase.constants._const import CONST_FILE_FOLDER, common_const_dict -MASS_PROTON:float = common_const_dict['MASS_PROTON'] -MASS_ISOTOPE:float = common_const_dict['MASS_ISOTOPE'] +MASS_PROTON: float = common_const_dict["MASS_PROTON"] +MASS_ISOTOPE: float = common_const_dict["MASS_ISOTOPE"] -MAX_ISOTOPE_LEN:int = common_const_dict['MAX_ISOTOPE_LEN'] -EMPTY_DIST:np.ndarray = np.zeros(MAX_ISOTOPE_LEN) +MAX_ISOTOPE_LEN: int = common_const_dict["MAX_ISOTOPE_LEN"] +EMPTY_DIST: np.ndarray = np.zeros(MAX_ISOTOPE_LEN) EMPTY_DIST[0] = 1 + @numba.njit -def truncate_isotope( - isotopes: np.ndarray, mono_idx: int -)->tuple: - ''' - For a given isotope distribution (intensity patterns), - this function truncates the distribution by top - `MAX_ISOTOPE_LEN` neighbors those contain the monoisotopic +def truncate_isotope(isotopes: np.ndarray, mono_idx: int) -> tuple: + """ + For a given isotope distribution (intensity patterns), + this function truncates the distribution by top + `MAX_ISOTOPE_LEN` neighbors those contain the monoisotopic peak pointed by `mono_idx`. Parameters @@ -36,34 +32,39 @@ def truncate_isotope( mono_idx : int Monoisotopic peak position (index) in the isotope patterns - + Returns ------- int - + the new position of `mono_idx` int - + the start position of the truncated isotopes int - + the end position of the truncated isotopes - ''' + """ trunc_start = mono_idx - 1 trunc_end = mono_idx + 1 - while trunc_start >= 0 and trunc_end < len(isotopes) and (trunc_end-trunc_start-1)= 0 + and trunc_end < len(isotopes) + and (trunc_end - trunc_start - 1) < MAX_ISOTOPE_LEN + ): if isotopes[trunc_end] >= isotopes[trunc_start]: trunc_end += 1 else: trunc_start -= 1 - if trunc_end-trunc_start-1 < MAX_ISOTOPE_LEN: + if trunc_end - trunc_start - 1 < MAX_ISOTOPE_LEN: if trunc_start == -1: trunc_end = MAX_ISOTOPE_LEN elif trunc_end == len(isotopes): - trunc_start = len(isotopes)-MAX_ISOTOPE_LEN-1 - return mono_idx-trunc_start-1, trunc_start+1, trunc_end + trunc_start = len(isotopes) - MAX_ISOTOPE_LEN - 1 + return mono_idx - trunc_start - 1, trunc_start + 1, trunc_end + #: chemical element information in dict defined by `nist_element.yaml` CHEM_INFO_DICT = {} @@ -72,25 +73,24 @@ def truncate_isotope( CHEM_MONO_MASS = {} #: {element: np.ndarray of abundance distribution} -CHEM_ISOTOPE_DIST:numba.typed.Dict = numba.typed.Dict.empty( - key_type=numba.types.unicode_type, - value_type=numba.types.float64[:] +CHEM_ISOTOPE_DIST: numba.typed.Dict = numba.typed.Dict.empty( + key_type=numba.types.unicode_type, value_type=numba.types.float64[:] ) #: {element: int (mono position)} -CHEM_MONO_IDX:numba.typed.Dict = numba.typed.Dict.empty( - key_type=numba.types.unicode_type, - value_type=numba.types.int64 +CHEM_MONO_IDX: numba.typed.Dict = numba.typed.Dict.empty( + key_type=numba.types.unicode_type, value_type=numba.types.int64 ) -MASS_H:int = None -MASS_C:int = None -MASS_O:int = None -MASS_N:int = None -MASS_H2O:int = None #raise errors if the value is not reset -MASS_NH3:int = None +MASS_H: int = None +MASS_C: int = None +MASS_O: int = None +MASS_N: int = None +MASS_H2O: int = None # raise errors if the value is not reset +MASS_NH3: int = None + -def update_atom_infos(new_atom_info:typing.Dict): +def update_atom_infos(new_atom_info: typing.Dict): """ Args: atom_dict (Dict): Example, replacing N with 15N @@ -104,14 +104,14 @@ def update_atom_infos(new_atom_info:typing.Dict): reset_elements() -def reset_elements(): +def reset_elements(): global MASS_C, MASS_H, MASS_O, MASS_N global MASS_H2O, MASS_NH3 for elem, items in CHEM_INFO_DICT.items(): - isotopes = np.array(items['abundance']) - masses = np.array(items['mass']) + isotopes = np.array(items["abundance"]) + masses = np.array(items["mass"]) _sort_idx = np.argsort(masses) masses = masses[_sort_idx] isotopes = isotopes[_sort_idx] @@ -139,18 +139,19 @@ def reset_elements(): CHEM_ISOTOPE_DIST[elem] = _isos[start:end] CHEM_MONO_IDX[elem] = _mono_idx - - MASS_C = CHEM_MONO_MASS['C'] - MASS_H = CHEM_MONO_MASS['H'] - MASS_N = CHEM_MONO_MASS['N'] - MASS_O = CHEM_MONO_MASS['O'] - MASS_H2O = CHEM_MONO_MASS['H']*2 + CHEM_MONO_MASS['O'] - MASS_NH3 = CHEM_MONO_MASS['H']*3 + CHEM_MONO_MASS['N'] - -def load_elem_yaml(yaml_file:str): - '''Load built-in or user-defined element yaml file. Default yaml is: - os.path.join(_base_dir, 'nist_element.yaml') - ''' + + MASS_C = CHEM_MONO_MASS["C"] + MASS_H = CHEM_MONO_MASS["H"] + MASS_N = CHEM_MONO_MASS["N"] + MASS_O = CHEM_MONO_MASS["O"] + MASS_H2O = CHEM_MONO_MASS["H"] * 2 + CHEM_MONO_MASS["O"] + MASS_NH3 = CHEM_MONO_MASS["H"] * 3 + CHEM_MONO_MASS["N"] + + +def load_elem_yaml(yaml_file: str): + """Load built-in or user-defined element yaml file. Default yaml is: + os.path.join(_base_dir, 'nist_element.yaml') + """ global CHEM_INFO_DICT global CHEM_MONO_MASS global CHEM_ISOTOPE_DIST @@ -160,52 +161,42 @@ def load_elem_yaml(yaml_file:str): CHEM_MONO_MASS = {} CHEM_ISOTOPE_DIST = numba.typed.Dict.empty( - key_type=numba.types.unicode_type, - value_type=numba.types.float64[:] + key_type=numba.types.unicode_type, value_type=numba.types.float64[:] ) - + CHEM_MONO_IDX = numba.typed.Dict.empty( - key_type=numba.types.unicode_type, - value_type=numba.types.int64 + key_type=numba.types.unicode_type, value_type=numba.types.int64 ) reset_elements() -load_elem_yaml( - os.path.join(CONST_FILE_FOLDER, - 'nist_element.yaml' - ) -) -def parse_formula( - formula:str -)->list: - ''' - Given a formula (str, e.g. `H(1)C(2)O(3)`), +load_elem_yaml(os.path.join(CONST_FILE_FOLDER, "nist_element.yaml")) + + +def parse_formula(formula: str) -> list: + """ + Given a formula (str, e.g. `H(1)C(2)O(3)`), it generates `[('H', 2), ('C', 2), ('O', 1)]` - ''' - if not formula: return [] - items = [item.split('(') for item in - formula.strip(')').split(')') - ] + """ + if not formula: + return [] + items = [item.split("(") for item in formula.strip(")").split(")")] return [(elem, int(n)) for elem, n in items] -def calc_mass_from_formula(formula:str): - ''' +def calc_mass_from_formula(formula: str): + """ Calculates the mass of the formula` Parameters ---------- formula : str e.g. `H(1)C(2)O(3)` - + Returns ------- float mass of the formula - ''' - return np.sum([ - CHEM_MONO_MASS[elem]*n - for elem, n in parse_formula(formula) - ]) + """ + return np.sum([CHEM_MONO_MASS[elem] * n for elem, n in parse_formula(formula)]) diff --git a/alphabase/constants/const_files/amino_acid.yaml b/alphabase/constants/const_files/amino_acid.yaml index 2c830571..5d3ef0b1 100644 --- a/alphabase/constants/const_files/amino_acid.yaml +++ b/alphabase/constants/const_files/amino_acid.yaml @@ -30,11 +30,11 @@ X: 'C(1000000)' Y: 'C(9)H(9)N(1)O(2)S(0)' Z: 'C(1000000)' # Any other ASCII chars could be the placeholders for future usage. -# For example: +# For example: # phospho site-specific search (only lower case 'sty' can be modified) # s is S s: 'C(3)H(5)N(1)O(2)S(0)' # t is T t: 'C(4)H(8)N(1)O(5)P(1)' # y is Y -y: 'C(9)H(9)N(1)O(2)S(0)' \ No newline at end of file +y: 'C(9)H(9)N(1)O(2)S(0)' diff --git a/alphabase/constants/const_files/common_constants.yaml b/alphabase/constants/const_files/common_constants.yaml index 98c659b4..0f8c2150 100644 --- a/alphabase/constants/const_files/common_constants.yaml +++ b/alphabase/constants/const_files/common_constants.yaml @@ -2,7 +2,7 @@ MASS_PROTON: 1.007276467 #https://physics.nist.gov/cgi-bin/cuu/Value?arp|search_ MASS_ISOTOPE: 1.0033 MAX_ISOTOPE_LEN: 10 MOBILITY: - # 1059.62245 is the estimated constant coef in + # 1059.62245 is the estimated constant coef in # Mason Schamp equation of Burker. CCS_IM_COEF: 1059.62245 # 28 is the mass of N(2), the default gas in IM bruker @@ -10,4 +10,4 @@ MOBILITY: # Only applied in peak/fragment dataframes to save RAM PEAK_MZ_DTYPE: float32 -PEAK_INTENSITY_DTYPE: float32 \ No newline at end of file +PEAK_INTENSITY_DTYPE: float32 diff --git a/alphabase/constants/const_files/protease.yaml b/alphabase/constants/const_files/protease.yaml index ec3885cf..e80abe7b 100644 --- a/alphabase/constants/const_files/protease.yaml +++ b/alphabase/constants/const_files/protease.yaml @@ -40,4 +40,4 @@ trypsin_not_p: '([KR](?=[^P]))' trypsin: '([KR])' trypsin/p: '([KR])' non-specific: '()' -no-cleave: '_' \ No newline at end of file +no-cleave: '_' diff --git a/alphabase/constants/const_files/psm_reader.yaml b/alphabase/constants/const_files/psm_reader.yaml index 7e717eb6..28587f58 100644 --- a/alphabase/constants/const_files/psm_reader.yaml +++ b/alphabase/constants/const_files/psm_reader.yaml @@ -30,12 +30,12 @@ maxquant: 'charge': 'Charge' 'rt': 'Retention time' 'ccs': 'CCS' - 'mobility': + 'mobility': - 'Mobility' - 'IonMobility' - 'K0' # Bug in MaxQuant? It should be 1/K0 - '1/K0' - 'scan_num': + 'scan_num': - 'Scan number' - 'MS/MS scan number' - 'Scan index' @@ -48,35 +48,35 @@ maxquant: 'intensity': 'Intensity' modification_mapping: - 'Dimethyl@K': + 'Dimethyl@K': - 'K(Dimethyl)' 'Dimethyl@R': - 'R(Dimethyl)' 'Dimethyl@Any N-term': - '(Dimethyl)' - 'Acetyl@Protein N-term': + 'Acetyl@Protein N-term': - '_(Acetyl (Protein N-term))' - '_(ac)' - 'Carbamidomethyl@C': + 'Carbamidomethyl@C': - 'C(Carbamidomethyl (C))' - 'C(Carbamidomethyl)' - 'Oxidation@M': + 'Oxidation@M': - 'M(Oxidation)' - 'M(Oxidation (M))' - 'M(ox)' - 'Phospho@S': + 'Phospho@S': - 'S(Phospho (S))' - 'S(Phospho (ST))' - 'S(Phospho (STY))' - 'S(ph)' - 'pS' - 'Phospho@T': + 'Phospho@T': - 'T(Phospho (T))' - 'T(Phospho (ST))' - 'T(Phospho (STY))' - 'T(ph)' - 'pT' - 'Phospho@Y': + 'Phospho@Y': - 'Y(Phospho (Y))' - 'Y(Phospho (STY))' - 'Y(ph)' @@ -187,7 +187,7 @@ spectronaut: 'uniprot_ids': ['UniProtIds','UniProtID','UniprotId'] 'genes': ['Genes','Gene','GeneName','GeneNames'] modification_mapping: 'maxquant' - + library_reader_base: reader_type: library_reader_base rt_unit: irt @@ -236,4 +236,4 @@ sage: 'fdr': 'spectrum_q' 'peptide_fdr': 'peptide_q' 'protein_fdr': 'protein_q' - 'decoy': 'is_decoy' \ No newline at end of file + 'decoy': 'is_decoy' diff --git a/alphabase/constants/const_files/quant_reader_config.yaml b/alphabase/constants/const_files/quant_reader_config.yaml index 5ef34715..4124b49e 100644 --- a/alphabase/constants/const_files/quant_reader_config.yaml +++ b/alphabase/constants/const_files/quant_reader_config.yaml @@ -14,11 +14,11 @@ alphapept_peptides: precursor_intensity: order: [SEQ, CHARGE] mapping: - SEQ: + SEQ: - naked_sequence - CHARGE: + CHARGE: - charge - + use_iontree: False @@ -33,7 +33,7 @@ maxquant_peptides_leading_razor_protein: sequence_int: order: [SEQ, MOD] mapping: - SEQ: + SEQ: - Sequence MOD: - Mass @@ -112,7 +112,7 @@ maxquant_evidence_proteins_column: diann_fragion_isotopes_mDIA_raw: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -128,22 +128,22 @@ diann_fragion_isotopes_mDIA_raw: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Raw ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1ISOTOPES: - Precursor.Charge @@ -154,7 +154,7 @@ diann_fragion_isotopes_mDIA_raw: diann_fragion_isotopes_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -170,22 +170,22 @@ diann_fragion_isotopes_mDIA: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Corrected ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1ISOTOPES: - Precursor.Charge @@ -195,7 +195,7 @@ diann_fragion_isotopes_mDIA: diann_precursors_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -207,18 +207,18 @@ diann_precursors_mDIA: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge use_iontree: True ml_level: CHARGE diann_precursors_translated_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -230,11 +230,11 @@ diann_precursors_translated_mDIA: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge use_iontree: True ml_level: CHARGE @@ -242,7 +242,7 @@ diann_precursors_translated_mDIA: diann_precursors_normalised_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -254,18 +254,18 @@ diann_precursors_normalised_mDIA: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge use_iontree: True ml_level: CHARGE diann_precursors_and_ms1_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -278,20 +278,20 @@ diann_precursors_and_ms1_mDIA: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge ms1iso: order: [SEQ, MOD, CHARGE, MS1] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1: - Stripped.Sequence @@ -302,7 +302,7 @@ diann_precursors_and_ms1_mDIA: diann_precursors_and_ms1_normalised_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -315,20 +315,20 @@ diann_precursors_and_ms1_normalised_mDIA: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge ms1iso: order: [SEQ, MOD, CHARGE, MS1] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1: - Stripped.Sequence @@ -338,7 +338,7 @@ diann_precursors_and_ms1_normalised_mDIA: diann_ms1_mDIA: format: longtable - channel_ID: + channel_ID: - Channel.0 - Channel.4 sample_ID: Run @@ -350,11 +350,11 @@ diann_ms1_mDIA: ms1iso: order: [SEQ, MOD, CHARGE, MS1] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1: - Stripped.Sequence @@ -374,22 +374,22 @@ diann_fragion_isotopes: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Corrected ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1ISOTOPES: - Precursor.Charge @@ -412,22 +412,22 @@ diann_fragion_isotopes_raw: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Raw ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1ISOTOPES: - Precursor.Charge @@ -450,22 +450,22 @@ diann_fragion_isotopes_raw_charite_dataset: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Raw ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1ISOTOPES: - Precursor.Charge @@ -486,13 +486,13 @@ diann_fragion: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Corrected use_iontree: True ml_level: CHARGE @@ -591,24 +591,24 @@ spectronaut_ptm_fragion_isotopes: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - ptm_mapped_modseq - CHARGE: + CHARGE: - FG.Charge - FRGION: + FRGION: - F.FrgIon - F.FrgLossType - F.Charge ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - ptm_mapped_modseq - CHARGE: + CHARGE: - FG.Charge MS1ISOTOPES: - FG.MS1IsotopeIntensities (Measured) @@ -641,24 +641,24 @@ spectronaut_fragion_isotopes: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge - FRGION: + FRGION: - F.FrgIon - F.FrgLossType - F.Charge ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge MS1ISOTOPES: - FG.MS1IsotopeIntensities (Measured) @@ -674,7 +674,7 @@ spectronaut_fragion_isotopes: # param: EG.IsDecoy # comparator: "==" # value: False - # shape_quality: + # shape_quality: # param: FG.ShapeQualityScore (MS2) # comparator: ">" # value: 0.4 @@ -703,24 +703,24 @@ spectronaut_fragion_isotopes_frag_height: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge - FRGION: + FRGION: - F.FrgIon - F.FrgLossType - F.Charge ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge MS1ISOTOPES: - FG.MS1IsotopeIntensities (Measured) @@ -753,24 +753,24 @@ spectronaut_fragion_isotopes_filtered: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge - FRGION: + FRGION: - F.FrgIon - F.FrgLossType - F.Charge ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge MS1ISOTOPES: - FG.MS1IsotopeIntensities (Measured) @@ -787,7 +787,7 @@ spectronaut_fragion_isotopes_filtered: param: EG.IsDecoy comparator: "==" value: False - shape_quality: + shape_quality: param: FG.ShapeQualityScore comparator: ">" value: 0.4 @@ -802,7 +802,7 @@ spectronaut_fragion_isotopes_filtered: # param: EG.IsDecoy # comparator: "==" # value: False - # shape_quality: + # shape_quality: # param: FG.ShapeQualityScore (MS2) # comparator: ">" # value: 0.4 @@ -830,13 +830,13 @@ spectronaut_fragion_isotopes_filtered_iq: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - PEP.StrippedSequence - MOD: + MOD: - EG.ModifiedSequence - CHARGE: + CHARGE: - FG.Charge - FRGION: + FRGION: - F.FrgIon - F.FrgLossType filters: @@ -877,7 +877,7 @@ spectronaut_precursor_new: param: EG.IsDecoy comparator: "==" value: False - shape_quality: + shape_quality: param: FG.ShapeQualityScore (MS2) comparator: ">" value: 0.4 @@ -924,7 +924,7 @@ spectronaut_precursor_v2: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - PEP.StrippedSequence MOD: - EG.ModifiedSequence @@ -944,7 +944,7 @@ spectronaut_precursor_v3: precursor: order: [SEQ, MOD, CHARGE] mapping: - SEQ: + SEQ: - PEP.StrippedSequence MOD: - EG.ModifiedSequence @@ -1016,7 +1016,7 @@ diann_wideformat: sequence_int: order: [SEQ, MOD] mapping: - SEQ: + SEQ: - Stripped.Sequence MOD: - Modified.Sequence @@ -1041,22 +1041,22 @@ diann_fragion_isotopes_gene_level: fragion: order: [SEQ, MOD, CHARGE, FRGION] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge - FRGION: + FRGION: - Fragment.Quant.Raw ms1iso: order: [SEQ, MOD, CHARGE, MS1ISOTOPES] mapping: - SEQ: + SEQ: - Stripped.Sequence - MOD: + MOD: - Modified.Sequence - CHARGE: + CHARGE: - Precursor.Charge MS1ISOTOPES: - Precursor.Charge @@ -1074,6 +1074,6 @@ fragpipe_precursors: mapping: SEQ: - Peptide Sequence - MOD: + MOD: - Modified Sequence - use_iontree: False \ No newline at end of file + use_iontree: False diff --git a/alphabase/constants/element.py b/alphabase/constants/element.py index 8add6ee0..d3803609 100644 --- a/alphabase/constants/element.py +++ b/alphabase/constants/element.py @@ -1 +1,10 @@ -from .atom import * \ No newline at end of file +from alphabase.constants.atom import * # noqa: F403 TODO remove in the next release + +import warnings + +warnings.warn( + "The module `alphabase.constants.element` is deprecated, " + "it will be removed in alphabase>=1.3.0. " + "Please use `alphabase.constants.atom` instead", + FutureWarning, +) diff --git a/alphabase/constants/isotope.py b/alphabase/constants/isotope.py index a2e3dc18..a0c432ff 100644 --- a/alphabase/constants/isotope.py +++ b/alphabase/constants/isotope.py @@ -2,23 +2,27 @@ import numpy as np import typing -from alphabase.constants.element import ( - MAX_ISOTOPE_LEN, EMPTY_DIST, - CHEM_ISOTOPE_DIST, CHEM_MONO_IDX, CHEM_MONO_MASS, - truncate_isotope, parse_formula +from alphabase.constants.atom import ( + MAX_ISOTOPE_LEN, + EMPTY_DIST, + CHEM_ISOTOPE_DIST, + CHEM_MONO_IDX, + truncate_isotope, + parse_formula, ) + @numba.njit def abundance_convolution( - d1:np.ndarray, - mono1:int, - d2:np.ndarray, - mono2:int, -)->typing.Tuple[np.ndarray, int]: - ''' - If we have two isotope distributions, - we can convolute them into one distribution. - + d1: np.ndarray, + mono1: int, + d2: np.ndarray, + mono2: int, +) -> typing.Tuple[np.ndarray, int]: + """ + If we have two isotope distributions, + we can convolute them into one distribution. + Parameters ---------- d1 : np.ndarray @@ -32,33 +36,34 @@ def abundance_convolution( mono2 : int mono position of d2 - + Returns ------- tuple[np.ndarray,int] np.ndarray, convoluted isotope distribution int, new mono position. - ''' + """ mono_idx = mono1 + mono2 - ret = np.zeros(MAX_ISOTOPE_LEN*2-1) + ret = np.zeros(MAX_ISOTOPE_LEN * 2 - 1) for i in range(len(d1)): for j in range(len(d2)): - ret[i+j] += d1[i]*d2[j] + ret[i + j] += d1[i] * d2[j] mono_idx, start, end = truncate_isotope(ret, mono_idx) return ret[start:end], mono_idx + @numba.njit def one_element_dist( elem: str, n: int, chem_isotope_dist: numba.typed.Dict, chem_mono_idx: numba.typed.Dict, -)->typing.Tuple[np.ndarray, int]: - ''' - Calculate the isotope distribution for +) -> typing.Tuple[np.ndarray, int]: + """ + Calculate the isotope distribution for an element and its numbers. - + Parameters ---------- elem : str @@ -78,21 +83,26 @@ def one_element_dist( tuple[np.ndarray, int] np.ndarray, isotope distribution of the element. int, mono position in the distribution - ''' - if n == 0: return EMPTY_DIST.copy(), 0 - elif n == 1: return chem_isotope_dist[elem], chem_mono_idx[elem] - tmp_dist, mono_idx = one_element_dist(elem, n//2, chem_isotope_dist, chem_mono_idx) + """ + if n == 0: + return EMPTY_DIST.copy(), 0 + elif n == 1: + return chem_isotope_dist[elem], chem_mono_idx[elem] + tmp_dist, mono_idx = one_element_dist( + elem, n // 2, chem_isotope_dist, chem_mono_idx + ) tmp_dist, mono_idx = abundance_convolution(tmp_dist, mono_idx, tmp_dist, mono_idx) - if n%2 == 0: + if n % 2 == 0: return tmp_dist, mono_idx else: - return abundance_convolution(tmp_dist, mono_idx, chem_isotope_dist[elem], chem_mono_idx[elem]) + return abundance_convolution( + tmp_dist, mono_idx, chem_isotope_dist[elem], chem_mono_idx[elem] + ) + -def formula_dist( - formula: typing.Union[list, str] -)->typing.Tuple[np.ndarray, int]: - ''' - Generate the isotope distribution and the mono index for +def formula_dist(formula: typing.Union[list, str]) -> typing.Tuple[np.ndarray, int]: + """ + Generate the isotope distribution and the mono index for a given formula (as a list, e.g. `[('H', 2), ('C', 2), ('O', 1)]`). Parameters @@ -101,13 +111,13 @@ def formula_dist( chemical formula, could be str or list. If str: "H(1)N(2)O(3)". If list: "[('H',1),('H',2),('H',3)]". - + Returns ------- tuple[np.ndarray,int] np.ndarray, isotope distribution int, mono position - ''' + """ if isinstance(formula, str): formula = parse_formula(formula) calc_dist = EMPTY_DIST.copy() @@ -117,13 +127,11 @@ def formula_dist( calc_dist, mono_idx = abundance_convolution(calc_dist, mono_idx, _dist, _mono) return calc_dist, mono_idx -def _calc_one_elem_cum_dist( - element_cum_dist:np.ndarray, - element_cum_mono:np.ndarray -): + +def _calc_one_elem_cum_dist(element_cum_dist: np.ndarray, element_cum_mono: np.ndarray): """Pre-build isotope abundance distribution for an element for fast calculation. Internel function. - + Added information inplace into element_cum_dist and element_cum_mono Parameters @@ -135,32 +143,31 @@ def _calc_one_elem_cum_dist( Cumulated element mono position in the distribution """ for n in range(2, len(element_cum_dist)): - ( - element_cum_dist[n], - element_cum_mono[n] - ) = abundance_convolution( - element_cum_dist[n-1], - element_cum_mono[n-1], + (element_cum_dist[n], element_cum_mono[n]) = abundance_convolution( + element_cum_dist[n - 1], + element_cum_mono[n - 1], element_cum_dist[1], - element_cum_mono[1] + element_cum_mono[1], ) + class IsotopeDistribution: - def __init__(self, - max_elem_num_dict:dict = { - 'C': 2000, - 'H': 5000, - 'N': 1000, - 'O': 1000, - 'S': 200, - 'P': 200, - } + def __init__( + self, + max_elem_num_dict: dict = { + "C": 2000, + "H": 5000, + "N": 1000, + "O": 1000, + "S": 200, + "P": 200, + }, ): """Faster calculation of isotope abundance distribution by pre-building isotope distribution tables for most common elements. We have considered large enough number of elements for shotgun proteomics. - We can increase `max_elem_num_dict` to support larger peptide or top-down + We can increase `max_elem_num_dict` to support larger peptide or top-down in the future. However, current `MAX_ISOTOPE_LEN` is not suitable for top-down, it must be extended to a larger number (100?). Note that non-standard amino acids have 1000000 C elements in AlphaBase, @@ -171,14 +178,14 @@ def __init__(self, Parameters ---------- max_elem_num_dict : dict, optional - Define the maximal number of the elements. - Defaults to { 'C': 2000, 'H': 5000, 'N': 1000, 'O': 1000, 'S': 200, 'P': 200, } - + Define the maximal number of the elements. + Defaults to { 'C': 2000, 'H': 5000, 'N': 1000, 'O': 1000, 'S': 200, 'P': 200, } + Attributes ---------- - element_to_cum_dist_dict : dict + element_to_cum_dist_dict : dict {element: cumulated isotope distribution array}, - and the cumulated isotope distribution array is a 2-D float np.ndarray with + and the cumulated isotope distribution array is a 2-D float np.ndarray with shape (element_max_number, MAX_ISOTOPE_LEN). element_to_cum_mono_idx : dict @@ -188,21 +195,22 @@ def __init__(self, self.element_to_cum_dist_dict = {} self.element_to_cum_mono_idx = {} for elem, n in max_elem_num_dict.items(): - if n < 2: n = 2 + if n < 2: + n = 2 self.element_to_cum_dist_dict[elem] = np.zeros((n, MAX_ISOTOPE_LEN)) - self.element_to_cum_mono_idx[elem] = -np.ones(n,dtype=np.int64) - self.element_to_cum_dist_dict[elem][0,:] = EMPTY_DIST + self.element_to_cum_mono_idx[elem] = -np.ones(n, dtype=np.int64) + self.element_to_cum_dist_dict[elem][0, :] = EMPTY_DIST self.element_to_cum_mono_idx[elem][0] = 0 - self.element_to_cum_dist_dict[elem][1,:] = CHEM_ISOTOPE_DIST[elem] + self.element_to_cum_dist_dict[elem][1, :] = CHEM_ISOTOPE_DIST[elem] self.element_to_cum_mono_idx[elem][1] = CHEM_MONO_IDX[elem] _calc_one_elem_cum_dist( - self.element_to_cum_dist_dict[elem], - self.element_to_cum_mono_idx[elem] + self.element_to_cum_dist_dict[elem], self.element_to_cum_mono_idx[elem] ) - def calc_formula_distribution(self, - formula: typing.List[typing.Tuple[str,int]], - )->typing.Tuple[np.ndarray, int]: + def calc_formula_distribution( + self, + formula: typing.List[typing.Tuple[str, int]], + ) -> typing.Tuple[np.ndarray, int]: """Calculate isotope abundance distribution for a given formula Parameters @@ -215,7 +223,7 @@ def calc_formula_distribution(self, tuple[np.ndarray, int] np.ndarray, isotope abundance distribution int, monoisotope position in the distribution array - + Examples -------- >>> from alphabase.constants import IsotopeDistribution, parse_formula @@ -227,12 +235,12 @@ def calc_formula_distribution(self, array([1.92320044e-02, 2.10952666e-02, 3.13753566e-01, 3.42663681e-01, 1.95962632e-01, 7.69157517e-02, 2.31993814e-02, 5.71948249e-03, 1.19790438e-03, 2.18815385e-04]) - >>> # Fe's mono position is 2 Da larger than its smallest mass, + >>> # Fe's mono position is 2 Da larger than its smallest mass, >>> # so the mono position of this formula shifts by +2 (Da). - >>> mono + >>> mono 2 - >>> formula = 'C(100)H(100)O(10)13C(1)Na(1)' + >>> formula = 'C(100)H(100)O(10)13C(1)Na(1)' >>> formula = parse_formula(formula) >>> dist, mono = iso.calc_formula_distribution(formula) >>> dist @@ -243,7 +251,7 @@ def calc_formula_distribution(self, >>> mono 1 - >>> formula = 'C(100)H(100)O(10)Na(1)' + >>> formula = 'C(100)H(100)O(10)Na(1)' >>> formula = parse_formula(formula) >>> dist, mono = iso.calc_formula_distribution(formula) >>> dist @@ -253,24 +261,24 @@ def calc_formula_distribution(self, >>> # mono position is normal (=0) for regular formulas >>> mono 0 - + """ mono = 0 dist = EMPTY_DIST.copy() for elem, n in formula: if elem in self.element_to_cum_dist_dict: if n >= len(self.element_to_cum_mono_idx[elem]): - n = len(self.element_to_cum_mono_idx[elem])-1 + n = len(self.element_to_cum_mono_idx[elem]) - 1 dist, mono = abundance_convolution( - dist, mono, + dist, + mono, self.element_to_cum_dist_dict[elem][n], self.element_to_cum_mono_idx[elem][n], ) else: dist, mono = abundance_convolution( - dist, mono, *one_element_dist( - elem,n,CHEM_ISOTOPE_DIST, CHEM_MONO_IDX - ) + dist, + mono, + *one_element_dist(elem, n, CHEM_ISOTOPE_DIST, CHEM_MONO_IDX), ) return dist, mono - diff --git a/alphabase/constants/modification.py b/alphabase/constants/modification.py index e9ad6d51..a1627e7c 100644 --- a/alphabase/constants/modification.py +++ b/alphabase/constants/modification.py @@ -4,111 +4,117 @@ import pandas as pd from typing import Union, List -from alphabase.constants.element import ( - calc_mass_from_formula, parse_formula, +from alphabase.constants.atom import ( + calc_mass_from_formula, + parse_formula, ) from alphabase.constants._const import CONST_FILE_FOLDER #: Main entry of modification infomation (DataFrame fotmat). -MOD_DF:pd.DataFrame = pd.DataFrame() +MOD_DF: pd.DataFrame = pd.DataFrame() -MOD_INFO_DICT:dict = {} +MOD_INFO_DICT: dict = {} #: Modification to formula str dict. {mod_name: formula str ('H(1)C(2)O(3)')} -MOD_CHEM:dict = {} +MOD_CHEM: dict = {} #: Modification to mass dict. -MOD_MASS:dict = {} +MOD_MASS: dict = {} #: Modification to modification neutral loss dict. -MOD_LOSS_MASS:dict = {} -#Modification to formula dict of dict, i.e. {modname: {'C': n, 'H': m, ...}} -MOD_Composition:dict = {} +MOD_LOSS_MASS: dict = {} +# Modification to formula dict of dict, i.e. {modname: {'C': n, 'H': m, ...}} +MOD_Composition: dict = {} #: Modification loss importance -MOD_LOSS_IMPORTANCE:dict = {} +MOD_LOSS_IMPORTANCE: dict = {} + def update_all_by_MOD_DF(): """ - As DataFrame is more conveneint in data operation, - we can also process MOD_DF and then update all global + As DataFrame is more conveneint in data operation, + we can also process MOD_DF and then update all global modification variables from MOD_DF """ - + MOD_INFO_DICT.clear() - MOD_INFO_DICT.update(MOD_DF.to_dict(orient='index')) + MOD_INFO_DICT.update(MOD_DF.to_dict(orient="index")) MOD_CHEM.clear() - MOD_CHEM.update(MOD_DF['composition'].to_dict()) + MOD_CHEM.update(MOD_DF["composition"].to_dict()) MOD_MASS.clear() - MOD_MASS.update(MOD_DF['mass'].to_dict()) + MOD_MASS.update(MOD_DF["mass"].to_dict()) MOD_LOSS_MASS.clear() - MOD_LOSS_MASS.update(MOD_DF['modloss'].to_dict()) + MOD_LOSS_MASS.update(MOD_DF["modloss"].to_dict()) MOD_LOSS_IMPORTANCE.clear() - MOD_LOSS_IMPORTANCE.update(MOD_DF['modloss_importance'].to_dict()) + MOD_LOSS_IMPORTANCE.update(MOD_DF["modloss_importance"].to_dict()) MOD_Composition.clear() for mod, chem in MOD_CHEM.items(): MOD_Composition[mod] = dict(parse_formula(chem)) + def add_modifications_for_lower_case_AA(): - """ Add modifications for lower-case AAs for advanced usages """ + """Add modifications for lower-case AAs for advanced usages""" global MOD_DF lower_case_df = MOD_DF.copy() - + def _mod_lower_case(modname): - modname, site = modname.split('@') + modname, site = modname.split("@") if len(site) == 1: - return modname+'@'+site.lower() - elif '^' in site: - site = site[0].lower()+site[1:] - return modname+'@'+site + return modname + "@" + site.lower() + elif "^" in site: + site = site[0].lower() + site[1:] + return modname + "@" + site else: - return '' - lower_case_df['mod_name'] = lower_case_df['mod_name'].apply(_mod_lower_case) - lower_case_df = lower_case_df[lower_case_df['mod_name']!=''] - lower_case_df.set_index('mod_name', drop=False, inplace=True) - lower_case_df['lower_case_AA'] = True - MOD_DF['lower_case_AA'] = False + return "" + + lower_case_df["mod_name"] = lower_case_df["mod_name"].apply(_mod_lower_case) + lower_case_df = lower_case_df[lower_case_df["mod_name"] != ""] + lower_case_df.set_index("mod_name", drop=False, inplace=True) + lower_case_df["lower_case_AA"] = True + MOD_DF["lower_case_AA"] = False MOD_DF = pd.concat([MOD_DF, lower_case_df]) update_all_by_MOD_DF() -def keep_modloss_by_importance(modloss_importance_level:float=1.0): - MOD_DF['modloss'] = MOD_DF['modloss_original'] - MOD_DF.loc[MOD_DF.modloss_importancenp.ndarray: - ''' - Calculate modification masses for the given peptide length (`nAA`), + nAA: int, mod_names: List[str], mod_sites: List[int] +) -> np.ndarray: + """ + Calculate modification masses for the given peptide length (`nAA`), and modified site list. - + Parameters ---------- nAA : int @@ -122,14 +128,14 @@ def calc_modification_mass( * `site=0` refers to an N-term modification * `site=-1` refers to a C-term modification * `1<=site<=peplen` refers to a normal modification - + Returns ------- np.ndarray - 1-D array with length=`nAA`. - Masses of modifications through the peptide, + 1-D array with length=`nAA`. + Masses of modifications through the peptide, `0` if sites has no modifications - ''' + """ masses = np.zeros(nAA) for site, mod in zip(mod_sites, mod_names): if site == 0: @@ -137,21 +143,20 @@ def calc_modification_mass( elif site == -1: masses[site] += MOD_MASS[mod] else: - masses[site-1] += MOD_MASS[mod] + masses[site - 1] += MOD_MASS[mod] return masses + def calc_mod_masses_for_same_len_seqs( - nAA:int, - mod_names_list:List[List[str]], - mod_sites_list:List[List[int]] -)->np.ndarray: - ''' + nAA: int, mod_names_list: List[List[str]], mod_sites_list: List[List[int]] +) -> np.ndarray: + """ Calculate modification masses for the given peptides with same peptide length (`nAA`). - + Parameters ---------- nAA : int - + Peptide length mod_names_list : List[List[str]] @@ -162,35 +167,32 @@ def calc_mod_masses_for_same_len_seqs( * `site=0` refers to an N-term modification * `site=-1` refers to a C-term modification * `1<=site<=peplen` refers to a normal modification - + Returns ------- np.ndarray - 2-D array with shape=`(nAA, pep_count or len(mod_names_list)))`. - Masses of modifications through all the peptides, + 2-D array with shape=`(nAA, pep_count or len(mod_names_list)))`. + Masses of modifications through all the peptides, `0` if sites without modifications. - ''' - masses = np.zeros((len(mod_names_list),nAA)) - for i, (mod_names, mod_sites) in enumerate( - zip(mod_names_list, mod_sites_list) - ): - for mod, site in zip(mod_names, mod_sites): + """ + masses = np.zeros((len(mod_names_list), nAA)) + for i, (mod_names, mod_sites) in enumerate(zip(mod_names_list, mod_sites_list)): + for mod, site in zip(mod_names, mod_sites): if site == 0: - masses[i,site] += MOD_MASS[mod] + masses[i, site] += MOD_MASS[mod] elif site == -1: - masses[i,site] += MOD_MASS[mod] + masses[i, site] += MOD_MASS[mod] else: - masses[i,site-1] += MOD_MASS[mod] + masses[i, site - 1] += MOD_MASS[mod] return masses -def calc_modification_mass_sum( - mod_names:List[str] -)->float: + +def calc_modification_mass_sum(mod_names: List[str]) -> float: """ - Calculate summed mass of the given modification + Calculate summed mass of the given modification without knowing the sites and peptide length. It is useful to calculate peptide mass. - + Parameters ---------- mod_names : List[str] @@ -201,23 +203,20 @@ def calc_modification_mass_sum( float Total mass """ - return np.sum([ - MOD_MASS[mod] for mod in mod_names - ]) + return np.sum([MOD_MASS[mod] for mod in mod_names]) @numba.jit(nopython=True, nogil=True) def _calc_modloss_with_importance( - mod_losses: np.ndarray, - _loss_importance: np.ndarray -)->np.ndarray: - ''' - Calculate modification loss masses (e.g. -98 Da for Phospho@S/T). - Modification with higher `_loss_importance` has higher priorities. + mod_losses: np.ndarray, _loss_importance: np.ndarray +) -> np.ndarray: + """ + Calculate modification loss masses (e.g. -98 Da for Phospho@S/T). + Modification with higher `_loss_importance` has higher priorities. For example, `AM(Oxidation@M)S(Phospho@S)...`, - importance of Phospho@S > importance of Oxidation@M, so the modloss of + importance of Phospho@S > importance of Oxidation@M, so the modloss of b3 ion will be -98 Da, not -64 Da. - + Parameters ---------- mod_losses : np.ndarray @@ -225,15 +224,15 @@ def _calc_modloss_with_importance( _loss_importance : np.ndarray Mod loss importance of each AA position - + Returns ------- np.ndarray New mod_loss masses selected by `_loss_importance` - ''' + """ prev_importance = _loss_importance[0] prev_most = 0 - for i, _curr_imp in enumerate(_loss_importance[1:],1): + for i, _curr_imp in enumerate(_loss_importance[1:], 1): if _curr_imp > prev_importance: prev_most = i prev_importance = _curr_imp @@ -241,19 +240,20 @@ def _calc_modloss_with_importance( mod_losses[i] = mod_losses[prev_most] return mod_losses + def calc_modloss_mass_with_importance( - nAA: int, - mod_names: List, + nAA: int, + mod_names: List, mod_sites: List, for_nterm_frag: bool, -)->np.ndarray: - ''' - Calculate modification loss masses (e.g. -98 Da for Phospho@S/T, - -64 Da for Oxidation@M). Modifications with higher `MOD_LOSS_IMPORTANCE` +) -> np.ndarray: + """ + Calculate modification loss masses (e.g. -98 Da for Phospho@S/T, + -64 Da for Oxidation@M). Modifications with higher `MOD_LOSS_IMPORTANCE` have higher priorities. For example, `AS(Phospho@S)M(Oxidation@M)...`, - importance of Phospho@S > importance of Oxidation@M, so the modloss of + importance of Phospho@S > importance of Oxidation@M, so the modloss of b3 ion will be -98 Da, not -64 Da. - + Parameters ---------- nAA : int @@ -263,73 +263,76 @@ def calc_modloss_mass_with_importance( Modification name list mod_sites : List[int] - Modification site list + Modification site list for_nterm_frag : bool - If `True`, the loss will be on the - N-term fragments (mainly `b` ions); - If `False`, the loss will be on the + If `True`, the loss will be on the + N-term fragments (mainly `b` ions); + If `False`, the loss will be on the C-term fragments (mainly `y` ions) - + Returns ------- np.ndarray mod_loss masses - ''' - if not mod_names: return np.zeros(nAA-1) - mod_losses = np.zeros(nAA+2) + """ + if not mod_names: + return np.zeros(nAA - 1) + mod_losses = np.zeros(nAA + 2) mod_losses[mod_sites] = [MOD_LOSS_MASS[mod] for mod in mod_names] - _loss_importance = np.zeros(nAA+2) + _loss_importance = np.zeros(nAA + 2) _loss_importance[mod_sites] = [ - MOD_LOSS_IMPORTANCE[mod] if mod in MOD_LOSS_IMPORTANCE else 0 + MOD_LOSS_IMPORTANCE[mod] if mod in MOD_LOSS_IMPORTANCE else 0 for mod in mod_names ] - + # Will not consider the modloss if the corresponding modloss_importance is 0 - mod_losses[_loss_importance==0] = 0 + mod_losses[_loss_importance == 0] = 0 if for_nterm_frag: return _calc_modloss_with_importance(mod_losses, _loss_importance)[1:-2] else: - return _calc_modloss_with_importance(mod_losses[::-1], _loss_importance[::-1])[-3:0:-1] + return _calc_modloss_with_importance(mod_losses[::-1], _loss_importance[::-1])[ + -3:0:-1 + ] + @numba.njit -def _calc_modloss( - mod_losses: np.ndarray -)->np.ndarray: - ''' - Calculate modification loss masses (e.g. -98 Da for Phospho@S/T). - +def _calc_modloss(mod_losses: np.ndarray) -> np.ndarray: + """ + Calculate modification loss masses (e.g. -98 Da for Phospho@S/T). + Parameters ---------- mod_losses : np.ndarray Mod loss masses of each AA position - + Returns ------- np.ndarray - New mod_loss masses - ''' - for i, _curr_loss in enumerate(mod_losses[1:],1): + New mod_loss masses + """ + for i, _curr_loss in enumerate(mod_losses[1:], 1): if _curr_loss == 0: - mod_losses[i] = mod_losses[i-1] + mod_losses[i] = mod_losses[i - 1] else: mod_losses[i] = _curr_loss return mod_losses - + + def calc_modloss_mass( - nAA: int, - mod_names: List, + nAA: int, + mod_names: List, mod_sites: List, for_nterm_frag: bool, -)->np.ndarray: - ''' - Calculate modification loss masses (e.g. -98 Da for Phospho@S/T, +) -> np.ndarray: + """ + Calculate modification loss masses (e.g. -98 Da for Phospho@S/T, -64 Da for Oxidation@M). The mod loss mass is calculated by the - modification closer to the fragment sites. For example, + modification closer to the fragment sites. For example, the modloss of the b3 ion for `AS(Phospho@S)M(Oxidation@M)...` will be -64 Da. - + Parameters ---------- nAA : int @@ -339,21 +342,22 @@ def calc_modloss_mass( Modification name list mod_sites : List[int] - Modification site list corresponding + Modification site list corresponding for_nterm_frag : bool - If `True`, the loss will be on the - N-term fragments (mainly `b` ions); - If `False`, the loss will be on the + If `True`, the loss will be on the + N-term fragments (mainly `b` ions); + If `False`, the loss will be on the C-term fragments (mainly `y` ions) - + Returns ------- np.ndarray mod_loss masses - ''' - if len(mod_names) == 0: return np.zeros(nAA-1) - mod_losses = np.zeros(nAA+2) + """ + if len(mod_names) == 0: + return np.zeros(nAA - 1) + mod_losses = np.zeros(nAA + 2) mod_losses[mod_sites] = [MOD_LOSS_MASS[mod] for mod in mod_names] if for_nterm_frag: @@ -361,30 +365,34 @@ def calc_modloss_mass( else: return _calc_modloss(mod_losses[::-1])[-3:0:-1] + def _add_a_new_modification( - mod_name:str, composition:str, - modloss_composition:str='' + mod_name: str, composition: str, modloss_composition: str = "" ): """ Add a new modification into :data:`MOD_DF`. """ - MOD_DF.loc[mod_name,[ - 'mod_name','composition','modloss_composition', - 'classification','unimod_id' - ]] = [ - mod_name, composition, modloss_composition, - 'User-added', 0 - ] - MOD_DF.loc[mod_name,['mass','modloss']] = ( + MOD_DF.loc[ + mod_name, + [ + "mod_name", + "composition", + "modloss_composition", + "classification", + "unimod_id", + ], + ] = [mod_name, composition, modloss_composition, "User-added", 0] + MOD_DF.loc[mod_name, ["mass", "modloss"]] = ( calc_mass_from_formula(composition), - calc_mass_from_formula(modloss_composition) + calc_mass_from_formula(modloss_composition), ) - if MOD_DF.loc[mod_name, 'modloss'] > 0: - MOD_DF.loc[mod_name, 'modloss_importance'] = 1e10 + if MOD_DF.loc[mod_name, "modloss"] > 0: + MOD_DF.loc[mod_name, "modloss_importance"] = 1e10 MOD_DF.fillna(0, inplace=True) # update_all_by_MOD_DF() -def add_new_modifications(new_mods:Union[list,dict]): + +def add_new_modifications(new_mods: Union[list, dict]): """Add new modifications into :data:`MOD_DF`. Parameters @@ -393,7 +401,7 @@ def add_new_modifications(new_mods:Union[list,dict]): list of tuples example: ``` [( - mod@site:str (e.g. Mod@S), + mod@site:str (e.g. Mod@S), composition:str (e.g. "H(4)O(2)"), [optional] modloss composition:str (e.g. "H(2)O(1)"), ), ...] diff --git a/alphabase/gui.py b/alphabase/gui.py index fcec3488..22fa93b8 100644 --- a/alphabase/gui.py +++ b/alphabase/gui.py @@ -1,2 +1,2 @@ def run(*args, **kwargs): - pass \ No newline at end of file + pass diff --git a/alphabase/io/hdf.py b/alphabase/io/hdf.py index 717111a6..26f12a8f 100644 --- a/alphabase/io/hdf.py +++ b/alphabase/io/hdf.py @@ -4,13 +4,12 @@ import re import contextlib import time -import warnings class HDF_Object(object): - ''' + """ A generic class to access HDF components. - ''' + """ @property def read_only(self): @@ -29,18 +28,10 @@ def name(self): return self._name def __eq__(self, other): - return ( - self.file_name == other.self.file_name - ) and ( - self.name == other.name - ) + return (self.file_name == other.self.file_name) and (self.name == other.name) @contextlib.contextmanager - def editing_mode( - self, - read_only: bool = False, - truncate: bool = True - ): + def editing_mode(self, read_only: bool = False, truncate: bool = True): original_read_only = self.read_only original_truncate = self.truncate try: @@ -82,12 +73,10 @@ def __setattr__(self, name, value): raise AttributeError("Cannot set read-only attributes") elif not isinstance(name, str): raise KeyError(f"Attribute name '{name}' is not a string") - elif not bool(re.match(r'^[a-zA-Z_][\w.-]*$', name)): + elif not bool(re.match(r"^[a-zA-Z_][\w.-]*$", name)): raise KeyError(f"Invalid attribute name: {name}") if (not self.truncate) and (name in self.metadata): - raise KeyError( - f"Attribute '{name}' cannot be truncated" - ) + raise KeyError(f"Attribute '{name}' cannot be truncated") if isinstance(value, (str, bool, int, float)): with h5py.File(self.file_name, "a") as hdf_file: hdf_object = hdf_file[self.name] @@ -101,7 +90,6 @@ def __setattr__(self, name, value): class HDF_Group(HDF_Object): - def __init__( self, *, @@ -158,21 +146,15 @@ def dataframe_names(self): @property def groups(self): - return [ - self.__getattribute__(name) for name in self.group_names - ] + return [self.__getattribute__(name) for name in self.group_names] @property def datasets(self): - return [ - self.__getattribute__(name) for name in self.dataset_names - ] + return [self.__getattribute__(name) for name in self.dataset_names] @property def dataframes(self): - return [ - self.__getattribute__(name) for name in self.dataframe_names - ] + return [self.__getattribute__(name) for name in self.dataframe_names] @property def components(self): @@ -186,7 +168,10 @@ def components(self): if not name.endswith("_mmap"): dataset_names.append(name) else: - if name.endswith('_df') or "is_pd_dataframe" in hdf_object[name].attrs: + if ( + name.endswith("_df") + or "is_pd_dataframe" in hdf_object[name].attrs + ): datafame_names.append(name) else: group_names.append(name) @@ -216,17 +201,11 @@ def __setattr__(self, name, value): except NotImplementedError: if not self.truncate: if name in self.group_names: - raise KeyError( - f"Group name '{name}' cannot be truncated" - ) + raise KeyError(f"Group name '{name}' cannot be truncated") elif name in self.dataset_names: - raise KeyError( - f"Dataset name '{name}' cannot be truncated" - ) + raise KeyError(f"Dataset name '{name}' cannot be truncated") elif name in self.dataframe_names: - raise KeyError( - f"Dataframe name '{name}' cannot be truncated" - ) + raise KeyError(f"Dataframe name '{name}' cannot be truncated") if isinstance(value, (np.ndarray, pd.core.series.Series)): self.add_dataset(name, value) elif isinstance(value, (dict, pd.DataFrame)): @@ -236,7 +215,7 @@ def __setattr__(self, name, value): f"Type '{type(value)}' is invalid for attribute {name}", "Only (str, bool, int, float, np.ndarray, " "pd.core.series.Series, dict pd.DataFrame) types are " - "accepted." + "accepted.", ) def add_dataset( @@ -298,7 +277,7 @@ def add_group( del hdf_object[name] hdf_object.create_group(name) if isinstance(group, pd.DataFrame): - if not name.endswith('_df'): + if not name.endswith("_df"): raise TypeError(f"DataFrame group name `{name}` must end with `_df`") group = dict(group) # group["is_pd_dataframe"] = True @@ -322,7 +301,6 @@ def add_group( class HDF_Dataset(HDF_Object): - def __init__( self, *, @@ -371,9 +349,7 @@ def append(self, data): raise AttributeError("Cannot append read-only dataset") with h5py.File(self.file_name, "a") as hdf_file: hdf_object = hdf_file[self.name] - new_shape = tuple( - [i + j for i, j in zip(self.shape, data.shape)] - ) + new_shape = tuple([i + j for i, j in zip(self.shape, data.shape)]) old_size = len(self) hdf_object.resize(new_shape) hdf_object[old_size:] = data @@ -421,22 +397,15 @@ def mmap(self): offset = subgroup.id.get_offset() shape = subgroup.shape import mmap + with open(self.file_name, "rb") as raw_hdf_file: - mmap_obj = mmap.mmap( - raw_hdf_file.fileno(), - 0, - access=mmap.ACCESS_READ - ) + mmap_obj = mmap.mmap(raw_hdf_file.fileno(), 0, access=mmap.ACCESS_READ) return np.frombuffer( - mmap_obj, - dtype=subgroup.dtype, - count=np.prod(shape), - offset=offset + mmap_obj, dtype=subgroup.dtype, count=np.prod(shape), offset=offset ).reshape(shape) class HDF_Dataframe(HDF_Group): - @property def dtype(self): dtypes = [] @@ -490,19 +459,19 @@ def __init__( """HDF file object to load/save the hdf file. It also provides convenient attribute-like accesses to operate the data in the HDF object. - Instead of relying directly on the `h5py` interface, we will use an HDF wrapper - file to provide consistent access to only those specific HDF features we want. - Since components of an HDF file come in three shapes `datasets`, `groups` and `attributes`, - we will first define a generic HDF wrapper object to handle these components. - Once this is done, the HDF wrapper file can be treated as such an object with additional + Instead of relying directly on the `h5py` interface, we will use an HDF wrapper + file to provide consistent access to only those specific HDF features we want. + Since components of an HDF file come in three shapes `datasets`, `groups` and `attributes`, + we will first define a generic HDF wrapper object to handle these components. + Once this is done, the HDF wrapper file can be treated as such an object with additional features to open and close the initial connection. Args: file_name (str): file path. read_only (bool, optional): If hdf is read-only. Defaults to True. - truncate (bool, optional): If existing groups and datasets can be + truncate (bool, optional): If existing groups and datasets can be truncated (i.e. are overwitten). Defaults to False. - delete_existing (bool, optional): If the file already exists, + delete_existing (bool, optional): If the file already exists, delete it completely and create a new one. Defaults to False. Examples:: @@ -530,7 +499,7 @@ def __init__( mode = "w" else: mode = "a" - with h5py.File(file_name, mode):#, swmr=True): + with h5py.File(file_name, mode): # , swmr=True): pass super().__init__( file_name=file_name, diff --git a/alphabase/io/psm_reader/__init__.py b/alphabase/io/psm_reader/__init__.py deleted file mode 100644 index 0c148e6c..00000000 --- a/alphabase/io/psm_reader/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Legacy, use alphabase.psm_reader instead -from alphabase.psm_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/alphapept_reader.py b/alphabase/io/psm_reader/alphapept_reader.py deleted file mode 100644 index d759ab20..00000000 --- a/alphabase/io/psm_reader/alphapept_reader.py +++ /dev/null @@ -1 +0,0 @@ -from alphabase.psm_reader.alphapept_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/dia_psm_reader.py b/alphabase/io/psm_reader/dia_psm_reader.py deleted file mode 100644 index d4043419..00000000 --- a/alphabase/io/psm_reader/dia_psm_reader.py +++ /dev/null @@ -1 +0,0 @@ -from alphabase.psm_reader.dia_psm_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/dia_search_reader.py b/alphabase/io/psm_reader/dia_search_reader.py deleted file mode 100644 index 5cbb67ee..00000000 --- a/alphabase/io/psm_reader/dia_search_reader.py +++ /dev/null @@ -1,2 +0,0 @@ -# Legacy, use .dia_psm_reader instead -from alphabase.psm_reader.dia_psm_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/maxquant_reader.py b/alphabase/io/psm_reader/maxquant_reader.py deleted file mode 100644 index fe862bc1..00000000 --- a/alphabase/io/psm_reader/maxquant_reader.py +++ /dev/null @@ -1,2 +0,0 @@ - -from alphabase.psm_reader.maxquant_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/msfragger_reader.py b/alphabase/io/psm_reader/msfragger_reader.py deleted file mode 100644 index aa238557..00000000 --- a/alphabase/io/psm_reader/msfragger_reader.py +++ /dev/null @@ -1 +0,0 @@ -from alphabase.psm_reader.msfragger_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/pfind_reader.py b/alphabase/io/psm_reader/pfind_reader.py deleted file mode 100644 index b9748885..00000000 --- a/alphabase/io/psm_reader/pfind_reader.py +++ /dev/null @@ -1 +0,0 @@ -from alphabase.psm_reader.pfind_reader import * \ No newline at end of file diff --git a/alphabase/io/psm_reader/psm_reader.py b/alphabase/io/psm_reader/psm_reader.py deleted file mode 100644 index 36e2b042..00000000 --- a/alphabase/io/psm_reader/psm_reader.py +++ /dev/null @@ -1 +0,0 @@ -from alphabase.psm_reader.psm_reader import * \ No newline at end of file diff --git a/alphabase/io/tempmmap.py b/alphabase/io/tempmmap.py index e811f294..a5485c75 100644 --- a/alphabase/io/tempmmap.py +++ b/alphabase/io/tempmmap.py @@ -13,14 +13,23 @@ import tempfile import shutil +# TODO initialize temp_dir not on import but when it is first needed _TEMP_DIR = tempfile.TemporaryDirectory(prefix="temp_mmap_") TEMP_DIR_NAME = _TEMP_DIR.name -logging.warning( - f"Temp mmap arrays are written to {TEMP_DIR_NAME}. " - "Cleanup of this folder is OS dependant, " - "and might need to be triggered manually!" -) +is_cleanup_info_logged = False + + +def _log_cleanup_info_once() -> None: + """Logs a info on temp array cleanup once.""" + global is_cleanup_info_logged + if not is_cleanup_info_logged: + logging.info( + f"Temp mmap arrays are written to {TEMP_DIR_NAME}. " + "Cleanup of this folder is OS dependent and might need to be triggered manually!" + ) + is_cleanup_info_logged = True + def redefine_temp_location(path): """ @@ -38,18 +47,23 @@ def redefine_temp_location(path): """ global _TEMP_DIR, _TEMP_DIR, TEMP_DIR_NAME - logging.warning(f'''Folder {TEMP_DIR_NAME} with temp mmap arrays is being deleted.All existing temp mmapp arrays will be unusable!''') - - #cleaup old temporary directory - shutil.rmtree(TEMP_DIR_NAME, ignore_errors = True) + logging.warning( + f"""Folder {TEMP_DIR_NAME} with temp mmap arrays is being deleted.All existing temp mmapp arrays will be unusable!""" + ) + + # cleaup old temporary directory + shutil.rmtree(TEMP_DIR_NAME, ignore_errors=True) del _TEMP_DIR - #create new tempfile at desired location - _TEMP_DIR = tempfile.TemporaryDirectory(prefix = os.path.join(path, 'temp_mmap')) + # create new tempfile at desired location + _TEMP_DIR = tempfile.TemporaryDirectory(prefix=os.path.join(path, "temp_mmap")) TEMP_DIR_NAME = _TEMP_DIR.name - logging.warning(f'''New temp folder location. Temp mmap arrays are written to {TEMP_DIR_NAME}. Cleanup of this folder is OS dependant, and might need to be triggered manually!''') + logging.warning( + f"""New temp folder location. Temp mmap arrays are written to {TEMP_DIR_NAME}. Cleanup of this folder is OS dependant, and might need to be triggered manually!""" + ) return TEMP_DIR_NAME + def array(shape: tuple, dtype: np.dtype) -> np.ndarray: """Create a writable temporary mmapped array. @@ -65,29 +79,106 @@ def array(shape: tuple, dtype: np.dtype) -> np.ndarray: type A writable temporary mmapped array. """ + _log_cleanup_info_once() + temp_file_name = os.path.join( - TEMP_DIR_NAME, - f"temp_mmap_{np.random.randint(2**63)}.hdf" + TEMP_DIR_NAME, f"temp_mmap_{np.random.randint(2**63)}.hdf" ) + with h5py.File(temp_file_name, "w") as hdf_file: - array = hdf_file.create_dataset( - "array", - shape=shape, - dtype=dtype - ) + array = hdf_file.create_dataset("array", shape=shape, dtype=dtype) array[0] = 0 offset = array.id.get_offset() + with open(temp_file_name, "rb+") as raw_hdf_file: - mmap_obj = mmap.mmap( - raw_hdf_file.fileno(), - 0, - access=mmap.ACCESS_WRITE + mmap_obj = mmap.mmap(raw_hdf_file.fileno(), 0, access=mmap.ACCESS_WRITE) + return np.frombuffer( + mmap_obj, dtype=dtype, count=np.prod(shape), offset=offset + ).reshape(shape) + + +def create_empty_mmap(shape: tuple, dtype: np.dtype, path: str = None, overwrite=False): + """Initialize a new HDF5 file compatible with mmap. Returns the path to the initialized file. + File can be mapped using the mmap_array_from_path function. + + Parameters + ---------- + shape : tuple + A tuple with the shape of the array. + dtype : type + The np.dtype of the array. + path : str, optional + The path to the file that should be created. + Defaults to None. + If None a random file name will be generated. + overwrite : bool , optional + If True the file will be overwritten if it already exists. + Defaults to False. + + Returns + ------- + str + path to the newly created file. + """ + _log_cleanup_info_once() + + # if path does not exist generate a random file name in the TEMP directory + if path is None: + temp_file_name = os.path.join( + TEMP_DIR_NAME, f"temp_mmap_{np.random.randint(2**63)}.hdf" ) + else: + # check that if overwrite is false the file does not already exist + if not overwrite: + if os.path.exists(path): + raise ValueError( + "The file already exists. Set overwrite to True to overwrite the file or choose a different name." + ) + if not os.path.basename.endswith(".hdf"): + raise ValueError("The chosen file name needs to end with .hdf") + if os.path.isdir(os.path.commonpath(path)): + temp_file_name = path + else: + raise ValueError( + "The directory in which the file should be created does not exist." + ) + + with h5py.File(temp_file_name, "w") as hdf_file: + array = hdf_file.create_dataset("array", shape=shape, dtype=dtype) + array[0] = 0 + + return temp_file_name + + +def mmap_array_from_path(hdf_file: str) -> np.ndarray: + """reconnect to an exisiting HDF5 file to generate a writable temporary mmapped array. + + Parameters + ---------- + hdf_file : str + path to the array that should be reconnected to. + + Returns + ------- + type + A writable temporary mmapped array. + """ + _log_cleanup_info_once() + + path = os.path.join(hdf_file) + + # read parameters required to reinitialize the mmap object + with h5py.File(path, "r") as hdf_file: + array = hdf_file["array"] + offset = array.id.get_offset() + shape = array.shape + dtype = array.dtype + + # reinitialize the mmap object + with open(path, "rb+") as raw_hdf_file: + mmap_obj = mmap.mmap(raw_hdf_file.fileno(), 0, access=mmap.ACCESS_WRITE) return np.frombuffer( - mmap_obj, - dtype=dtype, - count=np.prod(shape), - offset=offset + mmap_obj, dtype=dtype, count=np.prod(shape), offset=offset ).reshape(shape) diff --git a/alphabase/peptide/fragment.py b/alphabase/peptide/fragment.py index e1a0c8a6..39b5d912 100644 --- a/alphabase/peptide/fragment.py +++ b/alphabase/peptide/fragment.py @@ -1,47 +1,37 @@ import numpy as np import pandas as pd -from typing import List, Union, Tuple, Dict, TYPE_CHECKING -import warnings +from typing import List, Union, Tuple, Dict import numba as nb -import logging -from alphabase.constants._const import ( - PEAK_MZ_DTYPE, PEAK_INTENSITY_DTYPE -) -from alphabase.peptide.mass_calc import * -from alphabase.constants.modification import ( - calc_modloss_mass -) -from alphabase.constants.element import ( - MASS_H2O, MASS_PROTON, - MASS_NH3, MASS_H, MASS_C, MASS_O, -) +from alphabase.constants._const import PEAK_MZ_DTYPE, PEAK_INTENSITY_DTYPE +from alphabase.constants.modification import calc_modloss_mass +from alphabase.constants.atom import ( + MASS_PROTON, +) +from alphabase.peptide.mass_calc import calc_b_y_and_peptide_masses_for_same_len_seqs from alphabase.peptide.precursor import ( refine_precursor_df, - update_precursor_mz, - is_precursor_sorted + is_precursor_refined, ) -from alphabase.constants.element import ( - calc_mass_from_formula -) +from alphabase.constants.atom import calc_mass_from_formula frag_type_representation_dict = { - 'c': 'b+N(1)H(3)', - 'z': 'y+N(-1)H(-2)', - 'a': 'b+C(-1)O(-1)', - 'x': 'y+C(1)O(1)H(-2)', - 'b_H2O': 'b+H(-2)O(-1)', - 'y_H2O': 'y+H(-2)O(-1)', - 'b_NH3': 'b+N(-1)H(-3)', - 'y_NH3': 'y+N(-1)H(-3)', - 'c_lossH': 'b+N(1)H(2)', - 'z_addH': 'y+N(-1)H(-1)', + "c": "b+N(1)H(3)", + "z": "y+N(-1)H(-2)", + "a": "b+C(-1)O(-1)", + "x": "y+C(1)O(1)H(-2)", + "b_H2O": "b+H(-2)O(-1)", + "y_H2O": "y+H(-2)O(-1)", + "b_NH3": "b+N(-1)H(-3)", + "y_NH3": "y+N(-1)H(-3)", + "c_lossH": "b+N(1)H(2)", + "z_addH": "y+N(-1)H(-1)", } """ Represent fragment ion types from b/y ions. -Modification neutral losses (i.e. modloss) are not here +Modification neutral losses (i.e. modloss) are not here as they have variable atoms added to b/y ions. """ @@ -50,7 +40,8 @@ Masses parsed from :data:`frag_type_representation_dict`. """ -def add_new_frag_type(frag_type:str, representation:str): + +def add_new_frag_type(frag_type: str, representation: str): """Add new modifications into :data:`frag_type_representation_dict` and update :data:`frag_mass_from_ref_ion_dict`. @@ -62,25 +53,24 @@ def add_new_frag_type(frag_type:str, representation:str): The representation similar to :data:`frag_type_representation_dict` """ frag_type_representation_dict[frag_type] = representation - ref_ion, formula = representation.split('+') + ref_ion, formula = representation.split("+") frag_mass_from_ref_ion_dict[frag_type] = dict( - ref_ion=ref_ion, - add_mass=calc_mass_from_formula(formula) + ref_ion=ref_ion, add_mass=calc_mass_from_formula(formula) ) + def parse_all_frag_type_representation(): for frag, representation in frag_type_representation_dict.items(): add_new_frag_type(frag, representation) -parse_all_frag_type_representation() +parse_all_frag_type_representation() def get_charged_frag_types( - frag_types:List[str], - max_frag_charge:int = 2 -)->List[str]: - ''' + frag_types: List[str], max_frag_charge: int = 2 +) -> List[str]: + """ Combine fragment types and charge states. Parameters @@ -90,30 +80,29 @@ def get_charged_frag_types( max_frag_charge : int max fragment charge. (default: 2) - + Returns ------- List[str] charged fragment types - + Examples -------- >>> frag_types=['b','y','b_modloss','y_modloss'] >>> get_charged_frag_types(frag_types, 2) ['b_z1','b_z2','y_z1','y_z2','b_modloss_z1','b_modloss_z2','y_modloss_z1','y_modloss_z2'] - ''' + """ charged_frag_types = [] for _type in frag_types: - for _ch in range(1, max_frag_charge+1): + for _ch in range(1, max_frag_charge + 1): charged_frag_types.append(f"{_type}_z{_ch}") return charged_frag_types -def parse_charged_frag_type( - charged_frag_type: str -)->Tuple[str,int]: - ''' + +def parse_charged_frag_type(charged_frag_type: str) -> Tuple[str, int]: + """ Oppsite to `get_charged_frag_types`. - + Parameters ---------- charged_frag_type : str @@ -125,16 +114,15 @@ def parse_charged_frag_type( str. Fragment type, e.g. 'b','y' int. Charge state - ''' - _type, _ch = charged_frag_type.split('_z') + """ + _type, _ch = charged_frag_type.split("_z") return _type, int(_ch) + def init_zero_fragment_dataframe( - peplen_array:np.ndarray, - charged_frag_types:List[str], - dtype=PEAK_MZ_DTYPE -)->Tuple[pd.DataFrame, np.ndarray, np.ndarray]: - '''Initialize a zero dataframe based on peptide length + peplen_array: np.ndarray, charged_frag_types: List[str], dtype=PEAK_MZ_DTYPE +) -> Tuple[pd.DataFrame, np.ndarray, np.ndarray]: + """Initialize a zero dataframe based on peptide length (nAA) array (peplen_array) and charge_frag_types (column number). The row number of returned dataframe is np.sum(peplen_array-1). @@ -142,10 +130,10 @@ def init_zero_fragment_dataframe( ---------- peplen_array : np.ndarray peptide lengths for the fragment dataframe - + charged_frag_types : List[str] `['b_z1','b_z2','y_z1','y_z2','b_modloss_z1','y_H2O_z1'...]` - + Returns ------- tuple @@ -154,49 +142,50 @@ def init_zero_fragment_dataframe( np.ndarray (int64), the start indices point to the `fragment_df` for each peptide np.ndarray (int64), the end indices point to the `fragment_df` for each peptide - ''' - indices = np.zeros(len(peplen_array)+1, dtype=np.int64) - indices[1:] = peplen_array-1 + """ + indices = np.zeros(len(peplen_array) + 1, dtype=np.int64) + indices[1:] = peplen_array - 1 indices = np.cumsum(indices) fragment_df = pd.DataFrame( - np.zeros((indices[-1],len(charged_frag_types)), dtype=dtype), - columns = charged_frag_types + np.zeros((indices[-1], len(charged_frag_types)), dtype=dtype), + columns=charged_frag_types, ) return fragment_df, indices[:-1], indices[1:] + def init_fragment_dataframe_from_other( - reference_fragment_df: pd.DataFrame, - dtype=PEAK_MZ_DTYPE + reference_fragment_df: pd.DataFrame, dtype=PEAK_MZ_DTYPE ): - ''' + """ Init zero fragment dataframe from the `reference_fragment_df` (same rows and same columns) - ''' + """ return pd.DataFrame( np.zeros_like(reference_fragment_df.values, dtype=dtype), - columns = reference_fragment_df.columns + columns=reference_fragment_df.columns, ) + def init_fragment_by_precursor_dataframe( precursor_df, charged_frag_types: List[str], *, reference_fragment_df: pd.DataFrame = None, - dtype:np.dtype=PEAK_MZ_DTYPE, - inplace_in_reference:bool=False, + dtype: np.dtype = PEAK_MZ_DTYPE, + inplace_in_reference: bool = False, ): - ''' - Init zero fragment dataframe for the `precursor_df`. If - the `reference_fragment_df` is provided, the result dataframe's - length will be the same as reference_fragment_df. Otherwise it + """ + Init zero fragment dataframe for the `precursor_df`. If + the `reference_fragment_df` is provided, the result dataframe's + length will be the same as reference_fragment_df. Otherwise it generates the dataframe from scratch. - + Parameters ---------- precursor_df : pd.DataFrame precursors to generate fragment masses, - if `precursor_df` contains the 'frag_start_idx' column, - it is better to provide `reference_fragment_df` as - `precursor_df.frag_start_idx` and `precursor.frag_stop_idx` + if `precursor_df` contains the 'frag_start_idx' column, + it is better to provide `reference_fragment_df` as + `precursor_df.frag_start_idx` and `precursor.frag_stop_idx` point to the indices in `reference_fragment_df` charged_frag_types : List @@ -204,7 +193,7 @@ def init_fragment_by_precursor_dataframe( reference_fragment_df : pd.DataFrame init zero fragment_mz_df based - on this reference. If None, fragment_mz_df will be + on this reference. If None, fragment_mz_df will be initialized by :func:`alphabase.peptide.fragment.init_zero_fragment_dataframe`. Defaults to None. @@ -212,24 +201,20 @@ def init_fragment_by_precursor_dataframe( dtype of fragment mz values, Defaults to :data:`PEAK_MZ_DTYPE`. inplace_in_reference : bool, optional - if calculate the fragment mz + if calculate the fragment mz inplace in the reference_fragment_df (default: False) Returns ------- pd.DataFrame zero `fragment_df` with given `charged_frag_types` columns - ''' - if 'frag_start_idx' not in precursor_df.columns: - ( - fragment_df, start_indices, end_indices - ) = init_zero_fragment_dataframe( - precursor_df.nAA.values, - charged_frag_types, - dtype=dtype + """ + if "frag_start_idx" not in precursor_df.columns: + (fragment_df, start_indices, end_indices) = init_zero_fragment_dataframe( + precursor_df.nAA.values, charged_frag_types, dtype=dtype ) - precursor_df['frag_start_idx'] = start_indices - precursor_df['frag_stop_idx'] = end_indices + precursor_df["frag_start_idx"] = start_indices + precursor_df["frag_stop_idx"] = end_indices else: if reference_fragment_df is None: # raise ValueError( @@ -237,37 +222,41 @@ def init_fragment_by_precursor_dataframe( # "please provide `reference_fragment_df` argument" # ) fragment_df = pd.DataFrame( - np.zeros(( - precursor_df.frag_stop_idx.max(), - len(charged_frag_types) - ), dtype=dtype), - columns = charged_frag_types + np.zeros( + (precursor_df.frag_stop_idx.max(), len(charged_frag_types)), + dtype=dtype, + ), + columns=charged_frag_types, ) else: - if inplace_in_reference: - fragment_df = reference_fragment_df[[ - _fr for _fr in charged_frag_types - if _fr in reference_fragment_df.columns - ]] + if inplace_in_reference: + fragment_df = reference_fragment_df[ + [ + _fr + for _fr in charged_frag_types + if _fr in reference_fragment_df.columns + ] + ] else: fragment_df = pd.DataFrame( - np.zeros(( - len(reference_fragment_df), - len(charged_frag_types) - ), dtype=dtype), - columns = charged_frag_types + np.zeros( + (len(reference_fragment_df), len(charged_frag_types)), + dtype=dtype, + ), + columns=charged_frag_types, ) return fragment_df + def update_sliced_fragment_dataframe( fragment_df: pd.DataFrame, fragment_df_vals: np.ndarray, values: np.ndarray, - frag_start_end_list: List[Tuple[int,int]], - charged_frag_types: List[str]=None, + frag_start_end_list: List[Tuple[int, int]], + charged_frag_types: List[str] = None, ): - ''' - Set the values of the slices `frag_start_end_list=[(start,end),(start,end),...]` + """ + Set the values of the slices `frag_start_end_list=[(start,end),(start,end),...]` of fragment_df. Parameters @@ -287,29 +276,32 @@ def update_sliced_fragment_dataframe( charged_frag_types : List[str], optional e.g. `['b_z1','b_z2','y_z1','y_z2']`. If None, the columns of values should be the same as fragment_df's columns. - It is much faster if charged_frag_types is None as we use numpy slicing, + It is much faster if charged_frag_types is None as we use numpy slicing, otherwise we use pd.loc (much slower). Defaults to None. - ''' - frag_slice_list = [slice(start,end) for start,end in frag_start_end_list] + """ + frag_slice_list = [slice(start, end) for start, end in frag_start_end_list] frag_slices = np.r_[tuple(frag_slice_list)] - if charged_frag_types is None or len(charged_frag_types)==0: + if charged_frag_types is None or len(charged_frag_types) == 0: fragment_df_vals[frag_slices, :] = values.astype(fragment_df_vals.dtype) else: - charged_frag_idxes = [fragment_df.columns.get_loc(c) for c in charged_frag_types] - fragment_df.iloc[ - frag_slices, charged_frag_idxes - ] = values.astype(fragment_df_vals.dtype) + charged_frag_idxes = [ + fragment_df.columns.get_loc(c) for c in charged_frag_types + ] + fragment_df.iloc[frag_slices, charged_frag_idxes] = values.astype( + fragment_df_vals.dtype + ) fragment_df_vals[frag_slices] = fragment_df.values[frag_slices] + def get_sliced_fragment_dataframe( fragment_df: pd.DataFrame, - frag_start_end_list:Union[List,np.ndarray], - charged_frag_types:List = None, -)->pd.DataFrame: - ''' + frag_start_end_list: Union[List, np.ndarray], + charged_frag_types: List = None, +) -> pd.DataFrame: + """ Get the sliced fragment_df from `frag_start_end_list=[(start,end),(start,end),...]`. - + Parameters ---------- fragment_df : pd.DataFrame @@ -321,33 +313,36 @@ def get_sliced_fragment_dataframe( charged_frag_types : List[str] e.g. `['b_z1','b_z2','y_z1','y_z2']`. if None, all columns will be considered - + Returns ------- pd.DataFrame - - sliced fragment_df. If `charged_frag_types` is None, + + sliced fragment_df. If `charged_frag_types` is None, return fragment_df with all columns - ''' - frag_slice_list = [slice(start,end) for start,end in frag_start_end_list] + """ + frag_slice_list = [slice(start, end) for start, end in frag_start_end_list] frag_slices = np.r_[tuple(frag_slice_list)] - if charged_frag_types is None or len(charged_frag_types)==0: + if charged_frag_types is None or len(charged_frag_types) == 0: charged_frag_idxes = slice(None) else: - charged_frag_idxes = [fragment_df.columns.get_loc(c) for c in charged_frag_types] + charged_frag_idxes = [ + fragment_df.columns.get_loc(c) for c in charged_frag_types + ] return fragment_df.iloc[frag_slices, charged_frag_idxes] + def concat_precursor_fragment_dataframes( precursor_df_list: List[pd.DataFrame], fragment_df_list: List[pd.DataFrame], - *other_fragment_df_lists -)->Tuple[pd.DataFrame,...]: - ''' - Since fragment_df is indexed by precursor_df, when we concatenate multiple - fragment_df, the indexed positions will change for in precursor_dfs, - this function keeps the correct indexed positions of precursor_df when + *other_fragment_df_lists, +) -> Tuple[pd.DataFrame, ...]: + """ + Since fragment_df is indexed by precursor_df, when we concatenate multiple + fragment_df, the indexed positions will change for in precursor_dfs, + this function keeps the correct indexed positions of precursor_df when concatenating multiple fragment_df dataframes. - + Parameters ---------- precursor_df_list : List[pd.DataFrame] @@ -357,105 +352,118 @@ def concat_precursor_fragment_dataframes( fragment dataframe list to concatenate other_fragment_df_lists - arbitray other fragment dataframe list to concatenate, + arbitray other fragment dataframe list to concatenate, e.g. fragment_mass_df, fragment_inten_df, ... - + Returns ------- Tuple[pd.DataFrame,...] concatenated precursor_df, fragment_df, other_fragment_dfs ... - ''' + """ fragment_df_lens = [len(fragment_df) for fragment_df in fragment_df_list] precursor_df_list = [precursor_df.copy() for precursor_df in precursor_df_list] cum_frag_df_lens = np.cumsum(fragment_df_lens) - for i,precursor_df in enumerate(precursor_df_list[1:]): - precursor_df[['frag_start_idx','frag_stop_idx']] += cum_frag_df_lens[i] + for i, precursor_df in enumerate(precursor_df_list[1:]): + precursor_df[["frag_start_idx", "frag_stop_idx"]] += cum_frag_df_lens[i] return ( pd.concat(precursor_df_list, ignore_index=True), pd.concat(fragment_df_list, ignore_index=True), - *[pd.concat(other_list, ignore_index=True) + *[ + pd.concat(other_list, ignore_index=True) for other_list in other_fragment_df_lists - ] + ], ) + def calc_fragment_mz_values_for_same_nAA( - df_group:pd.DataFrame, - nAA:int, - charged_frag_types:list + df_group: pd.DataFrame, nAA: int, charged_frag_types: list ): - mod_list = df_group.mods.str.split(';').apply( - lambda x: [m for m in x if len(m)>0] - ).values - site_list = df_group.mod_sites.str.split(';').apply( - lambda x: [int(s) for s in x if len(s)>0] - ).values - - if 'aa_mass_diffs' in df_group.columns: - mod_diff_list = df_group.aa_mass_diffs.str.split(';').apply( - lambda x: [float(m) for m in x if len(m)>0] - ).values - mod_diff_site_list = df_group.aa_mass_diff_sites.str.split(';').apply( - lambda x: [int(s) for s in x if len(s)>0] - ).values + mod_list = ( + df_group.mods.str.split(";") + .apply(lambda x: [m for m in x if len(m) > 0]) + .values + ) + site_list = ( + df_group.mod_sites.str.split(";") + .apply(lambda x: [int(s) for s in x if len(s) > 0]) + .values + ) + + if "aa_mass_diffs" in df_group.columns: + mod_diff_list = ( + df_group.aa_mass_diffs.str.split(";") + .apply(lambda x: [float(m) for m in x if len(m) > 0]) + .values + ) + mod_diff_site_list = ( + df_group.aa_mass_diff_sites.str.split(";") + .apply(lambda x: [int(s) for s in x if len(s) > 0]) + .values + ) else: mod_diff_list = None mod_diff_site_list = None - ( - b_mass, y_mass, pepmass - ) = calc_b_y_and_peptide_masses_for_same_len_seqs( - df_group.sequence.values.astype('U'), - mod_list, site_list, + (b_mass, y_mass, pepmass) = calc_b_y_and_peptide_masses_for_same_len_seqs( + df_group.sequence.values.astype("U"), + mod_list, + site_list, mod_diff_list, - mod_diff_site_list + mod_diff_site_list, ) b_mass = b_mass.reshape(-1) y_mass = y_mass.reshape(-1) for charged_frag_type in charged_frag_types: - if charged_frag_type.startswith('b_modloss'): - b_modloss = np.concatenate([ - calc_modloss_mass(nAA, mods, sites, True) - for mods, sites in zip(mod_list, site_list) - ]) + if charged_frag_type.startswith("b_modloss"): + b_modloss = np.concatenate( + [ + calc_modloss_mass(nAA, mods, sites, True) + for mods, sites in zip(mod_list, site_list) + ] + ) break for charged_frag_type in charged_frag_types: - if charged_frag_type.startswith('y_modloss'): - y_modloss = np.concatenate([ - calc_modloss_mass(nAA, mods, sites, False) - for mods, sites in zip(mod_list, site_list) - ]) + if charged_frag_type.startswith("y_modloss"): + y_modloss = np.concatenate( + [ + calc_modloss_mass(nAA, mods, sites, False) + for mods, sites in zip(mod_list, site_list) + ] + ) break mz_values = [] add_proton = MASS_PROTON for charged_frag_type in charged_frag_types: # Neutral masses also considered for future uses - if charged_frag_type == 'b': + if charged_frag_type == "b": mz_values.append(b_mass) continue - elif charged_frag_type == 'y': + elif charged_frag_type == "y": mz_values.append(y_mass) continue frag_type, charge = parse_charged_frag_type(charged_frag_type) - if frag_type == 'b': - _mass = b_mass/charge + add_proton - elif frag_type == 'y': - _mass = y_mass/charge + add_proton - elif frag_type == 'b_modloss': - _mass = (b_mass-b_modloss)/charge + add_proton + if frag_type == "b": + _mass = b_mass / charge + add_proton + elif frag_type == "y": + _mass = y_mass / charge + add_proton + elif frag_type == "b_modloss": + _mass = (b_mass - b_modloss) / charge + add_proton _mass[b_modloss == 0] = 0 - elif frag_type == 'y_modloss': - _mass = (y_mass-y_modloss)/charge + add_proton + elif frag_type == "y_modloss": + _mass = (y_mass - y_modloss) / charge + add_proton _mass[y_modloss == 0] = 0 elif frag_type in frag_mass_from_ref_ion_dict: - ref_ion = frag_mass_from_ref_ion_dict[frag_type]['ref_ion'] - add_mass = frag_mass_from_ref_ion_dict[frag_type]['add_mass'] - if ref_ion == 'b': - _mass = (b_mass+add_mass)/charge + add_proton - elif ref_ion == 'y': - _mass = (y_mass+add_mass)/charge + add_proton + ref_ion = frag_mass_from_ref_ion_dict[frag_type]["ref_ion"] + add_mass = frag_mass_from_ref_ion_dict[frag_type]["add_mass"] + if ref_ion == "b": + _mass = (b_mass + add_mass) / charge + add_proton + elif ref_ion == "y": + _mass = (y_mass + add_mass) / charge + add_proton else: - raise KeyError(f"ref_ion only allows `b` and `y`, but {ref_ion} is given") + raise KeyError( + f"ref_ion only allows `b` and `y`, but {ref_ion} is given" + ) # elif frag_type == 'b_H2O': # _mass = (b_mass-MASS_H2O)/charge + add_proton # elif frag_type == 'y_H2O': @@ -477,45 +485,40 @@ def calc_fragment_mz_values_for_same_nAA( # elif frag_type == 'x': # _mass = (MASS_C+MASS_O-MASS_H*2+y_mass)/charge + add_proton else: - raise KeyError( - f'Fragment type "{frag_type}" is not in fragment_mz_df.' - ) + raise KeyError(f'Fragment type "{frag_type}" is not in fragment_mz_df.') mz_values.append(_mass) return np.array(mz_values).T + def mask_fragments_for_charge_greater_than_precursor_charge( - fragment_df:pd.DataFrame, - precursor_charge_array:np.ndarray, - nAA_array:np.ndarray, + fragment_df: pd.DataFrame, + precursor_charge_array: np.ndarray, + nAA_array: np.ndarray, *, - candidate_fragment_charges:list = [2,3,4], + candidate_fragment_charges: list = [2, 3, 4], ): - """Mask the fragment dataframe when + """Mask the fragment dataframe when the fragment charge is larger than the precursor charge""" - precursor_charge_array = np.repeat( - precursor_charge_array, nAA_array-1 - ) + precursor_charge_array = np.repeat(precursor_charge_array, nAA_array - 1) for col in fragment_df.columns: for charge in candidate_fragment_charges: - if col.endswith(f'z{charge}'): - fragment_df.loc[ - precursor_charge_array None: + frag_start_idxes: np.ndarray, + frag_stop_idxes: np.ndarray, + indices: np.ndarray, + max_indices: np.ndarray, + excluded_indices: np.ndarray, + top_k: int, + flattened_intensity: np.ndarray, + number_of_fragment_types: int, + max_frag_per_peptide: int = 300, +) -> None: """ Fill in indices, max indices and excluded indices for each peptide. indices: index of fragment per peptide (from 0 to max_index-1) @@ -552,26 +555,38 @@ def fill_in_indices( maximum number of fragments per peptide, Defaults to 300 """ - array = np.arange(0,max_frag_per_peptide).reshape(-1,1) - ones = np.ones(max_frag_per_peptide).reshape(-1,1) + array = np.arange(0, max_frag_per_peptide).reshape(-1, 1) + ones = np.ones(max_frag_per_peptide).reshape(-1, 1) length = len(frag_start_idxes) for i in nb.prange(length): frag_start = frag_start_idxes[i] frag_end = frag_stop_idxes[i] - max_index = frag_end-frag_start + max_index = frag_end - frag_start indices[frag_start:frag_end] = array[:max_index] - max_indices[frag_start:frag_end] = ones[:max_index]*max_index - if flattened_intensity is None or top_k >= max_index*number_of_fragment_types: continue - idxes = np.argsort(flattened_intensity[frag_start*number_of_fragment_types:frag_end*number_of_fragment_types]) + max_indices[frag_start:frag_end] = ones[:max_index] * max_index + if flattened_intensity is None or top_k >= max_index * number_of_fragment_types: + continue + idxes = np.argsort( + flattened_intensity[ + frag_start * number_of_fragment_types : frag_end + * number_of_fragment_types + ] + ) _excl = np.ones_like(idxes, dtype=np.bool_) _excl[idxes[-top_k:]] = False - excluded_indices[frag_start*number_of_fragment_types:frag_end*number_of_fragment_types] = _excl - + excluded_indices[ + frag_start * number_of_fragment_types : frag_end * number_of_fragment_types + ] = _excl -@nb.vectorize([nb.uint32(nb.int8, nb.uint32, nb.uint32, nb.uint32)],target='parallel') -def calculate_fragment_numbers(frag_direction:np.int8, frag_number:np.uint32, index:np.uint32, max_index:np.uint32): +@nb.vectorize([nb.uint32(nb.int8, nb.uint32, nb.uint32, nb.uint32)], target="parallel") +def calculate_fragment_numbers( + frag_direction: np.int8, + frag_number: np.uint32, + index: np.uint32, + max_index: np.uint32, +): """ Calculate fragment numbers for each fragment based on the fragment direction. @@ -587,27 +602,26 @@ def calculate_fragment_numbers(frag_direction:np.int8, frag_number:np.uint32, in index of fragment per peptide (from 0 to max_index-1) max_index : np.uint32 - max index of fragments per peptide (number of fragments per peptide) + max index of fragments per peptide (number of fragments per peptide) """ if frag_direction == 1: frag_number = index + 1 elif frag_direction == -1: - frag_number = max_index - index + frag_number = max_index - index return frag_number - def parse_fragment( - frag_directions:np.ndarray, - frag_start_idxes:np.ndarray, - frag_stop_idxes: np.ndarray, - top_k: int, - intensities:np.ndarray, - number_of_fragment_types:int + frag_directions: np.ndarray, + frag_start_idxes: np.ndarray, + frag_stop_idxes: np.ndarray, + top_k: int, + intensities: np.ndarray, + number_of_fragment_types: int, ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: """ - Parse fragments to get fragment numbers, fragment positions and not top k excluded indices in one hit - faster than doing each operation individually, and makes the most of the operations that are done in parallel. + Parse fragments to get fragment numbers, fragment positions and not top k excluded indices in one hit + faster than doing each operation individually, and makes the most of the operations that are done in parallel. Parameters ---------- @@ -628,7 +642,7 @@ def parse_fragment( number_of_fragment_types : int number of types of fragments (e.g. b,y,b_modloss,y_modloss, ...) equals to the number of columns in fragment mz dataframe - + Returns ------- Tuple[np.ndarray, np.ndarray, np.ndarray] @@ -639,35 +653,46 @@ def parse_fragment( frag_numbers = np.empty_like(frag_directions, dtype=np.uint32) indices = np.empty_like(frag_directions, dtype=np.uint32) max_indices = np.empty_like(frag_directions, dtype=np.uint32) - excluded_indices = np.zeros(frag_directions.shape[0]*frag_directions.shape[1], dtype=np.bool_) + excluded_indices = np.zeros( + frag_directions.shape[0] * frag_directions.shape[1], dtype=np.bool_ + ) # Fill in indices, max indices and excluded indices - fill_in_indices(frag_start_idxes, frag_stop_idxes,indices,max_indices, excluded_indices,top_k,intensities, number_of_fragment_types) - + fill_in_indices( + frag_start_idxes, + frag_stop_idxes, + indices, + max_indices, + excluded_indices, + top_k, + intensities, + number_of_fragment_types, + ) + # Calculate fragment numbers - frag_numbers = calculate_fragment_numbers(frag_directions, frag_numbers, indices, max_indices) + frag_numbers = calculate_fragment_numbers( + frag_directions, frag_numbers, indices, max_indices + ) return frag_numbers, indices, excluded_indices - + def flatten_fragments( - precursor_df: pd.DataFrame, + precursor_df: pd.DataFrame, fragment_mz_df: pd.DataFrame, fragment_intensity_df: pd.DataFrame, min_fragment_intensity: float = -1, keep_top_k_fragments: int = 1000, - custom_columns : list = [ - 'type','number','position','charge','loss_type' - ], - custom_df : Dict[str, pd.DataFrame] = {} -)->Tuple[pd.DataFrame, pd.DataFrame]: + custom_columns: list = ["type", "number", "position", "charge", "loss_type"], + custom_df: Dict[str, pd.DataFrame] = {}, +) -> Tuple[pd.DataFrame, pd.DataFrame]: """ - Converts the tabular fragment format consisting of - the `fragment_mz_df` and the `fragment_intensity_df` + Converts the tabular fragment format consisting of + the `fragment_mz_df` and the `fragment_intensity_df` into a linear fragment format. - The linear fragment format will only retain fragments - above a given intensity treshold with `mz > 0`. - It consists of columns: `mz`, `intensity`, - `type`, `number`, `charge` and `loss_type`, + The linear fragment format will only retain fragments + above a given intensity treshold with `mz > 0`. + It consists of columns: `mz`, `intensity`, + `type`, `number`, `charge` and `loss_type`, where each column refers to: - mz: :data:`PEAK_MZ_DTYPE`, fragment mz value @@ -679,43 +704,43 @@ def flatten_fragments( - position: uint32, fragment position in sequence (from left to right, starts with 0) - charge: uint8, fragment charge - loss_type: int16, fragment loss type, 0=noloss, 17=NH3, 18=H2O, 98=H3PO4 (phos), ... - - The fragment pointers `frag_start_idx` and `frag_stop_idx` + + The fragment pointers `frag_start_idx` and `frag_stop_idx` will be reannotated to the new fragment format. For ASCII code `type`, we can convert it into byte-str by using `frag_df.type.values.view('S1')`. - + Parameters ---------- precursor_df : pd.DataFrame input precursor dataframe which contains the frag_start_idx and frag_stop_idx columns - + fragment_mz_df : pd.DataFrame input fragment mz dataframe of shape (N, T) which contains N * T fragment mzs. Fragments with mz==0 will be excluded. - + fragment_intensity_df : pd.DataFrame input fragment intensity dataframe of shape (N, T) which contains N * T fragment mzs. Could be empty (len==0) to exclude intensity values. - + min_fragment_intensity : float, optional minimum intensity which should be retained. Defaults to -1 - + custom_columns : list, optional - 'mz' and 'intensity' columns are required. Others could be customized. + 'mz' and 'intensity' columns are required. Others could be customized. Defaults to ['type','number','position','charge','loss_type'] custom_df : Dict[str, pd.DataFrame], optional Append custom columns by providing additional dataframes of the same shape as fragment_mz_df and fragment_intensity_df. Defaults to {}. - + Returns ------- pd.DataFrame precursor dataframe with added `flat_frag_start_idx` and `flat_frag_stop_idx` columns pd.DataFrame - fragment dataframe with columns: `mz`, `intensity`, `type`, `number`, + fragment dataframe with columns: `mz`, `intensity`, `type`, `number`, `charge` and `loss_type`, where each column refers to: - + - mz: :data:`PEAK_MZ_DTYPE`, fragment mz value - intensity: :data:`PEAK_INTENSITY_DTYPE`, fragment intensity value - type: uint8, ASCII code of the ion type. Small caps are for regular scoring ions used during search: (97=a, 98=b, 99=c, 120=x, 121=y, 122=z). @@ -730,9 +755,9 @@ def flatten_fragments( return precursor_df, pd.DataFrame() # new dataframes for fragments and precursors are created frag_df = {} - frag_df['mz'] = fragment_mz_df.values.reshape(-1) + frag_df["mz"] = fragment_mz_df.values.reshape(-1) if len(fragment_intensity_df) > 0: - frag_df['intensity'] = fragment_intensity_df.values.astype( + frag_df["intensity"] = fragment_intensity_df.values.astype( PEAK_INTENSITY_DTYPE ).reshape(-1) use_intensity = True @@ -742,147 +767,153 @@ def flatten_fragments( # each column in the flat fragment dataframe is a whole pandas dataframe in the dense representation for col_name, df in custom_df.items(): frag_df[col_name] = df.values.reshape(-1) - + frag_types = [] frag_loss_types = [] frag_charges = [] - frag_directions = [] # 'abc': direction=1, 'xyz': direction=-1, otherwise 0 - + frag_directions = [] # 'abc': direction=1, 'xyz': direction=-1, otherwise 0 + for col in fragment_mz_df.columns.values: - _types = col.split('_') - frag_types.append(ord(_types[0])) # using ASCII code + _types = col.split("_") + frag_types.append(ord(_types[0])) # using ASCII code frag_charges.append(int(_types[-1][1:])) if len(_types) == 2: frag_loss_types.append(0) else: - if _types[1] == 'NH3': + if _types[1] == "NH3": frag_loss_types.append(17) - elif _types[1] == 'H2O': + elif _types[1] == "H2O": frag_loss_types.append(18) else: frag_loss_types.append(98) - if ord(_types[0]) >= 97 and ord(_types[0]) <= 109: # a-m + if ord(_types[0]) >= 97 and ord(_types[0]) <= 109: # a-m frag_directions.append(1) - elif ord(_types[0]) >= 110 and ord(_types[0]) <= 122: #n-z + elif ord(_types[0]) >= 110 and ord(_types[0]) <= 122: # n-z frag_directions.append(-1) else: frag_directions.append(0) - - if 'type' in custom_columns: - frag_df['type'] = np.array(np.tile(frag_types, len(fragment_mz_df)), dtype=np.int8) - if 'loss_type' in custom_columns: - frag_df['loss_type'] = np.array(np.tile(frag_loss_types, len(fragment_mz_df)), dtype=np.int16) - if 'charge' in custom_columns: - frag_df['charge'] = np.array(np.tile(frag_charges, len(fragment_mz_df)), dtype=np.int8) - - frag_directions = np.array(np.tile(frag_directions,(len(fragment_mz_df),1)), dtype=np.int8) + + if "type" in custom_columns: + frag_df["type"] = np.array( + np.tile(frag_types, len(fragment_mz_df)), dtype=np.int8 + ) + if "loss_type" in custom_columns: + frag_df["loss_type"] = np.array( + np.tile(frag_loss_types, len(fragment_mz_df)), dtype=np.int16 + ) + if "charge" in custom_columns: + frag_df["charge"] = np.array( + np.tile(frag_charges, len(fragment_mz_df)), dtype=np.int8 + ) + + frag_directions = np.array( + np.tile(frag_directions, (len(fragment_mz_df), 1)), dtype=np.int8 + ) numbers, positions, excluded_indices = parse_fragment( - frag_directions, - precursor_df.frag_start_idx.values, + frag_directions, + precursor_df.frag_start_idx.values, precursor_df.frag_stop_idx.values, keep_top_k_fragments, - frag_df['intensity'] if use_intensity else None, - len(fragment_mz_df.columns) + frag_df["intensity"] if use_intensity else None, + len(fragment_mz_df.columns), ) - - if 'number' in custom_columns: - frag_df['number'] = numbers.reshape(-1) - - if 'position' in custom_columns: - frag_df['position'] = positions.reshape(-1) - + if "number" in custom_columns: + frag_df["number"] = numbers.reshape(-1) - precursor_df['flat_frag_start_idx'] = precursor_df.frag_start_idx - precursor_df['flat_frag_stop_idx'] = precursor_df.frag_stop_idx - precursor_df[['flat_frag_start_idx','flat_frag_stop_idx']] *= len(fragment_mz_df.columns) + if "position" in custom_columns: + frag_df["position"] = positions.reshape(-1) - - if use_intensity: - frag_df['intensity'][frag_df['mz'] == 0.0] = 0.0 + precursor_df["flat_frag_start_idx"] = precursor_df.frag_start_idx + precursor_df["flat_frag_stop_idx"] = precursor_df.frag_stop_idx + precursor_df[["flat_frag_start_idx", "flat_frag_stop_idx"]] *= len( + fragment_mz_df.columns + ) + if use_intensity: + frag_df["intensity"][frag_df["mz"] == 0.0] = 0.0 excluded = ( - frag_df['mz'] == 0 if not use_intensity else - ( - frag_df['intensity'] < min_fragment_intensity - ) | ( - frag_df['mz'] == 0 - ) | ( - excluded_indices - ) - ) + frag_df["mz"] == 0 + if not use_intensity + else (frag_df["intensity"] < min_fragment_intensity) + | (frag_df["mz"] == 0) + | (excluded_indices) + ) frag_df = pd.DataFrame(frag_df) frag_df = frag_df[~excluded] frag_df = frag_df.reset_index(drop=True) - # cumulative sum counts the number of fragments before the given fragment which were removed. + # cumulative sum counts the number of fragments before the given fragment which were removed. # This sum does not include the fragment at the index position and has therefore len N +1 - cum_sum_tresh = np.zeros(shape=len(excluded)+1, dtype=np.int64) + cum_sum_tresh = np.zeros(shape=len(excluded) + 1, dtype=np.int64) cum_sum_tresh[1:] = np.cumsum(excluded) - precursor_df['flat_frag_start_idx'] -= cum_sum_tresh[precursor_df.flat_frag_start_idx.values] - precursor_df['flat_frag_stop_idx'] -= cum_sum_tresh[precursor_df.flat_frag_stop_idx.values] + precursor_df["flat_frag_start_idx"] -= cum_sum_tresh[ + precursor_df.flat_frag_start_idx.values + ] + precursor_df["flat_frag_stop_idx"] -= cum_sum_tresh[ + precursor_df.flat_frag_stop_idx.values + ] return precursor_df, frag_df + @nb.njit() def compress_fragment_indices(frag_idx): """ recalculates fragment indices to remove unused fragments. Can be used to compress a fragment library. Expects fragment indices to be ordered by increasing values (!!!). It should be O(N) runtime with N being the number of fragment rows. - + >>> frag_idx = [[6, 10], [12, 14], [20, 22]] - + >>> frag_idx = [[0, 4], [4, 6], [6, 8]] >>> fragment_pointer = [6,7,8,9,12,13,20,21] """ - frag_idx_len = frag_idx[:,1]-frag_idx[:,0] - + frag_idx_len = frag_idx[:, 1] - frag_idx[:, 0] # This sum does not include the fragment at the index position and has therefore len N +1 - frag_idx_cumsum = np.zeros(shape=len(frag_idx_len)+1, dtype='int64') + frag_idx_cumsum = np.zeros(shape=len(frag_idx_len) + 1, dtype="int64") frag_idx_cumsum[1:] = np.cumsum(frag_idx_len) - fragment_pointer = np.zeros(np.sum(frag_idx_len), dtype='int64') + fragment_pointer = np.zeros(np.sum(frag_idx_len), dtype="int64") for i in range(len(frag_idx)): - start_index = frag_idx_cumsum[i] - for j,k in enumerate(range(frag_idx[i,0],frag_idx[i,1])): - fragment_pointer[start_index+j]=k - + for j, k in enumerate(range(frag_idx[i, 0], frag_idx[i, 1])): + fragment_pointer[start_index + j] = k - new_frag_idx = np.column_stack((frag_idx_cumsum[:-1],frag_idx_cumsum[1:])) + new_frag_idx = np.column_stack((frag_idx_cumsum[:-1], frag_idx_cumsum[1:])) return new_frag_idx, fragment_pointer + def remove_unused_fragments( - precursor_df: pd.DataFrame, - fragment_df_list: Tuple[pd.DataFrame, ...], - frag_start_col:str = 'frag_start_idx', - frag_stop_col:str = 'frag_stop_idx', - ) -> Tuple[pd.DataFrame, Tuple[pd.DataFrame, ...]]: - """Removes unused fragments of removed precursors, + precursor_df: pd.DataFrame, + fragment_df_list: Tuple[pd.DataFrame, ...], + frag_start_col: str = "frag_start_idx", + frag_stop_col: str = "frag_stop_idx", +) -> Tuple[pd.DataFrame, Tuple[pd.DataFrame, ...]]: + """Removes unused fragments of removed precursors, reannotates the `frag_start_col` and `frag_stop_col` - + Parameters ---------- precursor_df : pd.DataFrame Precursor dataframe which contains frag_start_idx and frag_stop_idx columns - + fragment_df_list : List[pd.DataFrame] A list of fragment dataframes which should be compressed by removing unused fragments. - Multiple fragment dataframes can be provided which will all be sliced in the same way. - This allows to slice both the fragment_mz_df and fragment_intensity_df. - At least one fragment dataframe needs to be provided. + Multiple fragment dataframes can be provided which will all be sliced in the same way. + This allows to slice both the fragment_mz_df and fragment_intensity_df. + At least one fragment dataframe needs to be provided. frag_start_col : str, optional Fragment start idx column in `precursor_df`, such as "frag_start_idx" and "peak_start_idx". @@ -891,7 +922,7 @@ def remove_unused_fragments( frag_stop_col : str, optional Fragment stop idx column in `precursor_df`, such as "frag_stop_idx" and "peak_stop_idx". Defaults to "frag_stop_idx". - + Returns ------- pd.DataFrame, List[pd.DataFrame] @@ -899,217 +930,218 @@ def remove_unused_fragments( """ precursor_df = precursor_df.sort_values([frag_start_col], ascending=True) - frag_idx = precursor_df[[frag_start_col,frag_stop_col]].values + frag_idx = precursor_df[[frag_start_col, frag_stop_col]].values new_frag_idx, fragment_pointer = compress_fragment_indices(frag_idx) - precursor_df[[frag_start_col,frag_stop_col]] = new_frag_idx + precursor_df[[frag_start_col, frag_stop_col]] = new_frag_idx precursor_df = precursor_df.sort_index() output_tuple = [] for i in range(len(fragment_df_list)): output_tuple.append( - fragment_df_list[i].iloc[ - fragment_pointer - ].copy().reset_index(drop=True) + fragment_df_list[i].iloc[fragment_pointer].copy().reset_index(drop=True) ) return precursor_df, tuple(output_tuple) + def create_fragment_mz_dataframe_by_sort_precursor( precursor_df: pd.DataFrame, - charged_frag_types:List, - batch_size:int=500000, - dtype:np.dtype=PEAK_MZ_DTYPE, -)->pd.DataFrame: + charged_frag_types: List, + batch_size: int = 500000, + dtype: np.dtype = PEAK_MZ_DTYPE, +) -> pd.DataFrame: """Sort nAA in precursor_df for faster fragment mz dataframe creation. - + Because the fragment mz values are continous in memory, so it is faster when setting values in pandas. - + Note that this function will change the order and index of precursor_df - + Parameters ---------- precursor_df : pd.DataFrame precursor dataframe - + charged_frag_types : List fragment types list - + batch_size : int, optional - Calculate fragment mz values in batch. + Calculate fragment mz values in batch. Defaults to 500000. """ - if 'frag_start_idx' in precursor_df.columns: - precursor_df.drop(columns=[ - 'frag_start_idx','frag_stop_idx' - ], inplace=True) + if "frag_start_idx" in precursor_df.columns: + precursor_df.drop(columns=["frag_start_idx", "frag_stop_idx"], inplace=True) refine_precursor_df(precursor_df) fragment_mz_df = init_fragment_by_precursor_dataframe( - precursor_df, charged_frag_types, + precursor_df, + charged_frag_types, dtype=dtype, ) - _grouped = precursor_df.groupby('nAA') + _grouped = precursor_df.groupby("nAA") for nAA, big_df_group in _grouped: for i in range(0, len(big_df_group), batch_size): - batch_end = i+batch_size - - df_group = big_df_group.iloc[i:batch_end,:] + batch_end = i + batch_size + + df_group = big_df_group.iloc[i:batch_end, :] mz_values = calc_fragment_mz_values_for_same_nAA( df_group, nAA, charged_frag_types ) fragment_mz_df.iloc[ - df_group.frag_start_idx.values[0]: - df_group.frag_stop_idx.values[-1], : + df_group.frag_start_idx.values[0] : df_group.frag_stop_idx.values[-1], : ] = mz_values.astype(PEAK_MZ_DTYPE) return mask_fragments_for_charge_greater_than_precursor_charge( - fragment_mz_df, - precursor_df.charge.values, - precursor_df.nAA.values, - ) + fragment_mz_df, + precursor_df.charge.values, + precursor_df.nAA.values, + ) + def create_fragment_mz_dataframe( precursor_df: pd.DataFrame, - charged_frag_types:List, + charged_frag_types: List, *, reference_fragment_df: pd.DataFrame = None, - inplace_in_reference:bool = False, - batch_size:int=500000, - dtype:np.dtype=PEAK_MZ_DTYPE, -)->pd.DataFrame: - ''' - Generate fragment mass dataframe for the precursor_df. If - the `reference_fragment_df` is provided and precursor_df contains `frag_start_idx`, - it will generate the mz dataframe based on the reference. Otherwise it + inplace_in_reference: bool = False, + batch_size: int = 500000, + dtype: np.dtype = PEAK_MZ_DTYPE, +) -> pd.DataFrame: + """ + Generate fragment mass dataframe for the precursor_df. If + the `reference_fragment_df` is provided and precursor_df contains `frag_start_idx`, + it will generate the mz dataframe based on the reference. Otherwise it generates the mz dataframe from scratch. - + Parameters ---------- precursor_df : pd.DataFrame precursors to generate fragment masses, - if `precursor_df` contains the 'frag_start_idx' column, + if `precursor_df` contains the 'frag_start_idx' column, `reference_fragment_df` must be provided - + charged_frag_types : List `['b_z1','b_z2','y_z1','y_z2','b_modloss_1','y_H2O_z1'...]` - + reference_fragment_df : pd.DataFrame - kwargs only. Generate fragment_mz_df based on this reference, - as `precursor_df.frag_start_idx` and - `precursor.frag_stop_idx` point to the indices in + kwargs only. Generate fragment_mz_df based on this reference, + as `precursor_df.frag_start_idx` and + `precursor.frag_stop_idx` point to the indices in `reference_fragment_df`. Defaults to None - + inplace_in_reference : bool kwargs only. Change values in place in the `reference_fragment_df`. Defaults to False - + batch_size: int Number of peptides for each batch, to save RAM. - + Returns ------- pd.DataFrame `fragment_mz_df` with given `charged_frag_types` - ''' + """ if reference_fragment_df is None: - if 'frag_start_idx' in precursor_df.columns: + if "frag_start_idx" in precursor_df.columns: # raise ValueError( # "`precursor_df` contains 'frag_start_idx' column, "\ # "please provide `reference_fragment_df` argument" # ) fragment_mz_df = init_fragment_by_precursor_dataframe( - precursor_df, charged_frag_types, + precursor_df, + charged_frag_types, dtype=dtype, ) return create_fragment_mz_dataframe( - precursor_df=precursor_df, + precursor_df=precursor_df, charged_frag_types=charged_frag_types, reference_fragment_df=fragment_mz_df, inplace_in_reference=True, batch_size=batch_size, dtype=dtype, ) - if 'nAA' not in precursor_df.columns: + if "nAA" not in precursor_df.columns: # fast return create_fragment_mz_dataframe_by_sort_precursor( - precursor_df, charged_frag_types, - batch_size, dtype=dtype, + precursor_df, + charged_frag_types, + batch_size, + dtype=dtype, ) - if (is_precursor_sorted(precursor_df) and - reference_fragment_df is None - ): + if is_precursor_refined(precursor_df) and reference_fragment_df is None: # fast return create_fragment_mz_dataframe_by_sort_precursor( - precursor_df, charged_frag_types, - batch_size, dtype=dtype + precursor_df, charged_frag_types, batch_size, dtype=dtype ) else: # slow if reference_fragment_df is not None: if inplace_in_reference: - fragment_mz_df = reference_fragment_df.loc[:,[ - _fr for _fr in charged_frag_types - if _fr in reference_fragment_df.columns - ]] + fragment_mz_df = reference_fragment_df.loc[ + :, + [ + _fr + for _fr in charged_frag_types + if _fr in reference_fragment_df.columns + ], + ] else: fragment_mz_df = pd.DataFrame( - np.zeros(( - len(reference_fragment_df), - len(charged_frag_types) - ), dtype=dtype), - columns = charged_frag_types + np.zeros( + (len(reference_fragment_df), len(charged_frag_types)), + dtype=dtype, + ), + columns=charged_frag_types, ) else: fragment_mz_df = init_fragment_by_precursor_dataframe( - precursor_df, charged_frag_types, + precursor_df, + charged_frag_types, dtype=dtype, ) frag_mz_values = fragment_mz_df.to_numpy(copy=True) - _grouped = precursor_df.groupby('nAA') + _grouped = precursor_df.groupby("nAA") for nAA, big_df_group in _grouped: for i in range(0, len(big_df_group), batch_size): - batch_end = i+batch_size - - df_group = big_df_group.iloc[i:batch_end,:] + batch_end = i + batch_size + + df_group = big_df_group.iloc[i:batch_end, :] mz_values = calc_fragment_mz_values_for_same_nAA( df_group, nAA, fragment_mz_df.columns ) - + update_sliced_fragment_dataframe( - fragment_mz_df, frag_mz_values, mz_values, - df_group[['frag_start_idx','frag_stop_idx']].values, + fragment_mz_df, + frag_mz_values, + mz_values, + df_group[["frag_start_idx", "frag_stop_idx"]].values, ) fragment_mz_df.iloc[:] = frag_mz_values return mask_fragments_for_charge_greater_than_precursor_charge( - fragment_mz_df, - precursor_df.charge.values, - precursor_df.nAA.values, - ) + fragment_mz_df, + precursor_df.charge.values, + precursor_df.nAA.values, + ) -# %% ../../nbdev_nbs/peptide/fragment.ipynb 38 @nb.njit(nogil=True) -def join_left( - left: np.ndarray, - right: np.ndarray - ): - """joins all values in the left array to the values in the right array. - The index to the element in the right array is returned. +def join_left(left: np.ndarray, right: np.ndarray): + """joins all values in the left array to the values in the right array. + The index to the element in the right array is returned. If the value wasn't found, -1 is returned. If the element appears more than once, the last appearance is used. Parameters @@ -1133,15 +1165,13 @@ def join_left( right_indices = np.argsort(right) right_sorted = right[right_indices] - joined_index = -np.ones(len(left), dtype='int64') - + joined_index = -np.ones(len(left), dtype="int64") + # from hereon sorted arrays are expected lower_right = 0 for i in range(len(joined_index)): - for k in range(lower_right, len(right)): - if left_sorted[i] >= right_sorted[k]: if left_sorted[i] == right_sorted[k]: joined_index[i] = k @@ -1155,15 +1185,14 @@ def join_left( joined_index[joined_index >= 0] = right_indices[joined_index[joined_index >= 0]] # Next, the left side is restored by arranging the items - joined_index[left_indices] = joined_index + joined_index[left_indices] = joined_index return joined_index -def calc_fragment_count( - precursor_df : pd.DataFrame, - fragment_intensity_df : pd.DataFrame - ): +def calc_fragment_count( + precursor_df: pd.DataFrame, fragment_intensity_df: pd.DataFrame +): """ Calculates the number of fragments for each precursor. @@ -1177,30 +1206,32 @@ def calc_fragment_count( fragment intensity dataframe which contains the fragment intensities Returns - ------- + ------- numpy.ndarray array with the number of fragments for each precursor """ - if not set(['frag_start_idx', 'frag_stop_idx']).issubset(precursor_df.columns): - raise KeyError('frag_start_idx and frag_stop_idx not in dataframe') - + if not set(["frag_start_idx", "frag_stop_idx"]).issubset(precursor_df.columns): + raise KeyError("frag_start_idx and frag_stop_idx not in dataframe") + n_fragments = [] - - for start, stop in zip(precursor_df['frag_start_idx'].values, precursor_df['frag_stop_idx'].values): + + for start, stop in zip( + precursor_df["frag_start_idx"].values, precursor_df["frag_stop_idx"].values + ): n_fragments += [np.sum(fragment_intensity_df.iloc[start:stop].values > 0)] return np.array(n_fragments) - -def filter_fragment_number( - precursor_df : pd.DataFrame, - fragment_intensity_df : pd.DataFrame, - n_fragments_allowed_column_name : str = 'n_fragments_allowed', - n_allowed : int = 999 - ): + +def filter_fragment_number( + precursor_df: pd.DataFrame, + fragment_intensity_df: pd.DataFrame, + n_fragments_allowed_column_name: str = "n_fragments_allowed", + n_allowed: int = 999, +): """ Filters the number of fragments for each precursor. - + Parameters ---------- @@ -1222,36 +1253,35 @@ def filter_fragment_number( None """ - if not set(['frag_start_idx', 'frag_stop_idx']).issubset(precursor_df.columns): - raise KeyError('frag_start_idx and frag_stop_idx not in dataframe') + if not set(["frag_start_idx", "frag_stop_idx"]).issubset(precursor_df.columns): + raise KeyError("frag_start_idx and frag_stop_idx not in dataframe") for i, (start_idx, stop_idx, n_allowed_lib) in enumerate( zip( - precursor_df['frag_start_idx'].values, - precursor_df['frag_stop_idx'].values, - precursor_df[n_fragments_allowed_column_name].values - ) - ): - + precursor_df["frag_start_idx"].values, + precursor_df["frag_stop_idx"].values, + precursor_df[n_fragments_allowed_column_name].values, + ) + ): _allowed = min(n_allowed_lib, n_allowed) intensies = fragment_intensity_df.iloc[start_idx:stop_idx].values flat_intensities = np.sort(intensies.flatten())[::-1] intensies[intensies <= flat_intensities[_allowed]] = 0 fragment_intensity_df.iloc[start_idx:stop_idx] = intensies - -def calc_fragment_cardinality( - precursor_df, - fragment_mz_df, - group_column = 'elution_group_idx', - split_target_decoy = True - ): + +def calc_fragment_cardinality( + precursor_df, + fragment_mz_df, + group_column="elution_group_idx", + split_target_decoy=True, +): """ Calculate the cardinality for a given fragment across a group of precursors. The cardinality is the number of precursors that have a given fragment at a given position. - All precursors within a group are expected to have the same number of fragments. + All precursors within a group are expected to have the same number of fragments. The precursor dataframe. fragment_mz_df : pd.DataFrame @@ -1264,19 +1294,21 @@ def calc_fragment_cardinality( If True, the cardinality is calculated for the target and decoy precursors separately. """ - + if len(precursor_df) == 0: - raise ValueError('Precursor dataframe is empty.') - + raise ValueError("Precursor dataframe is empty.") + if len(fragment_mz_df) == 0: - raise ValueError('Fragment dataframe is empty.') - + raise ValueError("Fragment dataframe is empty.") + if group_column not in precursor_df.columns: - raise KeyError('Group column not in precursor dataframe.') - - if ('frag_start_idx' not in precursor_df.columns) or ('frag_stop_idx' not in precursor_df.columns): - raise KeyError('Precursor dataframe does not contain fragment indices.') - + raise KeyError("Group column not in precursor dataframe.") + + if ("frag_start_idx" not in precursor_df.columns) or ( + "frag_stop_idx" not in precursor_df.columns + ): + raise KeyError("Precursor dataframe does not contain fragment indices.") + precursor_df = precursor_df.sort_values(group_column) fragment_mz = fragment_mz_df.values fragment_cardinality = np.ones(fragment_mz.shape, dtype=np.uint8) @@ -1289,28 +1321,39 @@ def _calc_fragment_cardinality( fragment_mz, fragment_cardinality, ): - elution_group = elution_group_idx[0] + if len(elution_group_idx) == 0: + return + elution_group_idx[0] # noqa TODO check for potential bug elution_group_start = 0 for i in range(len(elution_group_idx)): - if i == len(elution_group_idx)-1 or elution_group_idx[i] != elution_group_idx[i+1]: - elution_group_stop = i+1 + if ( + i == len(elution_group_idx) - 1 + or elution_group_idx[i] != elution_group_idx[i + 1] + ): + elution_group_stop = i + 1 # check if whole elution group is covered n_precursor = elution_group_stop - elution_group_start - + # Check that all precursors within a group have the same number of fragments. - nAA = stop_idx[elution_group_start:elution_group_stop] - start_idx[elution_group_start:elution_group_stop] + nAA = ( + stop_idx[elution_group_start:elution_group_stop] + - start_idx[elution_group_start:elution_group_stop] + ) if not np.all(nAA[0] == nAA): - raise ValueError('All precursors within a group must have the same number of fragments.') + raise ValueError( + "All precursors within a group must have the same number of fragments." + ) # within a group, check for each precursor if it has the same fragment as another precursor for i in range(n_precursor): - precursor_start_idx = start_idx[elution_group_start + i] precursor_stop_idx = stop_idx[elution_group_start + i] - precursor_fragment_mz = fragment_mz[precursor_start_idx:precursor_stop_idx] + precursor_fragment_mz = fragment_mz[ + precursor_start_idx:precursor_stop_idx + ] for j in range(n_precursor): if i == j: @@ -1318,34 +1361,39 @@ def _calc_fragment_cardinality( other_precursor_start_idx = start_idx[elution_group_start + j] other_precursor_stop_idx = stop_idx[elution_group_start + j] - other_precursor_fragment_mz = fragment_mz[other_precursor_start_idx:other_precursor_stop_idx] - - binary_mask = np.abs(precursor_fragment_mz - other_precursor_fragment_mz) < 0.00001 - - fragment_cardinality[precursor_start_idx:precursor_stop_idx] += binary_mask.astype(np.uint8) - + other_precursor_fragment_mz = fragment_mz[ + other_precursor_start_idx:other_precursor_stop_idx + ] + + binary_mask = ( + np.abs(precursor_fragment_mz - other_precursor_fragment_mz) + < 0.00001 + ) + + fragment_cardinality[precursor_start_idx:precursor_stop_idx] += ( + binary_mask.astype(np.uint8) + ) + elution_group_start = elution_group_stop - if ('decoy' in precursor_df.columns) and (split_target_decoy): - decoy_classes = precursor_df['decoy'].unique() + + if ("decoy" in precursor_df.columns) and (split_target_decoy): + decoy_classes = precursor_df["decoy"].unique() for decoy_class in decoy_classes: - df = precursor_df[precursor_df['decoy'] == decoy_class] + df = precursor_df[precursor_df["decoy"] == decoy_class] _calc_fragment_cardinality( df[group_column].values, - df['frag_start_idx'].values, - df['frag_stop_idx'].values, + df["frag_start_idx"].values, + df["frag_stop_idx"].values, fragment_mz, fragment_cardinality, ) else: _calc_fragment_cardinality( precursor_df[group_column].values, - precursor_df['frag_start_idx'].values, - precursor_df['frag_stop_idx'].values, + precursor_df["frag_start_idx"].values, + precursor_df["frag_stop_idx"].values, fragment_mz, fragment_cardinality, ) - return pd.DataFrame( - fragment_cardinality, - columns = fragment_mz_df.columns - ) \ No newline at end of file + return pd.DataFrame(fragment_cardinality, columns=fragment_mz_df.columns) diff --git a/alphabase/peptide/mass_calc.py b/alphabase/peptide/mass_calc.py index c064b7ed..b2ae9610 100644 --- a/alphabase/peptide/mass_calc.py +++ b/alphabase/peptide/mass_calc.py @@ -2,32 +2,31 @@ from typing import List, Tuple from alphabase.constants.aa import ( - calc_AA_masses, + calc_AA_masses, calc_AA_masses_for_same_len_seqs, - calc_sequence_masses_for_same_len_seqs + calc_sequence_masses_for_same_len_seqs, ) from alphabase.constants.modification import ( calc_modification_mass, calc_modification_mass_sum, - calc_mod_masses_for_same_len_seqs + calc_mod_masses_for_same_len_seqs, ) -from alphabase.constants.element import MASS_H2O +from alphabase.constants.atom import MASS_H2O + def calc_diff_modification_mass( - pep_len:int, - mass_diffs:List[float], - mass_diff_sites:List[int] -)->np.ndarray: - ''' - For open-search, we may also get modification + pep_len: int, mass_diffs: List[float], mass_diff_sites: List[int] +) -> np.ndarray: + """ + For open-search, we may also get modification mass diffs other than mod names. This function calculate modification masses from these diff masses. - + Parameters ---------- pep_len : int nAA - + mass_diffs : List[float] mass diffs on the peptide @@ -40,7 +39,7 @@ def calc_diff_modification_mass( 1-D array with length=`peplen`. Masses of modifications (mass diffs) through the peptide, `0` if sites has no modifications - ''' + """ masses = np.zeros(pep_len) for site, mass in zip(mass_diff_sites, mass_diffs): if site == 0: @@ -48,20 +47,19 @@ def calc_diff_modification_mass( elif site == -1: masses[site] += mass else: - masses[site-1] += mass + masses[site - 1] += mass return masses + def calc_mod_diff_masses_for_same_len_seqs( - nAA:int, - aa_mass_diffs_list:List[List[float]], - mod_sites_list:List[List[int]] -)->np.ndarray: - ''' - Calculate diff modification masses for the given peptide length (`nAA`), - For open-search, we may also get modification + nAA: int, aa_mass_diffs_list: List[List[float]], mod_sites_list: List[List[int]] +) -> np.ndarray: + """ + Calculate diff modification masses for the given peptide length (`nAA`), + For open-search, we may also get modification mass diffs other than mod names. This function calculate modification masses from these diff masses. - + Parameters ---------- nAA : int @@ -71,120 +69,112 @@ def calc_mod_diff_masses_for_same_len_seqs( list of modification list mod_sites_list : List[List[int]] - list of modification site list corresponding + list of modification site list corresponding to `mod_names_list`. * `site=0` refers to an N-term modification * `site=-1` refers to a C-term modification * `1<=site<=peplen` refers to a normal modification - + Returns ------- np.ndarray - 2-D array with shape=`(nAA, pep_count or len(mod_names_list)))`. - Masses of modifications through all the peptides, + 2-D array with shape=`(nAA, pep_count or len(mod_names_list)))`. + Masses of modifications through all the peptides, `0` if sites has no modifications - ''' - masses = np.zeros((len(aa_mass_diffs_list),nAA)) + """ + masses = np.zeros((len(aa_mass_diffs_list), nAA)) for i, (aa_mass_diffs, mod_sites) in enumerate( zip(aa_mass_diffs_list, mod_sites_list) ): - for mod_diff, site in zip(aa_mass_diffs, mod_sites): + for mod_diff, site in zip(aa_mass_diffs, mod_sites): if site == 0: - masses[i,site] += mod_diff + masses[i, site] += mod_diff elif site == -1: - masses[i,site] += mod_diff + masses[i, site] += mod_diff else: - masses[i,site-1] += mod_diff + masses[i, site - 1] += mod_diff return masses + def calc_b_y_and_peptide_mass( sequence: str, mod_names: List[str], mod_sites: List[int], aa_mass_diffs: List[float] = None, aa_mass_diff_sites: List[int] = None, -)->Tuple[np.ndarray,np.ndarray,float]: - ''' - It is highly recommend to use +) -> Tuple[np.ndarray, np.ndarray, float]: + """ + It is highly recommend to use `calc_b_y_and_peptide_masses_for_same_len_seqs` as it is much faster - ''' + """ residue_masses = calc_AA_masses(sequence) - mod_masses = calc_modification_mass( - len(sequence), mod_names, mod_sites - ) + mod_masses = calc_modification_mass(len(sequence), mod_names, mod_sites) residue_masses += mod_masses if aa_mass_diffs is not None: mod_masses = calc_diff_modification_mass( len(sequence), aa_mass_diffs, aa_mass_diff_sites ) residue_masses += mod_masses - #residue_masses = residue_masses[np.newaxis, ...] + # residue_masses = residue_masses[np.newaxis, ...] b_masses = np.cumsum(residue_masses) b_masses, pepmass = b_masses[:-1], b_masses[-1] - + pepmass += MASS_H2O y_masses = pepmass - b_masses return b_masses, y_masses, pepmass + def calc_peptide_masses_for_same_len_seqs( - sequences: np.ndarray, - mod_list: List[str], - mod_diff_list: List[str]=None -)->np.ndarray: - ''' + sequences: np.ndarray, mod_list: List[str], mod_diff_list: List[str] = None +) -> np.ndarray: + """ Calculate peptide masses for peptide sequences with same lengths. - We need 'same_len' here because numpy can process AA sequences - with same length very fast. + We need 'same_len' here because numpy can process AA sequences + with same length very fast. See `alphabase.aa.calc_sequence_masses_for_same_len_seqs` Parameters ---------- mod_list : List[str] - list of modifications, + list of modifications, e.g. `['Oxidation@M;Phospho@S','Phospho@S;Deamidated@N']` mass_diff_list : List[str] - + List of modifications as mass diffs, e.g. `['15.9xx;79.9xxx','79.9xx;0.98xx']` - + Returns ------- np.ndarray - + peptide masses (1-D array, H2O already added) - ''' - seq_masses = calc_sequence_masses_for_same_len_seqs( - sequences - ) + """ + seq_masses = calc_sequence_masses_for_same_len_seqs(sequences) mod_masses = np.zeros_like(seq_masses) for i, mods in enumerate(mod_list): if len(mods) > 0: - mod_masses[i] = calc_modification_mass_sum( - mods.split(';') - ) + mod_masses[i] = calc_modification_mass_sum(mods.split(";")) if mod_diff_list is not None: for i, mass_diffs in enumerate(mod_diff_list): if len(mass_diffs) > 0: - mod_masses[i] += np.sum([ - float(mass) for mass in mass_diffs.split(';') - ]) - return seq_masses+mod_masses - + mod_masses[i] += np.sum([float(mass) for mass in mass_diffs.split(";")]) + return seq_masses + mod_masses + def calc_b_y_and_peptide_masses_for_same_len_seqs( sequences: np.ndarray, mod_list: List[List[str]], site_list: List[List[int]], - mod_diff_list: List[List[float]]=None, - mod_diff_site_list: List[List[int]]=None, -)->Tuple[np.ndarray,np.ndarray,np.ndarray]: - ''' - Calculate b/y fragment masses and peptide masses + mod_diff_list: List[List[float]] = None, + mod_diff_site_list: List[List[int]] = None, +) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """ + Calculate b/y fragment masses and peptide masses for peptide sequences with same lengths. - We need 'same_len' here because numpy can process AA sequences + We need 'same_len' here because numpy can process AA sequences with same length very fast. Parameters @@ -193,21 +183,21 @@ def calc_b_y_and_peptide_masses_for_same_len_seqs( np.ndarray of peptie sequences with same length. mod_list : List[List[str]] - list of modifications , - e.g. `[['Oxidation@M','Phospho@S'],['Phospho@S','Deamidated@N']]` + list of modifications , + e.g. `[['Oxidation@M','Phospho@S'],['Phospho@S','Deamidated@N']]` site_list : List[List[int]] list of modification sites corresponding to `mod_list`, e.g. `[[3,6],[4,17]]` mod_diff_list : List[List[float]] - list of modifications, - e.g. `[[15.994915,79.966331],[79.966331,0.984016]]` + list of modifications, + e.g. `[[15.994915,79.966331],[79.966331,0.984016]]` mod_diff_site_list : List[List[int]] list of modification mass diff sites corresponding to `mod_list`, e.g. `[[3,6],[4,17]]` - + Returns ------- np.ndarray @@ -218,7 +208,7 @@ def calc_b_y_and_peptide_masses_for_same_len_seqs( np.ndarray neutral peptide masses (1-D array) - ''' + """ aa_masses = calc_AA_masses_for_same_len_seqs(sequences) nAA = len(sequences[0]) @@ -226,8 +216,8 @@ def calc_b_y_and_peptide_masses_for_same_len_seqs( # for i, (mods, sites) in enumerate(zip(mod_list, site_list)): # if len(mods) != 0: # mod_masses[i,:] = calc_modification_mass( - # seq_len, - # mods, + # seq_len, + # mods, # sites, # ) mod_masses = calc_mod_masses_for_same_len_seqs(nAA, mod_list, site_list) @@ -240,15 +230,15 @@ def calc_b_y_and_peptide_masses_for_same_len_seqs( # )): # if len(mass_diffs) != 0: # mod_masses[i,:] += calc_diff_modification_mass( - # seq_len, - # mass_diffs, + # seq_len, + # mass_diffs, # sites, # ) aa_masses += mod_masses b_masses = np.cumsum(aa_masses, axis=1) - b_masses, pepmass = b_masses[:,:-1], b_masses[:,-1:] - + b_masses, pepmass = b_masses[:, :-1], b_masses[:, -1:] + pepmass += MASS_H2O y_masses = pepmass - b_masses return b_masses, y_masses, pepmass.flatten() diff --git a/alphabase/peptide/mobility.py b/alphabase/peptide/mobility.py index 3edaf096..be4a443d 100644 --- a/alphabase/peptide/mobility.py +++ b/alphabase/peptide/mobility.py @@ -1,44 +1,38 @@ import numpy as np import pandas as pd -from alphabase.peptide.fragment import update_precursor_mz -from alphabase.constants.element import common_const_dict +from alphabase.peptide.precursor import update_precursor_mz +from alphabase.constants.atom import common_const_dict -CCS_IM_COEF = common_const_dict['MOBILITY']['CCS_IM_COEF'] -IM_GAS_MASS = common_const_dict['MOBILITY']['IM_GAS_MASS'] +CCS_IM_COEF = common_const_dict["MOBILITY"]["CCS_IM_COEF"] +IM_GAS_MASS = common_const_dict["MOBILITY"]["IM_GAS_MASS"] + + +def get_reduced_mass(precursor_mzs: np.ndarray, charges: np.ndarray) -> np.ndarray: + """Reduced mass for CCS and mobility calculation""" + reduced_masses = precursor_mzs * charges + return reduced_masses * IM_GAS_MASS / (reduced_masses + IM_GAS_MASS) -def get_reduced_mass( - precursor_mzs: np.ndarray, - charges: np.ndarray -)->np.ndarray: - """ Reduced mass for CCS and mobility calculation """ - reduced_masses = precursor_mzs*charges - return reduced_masses*IM_GAS_MASS/(reduced_masses+IM_GAS_MASS) def ccs_to_mobility_bruker( - ccs_values: np.ndarray, - charges: np.ndarray, - precursor_mzs: np.ndarray -)->np.ndarray: - """ Convert CCS to mobility for Bruker (timsTOF) """ + ccs_values: np.ndarray, charges: np.ndarray, precursor_mzs: np.ndarray +) -> np.ndarray: + """Convert CCS to mobility for Bruker (timsTOF)""" reduced_masses = get_reduced_mass(precursor_mzs, charges) - return ccs_values*np.sqrt(reduced_masses)/charges/CCS_IM_COEF + return ccs_values * np.sqrt(reduced_masses) / charges / CCS_IM_COEF + def mobility_to_ccs_bruker( - im_values: np.ndarray, - charges: np.ndarray, - precursor_mzs: np.ndarray -)->np.ndarray: - """ Convert mobility to CCS for Bruker (timsTOF) """ + im_values: np.ndarray, charges: np.ndarray, precursor_mzs: np.ndarray +) -> np.ndarray: + """Convert mobility to CCS for Bruker (timsTOF)""" reduced_masses = get_reduced_mass(precursor_mzs, charges) - return im_values*charges*CCS_IM_COEF/np.sqrt(reduced_masses) + return im_values * charges * CCS_IM_COEF / np.sqrt(reduced_masses) + def ccs_to_mobility_for_df( - precursor_df:pd.DataFrame, - ccs_column:str, - *, - vendor="bruker" -)->np.ndarray: + precursor_df: pd.DataFrame, ccs_column: str, *, vendor="bruker" +) -> np.ndarray: """ Parameters @@ -50,7 +44,7 @@ def ccs_to_mobility_for_df( CCS column name in precursor_df vendor : str, optional - Different vender may have different IM calculation. + Different vender may have different IM calculation. Defaults to "bruker". Note that other vendors are not implemented currently. @@ -59,20 +53,18 @@ def ccs_to_mobility_for_df( np.ndarray mobility values """ - if 'precursor_mz' not in precursor_df.columns: + if "precursor_mz" not in precursor_df.columns: precursor_df = update_precursor_mz(precursor_df) return ccs_to_mobility_bruker( - precursor_df[ccs_column].values, + precursor_df[ccs_column].values, precursor_df.charge.values, - precursor_df.precursor_mz.values + precursor_df.precursor_mz.values, ) + def mobility_to_ccs_for_df( - precursor_df:pd.DataFrame, - mobility_column:str, - *, - vendor="bruker" -)->np.ndarray: + precursor_df: pd.DataFrame, mobility_column: str, *, vendor="bruker" +) -> np.ndarray: """ Parameters @@ -84,7 +76,7 @@ def mobility_to_ccs_for_df( mobility column name in precursor_df vendor : str, optional - Different vender may have different IM calculation. + Different vender may have different IM calculation. Defaults to "bruker". Note that other vendors are not implemented currently. @@ -93,17 +85,23 @@ def mobility_to_ccs_for_df( np.ndarray CCS values """ - - if 'precursor_mz' not in precursor_df.columns: + + if "precursor_mz" not in precursor_df.columns: precursor_df = update_precursor_mz(precursor_df) if precursor_df[mobility_column].isna().any(): print(f"NA/nan is detected in the `{mobility_column}` column, fillna with 0.0") - precursor_df[mobility_column] = precursor_df[mobility_column].fillna(0.0).astype(np.float64) - if (precursor_df[mobility_column]=="").any(): - print(f"Empty string is detected in the `{mobility_column}` column, fill with 0.0") - precursor_df[mobility_column] = precursor_df[mobility_column].replace("",0.0).astype(np.float64) + precursor_df[mobility_column] = ( + precursor_df[mobility_column].fillna(0.0).astype(np.float64) + ) + if (precursor_df[mobility_column] == "").any(): + print( + f"Empty string is detected in the `{mobility_column}` column, fill with 0.0" + ) + precursor_df[mobility_column] = ( + precursor_df[mobility_column].replace("", 0.0).astype(np.float64) + ) return mobility_to_ccs_bruker( precursor_df[mobility_column].values, precursor_df.charge.values, - precursor_df.precursor_mz.values + precursor_df.precursor_mz.values, ) diff --git a/alphabase/peptide/precursor.py b/alphabase/peptide/precursor.py index f2945539..5e4e4125 100644 --- a/alphabase/peptide/precursor.py +++ b/alphabase/peptide/precursor.py @@ -8,74 +8,79 @@ from xxhash import xxh64_intdigest from functools import partial -from alphabase.constants.element import ( - MASS_PROTON, MASS_ISOTOPE -) +from alphabase.constants.atom import MASS_PROTON, MASS_ISOTOPE from alphabase.constants.aa import AA_Composition from alphabase.constants.modification import MOD_Composition -from alphabase.constants.isotope import ( - IsotopeDistribution -) -from alphabase.peptide.mass_calc import ( - calc_peptide_masses_for_same_len_seqs -) +from alphabase.constants.isotope import IsotopeDistribution +from alphabase.peptide.mass_calc import calc_peptide_masses_for_same_len_seqs + def refine_precursor_df( - df:pd.DataFrame, - drop_frag_idx = False, - ensure_data_validity = False, -)->pd.DataFrame: - """ + df: pd.DataFrame, + drop_frag_idx=False, + ensure_data_validity=False, +) -> pd.DataFrame: + """ Refine df inplace for faster precursor/fragment calculation. """ if ensure_data_validity: - df.fillna('', inplace=True) - if 'charge' in df.columns: + df.fillna("", inplace=True) + if "charge" in df.columns: if df.charge.dtype not in [ - 'int','int8','int64','int32', + "int", + "int8", + "int64", + "int32", # np.int64, np.int32, np.int8, ]: - df['charge'] = df['charge'].astype(np.int8) - if 'mod_sites' in df.columns: - if df.mod_sites.dtype not in ['O','U']: - df['mod_sites'] = df.mod_sites.astype('U') + df["charge"] = df["charge"].astype(np.int8) + if "mod_sites" in df.columns: + if df.mod_sites.dtype not in ["O", "U"]: + df["mod_sites"] = df.mod_sites.astype("U") - if 'nAA' not in df.columns: - df['nAA']= df.sequence.str.len().astype(np.int32) + if "nAA" not in df.columns: + df["nAA"] = df.sequence.str.len().astype(np.int32) - if drop_frag_idx and 'frag_start_idx' in df.columns: - df.drop(columns=[ - 'frag_start_idx','frag_stop_idx' - ], inplace=True) + if drop_frag_idx and "frag_start_idx" in df.columns: + df.drop(columns=["frag_start_idx", "frag_stop_idx"], inplace=True) if not is_precursor_refined(df): - df.sort_values('nAA', inplace=True) + df.sort_values("nAA", inplace=True) df.reset_index(drop=True, inplace=True) return df + reset_precursor_df = refine_precursor_df + def is_precursor_refined(precursor_df: pd.DataFrame): - return ( - (len(precursor_df) == 0) or ( - (precursor_df.index.values[0] == 0) and - precursor_df.nAA.is_monotonic_increasing and - np.all( - np.diff(precursor_df.index.values)==1 - ) - ) + return (len(precursor_df) == 0) or ( + (precursor_df.index.values[0] == 0) + and precursor_df.nAA.is_monotonic_increasing + and np.all(np.diff(precursor_df.index.values) == 1) + ) + + +def is_precursor_sorted(precursor_df: pd.DataFrame): + import warnings + + warnings.warn( + "`alphabase.peptide.precursor.is_precursor_sorted()` is deprecated, " + "it will be removed in alphabse>=1.3.0. " + "Please use `alphabase.peptide.precursor.is_precursor_refined()` instead.", + FutureWarning, ) + return is_precursor_refined(precursor_df) -is_precursor_sorted = is_precursor_refined def update_precursor_mz( precursor_df: pd.DataFrame, - batch_size = 500000, -)->pd.DataFrame: + batch_size=500000, +) -> pd.DataFrame: """ Calculate precursor_mz inplace in the precursor_df - + Parameters ---------- precursor_df : pd.DataFrame @@ -85,74 +90,85 @@ def update_precursor_mz( Returns ------- pd.DataFrame - + precursor_df with 'precursor_mz' """ - if 'nAA' not in precursor_df: + if "nAA" not in precursor_df: reset_precursor_df(precursor_df) _calc_in_order = True - elif is_precursor_sorted(precursor_df): + elif is_precursor_refined(precursor_df): _calc_in_order = True else: _calc_in_order = False - precursor_df['precursor_mz'] = 0. + precursor_df["precursor_mz"] = 0.0 precursor_mzs = np.zeros(len(precursor_df)) - _grouped = precursor_df.groupby('nAA') + _grouped = precursor_df.groupby("nAA") # precursor_mz_idx = precursor_df.columns.get_loc( # 'precursor_mz' # ) for nAA, big_df_group in _grouped: for i in range(0, len(big_df_group), batch_size): - batch_end = i+batch_size - - df_group = big_df_group.iloc[i:batch_end,:] - - pep_mzs = calc_peptide_masses_for_same_len_seqs( - df_group.sequence.values.astype('U'), - df_group.mods.values, - df_group.aa_mass_diffs.values if - 'aa_mass_diffs' in df_group.columns else None - )/df_group.charge + MASS_PROTON + batch_end = i + batch_size + + df_group = big_df_group.iloc[i:batch_end, :] + + pep_mzs = ( + calc_peptide_masses_for_same_len_seqs( + df_group.sequence.values.astype("U"), + df_group.mods.values, + df_group.aa_mass_diffs.values + if "aa_mass_diffs" in df_group.columns + else None, + ) + / df_group.charge + + MASS_PROTON + ) if _calc_in_order: precursor_mzs[ - df_group.index.values[0]: - df_group.index.values[-1]+1 + df_group.index.values[0] : df_group.index.values[-1] + 1 ] = pep_mzs else: - precursor_df.loc[ - df_group.index, 'precursor_mz' - ] = pep_mzs + precursor_df.loc[df_group.index, "precursor_mz"] = pep_mzs if _calc_in_order: precursor_df["precursor_mz"] = precursor_mzs return precursor_df -calc_precursor_mz = update_precursor_mz + +def calc_precursor_mz(precursor_df: pd.DataFrame, batch_size: int = 500000): + import warnings + + warnings.warn( + "`alphabase.peptide.precursor.calc_precursor_mz()` is deprecated, " + "it will be removed in alphabse>=2.0.0. " + "Please use `alphabase.peptide.precursor.update_precursor_mz()` instead.", + FutureWarning, + ) + return update_precursor_mz(precursor_df, batch_size) + def get_mod_seq_hash( - sequence:str, mods:str, - mod_sites:str, - *, seed:int=0 -)->np.uint64: + sequence: str, mods: str, mod_sites: str, *, seed: int = 0 +) -> np.uint64: """Get hash code value for a peptide: (sequence, mods, mod_sites) Parameters ---------- sequence : str - + Amino acid sequence mods : str - + Modification names in AlphaBase format mod_sites : str - + Modification sites in AlphaBase format seed : int - + Seed for hashing. Optional, by default 0 @@ -162,16 +178,18 @@ def get_mod_seq_hash( 64-bit hash code value """ - return np.array([ - xxh64_intdigest(sequence, seed=seed), - xxh64_intdigest(mods, seed=seed), - xxh64_intdigest(mod_sites, seed=seed), - ],dtype=np.uint64).sum() # use np.sum to prevent overflow + return np.array( + [ + xxh64_intdigest(sequence, seed=seed), + xxh64_intdigest(mods, seed=seed), + xxh64_intdigest(mod_sites, seed=seed), + ], + dtype=np.uint64, + ).sum() # use np.sum to prevent overflow + def get_mod_seq_charge_hash( - sequence:str, mods:str, - mod_sites:str, charge:int, - *, seed=0 + sequence: str, mods: str, mod_sites: str, charge: int, *, seed=0 ): """Get hash code value for a precursor: (sequence, mods, mod_sites, charge) @@ -183,88 +201,83 @@ def get_mod_seq_charge_hash( Amino acid sequence mods : str - + Modification names in AlphaBase format mod_sites : str - + Modification sites in AlphaBase format charge : int - + Precursor charge state seed : int - + Seed for hashing. Optional, by default 0 Returns ------- np.uint64 - + 64-bit hash code value """ - return np.array([ - get_mod_seq_hash( - sequence, mods, mod_sites, - seed=seed - ), - charge, - ],dtype=np.uint64).sum() # use np.sum to prevent overflow - -def hash_mod_seq_df( - precursor_df:pd.DataFrame, - *, seed=0 -): - """ Internal function """ + return np.array( + [ + get_mod_seq_hash(sequence, mods, mod_sites, seed=seed), + charge, + ], + dtype=np.uint64, + ).sum() # use np.sum to prevent overflow + + +def hash_mod_seq_df(precursor_df: pd.DataFrame, *, seed=0): + """Internal function""" hash_vals = precursor_df.sequence.apply( lambda x: xxh64_intdigest(x, seed=seed) ).to_numpy(copy=True, dtype=np.uint64) - hash_vals += precursor_df.mods.apply( - lambda x: xxh64_intdigest(x, seed=seed) - ).astype(np.uint64).values - hash_vals += precursor_df.mod_sites.apply( - lambda x: xxh64_intdigest(x, seed=seed) - ).astype(np.uint64).values + hash_vals += ( + precursor_df.mods.apply(lambda x: xxh64_intdigest(x, seed=seed)) + .astype(np.uint64) + .values + ) + hash_vals += ( + precursor_df.mod_sites.apply(lambda x: xxh64_intdigest(x, seed=seed)) + .astype(np.uint64) + .values + ) - precursor_df[ - "mod_seq_hash" - ] = hash_vals + precursor_df["mod_seq_hash"] = hash_vals return precursor_df -def hash_mod_seq_charge_df( - precursor_df:pd.DataFrame, - *, seed=0 -): - """ Internal function """ + +def hash_mod_seq_charge_df(precursor_df: pd.DataFrame, *, seed=0): + """Internal function""" if "mod_seq_hash" not in precursor_df.columns: hash_mod_seq_df(precursor_df, seed=seed) if "charge" not in precursor_df.columns: return precursor_df - - precursor_df["mod_seq_charge_hash"] = ( - precursor_df["mod_seq_hash"].values - + precursor_df["charge"].values.astype(np.uint64) - ) + + precursor_df["mod_seq_charge_hash"] = precursor_df[ + "mod_seq_hash" + ].values + precursor_df["charge"].values.astype(np.uint64) return precursor_df -def hash_precursor_df( - precursor_df:pd.DataFrame, - *, seed:int=0 -)->pd.DataFrame: + +def hash_precursor_df(precursor_df: pd.DataFrame, *, seed: int = 0) -> pd.DataFrame: """Add columns 'mod_seq_hash' and 'mod_seq_charge_hash' - into precursor_df (inplace). + into precursor_df (inplace). The 64-bit hash function is from xxhash (xxhash.xxh64). Parameters ---------- precursor_df : pd.DataFrame - + precursor_df - + Seed : int - + Seed for xxhash.xxh64. Optional, by default 0 @@ -276,36 +289,38 @@ def hash_precursor_df( """ hash_mod_seq_df(precursor_df, seed=seed) - if 'charge' in precursor_df.columns: + if "charge" in precursor_df.columns: hash_mod_seq_charge_df(precursor_df, seed=seed) return precursor_df -def get_mod_seq_formula(seq:str, mods:str)->list: - """ - 'PEPTIDE','Acetyl@Any N-term' --> [('C',n), ('H',m), ...] + +def get_mod_seq_formula(seq: str, mods: str) -> list: + """ + 'PEPTIDE','Acetyl@Any N-term' --> [('C',n), ('H',m), ...] """ formula = {} for aa in seq: - for chem,n in AA_Composition[aa].items(): + for chem, n in AA_Composition[aa].items(): if chem in formula: - formula[chem]+=n + formula[chem] += n else: - formula[chem]=n + formula[chem] = n if len(mods) > 0: - for mod in mods.split(';'): - for chem,n in MOD_Composition[mod].items(): + for mod in mods.split(";"): + for chem, n in MOD_Composition[mod].items(): if chem in formula: - formula[chem]+=n + formula[chem] += n else: - formula[chem]=n + formula[chem] = n return list(formula.items()) + @numba.njit def get_right_most_isotope_offset( - intensities:np.ndarray, - apex_idx:int, - min_right_most_intensity:float, -)->int: + intensities: np.ndarray, + apex_idx: int, + min_right_most_intensity: float, +) -> int: """Get right-most isotope index Parameters @@ -330,16 +345,17 @@ def get_right_most_isotope_offset( """ apex_inten = intensities[apex_idx] - for i in range(len(intensities)-1,-1,-1): - if intensities[i] >= apex_inten*min_right_most_intensity: + for i in range(len(intensities) - 1, -1, -1): + if intensities[i] >= apex_inten * min_right_most_intensity: return i return apex_idx + def get_mod_seq_isotope_distribution( - seq_mods:tuple, - isotope_dist:IsotopeDistribution, - min_right_most_intensity:float=0.2, -)->tuple: + seq_mods: tuple, + isotope_dist: IsotopeDistribution, + min_right_most_intensity: float = 0.2, +) -> tuple: """Get isotope abundance distribution by IsotopeDistribution. This function is designed for multiprocessing. @@ -347,12 +363,12 @@ def get_mod_seq_isotope_distribution( ---------- seq_mods : tuple (sequence, mods) - + isotope_dist : IsotopeDistribution See `IsotopeDistribution` in `alphabase.constants.isotope` min_right_most_intensity : float - The minimal intensity value of the right-most peak relative to apex peak. + The minimal intensity value of the right-most peak relative to apex peak. Optional, by default 0.2 Returns @@ -364,9 +380,7 @@ def get_mod_seq_isotope_distribution( float - Abundance of right-most peak which has at least `min_right_most_intensity` intensity relative to the apex peak int - Right-most position relative to mono, i.e. right-most index - mono index """ - dist, mono = isotope_dist.calc_formula_distribution( - get_mod_seq_formula(*seq_mods) - ) + dist, mono = isotope_dist.calc_formula_distribution(get_mod_seq_formula(*seq_mods)) apex_idx = np.argmax(dist) @@ -376,16 +390,17 @@ def get_mod_seq_isotope_distribution( ) return ( - dist[mono+1]/dist[mono], - dist[apex_idx]/dist[mono], - apex_idx-mono, - dist[right_most_idx]/dist[mono], - right_most_idx-mono, + dist[mono + 1] / dist[mono], + dist[apex_idx] / dist[mono], + apex_idx - mono, + dist[right_most_idx] / dist[mono], + right_most_idx - mono, ) + def calc_precursor_isotope_info( - precursor_df:pd.DataFrame, - min_right_most_intensity:float=0.2, + precursor_df: pd.DataFrame, + min_right_most_intensity: float = 0.2, ): """Calculate isotope mz values and relative (to M0) intensity values for precursor_df inplace. @@ -395,7 +410,7 @@ def calc_precursor_isotope_info( precursor_df to calculate min_right_most_intensity : float - The minimal intensity value of the right-most peak relative to apex peak. + The minimal intensity value of the right-most peak relative to apex peak. Optional, by default 0.2 Returns @@ -403,7 +418,7 @@ def calc_precursor_isotope_info( pd.DataFrame precursor_df with additional columns: - - isotope_m1_intensity: relative intensity of M1 to mono peak + - isotope_m1_intensity: relative intensity of M1 to mono peak - isotope_m1_mz: mz of M1 - isotope_apex_intensity: relative intensity of the apex peak - isotope_apex_mz: mz of the apex peak @@ -419,63 +434,55 @@ def calc_precursor_isotope_info( isotope_dist = IsotopeDistribution() ( - precursor_df['isotope_m1_intensity'], - precursor_df['isotope_apex_intensity'], - precursor_df['isotope_apex_offset'], - precursor_df['isotope_right_most_intensity'], - precursor_df['isotope_right_most_offset'], + precursor_df["isotope_m1_intensity"], + precursor_df["isotope_apex_intensity"], + precursor_df["isotope_apex_offset"], + precursor_df["isotope_right_most_intensity"], + precursor_df["isotope_right_most_offset"], ) = zip( - *precursor_df[['sequence','mods']].apply( - get_mod_seq_isotope_distribution, - axis=1, isotope_dist=isotope_dist, + *precursor_df[["sequence", "mods"]].apply( + get_mod_seq_isotope_distribution, + axis=1, + isotope_dist=isotope_dist, min_right_most_intensity=min_right_most_intensity, ) ) - precursor_df['isotope_m1_intensity'] = precursor_df[ - 'isotope_m1_intensity' - ].astype(np.float32) - precursor_df['isotope_apex_intensity'] = precursor_df[ - 'isotope_apex_intensity' + precursor_df["isotope_m1_intensity"] = precursor_df["isotope_m1_intensity"].astype( + np.float32 + ) + precursor_df["isotope_apex_intensity"] = precursor_df[ + "isotope_apex_intensity" ].astype(np.float32) - precursor_df['isotope_apex_offset'] = precursor_df[ - 'isotope_apex_offset' - ].astype(np.int8) - precursor_df['isotope_right_most_intensity'] = precursor_df[ - 'isotope_right_most_intensity' + precursor_df["isotope_apex_offset"] = precursor_df["isotope_apex_offset"].astype( + np.int8 + ) + precursor_df["isotope_right_most_intensity"] = precursor_df[ + "isotope_right_most_intensity" ].astype(np.float32) - precursor_df['isotope_right_most_offset'] = precursor_df[ - 'isotope_right_most_offset' + precursor_df["isotope_right_most_offset"] = precursor_df[ + "isotope_right_most_offset" ].astype(np.int8) - precursor_df['isotope_m1_mz'] = ( - precursor_df.precursor_mz + - MASS_ISOTOPE/precursor_df.charge + precursor_df["isotope_m1_mz"] = ( + precursor_df.precursor_mz + MASS_ISOTOPE / precursor_df.charge ) - precursor_df['isotope_apex_mz'] = ( - precursor_df.precursor_mz + - ( - MASS_ISOTOPE - *precursor_df.isotope_apex_offset - /precursor_df.charge - ) + precursor_df["isotope_apex_mz"] = precursor_df.precursor_mz + ( + MASS_ISOTOPE * precursor_df.isotope_apex_offset / precursor_df.charge ) - precursor_df['isotope_right_most_mz'] = ( - precursor_df.precursor_mz + - ( - MASS_ISOTOPE - *precursor_df.isotope_right_most_offset - /precursor_df.charge - ) + precursor_df["isotope_right_most_mz"] = precursor_df.precursor_mz + ( + MASS_ISOTOPE * precursor_df.isotope_right_most_offset / precursor_df.charge ) return precursor_df + def _batchify_df(df_group, mp_batch_size): """Internal funciton for multiprocessing""" for _, df in df_group: for i in range(0, len(df), mp_batch_size): - yield df.iloc[i:i+mp_batch_size,:] + yield df.iloc[i : i + mp_batch_size, :] + def _count_batchify_df(df_group, mp_batch_size): """Internal funciton for multiprocessing""" @@ -485,75 +492,76 @@ def _count_batchify_df(df_group, mp_batch_size): count += 1 return count + # `progress_bar` should be replaced by more advanced tqdm wrappers created by Sander # I will leave it to alphabase.utils def calc_precursor_isotope_info_mp( - precursor_df:pd.DataFrame, - processes:int=8, - mp_batch_size:int=10000, + precursor_df: pd.DataFrame, + processes: int = 8, + mp_batch_size: int = 10000, progress_bar=None, - min_right_most_intensity:float=0.2, - min_precursor_num_to_run_mp:int=10000, -)->pd.DataFrame: - """`calc_precursor_isotope` is not that fast for large dataframes, - so here we use multiprocessing for faster isotope pattern calculation. + min_right_most_intensity: float = 0.2, + min_precursor_num_to_run_mp: int = 10000, +) -> pd.DataFrame: + """`calc_precursor_isotope` is not that fast for large dataframes, + so here we use multiprocessing for faster isotope pattern calculation. The speed is acceptable with multiprocessing (3.8 min for 21M precursors, 8 processes). Parameters ---------- precursor_df : pd.DataFrame Precursor_df to calculate - + processes : int Process number. Optional, by default 8 - + mp_batch_size : int Multiprocessing batch size. Optional, by default 100000. - + progress_bar : Callable - The tqdm-based callback function + The tqdm-based callback function to check multiprocessing. Defaults to None. min_right_most_intensity : float - The minimal intensity value of the right-most peak relative to apex peak. + The minimal intensity value of the right-most peak relative to apex peak. Optional, by default 0.2 Returns ------- pd.DataFrame - DataFrame with `isotope_*` columns, + DataFrame with `isotope_*` columns, see :meth:'calc_precursor_isotope()'. """ - if len(precursor_df) < min_precursor_num_to_run_mp or processes<=1: + if len(precursor_df) < min_precursor_num_to_run_mp or processes <= 1: return calc_precursor_isotope_info( precursor_df=precursor_df, min_right_most_intensity=min_right_most_intensity, ) df_list = [] - df_group = precursor_df.groupby('nAA') + df_group = precursor_df.groupby("nAA") with mp.get_context("spawn").Pool(processes) as p: processing = p.imap( partial( calc_precursor_isotope_info, - min_right_most_intensity=min_right_most_intensity - ), _batchify_df(df_group, mp_batch_size) + min_right_most_intensity=min_right_most_intensity, + ), + _batchify_df(df_group, mp_batch_size), ) if progress_bar: processing = progress_bar( - processing, _count_batchify_df( - df_group, mp_batch_size - ) + processing, _count_batchify_df(df_group, mp_batch_size) ) for df in processing: df_list.append(df) return pd.concat(df_list) + def calc_precursor_isotope_intensity( precursor_df, - max_isotope = 6, - min_right_most_intensity = 0.001, - normalize:typing.Literal['mono','sum'] = "sum", -)->pd.DataFrame: + max_isotope=6, + min_right_most_intensity=0.001, + normalize: typing.Literal["mono", "sum"] = "sum", +) -> pd.DataFrame: """Calculate isotope intensity values for precursor_df inplace. Parameters @@ -573,67 +581,66 @@ def calc_precursor_isotope_intensity( pd.DataFrame precursor_df with additional columns: - + """ isotope_dist = IsotopeDistribution() - col_names = ['i_{}'.format(i) for i in range(max_isotope)] + col_names = ["i_{}".format(i) for i in range(max_isotope)] precursor_dist = np.zeros((len(precursor_df), max_isotope), dtype=np.float32) - mono_idxes = np.zeros(len(precursor_df),dtype=np.int32) + mono_idxes = np.zeros(len(precursor_df), dtype=np.int32) for i in range(len(precursor_df)): - row = precursor_df.iloc[i] dist, mono = isotope_dist.calc_formula_distribution( - get_mod_seq_formula(row['sequence'], row['mods']) + get_mod_seq_formula(row["sequence"], row["mods"]) ) - dist[dist <= min_right_most_intensity] = 0. + dist[dist <= min_right_most_intensity] = 0.0 # mono should be always included in the i_x list # after clipping max_isotope isotopes - mono_left_half_isotope = max_isotope//2 + mono_left_half_isotope = max_isotope // 2 mono_right_half_isotope = ( - mono_left_half_isotope if max_isotope%2==0 - else (mono_left_half_isotope+1) + mono_left_half_isotope + if max_isotope % 2 == 0 + else (mono_left_half_isotope + 1) ) if mono < mono_left_half_isotope: precursor_dist[i] = dist[:max_isotope] mono_idxes[i] = mono elif mono + mono_right_half_isotope >= len(dist): precursor_dist[i] = dist[-max_isotope:] - mono_idxes[i] = max_isotope+mono-len(dist)+1 + mono_idxes[i] = max_isotope + mono - len(dist) + 1 else: precursor_dist[i] = dist[ - mono-mono_left_half_isotope: - mono+mono_right_half_isotope + mono - mono_left_half_isotope : mono + mono_right_half_isotope ] - mono_idxes[i] = mono-mono_left_half_isotope + mono_idxes[i] = mono - mono_left_half_isotope if normalize == "sum": precursor_dist /= np.sum(precursor_dist, axis=1, keepdims=True) else: precursor_dist /= precursor_dist[ np.arange(len(precursor_dist)), mono_idxes - ].reshape(-1,1) + ].reshape(-1, 1) precursor_df[col_names] = precursor_dist precursor_df["mono_isotope_idx"] = mono_idxes return precursor_df + def calc_precursor_isotope_intensity_mp( precursor_df, - max_isotope = 6, - min_right_most_intensity = 0.001, - normalize:typing.Literal['mono','sum'] = "sum", - mp_batch_size = 1000, - mp_process_num = 8, - progress_bar = True, -)->pd.DataFrame: - + max_isotope=6, + min_right_most_intensity=0.001, + normalize: typing.Literal["mono", "sum"] = "sum", + mp_batch_size=1000, + mp_process_num=8, + progress_bar=True, +) -> pd.DataFrame: """Calculate isotope intensity values for precursor_df using multiprocessing. Parameters @@ -662,7 +669,7 @@ def calc_precursor_isotope_intensity_mp( pd.DataFrame precursor_df with additional columns i_0, i_1, i_2, ... i_{max_isotope-1} - + """ if mp_process_num <= 1: @@ -670,11 +677,11 @@ def calc_precursor_isotope_intensity_mp( precursor_df=precursor_df, max_isotope=max_isotope, min_right_most_intensity=min_right_most_intensity, - normalize=normalize + normalize=normalize, ) df_list = [] - df_group = precursor_df.groupby('nAA') + df_group = precursor_df.groupby("nAA") with mp.get_context("spawn").Pool(mp_process_num) as p: processing = p.imap( @@ -683,15 +690,19 @@ def calc_precursor_isotope_intensity_mp( max_isotope=max_isotope, min_right_most_intensity=min_right_most_intensity, normalize=normalize, - ), _batchify_df(df_group, mp_batch_size) + ), + _batchify_df(df_group, mp_batch_size), ) if progress_bar: - df_list = list(tqdm(processing, total=_count_batchify_df(df_group, mp_batch_size))) + df_list = list( + tqdm(processing, total=_count_batchify_df(df_group, mp_batch_size)) + ) else: df_list = list(processing) return pd.concat(df_list, ignore_index=True) + calc_precursor_isotope = calc_precursor_isotope_intensity -calc_precursor_isotope_mp = calc_precursor_isotope_intensity_mp \ No newline at end of file +calc_precursor_isotope_mp = calc_precursor_isotope_intensity_mp diff --git a/alphabase/protein/fasta.py b/alphabase/protein/fasta.py index 790b59e1..a7e7f9df 100644 --- a/alphabase/protein/fasta.py +++ b/alphabase/protein/fasta.py @@ -21,13 +21,17 @@ from alphabase.spectral_library.base import SpecLibBase -def get_uniprot_gene_name(description:str): - idx = description.find(' GN=') - if idx == -1: return '' - else: idx += 4 - return description[idx:description.find(' ', idx)] -def read_fasta_file(fasta_filename:str=""): +def get_uniprot_gene_name(description: str): + idx = description.find(" GN=") + if idx == -1: + return "" + else: + idx += 4 + return description[idx : description.find(" ", idx)] + + +def read_fasta_file(fasta_filename: str = ""): """ Read a FASTA file line by line @@ -35,11 +39,11 @@ def read_fasta_file(fasta_filename:str=""): ---------- fasta_filename : str fasta. - + Yields ------ - dict - protein information, + dict + protein information, {protein_id:str, full_name:str, gene_name:str, description:str, sequence:str} """ with open(fasta_filename, "rt") as handle: @@ -68,21 +72,22 @@ def read_fasta_file(fasta_filename:str=""): except StopIteration: break -def load_all_proteins(fasta_file_list:list): + +def load_all_proteins(fasta_file_list: list): protein_dict = {} for fasta in fasta_file_list: for protein in read_fasta_file(fasta): - protein_dict[protein['full_name']] = protein + protein_dict[protein["full_name"]] = protein return protein_dict -def load_fasta_list_as_protein_df(fasta_list:list): + +def load_fasta_list_as_protein_df(fasta_list: list): protein_dict = load_all_proteins(fasta_list) - return pd.DataFrame().from_dict( - protein_dict, orient="index" - ).reset_index(drop=True) + return pd.DataFrame().from_dict(protein_dict, orient="index").reset_index(drop=True) + -def concat_proteins(protein_dict:dict, sep='$')->str: - """Concatenate all protein sequences into a single sequence, +def concat_proteins(protein_dict: dict, sep="$") -> str: + """Concatenate all protein sequences into a single sequence, seperated by `sep ($ by default)`. Parameters @@ -95,35 +100,32 @@ def concat_proteins(protein_dict:dict, sep='$')->str: str concatenated sequence seperated by `sep`. """ - seq_list = [''] + seq_list = [""] seq_count = 1 for key in protein_dict: - protein_dict[key]['offset'] = seq_count - seq_list.append(protein_dict[key]['sequence']) - seq_count += protein_dict[key]['sequence']+1 - seq_list.append('') - return '$'.join(seq_list) - -protease_dict = load_yaml( - os.path.join( - CONST_FILE_FOLDER, - 'protease.yaml' - ) -) + protein_dict[key]["offset"] = seq_count + seq_list.append(protein_dict[key]["sequence"]) + seq_count += protein_dict[key]["sequence"] + 1 + seq_list.append("") + return "$".join(seq_list) + + +protease_dict = load_yaml(os.path.join(CONST_FILE_FOLDER, "protease.yaml")) """ Pre-built protease dict with regular expression. """ + @numba.njit def cleave_sequence_with_cut_pos( - sequence:str, - cut_pos:np.ndarray, - n_missed_cleavages:int=2, - pep_length_min:int=6, - pep_length_max:int=45, -)->tuple: + sequence: str, + cut_pos: np.ndarray, + n_missed_cleavages: int = 2, + pep_length_min: int = 6, + pep_length_max: int = 45, +) -> tuple: """ - Cleave a sequence with cut postions (cut_pos). + Cleave a sequence with cut postions (cut_pos). Filters to have a minimum and maximum length. Parameters @@ -158,10 +160,8 @@ def cleave_sequence_with_cut_pos( miss_list = [] nterm_list = [] cterm_list = [] - for i,start_pos in enumerate(cut_pos): - for n_miss,end_pos in enumerate( - cut_pos[i+1:i+2+n_missed_cleavages] - ): + for i, start_pos in enumerate(cut_pos): + for n_miss, end_pos in enumerate(cut_pos[i + 1 : i + 2 + n_missed_cleavages]): if end_pos > start_pos + pep_length_max: break elif end_pos < start_pos + pep_length_min: @@ -179,12 +179,14 @@ def cleave_sequence_with_cut_pos( cterm_list.append(False) return seq_list, miss_list, nterm_list, cterm_list + class Digest(object): - def __init__(self, - protease:str='trypsin', - max_missed_cleavages:int=2, - peptide_length_min:int=6, - peptide_length_max:int=45, + def __init__( + self, + protease: str = "trypsin", + max_missed_cleavages: int = 2, + peptide_length_min: int = 6, + peptide_length_max: int = 45, ): """Digest a protein sequence @@ -200,7 +202,7 @@ def __init__(self, peptide_length_min : int, optional Minimal cleaved peptide length, by default 6 - + peptide_length_max : int, optional Maximal cleaved peptide length, by default 45 """ @@ -209,26 +211,20 @@ def __init__(self, self.peptide_length_min = peptide_length_min self.peptide_length_max = peptide_length_max if protease.lower() in protease_dict: - self.regex_pattern = re.compile( - protease_dict[protease.lower()] - ) + self.regex_pattern = re.compile(protease_dict[protease.lower()]) else: - self.regex_pattern = re.compile( - protease - ) + self.regex_pattern = re.compile(protease) def get_cut_positions(self, sequence): cut_pos = [0] - cut_pos.extend([ - m.start()+1 for m in - self.regex_pattern.finditer(sequence) - ]) + cut_pos.extend([m.start() + 1 for m in self.regex_pattern.finditer(sequence)]) cut_pos.append(len(sequence)) return np.array(cut_pos, dtype=np.int64) - def cleave_sequence(self, - sequence:str, - )->tuple: + def cleave_sequence( + self, + sequence: str, + ) -> tuple: """ Cleave a sequence. @@ -248,48 +244,38 @@ def cleave_sequence(self, cut_pos = self.get_cut_positions(sequence) - ( - seq_list, miss_list, nterm_list, cterm_list - ) = cleave_sequence_with_cut_pos( - sequence, cut_pos, + (seq_list, miss_list, nterm_list, cterm_list) = cleave_sequence_with_cut_pos( + sequence, + cut_pos, self.n_miss_cleave, self.peptide_length_min, self.peptide_length_max, ) # Consider M loss at protein N-term - if sequence.startswith('M'): - for seq,miss,cterm in zip( - seq_list,miss_list,cterm_list - ): - if ( - sequence.startswith(seq) - and len(seq)>self.peptide_length_min - ): + if sequence.startswith("M"): + for seq, miss, cterm in zip(seq_list, miss_list, cterm_list): + if sequence.startswith(seq) and len(seq) > self.peptide_length_min: seq_list.append(seq[1:]) miss_list.append(miss) nterm_list.append(True) cterm_list.append(cterm) return seq_list, miss_list, nterm_list, cterm_list -def get_fix_mods( - sequence:str, - fix_mod_aas:str, - fix_mod_dict:dict -)->tuple: + +def get_fix_mods(sequence: str, fix_mod_aas: str, fix_mod_dict: dict) -> tuple: """ Generate fix modifications for the sequence """ mods = [] mod_sites = [] - for i,aa in enumerate(sequence): + for i, aa in enumerate(sequence): if aa in fix_mod_aas: - mod_sites.append(i+1) + mod_sites.append(i + 1) mods.append(fix_mod_dict[aa]) - return ';'.join(mods), ';'.join(str(i) for i in mod_sites) + return ";".join(mods), ";".join(str(i) for i in mod_sites) -def get_candidate_sites( - sequence:str, target_mod_aas:str -)->list: + +def get_candidate_sites(sequence: str, target_mod_aas: str) -> list: """get candidate modification sites Parameters @@ -306,18 +292,19 @@ def get_candidate_sites( candiadte mod sites in alphabase format (0: N-term, -1: C-term, 1-n:others) """ candidate_sites = [] - for i,aa in enumerate(sequence): + for i, aa in enumerate(sequence): if aa in target_mod_aas: - candidate_sites.append(i+1) #alphabase mod sites + candidate_sites.append(i + 1) # alphabase mod sites return candidate_sites + def get_var_mod_sites( - sequence:str, - target_mod_aas:str, + sequence: str, + target_mod_aas: str, min_var_mod: int, max_var_mod: int, max_combs: int, -)->list: +) -> list: """get all combinations of variable modification sites Parameters @@ -340,121 +327,119 @@ def get_var_mod_sites( Returns ------- list - list of combinations (tuple) of modification sites + list of combinations (tuple) of modification sites """ - candidate_sites = get_candidate_sites( - sequence, target_mod_aas - ) + candidate_sites = get_candidate_sites(sequence, target_mod_aas) if min_var_mod <= 1 and max_var_mod >= 1: mod_sites = [(s,) for s in candidate_sites] else: mod_sites = [] - for n_var_mod in range(max(2,min_var_mod), max_var_mod+1): - if len(mod_sites)>=max_combs: break + for n_var_mod in range(max(2, min_var_mod), max_var_mod + 1): + if len(mod_sites) >= max_combs: + break mod_sites.extend( itertools.islice( - itertools.combinations( - candidate_sites, n_var_mod - ), - max_combs-len(mod_sites) + itertools.combinations(candidate_sites, n_var_mod), + max_combs - len(mod_sites), ) ) return mod_sites + def get_var_mods_per_sites_multi_mods_on_aa( - sequence:str, - mod_sites:tuple, - var_mod_dict:dict -)->list: + sequence: str, mod_sites: tuple, var_mod_dict: dict +) -> list: """ - Used only when the var mod list contains + Used only when the var mod list contains more than one mods on the same AA, for example: Mod1@A, Mod2@A ... """ - mods_str_list = [''] - for i,site in enumerate(mod_sites): - if len(var_mod_dict[sequence[site-1]]) == 1: + mods_str_list = [""] + for i, site in enumerate(mod_sites): + if len(var_mod_dict[sequence[site - 1]]) == 1: for i in range(len(mods_str_list)): - mods_str_list[i] += var_mod_dict[sequence[site-1]][0]+';' + mods_str_list[i] += var_mod_dict[sequence[site - 1]][0] + ";" else: _new_list = [] - for mod in var_mod_dict[sequence[site-1]]: + for mod in var_mod_dict[sequence[site - 1]]: _lst = copy.deepcopy(mods_str_list) for i in range(len(_lst)): - _lst[i] += mod+';' + _lst[i] += mod + ";" _new_list.extend(_lst) mods_str_list = _new_list return [mod[:-1] for mod in mods_str_list] + def get_var_mods_per_sites_single_mod_on_aa( - sequence:str, - mod_sites:tuple, - var_mod_dict:dict -)->list: + sequence: str, mod_sites: tuple, var_mod_dict: dict +) -> list: """ - Used when the var mod list contains + Used when the var mod list contains only one mods on the each AA, for example: Mod1@A, Mod2@D ... """ - mod_str = '' + mod_str = "" for site in mod_sites: - mod_str += var_mod_dict[sequence[site-1]]+';' + mod_str += var_mod_dict[sequence[site - 1]] + ";" return [mod_str[:-1]] + get_var_mods_per_sites = get_var_mods_per_sites_single_mod_on_aa + def get_var_mods( - sequence:str, - var_mod_aas:str, - mod_dict:dict, - min_var_mod:int, - max_var_mod:int, - max_combs:int, -)->tuple: + sequence: str, + var_mod_aas: str, + mod_dict: dict, + min_var_mod: int, + max_var_mod: int, + max_combs: int, +) -> tuple: """ Generate all modification combinations and associated sites for the sequence. """ mod_sites_list = get_var_mod_sites( - sequence, var_mod_aas, - min_var_mod, max_var_mod, max_combs + sequence, var_mod_aas, min_var_mod, max_var_mod, max_combs ) ret_mods = [] ret_sites_list = [] for mod_sites in mod_sites_list: - _mods = get_var_mods_per_sites( - sequence,mod_sites,mod_dict - ) - mod_sites_str = ';'.join([str(i) for i in mod_sites]) + _mods = get_var_mods_per_sites(sequence, mod_sites, mod_dict) + mod_sites_str = ";".join([str(i) for i in mod_sites]) ret_mods.extend(_mods) - ret_sites_list.extend([mod_sites_str]*len(_mods)) + ret_sites_list.extend([mod_sites_str] * len(_mods)) if min_var_mod == 0: - ret_mods.append('') - ret_sites_list.append('') + ret_mods.append("") + ret_sites_list.append("") return ret_mods, ret_sites_list -def parse_term_mod(term_mod_name:str): - _mod, term = term_mod_name.split('@') - if '^' in term: - return tuple(term.split('^')) + +def parse_term_mod(term_mod_name: str): + _mod, term = term_mod_name.split("@") + if "^" in term: + return tuple(term.split("^")) else: - return '', term + return "", term + def add_single_peptide_labeling( - seq:str, - mods:str, - mod_sites:str, - label_aas:str, - label_mod_dict:dict, - nterm_label_mod:str, - cterm_label_mod:str + seq: str, + mods: str, + mod_sites: str, + label_aas: str, + label_mod_dict: dict, + nterm_label_mod: str, + cterm_label_mod: str, ): add_nterm_label = True if nterm_label_mod else False add_cterm_label = True if cterm_label_mod else False if mod_sites: - _sites = mod_sites.split(';') - if '0' in _sites: add_nterm_label = False - if '-1' in _sites: add_cterm_label = False + _sites = mod_sites.split(";") + if "0" in _sites: + add_nterm_label = False + if "-1" in _sites: + add_cterm_label = False mod_list = [mods] mod_site_list = [mod_sites] else: @@ -462,99 +447,99 @@ def add_single_peptide_labeling( mod_site_list = [] if add_nterm_label: mod_list.append(nterm_label_mod) - mod_site_list.append('0') + mod_site_list.append("0") if add_cterm_label: mod_list.append(cterm_label_mod) - mod_site_list.append('-1') + mod_site_list.append("-1") aa_labels, aa_label_sites = get_fix_mods(seq, label_aas, label_mod_dict) if aa_labels: mod_list.append(aa_labels) mod_site_list.append(aa_label_sites) - return ';'.join(mod_list), ';'.join(mod_site_list) + return ";".join(mod_list), ";".join(mod_site_list) + -def parse_labels(labels:list): - label_aas = '' +def parse_labels(labels: list): + label_aas = "" label_mod_dict = {} - nterm_label_mod = '' - cterm_label_mod = '' + nterm_label_mod = "" + cterm_label_mod = "" for label in labels: - _, aa = label.split('@') + _, aa = label.split("@") if len(aa) == 1: label_aas += aa label_mod_dict[aa] = label - elif aa == 'Any N-term' or aa == "Any_N-term": + elif aa == "Any N-term" or aa == "Any_N-term": nterm_label_mod = label - elif aa == 'Any C-term' or aa == "Any_C-term": + elif aa == "Any C-term" or aa == "Any_C-term": cterm_label_mod = label return label_aas, label_mod_dict, nterm_label_mod, cterm_label_mod - + + def create_labeling_peptide_df( - peptide_df:pd.DataFrame, labels:list, - inplace:bool=False - ): - if len(peptide_df) == 0: return peptide_df + peptide_df: pd.DataFrame, labels: list, inplace: bool = False +): + if len(peptide_df) == 0: + return peptide_df if inplace: df = peptide_df else: df = peptide_df.copy() - ( - label_aas, label_mod_dict, - nterm_label_mod, cterm_label_mod - ) = parse_labels(labels) - - ( - df['mods'], - df['mod_sites'] - ) = zip(*df[ - ['sequence','mods','mod_sites'] - ].apply(lambda x: - add_single_peptide_labeling( - *x, label_aas, label_mod_dict, - nterm_label_mod, cterm_label_mod - ), axis=1, - )) + (label_aas, label_mod_dict, nterm_label_mod, cterm_label_mod) = parse_labels(labels) + + (df["mods"], df["mod_sites"]) = zip( + *df[["sequence", "mods", "mod_sites"]].apply( + lambda x: add_single_peptide_labeling( + *x, label_aas, label_mod_dict, nterm_label_mod, cterm_label_mod + ), + axis=1, + ) + ) return df -def protein_idxes_to_names(protein_idxes:str, protein_names:list): - if len(protein_idxes) == 0: return '' - proteins = [protein_names[int(i)] for i in protein_idxes.split(';')] + +def protein_idxes_to_names(protein_idxes: str, protein_names: list): + if len(protein_idxes) == 0: + return "" + proteins = [protein_names[int(i)] for i in protein_idxes.split(";")] proteins = [protein for protein in proteins if protein] - return ';'.join(proteins) + return ";".join(proteins) + def append_special_modifications( - df:pd.DataFrame, - var_mods:list = ['Phospho@S','Phospho@T','Phospho@Y'], - min_mod_num:int=0, max_mod_num:int=1, - max_peptidoform_num:int=100, - cannot_modify_pep_nterm_aa:bool=False, - cannot_modify_pep_cterm_aa:bool=False, -)->pd.DataFrame: + df: pd.DataFrame, + var_mods: list = ["Phospho@S", "Phospho@T", "Phospho@Y"], + min_mod_num: int = 0, + max_mod_num: int = 1, + max_peptidoform_num: int = 100, + cannot_modify_pep_nterm_aa: bool = False, + cannot_modify_pep_cterm_aa: bool = False, +) -> pd.DataFrame: """ - Append special (not N/C-term) variable modifications to the + Append special (not N/C-term) variable modifications to the exsiting modifications of each sequence in `df`. Parameters ---------- df : pd.DataFrame Precursor dataframe - + var_mods : list, optional - Considered varialbe modification list. + Considered varialbe modification list. Defaults to ['Phospho@S','Phospho@T','Phospho@Y']. min_mod_num : int, optional - Minimal modification number for + Minimal modification number for each sequence of the `var_mods`. Defaults to 0. max_mod_num : int, optional - Maximal modification number for + Maximal modification number for each sequence of the `var_mods`. Defaults to 1. max_peptidoform_num : int, optional - One sequence is only allowed to explode + One sequence is only allowed to explode to `max_peptidoform_num` number of modified peptides. Defaults to 100. cannot_modify_pep_nterm_aa : bool, optional @@ -562,7 +547,7 @@ def append_special_modifications( cannot_modify_pep_cterm_aa : bool, optional If the modified AA is at C-term, then the modification cannot modified it. - For example GlyGly@K, for a peptide `ACDKEFGK`, if GlyGly is at the C-term, + For example GlyGly@K, for a peptide `ACDKEFGK`, if GlyGly is at the C-term, trypsin cannot cleave the C-term K, hence there will be no such a modified peptide ACDKEFGK(GlyGly). by default False @@ -571,63 +556,75 @@ def append_special_modifications( pd.DataFrame The precursor_df with new modification added. """ - if len(var_mods) == 0 or len(df) == 0: + if len(var_mods) == 0 or len(df) == 0: return df if cannot_modify_pep_nterm_aa: - df['sequence'] = df['sequence'].apply( - lambda seq: seq[0].lower()+seq[1:] - ) - + df["sequence"] = df["sequence"].apply(lambda seq: seq[0].lower() + seq[1:]) + if cannot_modify_pep_cterm_aa: - df['sequence'] = df['sequence'].apply( - lambda seq: seq[:-1]+seq[-1].lower() - ) + df["sequence"] = df["sequence"].apply(lambda seq: seq[:-1] + seq[-1].lower()) - mod_dict = dict([(mod[-1],mod) for mod in var_mods]) - var_mod_aas = ''.join(mod_dict.keys()) - - ( - df['mods_app'], - df['mod_sites_app'] - ) = zip(*df.sequence.apply(get_var_mods, - var_mod_aas=var_mod_aas, mod_dict=mod_dict, - min_var_mod=min_mod_num, max_var_mod=max_mod_num, + global get_var_mods_per_sites + var_mod_aas = "" + mod_dict = {} + if _check_if_multi_mods_on_aa(var_mods): + for mod in var_mods: + if mod.find("@") + 2 == len(mod): + # if mod[-1] in self.fix_mod_dict: continue + if mod[-1] in mod_dict: + mod_dict[mod[-1]].append(mod) + else: + var_mod_aas += mod[-1] + mod_dict[mod[-1]] = [mod] + get_var_mods_per_sites = get_var_mods_per_sites_multi_mods_on_aa + else: + for mod in var_mods: + if mod.find("@") + 2 == len(mod): + # if mod[-1] in self.fix_mod_dict: continue + var_mod_aas += mod[-1] + mod_dict[mod[-1]] = mod + get_var_mods_per_sites = get_var_mods_per_sites_single_mod_on_aa + + (df["mods_app"], df["mod_sites_app"]) = zip( + *df.sequence.apply( + get_var_mods, + var_mod_aas=var_mod_aas, + mod_dict=mod_dict, + min_var_mod=min_mod_num, + max_var_mod=max_mod_num, max_combs=max_peptidoform_num, ) ) if cannot_modify_pep_nterm_aa: - df['sequence'] = df['sequence'].apply( - lambda seq: seq[0].upper()+seq[1:] - ) - + df["sequence"] = df["sequence"].apply(lambda seq: seq[0].upper() + seq[1:]) + if cannot_modify_pep_cterm_aa: - df['sequence'] = df['sequence'].apply( - lambda seq: seq[:-1]+seq[-1].upper() - ) - - if min_mod_num==0: - df = explode_multiple_columns(df, ['mods_app','mod_sites_app']) - df.fillna('', inplace=True) + df["sequence"] = df["sequence"].apply(lambda seq: seq[:-1] + seq[-1].upper()) + + if min_mod_num == 0: + df = explode_multiple_columns(df, ["mods_app", "mod_sites_app"]) + df.fillna("", inplace=True) else: - df.drop(df[df.mods_app.apply(lambda x: len(x)==0)].index, inplace=True) - df = explode_multiple_columns(df, ['mods_app','mod_sites_app']) - df['mods'] = df[['mods','mods_app']].apply( - lambda x: ';'.join(i for i in x if i), axis=1 + df.drop(df[df.mods_app.apply(lambda x: len(x) == 0)].index, inplace=True) + df = explode_multiple_columns(df, ["mods_app", "mod_sites_app"]) + df["mods"] = df[["mods", "mods_app"]].apply( + lambda x: ";".join(i for i in x if i), axis=1 ) - df['mod_sites'] = df[['mod_sites','mod_sites_app']].apply( - lambda x: ';'.join(i for i in x if i), axis=1 + df["mod_sites"] = df[["mod_sites", "mod_sites_app"]].apply( + lambda x: ";".join(i for i in x if i), axis=1 ) - df.drop(columns=['mods_app', 'mod_sites_app'], inplace=True) + df.drop(columns=["mods_app", "mod_sites_app"], inplace=True) df.reset_index(drop=True, inplace=True) return df + class SpecLibFasta(SpecLibBase): """ This is the main entry of AlphaBase when generating spectral libraries from fasta files It includes functionalities to: - + - Load protein sequences - Digest protein sequences - Append decoy peptides @@ -638,57 +635,57 @@ class SpecLibFasta(SpecLibBase): Attributes ---------- max_peptidoform_num : int, 100 by default - For some modifications such as Phospho, there may be - thousands of peptidoforms generated for some peptides, - so we use this attribute to control the overall number of + For some modifications such as Phospho, there may be + thousands of peptidoforms generated for some peptides, + so we use this attribute to control the overall number of peptidoforms of a peptide. - + protein_df : pd.DataFrame - Protein dataframe with columns 'protein_id', + Protein dataframe with columns 'protein_id', 'sequence', 'description', 'gene_name', etc. """ - def __init__(self, - charged_frag_types:list = [ - 'b_z1','b_z2','y_z1', 'y_z2' - ], + + def __init__( + self, + charged_frag_types: list = ["b_z1", "b_z2", "y_z1", "y_z2"], *, - protease:str = 'trypsin', - max_missed_cleavages:int = 2, - peptide_length_min:int = 7, - peptide_length_max:int = 35, - precursor_charge_min:int = 2, - precursor_charge_max:int = 4, - precursor_mz_min:float = 400.0, - precursor_mz_max:float = 2000.0, - var_mods:list = ['Acetyl@Protein_N-term','Oxidation@M'], - min_var_mod_num:int = 0, - max_var_mod_num:int = 2, - fix_mods:list = ['Carbamidomethyl@C'], - labeling_channels:dict = None, - special_mods:list = [], - min_special_mod_num:int = 0, - max_special_mod_num:int = 1, - special_mods_cannot_modify_pep_n_term:bool=False, - special_mods_cannot_modify_pep_c_term:bool=False, + protease: str = "trypsin", + max_missed_cleavages: int = 2, + peptide_length_min: int = 7, + peptide_length_max: int = 35, + precursor_charge_min: int = 2, + precursor_charge_max: int = 4, + precursor_mz_min: float = 400.0, + precursor_mz_max: float = 2000.0, + var_mods: list = ["Acetyl@Protein_N-term", "Oxidation@M"], + min_var_mod_num: int = 0, + max_var_mod_num: int = 2, + fix_mods: list = ["Carbamidomethyl@C"], + labeling_channels: dict = None, + special_mods: list = [], + min_special_mod_num: int = 0, + max_special_mod_num: int = 1, + special_mods_cannot_modify_pep_n_term: bool = False, + special_mods_cannot_modify_pep_c_term: bool = False, decoy: str = None, - include_contaminants:bool=False, - I_to_L:bool=False, + include_contaminants: bool = False, + I_to_L: bool = False, ): """ Parameters ---------- charged_frag_types : list, optional - Fragment types with charge, + Fragment types with charge, by default [ 'b_z1','b_z2','y_z1', 'y_z2' ] protease : str, optional Could be pre-defined protease name defined in :data:`protease_dict`, - or a regular expression. + or a regular expression. By default 'trypsin' max_missed_cleavages : int, optional Maximal missed cleavages, by default 2 - + peptide_length_min : int, optional Minimal cleaved peptide length, by default 7 @@ -708,30 +705,30 @@ def __init__(self, Maximal precursor mz, by default 2000.0 var_mods : list, optional - list of variable modifications, + list of variable modifications, by default ['Acetyl@Protein_N-term','Oxidation@M'] max_var_mod_num : int, optional - Minimal number of variable modifications on a peptide sequence, + Minimal number of variable modifications on a peptide sequence, by default 0 max_var_mod_num : int, optional - Maximal number of variable modifications on a peptide sequence, + Maximal number of variable modifications on a peptide sequence, by default 2 fix_mods : list, optional list of fixed modifications, by default ['Carbamidomethyl@C'] labeling_channels : dict, optional - Add isotope labeling with different channels, - see :meth:`add_peptide_labeling()`. + Add isotope labeling with different channels, + see :meth:`add_peptide_labeling()`. Defaults to None special_mods : list, optional Modifications with special occurance per peptide. - It is useful for modificaitons like Phospho which may largely + It is useful for modificaitons like Phospho which may largely explode the number of candidate modified peptides. - The number of special_mods per peptide + The number of special_mods per peptide is controlled by `max_append_mod_num`. Defaults to []. @@ -742,9 +739,9 @@ def __init__(self, Control the max number of special_mods per peptide, by default 1. special_mods_cannot_modify_pep_c_term : bool, optional - Some modifications cannot modify the peptide C-term, - this will be useful for GlyGly@K as if C-term is di-Glyed, - it cannot be cleaved/digested. + Some modifications cannot modify the peptide C-term, + this will be useful for GlyGly@K as if C-term is di-Glyed, + it cannot be cleaved/digested. Defaults to False. special_mods_cannot_modify_pep_n_term : bool, optional @@ -768,15 +765,14 @@ def __init__(self, charged_frag_types=charged_frag_types, precursor_mz_min=precursor_mz_min, precursor_mz_max=precursor_mz_max, - decoy=decoy + decoy=decoy, ) - self.protein_df:pd.DataFrame = pd.DataFrame() + self.protein_df: pd.DataFrame = pd.DataFrame() self.I_to_L = I_to_L self.include_contaminants = include_contaminants self.max_peptidoform_num = 100 self._digest = Digest( - protease, max_missed_cleavages, - peptide_length_min, peptide_length_max + protease, max_missed_cleavages, peptide_length_min, peptide_length_max ) self.min_precursor_charge = precursor_charge_min self.max_precursor_charge = precursor_charge_max @@ -789,11 +785,15 @@ def __init__(self, self.special_mods = special_mods self.min_special_mod_num = min_special_mod_num self.max_special_mod_num = max_special_mod_num - self.special_mods_cannot_modify_pep_n_term = special_mods_cannot_modify_pep_n_term - self.special_mods_cannot_modify_pep_c_term = special_mods_cannot_modify_pep_c_term + self.special_mods_cannot_modify_pep_n_term = ( + special_mods_cannot_modify_pep_n_term + ) + self.special_mods_cannot_modify_pep_c_term = ( + special_mods_cannot_modify_pep_c_term + ) self._parse_fix_and_var_mods() - + def _parse_fix_and_var_mods(self): # self.fix_mod_aas = '' # self.fix_mod_prot_nterm_dict = {} @@ -802,13 +802,10 @@ def _parse_fix_and_var_mods(self): # self.fix_mod_pep_cterm_dict = {} # self.fix_mod_dict = {} - def _set_term_mod(term_mod, - prot_nterm, prot_cterm, pep_nterm, pep_cterm, - allow_conflicts + def _set_term_mod( + term_mod, prot_nterm, prot_cterm, pep_nterm, pep_cterm, allow_conflicts ): - def _set_dict(term_dict,site,mod, - allow_conflicts - ): + def _set_dict(term_dict, site, mod, allow_conflicts): if allow_conflicts: if site in term_dict: term_dict[site].append(term_mod) @@ -816,31 +813,24 @@ def _set_dict(term_dict,site,mod, term_dict[site] = [term_mod] else: term_dict[site] = term_mod + site, term = parse_term_mod(term_mod) if term == "Any N-term" or term == "Any_N-term": - _set_dict(pep_nterm, site, term_mod, - allow_conflicts - ) - elif term == 'Protein N-term' or term == "Protein_N-term": - _set_dict(prot_nterm, site, term_mod, - allow_conflicts - ) - elif term == 'Any C-term' or term == "Any_C-term": - _set_dict(pep_cterm, site, term_mod, - allow_conflicts - ) - elif term == 'Protein C-term' or term == "Protein_C-term": - _set_dict(prot_cterm, site, term_mod, - allow_conflicts - ) - + _set_dict(pep_nterm, site, term_mod, allow_conflicts) + elif term == "Protein N-term" or term == "Protein_N-term": + _set_dict(prot_nterm, site, term_mod, allow_conflicts) + elif term == "Any C-term" or term == "Any_C-term": + _set_dict(pep_cterm, site, term_mod, allow_conflicts) + elif term == "Protein C-term" or term == "Protein_C-term": + _set_dict(prot_cterm, site, term_mod, allow_conflicts) + # for mod in self.fix_mods: # if mod.find('@')+2 == len(mod): # self.fix_mod_aas += mod[-1] # self.fix_mod_dict[mod[-1]] = mod # else: # _set_term_mod( - # mod, + # mod, # self.fix_mod_prot_nterm_dict, # self.fix_mod_prot_cterm_dict, # self.fix_mod_pep_nterm_dict, @@ -848,7 +838,7 @@ def _set_dict(term_dict,site,mod, # allow_conflicts=False # ) - self.var_mod_aas = '' + self.var_mod_aas = "" self.var_mod_prot_nterm_dict = {} self.var_mod_prot_cterm_dict = {} self.var_mod_pep_nterm_dict = {} @@ -856,52 +846,45 @@ def _set_dict(term_dict,site,mod, self.var_mod_dict = {} global get_var_mods_per_sites - if self._check_if_multi_mods_on_aa(self.var_mods): + if _check_if_multi_mods_on_aa(self.var_mods): for mod in self.var_mods: - if mod.find('@')+2 == len(mod): + if mod.find("@") + 2 == len(mod): # if mod[-1] in self.fix_mod_dict: continue - self.var_mod_aas += mod[-1] if mod[-1] in self.var_mod_dict: self.var_mod_dict[mod[-1]].append(mod) else: + self.var_mod_aas += mod[-1] self.var_mod_dict[mod[-1]] = [mod] get_var_mods_per_sites = get_var_mods_per_sites_multi_mods_on_aa else: for mod in self.var_mods: - if mod.find('@')+2 == len(mod): + if mod.find("@") + 2 == len(mod): # if mod[-1] in self.fix_mod_dict: continue self.var_mod_aas += mod[-1] self.var_mod_dict[mod[-1]] = mod get_var_mods_per_sites = get_var_mods_per_sites_single_mod_on_aa - + for mod in self.var_mods: - if mod.find('@')+2 < len(mod): + if mod.find("@") + 2 < len(mod): _set_term_mod( - mod, + mod, self.var_mod_prot_nterm_dict, self.var_mod_prot_cterm_dict, self.var_mod_pep_nterm_dict, self.var_mod_pep_cterm_dict, - allow_conflicts=True + allow_conflicts=True, ) - def _check_if_multi_mods_on_aa(self, var_mods): - mod_set = set() - for mod in var_mods: - if mod.find('@')+2 == len(mod): - if mod[-1] in mod_set: return True - mod_set.add(mod[-1]) - return False - - def import_and_process_fasta(self, - fasta_files:list, + def import_and_process_fasta( + self, + fasta_files: list, ): """ Import and process a fasta file or a list of fasta files. It includes 3 steps: 1. Digest and get peptide sequences, it uses `self.get_peptides_from_...()` - 2. Process the peptides including add modifications, + 2. Process the peptides including add modifications, it uses :meth:`process_from_naked_peptide_seqs()`. Parameters @@ -910,14 +893,12 @@ def import_and_process_fasta(self, A fasta file or a list of fasta files """ if self.include_contaminants: - fasta_files.append(os.path.join( - CONST_FILE_FOLDER, 'contaminants.fasta' - )) + fasta_files.append(os.path.join(CONST_FILE_FOLDER, "contaminants.fasta")) protein_dict = load_all_proteins(fasta_files) self.import_and_process_protein_dict(protein_dict) - def import_and_process_protein_dict(self, protein_dict:dict): - """ + def import_and_process_protein_dict(self, protein_dict: dict): + """ Import and process the protein_dict. The processing step is in :meth:`process_from_naked_peptide_seqs()`. ``` @@ -937,8 +918,8 @@ def import_and_process_protein_dict(self, protein_dict:dict): self.get_peptides_from_protein_dict(protein_dict) self.process_from_naked_peptide_seqs() - def import_and_process_protein_df(self, protein_df:pd.DataFrame): - """ + def import_and_process_protein_df(self, protein_df: pd.DataFrame): + """ Import and process the protein_dict. The processing step is in :meth:`process_from_naked_peptide_seqs()`. ``` @@ -953,10 +934,12 @@ def import_and_process_protein_df(self, protein_df:pd.DataFrame): self.get_peptides_from_protein_df(protein_df) self.process_from_naked_peptide_seqs() - def import_and_process_peptide_sequences(self, - pep_seq_list:list, protein_list:list=None, + def import_and_process_peptide_sequences( + self, + pep_seq_list: list, + protein_list: list = None, ): - """ + """ Importing and process peptide sequences instead of proteins. The processing step is in :meth:`process_from_naked_peptide_seqs()`. @@ -966,17 +949,15 @@ def import_and_process_peptide_sequences(self, Peptide sequence list protein_list : list, optional - Protein id list which maps to pep_seq_list one-by-one, + Protein id list which maps to pep_seq_list one-by-one, by default None """ - self.get_peptides_from_peptide_sequence_list( - pep_seq_list, protein_list - ) + self.get_peptides_from_peptide_sequence_list(pep_seq_list, protein_list) self.process_from_naked_peptide_seqs() def process_from_naked_peptide_seqs(self): """ - The peptide processing step which is + The peptide processing step which is called by `import_and_process_...` methods. """ self.append_decoy_sequence() @@ -986,7 +967,7 @@ def process_from_naked_peptide_seqs(self): self.add_charge() self.calc_and_clip_precursor_mz() - def get_peptides_from_fasta(self, fasta_file:Union[str,list]): + def get_peptides_from_fasta(self, fasta_file: Union[str, list]): """Load peptide sequences from fasta files. Parameters @@ -999,7 +980,7 @@ def get_peptides_from_fasta(self, fasta_file:Union[str,list]): else: self.get_peptides_from_fasta_list(fasta_file) - def get_peptides_from_fasta_list(self, fasta_files:list): + def get_peptides_from_fasta_list(self, fasta_files: list): """Load peptide sequences from fasta file list Parameters @@ -1008,27 +989,22 @@ def get_peptides_from_fasta_list(self, fasta_files:list): fasta file list """ if self.include_contaminants: - fasta_files.append(os.path.join( - CONST_FILE_FOLDER, 'contaminants.fasta' - )) + fasta_files.append(os.path.join(CONST_FILE_FOLDER, "contaminants.fasta")) protein_dict = load_all_proteins(fasta_files) self.get_peptides_from_protein_dict(protein_dict) - def get_peptides_from_protein_df(self, protein_df:pd.DataFrame): + def get_peptides_from_protein_df(self, protein_df: pd.DataFrame): self.protein_df = protein_df if self.I_to_L: - self.protein_df[ - 'sequence_I2L' - ] = self.protein_df.sequence.str.replace('I','L') - digest_seq = 'sequence_I2L' + self.protein_df["sequence_I2L"] = self.protein_df.sequence.str.replace( + "I", "L" + ) + digest_seq = "sequence_I2L" else: - digest_seq = 'sequence' - self._cleave_to_peptides( - self.protein_df, - protein_seq_column=digest_seq - ) + digest_seq = "sequence" + self._cleave_to_peptides(self.protein_df, protein_seq_column=digest_seq) - def get_peptides_from_protein_dict(self, protein_dict:dict): + def get_peptides_from_protein_dict(self, protein_dict: dict): """Cleave the protein sequences in protein_dict. Parameters @@ -1043,14 +1019,13 @@ def get_peptides_from_protein_dict(self, protein_dict:dict): } ``` """ - protein_df = pd.DataFrame.from_dict( - protein_dict, orient='index' - ).reset_index(drop=True) + protein_df = pd.DataFrame.from_dict(protein_dict, orient="index").reset_index( + drop=True + ) self.get_peptides_from_protein_df(protein_df) - def _cleave_to_peptides(self, - protein_df:pd.DataFrame, - protein_seq_column:str='sequence' + def _cleave_to_peptides( + self, protein_df: pd.DataFrame, protein_seq_column: str = "sequence" ): """Cleave protein sequences in protein_df @@ -1063,72 +1038,70 @@ def _cleave_to_peptides(self, """ pep_dict = {} - for i,prot_seq in enumerate( - protein_df[protein_seq_column].values - ): - ( + for i, prot_seq in enumerate(protein_df[protein_seq_column].values): + (seq_list, miss_list, nterm_list, cterm_list) = ( + self._digest.cleave_sequence(prot_seq) + ) + for seq, miss, nterm, cterm in zip( seq_list, miss_list, nterm_list, cterm_list - ) = self._digest.cleave_sequence(prot_seq) - for seq,miss,nterm,cterm in zip( - seq_list,miss_list,nterm_list, cterm_list ): prot_id = str(i) if seq in pep_dict: if not pep_dict[seq][0].endswith(prot_id): - pep_dict[seq][0] += ';'+prot_id + pep_dict[seq][0] += ";" + prot_id if nterm: pep_dict[seq][2] = nterm if cterm: pep_dict[seq][3] = cterm else: - pep_dict[seq] = [prot_id,miss,nterm,cterm] + pep_dict[seq] = [prot_id, miss, nterm, cterm] self._precursor_df = pd.DataFrame().from_dict( - pep_dict, orient='index', columns = [ - 'protein_idxes','miss_cleavage', - 'is_prot_nterm','is_prot_cterm' - ] + pep_dict, + orient="index", + columns=[ + "protein_idxes", + "miss_cleavage", + "is_prot_nterm", + "is_prot_cterm", + ], ) self._precursor_df.reset_index(drop=False, inplace=True) - self._precursor_df.rename( - columns={'index':'sequence'}, inplace=True - ) - self._precursor_df['mods'] = '' - self._precursor_df['mod_sites'] = '' + self._precursor_df.rename(columns={"index": "sequence"}, inplace=True) + self._precursor_df["mods"] = "" + self._precursor_df["mod_sites"] = "" self.refine_df() def append_protein_name(self): if ( - 'protein_id' not in self.protein_df or - 'protein_idxes' not in self._precursor_df - ): + "protein_id" not in self.protein_df + or "protein_idxes" not in self._precursor_df + ): return - self._precursor_df['proteins'] = self._precursor_df['protein_idxes'].apply( - protein_idxes_to_names, - protein_names=self.protein_df['protein_id'].values + self._precursor_df["proteins"] = self._precursor_df["protein_idxes"].apply( + protein_idxes_to_names, protein_names=self.protein_df["protein_id"].values ) - if 'gene_name' in self.protein_df.columns: - self._precursor_df['genes'] = self._precursor_df['protein_idxes'].apply( + if "gene_name" in self.protein_df.columns: + self._precursor_df["genes"] = self._precursor_df["protein_idxes"].apply( protein_idxes_to_names, - protein_names=self.protein_df['gene_name'].values + protein_names=self.protein_df["gene_name"].values, ) - def get_peptides_from_peptide_sequence_list(self, - pep_seq_list:list, - protein_list:list = None + def get_peptides_from_peptide_sequence_list( + self, pep_seq_list: list, protein_list: list = None ): self._precursor_df = pd.DataFrame() - self._precursor_df['sequence'] = pep_seq_list + self._precursor_df["sequence"] = pep_seq_list if protein_list is not None: - self._precursor_df['protein_name'] = protein_list - self._precursor_df['is_prot_nterm'] = False - self._precursor_df['is_prot_cterm'] = False + self._precursor_df["protein_name"] = protein_list + self._precursor_df["is_prot_nterm"] = False + self._precursor_df["is_prot_cterm"] = False self.refine_df() - def add_mods_for_one_seq(self, sequence:str, - is_prot_nterm, is_prot_cterm - )->tuple: + def add_mods_for_one_seq( + self, sequence: str, is_prot_nterm, is_prot_cterm + ) -> tuple: """Add fixed and variable modifications to a sequence Parameters @@ -1160,89 +1133,87 @@ def add_mods_for_one_seq(self, sequence:str, # fix_mod_sites = [fix_mod_sites] var_mods_list, var_mod_sites_list = get_var_mods( - sequence, self.var_mod_aas, self.var_mod_dict, - self.min_var_mod_num, self.max_var_mod_num, - self.max_peptidoform_num-1, # 1 for unmodified + sequence, + self.var_mod_aas, + self.var_mod_dict, + self.min_var_mod_num, + self.max_var_mod_num, + self.max_peptidoform_num - 1, # 1 for unmodified ) - nterm_var_mods = [''] - nterm_var_mod_sites = [''] - if is_prot_nterm and len(self.var_mod_prot_nterm_dict)>0: - if '' in self.var_mod_prot_nterm_dict: - nterm_var_mods.extend(self.var_mod_prot_nterm_dict['']) + nterm_var_mods = [""] + nterm_var_mod_sites = [""] + if is_prot_nterm and len(self.var_mod_prot_nterm_dict) > 0: + if "" in self.var_mod_prot_nterm_dict: + nterm_var_mods.extend(self.var_mod_prot_nterm_dict[""]) if sequence[0] in self.var_mod_prot_nterm_dict: nterm_var_mods.extend(self.var_mod_prot_nterm_dict[sequence[0]]) - if len(self.var_mod_pep_nterm_dict)>0: - if '' in self.var_mod_pep_nterm_dict: - nterm_var_mods.extend(self.var_mod_pep_nterm_dict['']) + if len(self.var_mod_pep_nterm_dict) > 0: + if "" in self.var_mod_pep_nterm_dict: + nterm_var_mods.extend(self.var_mod_pep_nterm_dict[""]) if sequence[0] in self.var_mod_pep_nterm_dict: nterm_var_mods.extend(self.var_mod_pep_nterm_dict[sequence[0]]) - nterm_var_mod_sites.extend(['0']*(len(nterm_var_mods)-1)) + nterm_var_mod_sites.extend(["0"] * (len(nterm_var_mods) - 1)) - #TODO add prot and pep C-term var mods + # TODO add prot and pep C-term var mods return ( list( - ';'.join([i for i in items if i]) for items in itertools.product( - nterm_var_mods, var_mods_list - ) + ";".join([i for i in items if i]) + for items in itertools.product(nterm_var_mods, var_mods_list) ), list( - ';'.join([i for i in items if i]) for items in itertools.product( - nterm_var_mod_sites, var_mod_sites_list - ) + ";".join([i for i in items if i]) + for items in itertools.product(nterm_var_mod_sites, var_mod_sites_list) ), ) def add_modifications(self): - """Add fixed and variable modifications to all peptide sequences in `self.precursor_df` - """ - if 'is_prot_nterm' not in self._precursor_df.columns: - self._precursor_df['is_prot_nterm'] = False - if 'is_prot_cterm' not in self._precursor_df.columns: - self._precursor_df['is_prot_cterm'] = False - + """Add fixed and variable modifications to all peptide sequences in `self.precursor_df`""" + if "is_prot_nterm" not in self._precursor_df.columns: + self._precursor_df["is_prot_nterm"] = False + if "is_prot_cterm" not in self._precursor_df.columns: + self._precursor_df["is_prot_cterm"] = False + if len(self._precursor_df) == 0: - self._precursor_df['mods'] = "" - self._precursor_df['mod_sites'] = "" + self._precursor_df["mods"] = "" + self._precursor_df["mod_sites"] = "" return - - ( - self._precursor_df['mods'], - self._precursor_df['mod_sites'] - ) = zip(*self._precursor_df[ - ['sequence','is_prot_nterm','is_prot_cterm'] - ].apply(lambda x: - self.add_mods_for_one_seq(*x), axis=1 - )) + + (self._precursor_df["mods"], self._precursor_df["mod_sites"]) = zip( + *self._precursor_df[["sequence", "is_prot_nterm", "is_prot_cterm"]].apply( + lambda x: self.add_mods_for_one_seq(*x), axis=1 + ) + ) self._precursor_df = explode_multiple_columns( - self._precursor_df, - ['mods','mod_sites'] + self._precursor_df, ["mods", "mod_sites"] ) - self._precursor_df.dropna(subset=['mods'], inplace=True) + self._precursor_df.dropna(subset=["mods"], inplace=True) self._precursor_df = create_labeling_peptide_df( - self._precursor_df, self.fix_mods, - inplace=True + self._precursor_df, self.fix_mods, inplace=True ) self._precursor_df.reset_index(drop=True, inplace=True) def add_special_modifications(self): """ - Add external defined variable modifications to + Add external defined variable modifications to all peptide sequences in `self._precursor_df`. See :meth:`append_special_modifications()` for details. """ - if len(self.special_mods) == 0: return + if len(self.special_mods) == 0: + return self._precursor_df = append_special_modifications( - self._precursor_df, self.special_mods, - self.min_special_mod_num, self.max_special_mod_num, + self._precursor_df, + self.special_mods, + self.min_special_mod_num, + self.max_special_mod_num, self.max_peptidoform_num, cannot_modify_pep_nterm_aa=self.special_mods_cannot_modify_pep_n_term, cannot_modify_pep_cterm_aa=self.special_mods_cannot_modify_pep_c_term, ) - def add_peptide_labeling(self, labeling_channel_dict:dict=None): - """ + def add_peptide_labeling(self, labeling_channel_dict: dict = None): + """ Add labeling onto peptides inplace of self._precursor_df Parameters @@ -1257,12 +1228,12 @@ def add_peptide_labeling(self, labeling_channel_dict:dict=None): 8: ['Dimethyl:2H(6)13C(2)@Any_N-term','Dimethyl:2H(6)13C(2)@K'], } ```. - The key name could be int (highly recommended or - must be in the future) or str, and the value must be + The key name could be int (highly recommended or + must be in the future) or str, and the value must be a list of modification names (str) in alphabase format. It is set to `self.labeling_channels` if None. Defaults to None - + """ if labeling_channel_dict is None: labeling_channel_dict = self.labeling_channels @@ -1271,36 +1242,31 @@ def add_peptide_labeling(self, labeling_channel_dict:dict=None): df_list = [] for channel, labels in labeling_channel_dict.items(): df = create_labeling_peptide_df(self._precursor_df, labels) - df['labeling_channel'] = channel + df["labeling_channel"] = channel df_list.append(df) self._precursor_df = pd.concat(df_list, ignore_index=True) try: - self._precursor_df[ - 'labeling_channel' - ] = self._precursor_df.labeling_channel.astype(np.int32) - if 'labeling_channel' not in self.key_numeric_columns: - self.key_numeric_columns.append('labeling_channel') - except: - if 'labeling_channel' in self.key_numeric_columns: - self.key_numeric_columns.remove('labeling_channel') - + self._precursor_df["labeling_channel"] = ( + self._precursor_df.labeling_channel.astype(np.int32) + ) + if "labeling_channel" not in self.key_numeric_columns: + self.key_numeric_columns.append("labeling_channel") + except Exception: + if "labeling_channel" in self.key_numeric_columns: + self.key_numeric_columns.remove("labeling_channel") def add_charge(self): - """Add charge states - """ + """Add charge states""" if "charge" in self._precursor_df.columns: return - self._precursor_df['charge'] = [ - np.arange( - self.min_precursor_charge, - self.max_precursor_charge+1 - ) - ]*len(self._precursor_df) - self._precursor_df = self._precursor_df.explode('charge') - self._precursor_df['charge'] = self._precursor_df.charge.astype(np.int8) + self._precursor_df["charge"] = [ + np.arange(self.min_precursor_charge, self.max_precursor_charge + 1) + ] * len(self._precursor_df) + self._precursor_df = self._precursor_df.explode("charge") + self._precursor_df["charge"] = self._precursor_df.charge.astype(np.int8) self._precursor_df.reset_index(drop=True, inplace=True) - def save_hdf(self, hdf_file:str): + def save_hdf(self, hdf_file: str): """Save the contents into hdf file (attribute -> hdf_file): - self.precursor_df -> library/precursor_df - self.protein_df -> library/protein_df @@ -1313,15 +1279,10 @@ def save_hdf(self, hdf_file:str): The hdf file path """ super().save_hdf(hdf_file) - _hdf = HDF_File( - hdf_file, - read_only=False, - truncate=True, - delete_existing=False - ) + _hdf = HDF_File(hdf_file, read_only=False, truncate=True, delete_existing=False) _hdf.library.protein_df = self.protein_df - def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): + def load_hdf(self, hdf_file: str, load_mod_seq: bool = False): """Load contents from hdf file: - self.precursor_df <- library/precursor_df - self.precursor_df <- library/mod_seq_df if load_mod_seq is True @@ -1336,7 +1297,7 @@ def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): load_mod_seq : bool, optional After library is generated with hash values (int64) for sequences (str) and modifications (str), - we don't need sequence information for searching. + we don't need sequence information for searching. So we can skip loading sequences to make the loading much faster. By default False """ @@ -1349,10 +1310,11 @@ def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): except (AttributeError, KeyError, ValueError, TypeError): print(f"No protein_df in {hdf_file}") + def annotate_precursor_df( - precursor_df : pd.DataFrame, - protein_df : pd.DataFrame, - ): + precursor_df: pd.DataFrame, + protein_df: pd.DataFrame, +): """Annotate a list of peptides with genes and proteins by using an ahocorasick automaton. Parameters @@ -1369,24 +1331,22 @@ def annotate_precursor_df( pd.DataFrame updated precursor_df with `genes`, `proteins` and `cardinality` columns. - + """ if len(precursor_df) == 0: return precursor_df - + if len(protein_df) == 0: return precursor_df - if 'sequence' not in precursor_df.columns: - raise SystemError('precursor_df must contain a sequence column') - - peptide_df = pd.DataFrame({ - 'sequence': precursor_df['sequence'].unique() - }) + if "sequence" not in precursor_df.columns: + raise SystemError("precursor_df must contain a sequence column") + + peptide_df = pd.DataFrame({"sequence": precursor_df["sequence"].unique()}) # ahocorasick automaton will be used to index the protein_df automaton = ahocorasick.Automaton() - for i, peptide_sequence in enumerate(peptide_df['sequence']): + for i, peptide_sequence in enumerate(peptide_df["sequence"]): automaton.add_word(peptide_sequence, i) automaton.make_automaton() @@ -1394,32 +1354,42 @@ def annotate_precursor_df( proteins = [[] for _ in range(len(peptide_df))] # iter as dictionary - for protein_entry in tqdm(protein_df.to_dict('records')): - idx = [idx for _, idx in automaton.iter(protein_entry['sequence'])] + for protein_entry in tqdm(protein_df.to_dict("records")): + idx = [idx for _, idx in automaton.iter(protein_entry["sequence"])] idx = np.unique(idx) if len(idx) > 0: for i in idx: - genes[i].append(protein_entry['gene_org']) - proteins[i].append(protein_entry['protein_id']) + genes[i].append(protein_entry["gene_org"]) + proteins[i].append(protein_entry["protein_id"]) - peptide_df['genes'] = [';'.join(g) for g in genes] - peptide_df['proteins'] = [';'.join(g) for g in proteins] - peptide_df['cardinality'] = [len(g) for g in genes] + peptide_df["genes"] = [";".join(g) for g in genes] + peptide_df["proteins"] = [";".join(g) for g in proteins] + peptide_df["cardinality"] = [len(g) for g in genes] - if 'genes' in precursor_df.columns: - precursor_df.drop(columns=['genes'], inplace=True) + if "genes" in precursor_df.columns: + precursor_df.drop(columns=["genes"], inplace=True) - if 'proteins' in precursor_df.columns: - precursor_df.drop(columns=['proteins'], inplace=True) + if "proteins" in precursor_df.columns: + precursor_df.drop(columns=["proteins"], inplace=True) - if 'proteotypic' in precursor_df.columns: - precursor_df.drop(columns=['proteotypic'], inplace=True) + if "proteotypic" in precursor_df.columns: + precursor_df.drop(columns=["proteotypic"], inplace=True) - if 'cardinality' in precursor_df.columns: - precursor_df.drop(columns=['cardinality'], inplace=True) + if "cardinality" in precursor_df.columns: + precursor_df.drop(columns=["cardinality"], inplace=True) - failed_annotation = np.sum(peptide_df['genes'] == '') + failed_annotation = np.sum(peptide_df["genes"] == "") if failed_annotation > 0: - warnings.warn(f'{failed_annotation} peptides could not be annotated') + warnings.warn(f"{failed_annotation} peptides could not be annotated") + + return precursor_df.merge(peptide_df, on="sequence", how="left") + - return precursor_df.merge(peptide_df, on='sequence', how='left') \ No newline at end of file +def _check_if_multi_mods_on_aa(var_mods): + mod_set = set() + for mod in var_mods: + if mod.find("@") + 2 == len(mod): + if mod[-1] in mod_set: + return True + mod_set.add(mod[-1]) + return False diff --git a/alphabase/protein/inference.py b/alphabase/protein/inference.py index f84f7466..1bbe7066 100644 --- a/alphabase/protein/inference.py +++ b/alphabase/protein/inference.py @@ -1,15 +1,17 @@ import ahocorasick -def build_AC(peptides:list): + +def build_AC(peptides: list): AC = ahocorasick.Automaton() for seq in peptides: AC.add_word(seq, seq) AC.make_automaton() -def match_AC(AC:ahocorasick.Automaton, protein_seq): + +def match_AC(AC: ahocorasick.Automaton, protein_seq): start_last_list = [] for last_index, seq in AC.iter(protein_seq): start_index = last_index - len(seq) + 1 start_last_list.append((start_index, last_index)) - return start_last_list \ No newline at end of file + return start_last_list diff --git a/alphabase/protein/lcp_digest.py b/alphabase/protein/lcp_digest.py index 4b47940c..c97ddfac 100644 --- a/alphabase/protein/lcp_digest.py +++ b/alphabase/protein/lcp_digest.py @@ -2,48 +2,58 @@ import numpy as np from pydivsufsort import divsufsort, kasai -def get_lcp_array(cat_prot:str): - data = np.array(cat_prot,'c').view(np.int8) + +def get_lcp_array(cat_prot: str): + data = np.array(cat_prot, "c").view(np.int8) suffix_array = divsufsort(data) lcp_array = kasai(data, suffix_array) return lcp_array[np.argsort(suffix_array)] + @numba.njit -def get_next_stop_char(seq, stop_char='$'): +def get_next_stop_char(seq, stop_char="$"): next_stop_indices = np.zeros(len(seq), dtype=np.uint32) - curr_next_stop = len(seq)-1 - for i in range(len(seq)-1, -1, -1): - if seq[i]==stop_char: + curr_next_stop = len(seq) - 1 + for i in range(len(seq) - 1, -1, -1): + if seq[i] == stop_char: curr_next_stop = i else: next_stop_indices[i] = curr_next_stop return next_stop_indices + @numba.njit -def get_all_substring_indices_from_lcp(cat_prot, lcp_array, min_len, max_len, stop_char='$'): +def get_all_substring_indices_from_lcp( + cat_prot, lcp_array, min_len, max_len, stop_char="$" +): pos_starts = [] pos_ends = [] next_stops = get_next_stop_char(cat_prot, stop_char) for i in range(len(cat_prot)): - if cat_prot[i] == stop_char: continue + if cat_prot[i] == stop_char: + continue for seq_len in range( - max(lcp_array[i]+1,min_len), - min(len(cat_prot)-i,max_len+1) + max(lcp_array[i] + 1, min_len), min(len(cat_prot) - i, max_len + 1) ): - end_pos = i+seq_len - if end_pos>next_stops[i]: break + end_pos = i + seq_len + if end_pos > next_stops[i]: + break pos_starts.append(i) pos_ends.append(end_pos) - return np.array(pos_starts,dtype=np.uint32), np.array(pos_ends,dtype=np.uint32) + return np.array(pos_starts, dtype=np.uint32), np.array(pos_ends, dtype=np.uint32) -def get_substring_indices(cat_prot:str, min_len=7, max_len=25, stop_char='$'): + +def get_substring_indices(cat_prot: str, min_len=7, max_len=25, stop_char="$"): lcp_array = get_lcp_array(cat_prot) - return get_all_substring_indices_from_lcp(cat_prot, lcp_array, min_len, max_len, stop_char=stop_char) + return get_all_substring_indices_from_lcp( + cat_prot, lcp_array, min_len, max_len, stop_char=stop_char + ) + -#compile +# compile get_substring_indices("$ABCABCD$ABCDE$ABCE$BCDEF$", 2, 100) -''' +""" cat_prots = "$ABCABCD$ABCDE$ABCE$BCDEF$" pos_starts, pos_ends = get_substring_indices(cat_prots, 2, 100) substr_set = set() @@ -54,4 +64,4 @@ def get_substring_indices(cat_prot:str, min_len=7, max_len=25, stop_char='$'): for j in range(i+2,len(cat_prots)): if '$' in cat_prots[i:j]: break assert cat_prots[i:j] in substr_set, f"{cat_prots[i:j]} not found" #not missing -''' \ No newline at end of file +""" diff --git a/alphabase/protein/protein_level_decoy.py b/alphabase/protein/protein_level_decoy.py index b750a64a..eadac7e6 100644 --- a/alphabase/protein/protein_level_decoy.py +++ b/alphabase/protein/protein_level_decoy.py @@ -1,42 +1,35 @@ import pandas as pd from alphabase.protein.fasta import SpecLibFasta -from alphabase.spectral_library.decoy import ( - decoy_lib_provider, SpecLibDecoy -) +from alphabase.spectral_library.decoy import decoy_lib_provider, SpecLibDecoy + class ProteinReverseDecoy(SpecLibDecoy): - def __init__(self, target_lib:SpecLibFasta): + def __init__(self, target_lib: SpecLibFasta): self.target_lib = target_lib - self._precursor_df:pd.DataFrame = pd.DataFrame() + self._precursor_df: pd.DataFrame = pd.DataFrame() self.protein_df = pd.DataFrame() self.decoy_tag = "REV_" - def _add_tag_to_a_column_in_protein_df(self, column:str): + def _add_tag_to_a_column_in_protein_df(self, column: str): if column in self.protein_df.columns: - self.protein_df[column] = self.decoy_tag+self.protein_df[column] + self.protein_df[column] = self.decoy_tag + self.protein_df[column] - def _make_empty_loc_for_target_protein_df(self): self.protein_df = pd.concat( [ - pd.DataFrame({'sequence':[""]*len(self.target_lib.protein_df)}), - self.protein_df - ], ignore_index=True - ).fillna('') + pd.DataFrame({"sequence": [""] * len(self.target_lib.protein_df)}), + self.protein_df, + ], + ignore_index=True, + ).fillna("") def _decoy_protein_df(self): self.protein_df = self.target_lib.protein_df.copy() - self.protein_df['sequence'] = self.protein_df.sequence.str[::-1] - self._add_tag_to_a_column_in_protein_df( - 'protein_id' - ) - self._add_tag_to_a_column_in_protein_df( - 'full_name' - ) - self._add_tag_to_a_column_in_protein_df( - 'gene_name' - ) + self.protein_df["sequence"] = self.protein_df.sequence.str[::-1] + self._add_tag_to_a_column_in_protein_df("protein_id") + self._add_tag_to_a_column_in_protein_df("full_name") + self._add_tag_to_a_column_in_protein_df("gene_name") self._make_empty_loc_for_target_protein_df() def _generate_decoy_sequences(self): @@ -49,33 +42,34 @@ def _generate_decoy_sequences(self): def decoy_sequence(self): if ( - not hasattr(self.target_lib, 'protein_df') + not hasattr(self.target_lib, "protein_df") or len(self.target_lib.protein_df) == 0 - ): return - + ): + return + self._decoy_protein_df() self._generate_decoy_sequences() self._remove_target_seqs() def append_to_target_lib(self): if ( - not hasattr(self.target_lib, 'protein_df') + not hasattr(self.target_lib, "protein_df") or len(self.target_lib.protein_df) == 0 - ): return + ): + return super().append_to_target_lib() self._append_protein_df_to_target_lib() def _append_protein_df_to_target_lib(self): - self.protein_df['decoy'] = 1 - self.target_lib.protein_df['decoy'] = 0 - self.target_lib.protein_df = pd.concat([ - self.target_lib.protein_df, - self.protein_df.loc[len(self.target_lib.protein_df):] - ]) - - -decoy_lib_provider.register('protein_reverse', ProteinReverseDecoy) - - + self.protein_df["decoy"] = 1 + self.target_lib.protein_df["decoy"] = 0 + self.target_lib.protein_df = pd.concat( + [ + self.target_lib.protein_df, + self.protein_df.loc[len(self.target_lib.protein_df) :], + ] + ) +def register_decoy(): + decoy_lib_provider.register("protein_reverse", ProteinReverseDecoy) diff --git a/alphabase/psm_reader/__init__.py b/alphabase/psm_reader/__init__.py index a3138fc7..30e431ba 100644 --- a/alphabase/psm_reader/__init__.py +++ b/alphabase/psm_reader/__init__.py @@ -1,18 +1,58 @@ -# to register all readers into .psm_reader.psm_reader_provider +__all__ = [ + "psm_reader_provider", + "psm_reader_yaml", + "PSMReaderBase", + "AlphaPeptReader", + "DiannReader", + "SpectronautReader", + "SwathReader", + "SpectronautReportReader", + "MaxQuantReader", + "MSFragger_PSM_TSV_Reader", + "pFindReader", + "MSFraggerPepXML", + "SageReaderTSV", + "SageReaderParquet", +] + from alphabase.psm_reader.psm_reader import ( - psm_reader_provider, psm_reader_yaml, - PSMReaderBase + psm_reader_provider, + psm_reader_yaml, + PSMReaderBase, +) +from alphabase.psm_reader.alphapept_reader import ( + AlphaPeptReader, + register_readers as register_ap_readers, ) -from alphabase.psm_reader.alphapept_reader import AlphaPeptReader from alphabase.psm_reader.dia_psm_reader import ( - DiannReader, SpectronautReader, SwathReader, SpectronautReportReader + DiannReader, + SpectronautReader, + SwathReader, + SpectronautReportReader, + register_readers as register_dia_readers, +) +from alphabase.psm_reader.maxquant_reader import ( + MaxQuantReader, + register_readers as register_mq_readers, +) +from alphabase.psm_reader.pfind_reader import ( + pFindReader, + register_readers as register_pf_readers, +) +from alphabase.psm_reader.msfragger_reader import ( + MSFragger_PSM_TSV_Reader, + MSFraggerPepXML, + register_readers as register_fragger_readers, +) +from alphabase.psm_reader.sage_reader import ( + SageReaderTSV, + SageReaderParquet, + register_readers as register_sage_readers, ) -from alphabase.psm_reader.maxquant_reader import MaxQuantReader -from alphabase.psm_reader.pfind_reader import pFindReader -from alphabase.psm_reader.msfragger_reader import MSFragger_PSM_TSV_Reader -from alphabase.psm_reader.sage_reader import SageReaderTSV, SageReaderParquet -try: - from alphabase.psm_reader.msfragger_reader import MSFraggerPepXML -except ImportError: - pass \ No newline at end of file +register_ap_readers() +register_dia_readers() +register_fragger_readers() +register_mq_readers() +register_pf_readers() +register_sage_readers() diff --git a/alphabase/psm_reader/alphapept_reader.py b/alphabase/psm_reader/alphapept_reader.py index 0d40d1e5..7b0e2ca5 100644 --- a/alphabase/psm_reader/alphapept_reader.py +++ b/alphabase/psm_reader/alphapept_reader.py @@ -5,16 +5,18 @@ import h5py from alphabase.psm_reader.psm_reader import ( - PSMReaderBase, psm_reader_provider, - psm_reader_yaml + PSMReaderBase, + psm_reader_provider, + psm_reader_yaml, ) + @numba.njit def parse_ap(precursor): """ Parser to parse peptide strings """ - items = precursor.split('_') + items = precursor.split("_") if len(items) == 3: decoy = 1 else: @@ -31,7 +33,7 @@ def parse_ap(precursor): if modseq[i].isupper(): break if i > 0: - sites.append('0') + sites.append("0") mods.append(modseq[:i]) modseq = modseq[i:] @@ -44,15 +46,17 @@ def parse_ap(precursor): mods.append(string) string = "" - return ''.join(parsed), ';'.join(mods), ';'.join(sites), charge, decoy + return "".join(parsed), ";".join(mods), ";".join(sites), charge, decoy + class AlphaPeptReader(PSMReaderBase): - def __init__(self, + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, **kwargs, ): """ @@ -61,48 +65,48 @@ def __init__(self, super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr = fdr, - keep_decoy = keep_decoy, + fdr=fdr, + keep_decoy=keep_decoy, **kwargs, ) - self.hdf_dataset = 'identifications' + self.hdf_dataset = "identifications" def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'alphapept' - ]['column_mapping'] + self.column_mapping = psm_reader_yaml["alphapept"]["column_mapping"] def _init_modification_mapping(self): - self.modification_mapping = psm_reader_yaml[ - 'alphapept' - ]['modification_mapping'] + self.modification_mapping = psm_reader_yaml["alphapept"]["modification_mapping"] def _load_file(self, filename): - with h5py.File(filename, 'r') as _hdf: + with h5py.File(filename, "r") as _hdf: dataset = _hdf[self.hdf_dataset] - df = pd.DataFrame({col:dataset[col] for col in dataset.keys()}) - df['raw_name'] = os.path.basename(filename)[:-len('.ms_data.hdf')] - df['precursor'] = df['precursor'].str.decode('utf-8') - #df['naked_sequence'] = df['naked_sequence'].str.decode('utf-8') - if 'scan_no' in df.columns: - df['scan_no'] = df['scan_no'].astype('int') - df['raw_idx'] = df['scan_no']-1 # if thermo, use scan-1 as spec_idx - df['charge'] = df['charge'].astype(int) + df = pd.DataFrame({col: dataset[col] for col in dataset.keys()}) + df["raw_name"] = os.path.basename(filename)[: -len(".ms_data.hdf")] + df["precursor"] = df["precursor"].str.decode("utf-8") + # df['naked_sequence'] = df['naked_sequence'].str.decode('utf-8') + if "scan_no" in df.columns: + df["scan_no"] = df["scan_no"].astype("int") + df["raw_idx"] = df["scan_no"] - 1 # if thermo, use scan-1 as spec_idx + df["charge"] = df["charge"].astype(int) return df - + def _load_modifications(self, df: pd.DataFrame): - if len(df) == 0: - self._psm_df['sequence'] = '' - self._psm_df['mods'] = '' - self._psm_df['mod_sites'] = '' - self._psm_df['decoy'] = 0 + if len(df) == 0: + self._psm_df["sequence"] = "" + self._psm_df["mods"] = "" + self._psm_df["mod_sites"] = "" + self._psm_df["decoy"] = 0 return - + ( - self._psm_df['sequence'], self._psm_df['mods'], - self._psm_df['mod_sites'], _charges, - self._psm_df['decoy'] - ) = zip(*df['precursor'].apply(parse_ap)) + self._psm_df["sequence"], + self._psm_df["mods"], + self._psm_df["mod_sites"], + _charges, + self._psm_df["decoy"], + ) = zip(*df["precursor"].apply(parse_ap)) self._psm_df.decoy = self._psm_df.decoy.astype(np.int8) - -psm_reader_provider.register_reader('alphapept', AlphaPeptReader) + + +def register_readers(): + psm_reader_provider.register_reader("alphapept", AlphaPeptReader) diff --git a/alphabase/psm_reader/dia_psm_reader.py b/alphabase/psm_reader/dia_psm_reader.py index f324188e..0f651b2d 100644 --- a/alphabase/psm_reader/dia_psm_reader.py +++ b/alphabase/psm_reader/dia_psm_reader.py @@ -1,18 +1,15 @@ import pandas as pd import numpy as np -from alphabase.psm_reader.psm_reader import ( - psm_reader_provider, psm_reader_yaml -) +from alphabase.psm_reader.psm_reader import psm_reader_provider, psm_reader_yaml + +from alphabase.psm_reader.maxquant_reader import MaxQuantReader -from alphabase.psm_reader.maxquant_reader import ( - MaxQuantReader -) class SpectronautReader(MaxQuantReader): """Reader for Spectronaut's output library TSV/CSV. - Other parameters, please see `MaxQuantReader` + Other parameters, please see `MaxQuantReader` in `alphabase.psm_reader.maxquant_reader` Parameters @@ -20,142 +17,124 @@ class SpectronautReader(MaxQuantReader): csv_sep : str, optional Delimiter for TSV/CSV, by default '\t' """ - def __init__(self, + + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, - fixed_C57 = False, - mod_seq_columns=psm_reader_yaml[ - 'spectronaut' - ]['mod_seq_columns'], - rt_unit = 'minute', + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + fixed_C57=False, + mod_seq_columns=psm_reader_yaml["spectronaut"]["mod_seq_columns"], + rt_unit="minute", **kwargs, ): super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr=fdr, keep_decoy=keep_decoy, - mod_seq_columns = mod_seq_columns, + fdr=fdr, + keep_decoy=keep_decoy, + mod_seq_columns=mod_seq_columns, fixed_C57=fixed_C57, rt_unit=rt_unit, **kwargs, ) - self.mod_seq_column = 'ModifiedPeptide' + self.mod_seq_column = "ModifiedPeptide" self._min_max_rt_norm = True def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'spectronaut' - ]['column_mapping'] - + self.column_mapping = psm_reader_yaml["spectronaut"]["column_mapping"] + def _load_file(self, filename): self.csv_sep = self._get_table_delimiter(filename) - df = pd.read_csv(filename, sep=self.csv_sep,keep_default_na=False) + df = pd.read_csv(filename, sep=self.csv_sep, keep_default_na=False) self._find_mod_seq_column(df) - if 'ReferenceRun' in df.columns: - df.drop_duplicates([ - 'ReferenceRun',self.mod_seq_column, 'PrecursorCharge' - ], inplace=True) + if "ReferenceRun" in df.columns: + df.drop_duplicates( + ["ReferenceRun", self.mod_seq_column, "PrecursorCharge"], inplace=True + ) else: - df.drop_duplicates([ - self.mod_seq_column, 'PrecursorCharge' - ], inplace=True) + df.drop_duplicates([self.mod_seq_column, "PrecursorCharge"], inplace=True) df.reset_index(drop=True, inplace=True) - + return df + class SwathReader(SpectronautReader): - def __init__(self, + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, - fixed_C57 = False, - mod_seq_columns=psm_reader_yaml[ - 'spectronaut' - ]['mod_seq_columns'], + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + fixed_C57=False, + mod_seq_columns=psm_reader_yaml["spectronaut"]["mod_seq_columns"], **kwargs, ): - """ + """ SWATH or OpenSWATH library, similar to `SpectronautReader` """ super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr=fdr, keep_decoy=keep_decoy, + fdr=fdr, + keep_decoy=keep_decoy, fixed_C57=fixed_C57, mod_seq_columns=mod_seq_columns, **kwargs, ) + class DiannReader(SpectronautReader): - def __init__(self, + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, - fixed_C57 = False, - rt_unit = 'minute', + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + fixed_C57=False, + rt_unit="minute", **kwargs, ): """ - Also similar to `MaxQuantReader`, + Also similar to `MaxQuantReader`, but different in column_mapping and modificatin_mapping """ super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr=fdr, keep_decoy=keep_decoy, + fdr=fdr, + keep_decoy=keep_decoy, fixed_C57=fixed_C57, rt_unit=rt_unit, **kwargs, ) - self.mod_seq_column = 'Modified.Sequence' + self.mod_seq_column = "Modified.Sequence" self._min_max_rt_norm = False def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'diann' - ]['column_mapping'] - + self.column_mapping = psm_reader_yaml["diann"]["column_mapping"] + def _load_file(self, filename): self.csv_sep = self._get_table_delimiter(filename) - df = pd.read_csv(filename, sep=self.csv_sep,keep_default_na=False) + df = pd.read_csv(filename, sep=self.csv_sep, keep_default_na=False) return df - + def _post_process(self, origin_df: pd.DataFrame): super()._post_process(origin_df) - self._psm_df.rename( - columns={"spec_idx":"diann_spec_idx"}, inplace=True - ) + self._psm_df.rename(columns={"spec_idx": "diann_spec_idx"}, inplace=True) -psm_reader_provider.register_reader( - 'spectronaut', SpectronautReader -) -psm_reader_provider.register_reader( - "speclib_tsv", SpectronautReader -) -psm_reader_provider.register_reader( - 'openswath', SwathReader -) -psm_reader_provider.register_reader( - 'swath', SwathReader -) -psm_reader_provider.register_reader( - 'diann', DiannReader -) class SpectronautReportReader(MaxQuantReader): """Reader for Spectronaut's report TSV/CSV. - Other parameters, please see `MaxQuantReader` + Other parameters, please see `MaxQuantReader` in `alphabase.psm_reader.maxquant_reader` Parameters @@ -163,46 +142,50 @@ class SpectronautReportReader(MaxQuantReader): csv_sep : str, optional Delimiter for TSV/CSV, by default ',' """ - def __init__(self, + + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, - fixed_C57 = False, - rt_unit = 'minute', + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + fixed_C57=False, + rt_unit="minute", **kwargs, ): super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr=fdr, keep_decoy=keep_decoy, + fdr=fdr, + keep_decoy=keep_decoy, fixed_C57=fixed_C57, rt_unit=rt_unit, **kwargs, ) - self.precursor_column = 'EG.PrecursorId' + self.precursor_column = "EG.PrecursorId" self._min_max_rt_norm = False def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'spectronaut_report' - ]['column_mapping'] - + self.column_mapping = psm_reader_yaml["spectronaut_report"]["column_mapping"] + def _load_file(self, filename): - self.mod_seq_column = 'ModifiedSequence' + self.mod_seq_column = "ModifiedSequence" self.csv_sep = self._get_table_delimiter(filename) - df = pd.read_csv(filename, sep=self.csv_sep,keep_default_na=False) - df[[self.mod_seq_column,'charge']] = df[ - self.precursor_column - ].str.split('.', expand=True, n=2) - df['charge'] = df.charge.astype(np.int8) + df = pd.read_csv(filename, sep=self.csv_sep, keep_default_na=False) + df[[self.mod_seq_column, "charge"]] = df[self.precursor_column].str.split( + ".", expand=True, n=2 + ) + df["charge"] = df.charge.astype(np.int8) return df -psm_reader_provider.register_reader( - 'spectronaut_report', SpectronautReportReader -) - +def register_readers(): + psm_reader_provider.register_reader("spectronaut", SpectronautReader) + psm_reader_provider.register_reader("speclib_tsv", SpectronautReader) + psm_reader_provider.register_reader("openswath", SwathReader) + psm_reader_provider.register_reader("swath", SwathReader) + psm_reader_provider.register_reader("diann", DiannReader) + psm_reader_provider.register_reader("spectronaut_report", SpectronautReportReader) diff --git a/alphabase/psm_reader/maxquant_reader.py b/alphabase/psm_reader/maxquant_reader.py index e9df83cb..49e8202a 100644 --- a/alphabase/psm_reader/maxquant_reader.py +++ b/alphabase/psm_reader/maxquant_reader.py @@ -4,48 +4,51 @@ import copy from alphabase.psm_reader.psm_reader import ( - PSMReaderBase, psm_reader_provider, - psm_reader_yaml + PSMReaderBase, + psm_reader_provider, + psm_reader_yaml, ) from alphabase.constants.modification import MOD_DF mod_to_unimod_dict = {} -for mod_name,unimod_id in MOD_DF[['mod_name','unimod_id']].values: +for mod_name, unimod_id in MOD_DF[["mod_name", "unimod_id"]].values: unimod_id = int(unimod_id) - if unimod_id==-1 or unimod_id=='-1': continue - if mod_name[-2]=='@': + if unimod_id == -1 or unimod_id == "-1": + continue + if mod_name[-2] == "@": mod_to_unimod_dict[mod_name] = f"{mod_name[-1]}(UniMod:{unimod_id})" else: mod_to_unimod_dict[mod_name] = f"_(UniMod:{unimod_id})" + @numba.njit def replace_parentheses_with_brackets( - modseq:str, + modseq: str, ): mod_depth = 0 - for i,aa in enumerate(modseq): - if aa == '(': + for i, aa in enumerate(modseq): + if aa == "(": if mod_depth <= 0: - modseq = modseq[:i] + '[' + modseq[i+1:] + modseq = modseq[:i] + "[" + modseq[i + 1 :] mod_depth += 1 - elif aa == '[': + elif aa == "[": mod_depth += 1 - elif aa == ')': + elif aa == ")": mod_depth -= 1 if mod_depth <= 0: - modseq = modseq[:i] + ']' + modseq[i+1:] - elif aa == ']': + modseq = modseq[:i] + "]" + modseq[i + 1 :] + elif aa == "]": mod_depth -= 1 return modseq - + @numba.njit def parse_mod_seq( - modseq:str, - mod_sep:str='()', - fixed_C57:bool=True, -)->tuple: + modseq: str, + mod_sep: str = "()", + fixed_C57: bool = True, +) -> tuple: """Extract modifications and sites from the modified sequence (modseq) Parameters @@ -54,11 +57,11 @@ def parse_mod_seq( modified sequence to extract modifications. mod_sep : str, optional - separator to indicate the modification section. + separator to indicate the modification section. Defaults to '()' fixed_C : bool - If Carbamidomethyl@C is a fixed modification + If Carbamidomethyl@C is a fixed modification and not displayed in the sequence. Defaults to True for MaxQuant. Returns @@ -67,12 +70,12 @@ def parse_mod_seq( str: naked peptide sequence str: modification names, separated by ';' - - str: modification sites, separated by ';'. + + str: modification sites, separated by ';'. 0 for N-term; -1 for C-term; 1 to N for normal modifications. """ PeptideModSeq = modseq - if modseq[0] == '_': + if modseq[0] == "_": underscore_for_ncterm = True else: underscore_for_ncterm = False @@ -80,48 +83,60 @@ def parse_mod_seq( site_list = [] site = PeptideModSeq.find(mod_sep[0]) while site != -1: - site_end = PeptideModSeq.find(mod_sep[1],site+1)+1 - if site_end < len(PeptideModSeq) and PeptideModSeq[site_end] == mod_sep[1]: + site_end = PeptideModSeq.find(mod_sep[1], site + 1) + 1 + if site_end < len(PeptideModSeq) and PeptideModSeq[site_end] == mod_sep[1]: site_end += 1 - if underscore_for_ncterm: site_list.append(site-1) - else: site_list.append(site) + if underscore_for_ncterm: + site_list.append(site - 1) + else: + site_list.append(site) start_mod = site - if start_mod > 0: start_mod -= 1 + if start_mod > 0: + start_mod -= 1 mod_list.append(PeptideModSeq[start_mod:site_end]) PeptideModSeq = PeptideModSeq[:site] + PeptideModSeq[site_end:] site = PeptideModSeq.find(mod_sep[0], site) # patch for phos. How many other modification formats does MQ have? - site = PeptideModSeq.find('p') + site = PeptideModSeq.find("p") while site != -1: - mod_list.append(PeptideModSeq[site:site+2]) - site_list = [i-1 if i > site else i for i in site_list] - if underscore_for_ncterm: site_list.append(site) - else: site_list.append(site+1) - PeptideModSeq = PeptideModSeq[:site] + PeptideModSeq[site+1:] - site = PeptideModSeq.find('p', site) - + mod_list.append(PeptideModSeq[site : site + 2]) + site_list = [i - 1 if i > site else i for i in site_list] + if underscore_for_ncterm: + site_list.append(site) + else: + site_list.append(site + 1) + PeptideModSeq = PeptideModSeq[:site] + PeptideModSeq[site + 1 :] + site = PeptideModSeq.find("p", site) + if fixed_C57: - site = PeptideModSeq.find('C') + site = PeptideModSeq.find("C") while site != -1: - if underscore_for_ncterm: site_list.append(site) - else: site_list.append(site+1) - mod_list.append('C'+"Carbamidomethyl (C)".join(mod_sep)) - site = PeptideModSeq.find('C',site+1) - sequence = PeptideModSeq.strip('_') + if underscore_for_ncterm: + site_list.append(site) + else: + site_list.append(site + 1) + mod_list.append("C" + "Carbamidomethyl (C)".join(mod_sep)) + site = PeptideModSeq.find("C", site + 1) + sequence = PeptideModSeq.strip("_") nAA = len(sequence) - return sequence, ';'.join(mod_list), ';'.join([str(i) if i <= nAA else '-1' for i in site_list]) + return ( + sequence, + ";".join(mod_list), + ";".join([str(i) if i <= nAA else "-1" for i in site_list]), + ) class MaxQuantReader(PSMReaderBase): - def __init__(self, + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, - fixed_C57 = True, - mod_seq_columns = ['Modified sequence'], + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + fixed_C57=True, + mod_seq_columns=["Modified sequence"], **kwargs, ): """Reader for MaxQuant msms.txt and evidence.txt @@ -129,13 +144,13 @@ def __init__(self, Parameters ---------- column_mapping : dict, optional - By default None. If None, use - `psm_reader_yaml['maxquant']['column_mapping']` + By default None. If None, use + `psm_reader_yaml['maxquant']['column_mapping']` (alphabase.psm_reader.psm_reader_yaml). modification_mapping : dict, optional - By default None. If None, use - `psm_reader_yaml['maxquant']['modification_mapping']` + By default None. If None, use + `psm_reader_yaml['maxquant']['modification_mapping']` (alphabase.psm_reader.psm_reader_yaml). fdr : float, optional @@ -146,38 +161,36 @@ def __init__(self, fixed_C57 : bool, optional If true, the search engine will not show `Carbamidomethyl` - in the modified sequences. + in the modified sequences. by default True mod_seq_columns : list, optional - The columns to find modified sequences, + The columns to find modified sequences, by default ['Modified sequence'] """ super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr = fdr, - keep_decoy = keep_decoy, + fdr=fdr, + keep_decoy=keep_decoy, **kwargs, ) self.fixed_C57 = fixed_C57 self._mod_seq_columns = mod_seq_columns - self.mod_seq_column = 'Modified sequence' + self.mod_seq_column = "Modified sequence" def _find_mod_seq_column(self, df): for mod_seq_col in self._mod_seq_columns: if mod_seq_col in df.columns: self.mod_seq_column = mod_seq_col break - + def _init_modification_mapping(self): self.modification_mapping = copy.deepcopy( # otherwise maxquant reader will modify the dict inplace - psm_reader_yaml['maxquant'][ - 'modification_mapping' - ] - ) + psm_reader_yaml["maxquant"]["modification_mapping"] + ) def set_modification_mapping(self, modification_mapping: dict): super().set_modification_mapping(modification_mapping) @@ -193,81 +206,71 @@ def _add_all_unimod(self): self.modification_mapping[mod_name] = [unimod] def _extend_mod_brackets(self): - """update modification_mapping to include different bracket types. - - """ + """update modification_mapping to include different bracket types.""" for key, mod_list in list(self.modification_mapping.items()): - mod_set = set(mod_list) # extend bracket types of modifications # K(Acetyl) -> K[Acetyl] # (Phospho) -> _(Phospho) # _[Phospho] -> _(Phospho) for mod in mod_list: - - if mod[1] == '(': - mod_set.add(f'{mod[0]}[{mod[2:-1]}]') - elif mod[1] == '[': - mod_set.add(f'{mod[0]}({mod[2:-1]})') - - if mod.startswith('_'): - mod_set.add(f'{mod[1:]}') - elif mod.startswith('('): - mod_set.add(f'_{mod}') - mod_set.add(f'[{mod[1:-1]}]') - mod_set.add(f'_[{mod[1:-1]}]') - elif mod.startswith('['): - mod_set.add(f'_{mod}') - mod_set.add(f'({mod[1:-1]})') - mod_set.add(f'_({mod[1:-1]})') + if mod[1] == "(": + mod_set.add(f"{mod[0]}[{mod[2:-1]}]") + elif mod[1] == "[": + mod_set.add(f"{mod[0]}({mod[2:-1]})") + + if mod.startswith("_"): + mod_set.add(f"{mod[1:]}") + elif mod.startswith("("): + mod_set.add(f"_{mod}") + mod_set.add(f"[{mod[1:-1]}]") + mod_set.add(f"_[{mod[1:-1]}]") + elif mod.startswith("["): + mod_set.add(f"_{mod}") + mod_set.add(f"({mod[1:-1]})") + mod_set.add(f"_({mod[1:-1]})") self.modification_mapping[key] = list(mod_set) - def _translate_decoy(self, origin_df=None): - if 'decoy' in self._psm_df.columns: - self._psm_df.decoy = ( - self._psm_df.decoy == '-' - ).astype(np.int8) + if "decoy" in self._psm_df.columns: + self._psm_df.decoy = (self._psm_df.decoy == "-").astype(np.int8) def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'maxquant' - ]['column_mapping'] + self.column_mapping = psm_reader_yaml["maxquant"]["column_mapping"] def _load_file(self, filename): csv_sep = self._get_table_delimiter(filename) - df = pd.read_csv(filename, sep=csv_sep,keep_default_na=False) + df = pd.read_csv(filename, sep=csv_sep, keep_default_na=False) self._find_mod_seq_column(df) - df = df[~pd.isna(df['Retention time'])] - df.fillna('', inplace=True) + df = df[~pd.isna(df["Retention time"])] + df.fillna("", inplace=True) # if 'K0' in df.columns: # df['Mobility'] = df['K0'] # Bug in MaxQuant? It should be 1/K0 # min_rt = df['Retention time'].min() return df def _load_modifications(self, origin_df: pd.DataFrame): - if origin_df[self.mod_seq_column].str.contains('[', regex=False).any(): - if origin_df[self.mod_seq_column].str.contains('(', regex=False).any(): + if origin_df[self.mod_seq_column].str.contains("[", regex=False).any(): + if origin_df[self.mod_seq_column].str.contains("(", regex=False).any(): origin_df[self.mod_seq_column] = origin_df[self.mod_seq_column].apply( replace_parentheses_with_brackets ) mod_sep = "[]" else: mod_sep = "()" - - ( - seqs, - self._psm_df['mods'], - self._psm_df['mod_sites'] - ) = zip( + + (seqs, self._psm_df["mods"], self._psm_df["mod_sites"]) = zip( *origin_df[self.mod_seq_column].apply( - parse_mod_seq, mod_sep=mod_sep, + parse_mod_seq, + mod_sep=mod_sep, fixed_C57=self.fixed_C57, ) ) - if 'sequence' not in self._psm_df.columns: - self._psm_df['sequence'] = seqs + if "sequence" not in self._psm_df.columns: + self._psm_df["sequence"] = seqs + -psm_reader_provider.register_reader('maxquant', MaxQuantReader) +def register_readers(): + psm_reader_provider.register_reader("maxquant", MaxQuantReader) diff --git a/alphabase/psm_reader/msfragger_reader.py b/alphabase/psm_reader/msfragger_reader.py index cbc4fbcd..fde27480 100644 --- a/alphabase/psm_reader/msfragger_reader.py +++ b/alphabase/psm_reader/msfragger_reader.py @@ -2,26 +2,27 @@ import pandas as pd from alphabase.psm_reader.psm_reader import ( - PSMReaderBase, psm_reader_yaml, - psm_reader_provider + PSMReaderBase, + psm_reader_yaml, + psm_reader_provider, ) from alphabase.constants.aa import AA_ASCII_MASS -from alphabase.constants.atom import MASS_H, MASS_O, MASS_PROTON +from alphabase.constants.atom import MASS_H, MASS_O from alphabase.constants.modification import MOD_MASS -try: - import pyteomics.pepxml as pepxml -except: - pepxml = None +import pyteomics.pepxml as pepxml + def _is_fragger_decoy(proteins): for prot in proteins: - if not prot.lower().startswith('rev_'): + if not prot.lower().startswith("rev_"): return False return True -mass_mapped_mods = psm_reader_yaml['msfragger_pepxml']['mass_mapped_mods'] -mod_mass_tol = psm_reader_yaml['msfragger_pepxml']['mod_mass_tol'] + +mass_mapped_mods = psm_reader_yaml["msfragger_pepxml"]["mass_mapped_mods"] +mod_mass_tol = psm_reader_yaml["msfragger_pepxml"]["mod_mass_tol"] + def _get_mods_from_masses(sequence, msf_aa_mods): mods = [] @@ -29,155 +30,159 @@ def _get_mods_from_masses(sequence, msf_aa_mods): aa_mass_diffs = [] aa_mass_diff_sites = [] for mod in msf_aa_mods: - _mass_str, site_str = mod.split('@') + _mass_str, site_str = mod.split("@") mod_mass = float(_mass_str) site = int(site_str) cterm_position = len(sequence) + 1 if site > 0: if site < cterm_position: - mod_mass = mod_mass - AA_ASCII_MASS[ord(sequence[site-1])] + mod_mass = mod_mass - AA_ASCII_MASS[ord(sequence[site - 1])] else: - mod_mass -= (2* MASS_H + MASS_O) + mod_mass -= 2 * MASS_H + MASS_O else: mod_mass -= MASS_H mod_translated = False for mod_name in mass_mapped_mods: - if abs(mod_mass-MOD_MASS[mod_name]) 0) - - def _translate_score(self, origin_df=None): - # evalue score - self._psm_df['score'] = -np.log( - self._psm_df['score']+1e-100 + +class MSFraggerPepXML(PSMReaderBase): + def __init__( + self, + *, + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.001, # refers to E-value in the PepXML + keep_decoy=False, + rt_unit="second", + keep_unknown_aa_mass_diffs=False, + **kwargs, + ): + """MSFragger is not fully supported as we can only access the pepxml file.""" + super().__init__( + column_mapping=column_mapping, + modification_mapping=modification_mapping, + fdr=fdr, + keep_decoy=keep_decoy, + rt_unit=rt_unit, + **kwargs, + ) + self.keep_unknown_aa_mass_diffs = keep_unknown_aa_mass_diffs + + def _init_column_mapping(self): + self.column_mapping = psm_reader_yaml["msfragger_pepxml"]["column_mapping"] + + def _init_modification_mapping(self): + self.modification_mapping = {} + + def _translate_modifications(self): + pass + + def _load_file(self, filename): + msf_df = pepxml.DataFrame(filename) + msf_df.fillna("", inplace=True) + if "ion_mobility" in msf_df.columns: + msf_df["ion_mobility"] = msf_df.ion_mobility.astype(float) + msf_df["raw_name"] = msf_df["spectrum"].str.split(".").apply(lambda x: x[0]) + msf_df["to_remove"] = 0 + self.column_mapping["to_remove"] = "to_remove" + return msf_df + + def _translate_decoy(self, origin_df=None): + self._psm_df["decoy"] = self._psm_df.proteins.apply(_is_fragger_decoy).astype( + np.int8 + ) + + self._psm_df.proteins = self._psm_df.proteins.apply(lambda x: ";".join(x)) + if not self.keep_decoy: + self._psm_df["to_remove"] += self._psm_df.decoy > 0 + + def _translate_score(self, origin_df=None): + # evalue score + self._psm_df["score"] = -np.log(self._psm_df["score"] + 1e-100) + + def _load_modifications(self, msf_df): + if len(msf_df) == 0: + self._psm_df["mods"] = "" + self._psm_df["mod_sites"] = "" + self._psm_df["aa_mass_diffs"] = "" + self._psm_df["aa_mass_diff_sites"] = "" + return + + ( + self._psm_df["mods"], + self._psm_df["mod_sites"], + self._psm_df["aa_mass_diffs"], + self._psm_df["aa_mass_diff_sites"], + ) = zip( + *msf_df[["peptide", "modifications"]].apply( + lambda x: _get_mods_from_masses(*x), axis=1 ) + ) - def _load_modifications(self, msf_df): - if len(msf_df) == 0: - self._psm_df['mods'] = '' - self._psm_df['mod_sites'] = '' - self._psm_df['aa_mass_diffs'] = '' - self._psm_df['aa_mass_diff_sites'] = '' - return - - ( - self._psm_df['mods'], self._psm_df['mod_sites'], - self._psm_df['aa_mass_diffs'], self._psm_df['aa_mass_diff_sites'], - ) = zip(*msf_df[['peptide','modifications']].apply( - lambda x: _get_mods_from_masses(*x), axis=1) + if not self.keep_unknown_aa_mass_diffs: + self._psm_df["to_remove"] += self._psm_df.aa_mass_diffs != "" + self._psm_df.drop( + columns=["aa_mass_diffs", "aa_mass_diff_sites"], inplace=True ) - - if not self.keep_unknown_aa_mass_diffs: - self._psm_df['to_remove'] += (self._psm_df.aa_mass_diffs != '') - self._psm_df.drop( - columns=['aa_mass_diffs','aa_mass_diff_sites'], - inplace=True - ) - - def _post_process(self, origin_df: pd.DataFrame): - super()._post_process(origin_df) - self._psm_df = self._psm_df.query( - 'to_remove==0' - ).drop(columns='to_remove').reset_index(drop=True) - - psm_reader_provider.register_reader('msfragger_pepxml', MSFraggerPepXML) + def _post_process(self, origin_df: pd.DataFrame): + super()._post_process(origin_df) + self._psm_df = ( + self._psm_df.query("to_remove==0") + .drop(columns="to_remove") + .reset_index(drop=True) + ) + + +def register_readers(): + psm_reader_provider.register_reader("msfragger_psm_tsv", MSFragger_PSM_TSV_Reader) + psm_reader_provider.register_reader("msfragger", MSFragger_PSM_TSV_Reader) + psm_reader_provider.register_reader("msfragger_pepxml", MSFraggerPepXML) diff --git a/alphabase/psm_reader/pfind_reader.py b/alphabase/psm_reader/pfind_reader.py index f424992f..6253d5fc 100644 --- a/alphabase/psm_reader/pfind_reader.py +++ b/alphabase/psm_reader/pfind_reader.py @@ -4,104 +4,109 @@ import alphabase.constants.modification as ap_mod from alphabase.psm_reader.psm_reader import ( - PSMReaderBase, psm_reader_provider, - psm_reader_yaml + PSMReaderBase, + psm_reader_provider, + psm_reader_yaml, ) + def convert_one_pFind_mod(mod): - if mod[-1] == ')': - mod = mod[:(mod.find('(')-1)] - idx = mod.rfind('[') + if mod[-1] == ")": + mod = mod[: (mod.find("(") - 1)] + idx = mod.rfind("[") name = mod[:idx] - site = mod[(idx+1):] + site = mod[(idx + 1) :] else: - idx = mod.rfind('[') + idx = mod.rfind("[") name = mod[:idx] - site = mod[(idx+1):-1] + site = mod[(idx + 1) : -1] if len(site) == 1: - return name + '@' + site - elif site == 'AnyN-term': - return name + '@' + 'Any N-term' - elif site == 'ProteinN-term': - return name + '@' + 'Protein N-term' - elif site.startswith('AnyN-term'): - return name + '@' + site[-1] + '^Any N-term' - elif site.startswith('ProteinN-term'): - return name + '@' + site[-1] + '^Protein N-term' - elif site == 'AnyC-term': - return name + '@' + 'Any C-term' - elif site == 'ProteinC-term': - return name + '@' + 'Protein C-term' - elif site.startswith('AnyC-term'): - return name + '@' + site[-1] + '^Any C-term' - elif site.startswith('ProteinC-term'): - return name + '@' + site[-1] + '^Protein C-term' + return name + "@" + site + elif site == "AnyN-term": + return name + "@" + "Any N-term" + elif site == "ProteinN-term": + return name + "@" + "Protein N-term" + elif site.startswith("AnyN-term"): + return name + "@" + site[-1] + "^Any N-term" + elif site.startswith("ProteinN-term"): + return name + "@" + site[-1] + "^Protein N-term" + elif site == "AnyC-term": + return name + "@" + "Any C-term" + elif site == "ProteinC-term": + return name + "@" + "Protein C-term" + elif site.startswith("AnyC-term"): + return name + "@" + site[-1] + "^Any C-term" + elif site.startswith("ProteinC-term"): + return name + "@" + site[-1] + "^Protein C-term" else: return None + def translate_pFind_mod(mod_str): - if not mod_str: return "" + if not mod_str: + return "" ret_mods = [] - for mod in mod_str.split(';'): + for mod in mod_str.split(";"): mod = convert_one_pFind_mod(mod) - if not mod: return pd.NA - elif mod not in ap_mod.MOD_INFO_DICT: return pd.NA - else: ret_mods.append(mod) - return ';'.join(ret_mods) + if not mod: + return pd.NA + elif mod not in ap_mod.MOD_INFO_DICT: + return pd.NA + else: + ret_mods.append(mod) + return ";".join(ret_mods) + def get_pFind_mods(pfind_mod_str): - pfind_mod_str = pfind_mod_str.strip(';') - if not pfind_mod_str: return "", "" + pfind_mod_str = pfind_mod_str.strip(";") + if not pfind_mod_str: + return "", "" + + items = [item.split(",", 3) for item in pfind_mod_str.split(";")] items = [ - item.split(',',3) - for item in pfind_mod_str.split(';') - ] - - items = [ - ('-1',mod) if (mod.endswith('C-term]') - or mod[:-2].endswith('C-term')) - #else ('0', mod) if mod.endswith('N-term]') - else (site, mod) for site, mod in items + ("-1", mod) + if (mod.endswith("C-term]") or mod[:-2].endswith("C-term")) + # else ('0', mod) if mod.endswith('N-term]') + else (site, mod) + for site, mod in items ] items = list(zip(*items)) - return ';'.join(items[1]), ';'.join(items[0]) + return ";".join(items[1]), ";".join(items[0]) + def parse_pfind_protein(protein, keep_reverse=True): - proteins = protein.strip('/').split('/') - return ';'.join( + proteins = protein.strip("/").split("/") + return ";".join( [ - protein for protein in proteins - if ( - not protein.startswith('REV_') - or keep_reverse - ) + protein + for protein in proteins + if (not protein.startswith("REV_") or keep_reverse) ] ) class pFindReader(PSMReaderBase): - def __init__(self, + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, **kwargs, ): super().__init__( column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr = fdr, - keep_decoy = keep_decoy, + fdr=fdr, + keep_decoy=keep_decoy, **kwargs, ) def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'pfind' - ]['column_mapping'] - + self.column_mapping = psm_reader_yaml["pfind"]["column_mapping"] + def _init_modification_mapping(self): self.modification_mapping = {} @@ -109,40 +114,36 @@ def _translate_modifications(self): pass def _load_file(self, filename): - pfind_df = pd.read_csv(filename, index_col=False, sep='\t',keep_default_na=False) - pfind_df.fillna('', inplace=True) - pfind_df = pfind_df[pfind_df.Sequence != ''] - pfind_df['raw_name'] = pfind_df[ - 'File_Name' - ].str.split('.').apply(lambda x: x[0]) - pfind_df['Proteins'] = pfind_df[ - 'Proteins' - ].apply(parse_pfind_protein) + pfind_df = pd.read_csv( + filename, index_col=False, sep="\t", keep_default_na=False + ) + pfind_df.fillna("", inplace=True) + pfind_df = pfind_df[pfind_df.Sequence != ""] + pfind_df["raw_name"] = ( + pfind_df["File_Name"].str.split(".").apply(lambda x: x[0]) + ) + pfind_df["Proteins"] = pfind_df["Proteins"].apply(parse_pfind_protein) return pfind_df def _translate_decoy(self, origin_df=None): - self._psm_df.decoy = ( - self._psm_df.decoy == 'decoy' - ).astype(np.int8) - + self._psm_df.decoy = (self._psm_df.decoy == "decoy").astype(np.int8) + def _translate_score(self, origin_df=None): - self._psm_df.score = -np.log( - self._psm_df.score.astype(float)+1e-100 - ) + self._psm_df.score = -np.log(self._psm_df.score.astype(float) + 1e-100) def _load_modifications(self, pfind_df): if len(pfind_df) == 0: - self._psm_df['mods'] = '' - self._psm_df['mod_sites'] = '' + self._psm_df["mods"] = "" + self._psm_df["mod_sites"] = "" return - - ( - self._psm_df['mods'], self._psm_df['mod_sites'] - ) = zip(*pfind_df['Modification'].apply(get_pFind_mods)) - self._psm_df['mods'] = self._psm_df['mods'].apply( - translate_pFind_mod + (self._psm_df["mods"], self._psm_df["mod_sites"]) = zip( + *pfind_df["Modification"].apply(get_pFind_mods) ) - -psm_reader_provider.register_reader('pfind', pFindReader) -psm_reader_provider.register_reader('pfind3', pFindReader) + + self._psm_df["mods"] = self._psm_df["mods"].apply(translate_pFind_mod) + + +def register_readers(): + psm_reader_provider.register_reader("pfind", pFindReader) + psm_reader_provider.register_reader("pfind3", pFindReader) diff --git a/alphabase/psm_reader/psm_reader.py b/alphabase/psm_reader/psm_reader.py index 5a7e4405..53ed84f4 100644 --- a/alphabase/psm_reader/psm_reader.py +++ b/alphabase/psm_reader/psm_reader.py @@ -1,49 +1,43 @@ import os import copy -import io import pandas as pd import numpy as np import warnings import alphabase.peptide.mobility as mobility -from alphabase.peptide.precursor import ( - update_precursor_mz, reset_precursor_df -) +from alphabase.peptide.precursor import update_precursor_mz, reset_precursor_df from alphabase.constants._const import CONST_FILE_FOLDER from alphabase.utils import get_delimiter from alphabase.yaml_utils import load_yaml - -def translate_other_modification( - mod_str: str, - mod_dict: dict -)->str: - ''' - Translate modifications of `mod_str` to the AlphaBase +def translate_other_modification(mod_str: str, mod_dict: dict) -> str: + """ + Translate modifications of `mod_str` to the AlphaBase format mapped by mod_dict. - + Parameters ---------- mod_str : str - mod list in str format, seperated by ';', + mod list in str format, seperated by ';', e.g. ModA;ModB mod_dict : dict - translate mod dict from others to AlphaBase, - e.g. for pFind, key=['Phospho[S]','Oxidation[M]'], + translate mod dict from others to AlphaBase, + e.g. for pFind, key=['Phospho[S]','Oxidation[M]'], value=['Phospho@S','Oxidation@M'] Returns ------- str new mods in AlphaBase format seperated by ';'. if any modification is not in `mod_dict`, return pd.NA. - ''' + """ - if mod_str == "" : return "", [] + if mod_str == "": + return "", [] ret_mods = [] unknown_mods = [] - for mod in mod_str.split(';'): + for mod in mod_str.split(";"): if mod in mod_dict: ret_mods.append(mod_dict[mod]) else: @@ -54,62 +48,59 @@ def translate_other_modification( else: return ";".join(ret_mods), [] -def keep_modifications( - mod_str: str, - mod_set: set -)->str: - ''' + +def keep_modifications(mod_str: str, mod_set: set) -> str: + """ Check if modifications of `mod_str` are in `mod_set`. Parameters ---------- mod_str : str - mod list in str format, seperated by ';', + mod list in str format, seperated by ';', e.g. Oxidation@M;Phospho@S. mod_set : set mod set to check Returns ------- str - original `mod_str` if all modifications are in mod_set + original `mod_str` if all modifications are in mod_set else pd.NA. - ''' - if not mod_str: return "" - for mod in mod_str.split(';'): - if not mod in mod_set: + """ + if not mod_str: + return "" + for mod in mod_str.split(";"): + if mod not in mod_set: return pd.NA return mod_str + #: See `psm_reader.yaml `_ -psm_reader_yaml = load_yaml( - os.path.join( - CONST_FILE_FOLDER, - 'psm_reader.yaml' - ) -) +psm_reader_yaml = load_yaml(os.path.join(CONST_FILE_FOLDER, "psm_reader.yaml")) + class PSMReaderBase(object): - def __init__(self, + def __init__( + self, *, - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - keep_decoy = False, - rt_unit:str = 'minute', + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + rt_unit: str = "minute", **kwargs, ): - """The Base class for all PSMReaders. The key of the sub-classes for different + """The Base class for all PSMReaders. The key of the sub-classes for different search engine format is to re-define `column_mapping` and `modification_mapping`. - + Parameters ---------- column_mapping : dict, optional A dict that maps alphabase's columns to other search engine's. - The key of the column_mapping is alphabase's column name, and + The key of the column_mapping is alphabase's column name, and the value could be the column name or a list of column names in other engine's result. - If it is None, this dict will be init by - `self._init_column_mapping`. The dict values could be + If it is None, this dict will be init by + `self._init_column_mapping`. The dict values could be either str or list, for exaplme: ``` columns_mapping = { @@ -121,10 +112,10 @@ def __init__(self, Defaults to None. modification_mapping : dict, optional A dict that maps alphabase's modifications to other engine's. - If it is None, this dict will be init by - default modification mapping for each search engine - (see :data:`psm_reader_yaml`). - The dict values can be + If it is None, this dict will be init by + default modification mapping for each search engine + (see :data:`psm_reader_yaml`). + The dict values can be either str or list, for exaplme: ``` modification_mapping = { @@ -139,7 +130,7 @@ def __init__(self, keep_decoy : bool, optional If keep decoy PSMs in self.psm_df. Defautls to False. - + Attributes ---------- column_mapping : dict @@ -152,21 +143,19 @@ def __init__(self, psm_df : pd.DataFrame the getter of self._psm_df keep_fdr : float - The only PSMs with FDR<=keep_fdr were returned in self._psm_df. + The only PSMs with FDR<=keep_fdr were returned in self._psm_df. keep_decoy : bool If keep decoy PSMs in self.psm_df. _min_max_rt_norm : bool - if True, the 'rt_norm' values in self._psm_df + if True, the 'rt_norm' values in self._psm_df will be normalized by rt_norm = (self.psm_df.rt-rt_min)/(rt_max-rt_min). It is useful to normalize iRT values as they contain negative values. Defaults to False. """ self.set_modification_mapping(None) - self.add_modification_mapping( - modification_mapping - ) - + self.add_modification_mapping(modification_mapping) + if column_mapping is not None: self.column_mapping = column_mapping else: @@ -181,17 +170,17 @@ def __init__(self, self._max_irt_value = 200 @property - def psm_df(self)->pd.DataFrame: + def psm_df(self) -> pd.DataFrame: return self._psm_df - def add_modification_mapping(self, modification_mapping:dict): + def add_modification_mapping(self, modification_mapping: dict): """ Append additional modification mappings for the search engine. Parameters ---------- modification_mapping : dict - The key of dict is a modification name in AlphaBase format; + The key of dict is a modification name in AlphaBase format; the value could be a str or a list, see below ``` add_modification_mapping({ @@ -201,9 +190,9 @@ def add_modification_mapping(self, modification_mapping:dict): ``` """ if ( - modification_mapping is None or - len(modification_mapping) == 0 or - not isinstance(modification_mapping,dict) + modification_mapping is None + or len(modification_mapping) == 0 + or not isinstance(modification_mapping, dict) ): return @@ -221,71 +210,65 @@ def add_modification_mapping(self, modification_mapping:dict): self.set_modification_mapping(self.modification_mapping) - def set_modification_mapping(self, modification_mapping:dict): + def set_modification_mapping(self, modification_mapping: dict): if modification_mapping is None: self._init_modification_mapping() elif isinstance(modification_mapping, str): if modification_mapping in psm_reader_yaml: self.modification_mapping = copy.deepcopy( - psm_reader_yaml[ - modification_mapping - ]['modification_mapping'] + psm_reader_yaml[modification_mapping]["modification_mapping"] ) else: raise ValueError( - f'Unknown modification mapping: {modification_mapping}' + f"Unknown modification mapping: {modification_mapping}" ) else: - self.modification_mapping = copy.deepcopy( - modification_mapping - ) + self.modification_mapping = copy.deepcopy(modification_mapping) self._mods_as_lists() self._reverse_mod_mapping() def _init_modification_mapping(self): self.modification_mapping = {} - + def _mods_as_lists(self): - for mod,val in list(self.modification_mapping.items()): + for mod, val in list(self.modification_mapping.items()): if isinstance(val, str): self.modification_mapping[mod] = [val] - + def _reverse_mod_mapping(self): self.rev_mod_mapping = {} - for ( - this_mod, other_mod - ) in self.modification_mapping.items(): + for this_mod, other_mod in self.modification_mapping.items(): if isinstance(other_mod, (list, tuple)): for _mod in other_mod: if _mod in self.rev_mod_mapping: - if this_mod.endswith('Protein N-term'): + if this_mod.endswith("Protein N-term"): continue self.rev_mod_mapping[_mod] = this_mod else: self.rev_mod_mapping[other_mod] = this_mod - + def _init_column_mapping(self): raise NotImplementedError( f'"{self.__class__}" must implement "_init_column_mapping()"' ) - - def load(self, _file)->pd.DataFrame: - """ Wrapper for import_file() """ - if isinstance(_file, list): + + def load(self, _file) -> pd.DataFrame: + """Wrapper for import_file()""" + if isinstance(_file, list): return self.import_files(_file) - else: + else: return self.import_file(_file) - def import_files(self, file_list:list): + def import_files(self, file_list: list): df_list = [] for _file in file_list: df_list.append(self.import_file(_file)) self._psm_df = pd.concat(df_list, ignore_index=True) return self._psm_df - def import_file(self, _file:str)->pd.DataFrame: + def import_file(self, _file: str) -> pd.DataFrame: """ - This is the main entry function of PSM readers, + This is the main entry function of PSM readers, it imports the file with following steps: ``` origin_df = self._load_file(_file) @@ -296,7 +279,7 @@ def import_file(self, _file:str)->pd.DataFrame: self._translate_modifications() self._post_process(origin_df) ``` - + Parameters ---------- _file: str @@ -315,16 +298,10 @@ def import_file(self, _file:str)->pd.DataFrame: self._post_process(origin_df) return self._psm_df - def _translate_decoy( - self, - origin_df:pd.DataFrame=None - ): + def _translate_decoy(self, origin_df: pd.DataFrame = None): pass - def _translate_score( - self, - origin_df:pd.DataFrame=None - ): + def _translate_score(self, origin_df: pd.DataFrame = None): # some scores are evalue/pvalue, it should be translated # to -log(evalue), as score is the larger the better pass @@ -333,48 +310,48 @@ def _get_table_delimiter(self, _filename): return get_delimiter(_filename) def normalize_rt(self): - if 'rt' in self.psm_df.columns: - if self._engine_rt_unit == 'second': + if "rt" in self.psm_df.columns: + if self._engine_rt_unit == "second": # self.psm_df['rt_sec'] = self.psm_df.rt - self.psm_df['rt'] = self.psm_df.rt/60 + self.psm_df["rt"] = self.psm_df.rt / 60 if "rt_start" in self.psm_df.columns: - self.psm_df["rt_start"] = self.psm_df.rt_start/60 - self.psm_df["rt_stop"] = self.psm_df.rt_stop/60 + self.psm_df["rt_start"] = self.psm_df.rt_start / 60 + self.psm_df["rt_stop"] = self.psm_df.rt_stop / 60 # elif self._engine_rt_unit == 'minute': - # self.psm_df['rt_sec'] = self.psm_df.rt*60 + # self.psm_df['rt_sec'] = self.psm_df.rt*60 min_rt = self.psm_df.rt.min() max_rt = self.psm_df.rt.max() - if min_rt < 0: # iRT + if min_rt < 0: # iRT if min_rt < self._min_irt_value: min_rt = self._min_irt_value if max_rt > self._max_irt_value: max_rt = self._max_irt_value - elif not self._min_max_rt_norm : + elif not self._min_max_rt_norm: min_rt = 0 - - self.psm_df['rt_norm'] = (( - self.psm_df.rt - min_rt - ) / (max_rt-min_rt)).clip(0, 1) + + self.psm_df["rt_norm"] = ( + (self.psm_df.rt - min_rt) / (max_rt - min_rt) + ).clip(0, 1) def norm_rt(self): self.normalize_rt() def normalize_rt_by_raw_name(self): - if not 'rt' in self.psm_df.columns: + if "rt" not in self.psm_df.columns: return - if not 'rt_norm' in self.psm_df.columns: + if "rt_norm" not in self.psm_df.columns: self.norm_rt() - if not 'raw_name' in self.psm_df.columns: + if "raw_name" not in self.psm_df.columns: return - for raw_name, df_group in self.psm_df.groupby('raw_name'): - self.psm_df.loc[ - df_group.index,'rt_norm' - ] = df_group.rt_norm / df_group.rt_norm.max() + for raw_name, df_group in self.psm_df.groupby("raw_name"): + self.psm_df.loc[df_group.index, "rt_norm"] = ( + df_group.rt_norm / df_group.rt_norm.max() + ) - def _load_file(self, filename:str)->pd.DataFrame: + def _load_file(self, filename: str) -> pd.DataFrame: """ - Load original dataframe from PSM filename. + Load original dataframe from PSM filename. Different search engines may store PSMs in different ways: tsv, csv, HDF, XML, ... @@ -392,26 +369,24 @@ def _load_file(self, filename:str)->pd.DataFrame: pd.DataFrame loaded dataframe """ - raise NotImplementedError( - f'"{self.__class__}" must implement "_load_file()"' - ) + raise NotImplementedError(f'"{self.__class__}" must implement "_load_file()"') - def _find_mapped_columns(self, origin_df:pd.DataFrame): + def _find_mapped_columns(self, origin_df: pd.DataFrame): mapped_columns = {} for col, map_col in self.column_mapping.items(): if isinstance(map_col, str): if map_col in origin_df.columns: mapped_columns[col] = map_col - elif isinstance(map_col, (list,tuple)): + elif isinstance(map_col, (list, tuple)): for other_col in map_col: if other_col in origin_df.columns: mapped_columns[col] = other_col break return mapped_columns - def _translate_columns(self, origin_df:pd.DataFrame): + def _translate_columns(self, origin_df: pd.DataFrame): """ - Translate the dataframe from other search engines + Translate the dataframe from other search engines to AlphaBase format Parameters @@ -428,14 +403,14 @@ def _translate_columns(self, origin_df:pd.DataFrame): self._psm_df = pd.DataFrame() for col, map_col in mapped_columns.items(): self._psm_df[col] = origin_df[map_col] - + if ( - 'scan_num' in self._psm_df.columns and - not 'spec_idx' in self._psm_df.columns + "scan_num" in self._psm_df.columns + and "spec_idx" not in self._psm_df.columns ): - self._psm_df['spec_idx'] = self._psm_df.scan_num - 1 - - def _transform_table(self, origin_df:pd.DataFrame): + self._psm_df["spec_idx"] = self._psm_df.scan_num - 1 + + def _transform_table(self, origin_df: pd.DataFrame): """ Transform the dataframe format if needed. Usually only needed in combination with spectral libraries. @@ -452,8 +427,8 @@ def _transform_table(self, origin_df:pd.DataFrame): """ pass - def _load_modifications(self, origin_df:pd.DataFrame): - """Read modification information from 'origin_df'. + def _load_modifications(self, origin_df: pd.DataFrame): + """Read modification information from 'origin_df'. Some of search engines use modified_sequence, some of them use additional columns to store modifications and the sites. @@ -467,20 +442,21 @@ def _load_modifications(self, origin_df:pd.DataFrame): ) def _translate_modifications(self): - ''' + """ Translate modifications to AlphaBase format. Raises ------ KeyError - if `mod` in `mod_names` is + if `mod` in `mod_names` is not in `self.modification_mapping` - ''' + """ - self._psm_df.mods, unknown_mods = zip(*self._psm_df.mods.apply( - translate_other_modification, - mod_dict=self.rev_mod_mapping - )) + self._psm_df.mods, unknown_mods = zip( + *self._psm_df.mods.apply( + translate_other_modification, mod_dict=self.rev_mod_mapping + ) + ) # accumulate unknown mods unknwon_mod_set = set() @@ -490,16 +466,13 @@ def _translate_modifications(self): if len(unknwon_mod_set) > 0: warnings.warn( - f'Unknown modifications: {unknwon_mod_set}. Precursors with unknown modifications will be removed.' + f"Unknown modifications: {unknwon_mod_set}. Precursors with unknown modifications will be removed." ) - - def _post_process(self, - origin_df:pd.DataFrame - ): + def _post_process(self, origin_df: pd.DataFrame): """ - Set 'nAA' columns, remove unknown modifications - and perform other post processings, + Set 'nAA' columns, remove unknown modifications + and perform other post processings, e.g. get 'rt_norm', remove decoys, filter FDR... Parameters @@ -507,67 +480,54 @@ def _post_process(self, origin_df : pd.DataFrame the loaded original df """ - self._psm_df['nAA'] = self._psm_df.sequence.str.len() + self._psm_df["nAA"] = self._psm_df.sequence.str.len() self.normalize_rt_by_raw_name() - self._psm_df = self._psm_df[ - ~self._psm_df['mods'].isna() - ] + self._psm_df = self._psm_df[~self._psm_df["mods"].isna()] - keep_rows = np.ones( - len(self._psm_df), dtype=bool - ) - if 'fdr' in self._psm_df.columns: - keep_rows &= (self._psm_df.fdr <= self.keep_fdr) - if ( - 'decoy' in self._psm_df.columns - and not self.keep_decoy - ): - keep_rows &= (self._psm_df.decoy == 0) + keep_rows = np.ones(len(self._psm_df), dtype=bool) + if "fdr" in self._psm_df.columns: + keep_rows &= self._psm_df.fdr <= self.keep_fdr + if "decoy" in self._psm_df.columns and not self.keep_decoy: + keep_rows &= self._psm_df.decoy == 0 self._psm_df = self._psm_df[keep_rows] - + reset_precursor_df(self._psm_df) - - if 'precursor_mz' not in self._psm_df: + + if "precursor_mz" not in self._psm_df: self._psm_df = update_precursor_mz(self._psm_df) - if ( - 'ccs' in self._psm_df.columns and - 'mobility' not in self._psm_df.columns - ): - self._psm_df['mobility'] = ( - mobility.ccs_to_mobility_for_df( - self._psm_df, - 'ccs' - ) + if "ccs" in self._psm_df.columns and "mobility" not in self._psm_df.columns: + self._psm_df["mobility"] = mobility.ccs_to_mobility_for_df( + self._psm_df, "ccs" ) - elif ( - 'mobility' in self._psm_df.columns and - 'ccs' not in self._psm_df.columns - ): - self._psm_df['ccs'] = ( - mobility.mobility_to_ccs_for_df( - self._psm_df, - 'mobility' - ) + elif "mobility" in self._psm_df.columns and "ccs" not in self._psm_df.columns: + self._psm_df["ccs"] = mobility.mobility_to_ccs_for_df( + self._psm_df, "mobility" ) - def filter_psm_by_modifications(self, include_mod_set = set([ - 'Oxidation@M','Phospho@S','Phospho@T', - 'Phospho@Y','Acetyl@Protein N-term' - ])): - ''' - Only keeps peptides with modifications in `include_mod_list`. - ''' + def filter_psm_by_modifications( + self, + include_mod_set=set( + [ + "Oxidation@M", + "Phospho@S", + "Phospho@T", + "Phospho@Y", + "Acetyl@Protein N-term", + ] + ), + ): + """ + Only keeps peptides with modifications in `include_mod_list`. + """ self._psm_df.mods = self._psm_df.mods.apply( keep_modifications, mod_set=include_mod_set ) - - self._psm_df.dropna( - subset=['mods'], inplace=True - ) + + self._psm_df.dropna(subset=["mods"], inplace=True) self._psm_df.reset_index(drop=True, inplace=True) @@ -578,26 +538,30 @@ def __init__(self): def register_reader(self, reader_type, reader_class): self.reader_dict[reader_type.lower()] = reader_class - def get_reader(self, - reader_type:str, + def get_reader( + self, + reader_type: str, *, - column_mapping:dict=None, - modification_mapping:dict=None, - fdr=0.01, keep_decoy=False, - **kwargs - )->PSMReaderBase: + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + keep_decoy=False, + **kwargs, + ) -> PSMReaderBase: return self.reader_dict[reader_type.lower()]( - column_mapping = column_mapping, + column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr=fdr, keep_decoy=keep_decoy, **kwargs + fdr=fdr, + keep_decoy=keep_decoy, + **kwargs, ) - def get_reader_by_yaml(self, - yaml_dict:dict, - )->PSMReaderBase: - return self.get_reader( - **copy.deepcopy(yaml_dict) - ) + def get_reader_by_yaml( + self, + yaml_dict: dict, + ) -> PSMReaderBase: + return self.get_reader(**copy.deepcopy(yaml_dict)) + psm_reader_provider = PSMReaderProvider() """ diff --git a/alphabase/psm_reader/sage_reader.py b/alphabase/psm_reader/sage_reader.py index ca9ce506..71b7187f 100644 --- a/alphabase/psm_reader/sage_reader.py +++ b/alphabase/psm_reader/sage_reader.py @@ -5,12 +5,14 @@ from functools import partial from alphabase.psm_reader.psm_reader import ( - PSMReaderBase, psm_reader_provider, - psm_reader_yaml + PSMReaderBase, + psm_reader_provider, + psm_reader_yaml, ) from alphabase.constants.modification import MOD_DF + def sage_spec_idx_from_scannr(scannr: str) -> int: """Extract the spectrum index from the scannr field in Sage output. @@ -19,16 +21,17 @@ def sage_spec_idx_from_scannr(scannr: str) -> int: scannr : str The scannr field in Sage output. - + """ - return int(scannr.split('=')[-1]) + return int(scannr.split("=")[-1]) + def lookup_modification( - mass_observed: float, - previous_aa: str, - mod_annotated_df: pd.DataFrame, - ppm_tolerance:int=10, - ) -> str: + mass_observed: float, + previous_aa: str, + mod_annotated_df: pd.DataFrame, + ppm_tolerance: int = 10, +) -> str: """ Look up a single modification based on the observed mass and the previous amino acid. @@ -52,10 +55,10 @@ def lookup_modification( str The name of the matched modification in alphabase format. - + """ - mass_distance = mod_annotated_df['mass'].values - mass_observed + mass_distance = mod_annotated_df["mass"].values - mass_observed ppm_distance = mass_distance / mass_observed * 1e6 ppm_distance = np.abs(ppm_distance) @@ -63,24 +66,22 @@ def lookup_modification( # get index of matches mass_match = ppm_distance <= ppm_tolerance - sequence_match = mod_annotated_df['location'] == previous_aa - + sequence_match = mod_annotated_df["location"] == previous_aa filtered_mod_df = mod_annotated_df[mass_match & sequence_match] if len(filtered_mod_df) == 0: print(np.min(ppm_distance)) return None - matched_mod = filtered_mod_df.sort_values(by='unimod_id').iloc[0] - - return matched_mod['mod_name'] + matched_mod = filtered_mod_df.sort_values(by="unimod_id").iloc[0] + + return matched_mod["mod_name"] + def capture_modifications( - sequence: str, - mod_annotated_df: pd.DataFrame, - ppm_tolerance: int=10 - ) -> typing.Tuple[str, str]: - """ Capture modifications from a sequence string. + sequence: str, mod_annotated_df: pd.DataFrame, ppm_tolerance: int = 10 +) -> typing.Tuple[str, str]: + """Capture modifications from a sequence string. Parameters ---------- @@ -103,7 +104,7 @@ def capture_modifications( """ # get index of matches - matches = re.finditer(r'\[(\+|-)(\d+\.\d+)\]', sequence) + matches = re.finditer(r"\[(\+|-)(\d+\.\d+)\]", sequence) site_list = [] mod_list = [] @@ -114,56 +115,66 @@ def capture_modifications( for match in matches: match_start, match_end = match.start(), match.end() - previous_aa = sequence[match_start-1] if match_start > 0 else 'Any_N-term' - mass_observed = float(match.group(2)) * (1 if match.group(1) == '+' else -1) + previous_aa = sequence[match_start - 1] if match_start > 0 else "Any_N-term" + mass_observed = float(match.group(2)) * (1 if match.group(1) == "+" else -1) - mod = lookup_modification(mass_observed, previous_aa, mod_annotated_df, ppm_tolerance=ppm_tolerance) + mod = lookup_modification( + mass_observed, previous_aa, mod_annotated_df, ppm_tolerance=ppm_tolerance + ) if mod is not None: - site_list.append(str(match_start-1-match_delta)) + site_list.append(str(match_start - 1 - match_delta)) mod_list.append(mod) - + else: error = True - print(f'No modification found for mass {mass_observed} at position {match_start} with previous aa {previous_aa}') + print( + f"No modification found for mass {mass_observed} at position {match_start} with previous aa {previous_aa}" + ) - match_delta += (match_end - match_start) + match_delta += match_end - match_start if error: return np.nan, np.nan else: - return ';'.join(site_list), ';'.join(mod_list) - + return ";".join(site_list), ";".join(mod_list) + + def get_annotated_mod_df(): - """ Annotates the modification dataframe with the location of the modification.""" + """Annotates the modification dataframe with the location of the modification.""" mod_annotated_df = MOD_DF.copy() - mod_annotated_df['location'] = mod_annotated_df['mod_name'].str.split('@').str[1].str.split('^').str[0] - mod_annotated_df = mod_annotated_df.sort_values(by='mass').reset_index(drop=True) - mod_annotated_df['mod_name_stripped'] = mod_annotated_df['mod_name'].str.replace(' ','_') + mod_annotated_df["location"] = ( + mod_annotated_df["mod_name"].str.split("@").str[1].str.split("^").str[0] + ) + mod_annotated_df = mod_annotated_df.sort_values(by="mass").reset_index(drop=True) + mod_annotated_df["mod_name_stripped"] = mod_annotated_df["mod_name"].str.replace( + " ", "_" + ) return mod_annotated_df + class SageReaderBase(PSMReaderBase): - def __init__(self, *, - column_mapping: dict = None, + def __init__( + self, + *, + column_mapping: dict = None, modification_mapping: dict = None, - fdr = 0.01, - keep_decoy=False, - rt_unit = 'second', - **kwargs + fdr=0.01, + keep_decoy=False, + rt_unit="second", + **kwargs, ): super().__init__( - column_mapping=column_mapping, + column_mapping=column_mapping, modification_mapping=modification_mapping, - fdr = fdr, - keep_decoy=keep_decoy, - rt_unit = rt_unit, - **kwargs + fdr=fdr, + keep_decoy=keep_decoy, + rt_unit=rt_unit, + **kwargs, ) def _init_column_mapping(self): - self.column_mapping = psm_reader_yaml[ - 'sage' - ]['column_mapping'] - + self.column_mapping = psm_reader_yaml["sage"]["column_mapping"] + def _init_modification_mapping(self): self.modification_mapping = {} @@ -171,46 +182,47 @@ def _load_file(self, filename): raise NotImplementedError def _transform_table(self, origin_df): - self.psm_df['spec_idx'] = self.psm_df['scannr'].apply( - sage_spec_idx_from_scannr - ) - self.psm_df.drop(columns=['scannr'], inplace=True) + self.psm_df["spec_idx"] = self.psm_df["scannr"].apply(sage_spec_idx_from_scannr) + self.psm_df.drop(columns=["scannr"], inplace=True) def _translate_decoy(self, origin_df): if not self.keep_decoy: - self._psm_df = self.psm_df[ - ~self.psm_df['decoy'] - ] + self._psm_df = self.psm_df[~self.psm_df["decoy"]] - self._psm_df = self.psm_df[self.psm_df['fdr'] <= self.keep_fdr] - self._psm_df = self.psm_df[self.psm_df['peptide_fdr'] <= self.keep_fdr] - self._psm_df = self.psm_df[self.psm_df['protein_fdr'] <= self.keep_fdr] + self._psm_df = self.psm_df[self.psm_df["fdr"] <= self.keep_fdr] + self._psm_df = self.psm_df[self.psm_df["peptide_fdr"] <= self.keep_fdr] + self._psm_df = self.psm_df[self.psm_df["protein_fdr"] <= self.keep_fdr] # drop peptide_fdr, protein_fdr - self._psm_df.drop(columns=['peptide_fdr', 'protein_fdr'], inplace=True) + self._psm_df.drop(columns=["peptide_fdr", "protein_fdr"], inplace=True) def _load_modifications(self, origin_df): pass def _translate_modifications(self): - mod_annotated_df = get_annotated_mod_df() - self._psm_df['mod_sites'], self._psm_df['mods'] = zip(*self.psm_df['modified_sequence'].apply( - partial( - capture_modifications, mod_annotated_df=mod_annotated_df, ppm_tolerance=10 + self._psm_df["mod_sites"], self._psm_df["mods"] = zip( + *self.psm_df["modified_sequence"].apply( + partial( + capture_modifications, + mod_annotated_df=mod_annotated_df, + ppm_tolerance=10, ) - )) + ) + ) # drop modified_sequence - self._psm_df.drop(columns=['modified_sequence'], inplace=True) + self._psm_df.drop(columns=["modified_sequence"], inplace=True) + class SageReaderTSV(SageReaderBase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _load_file(self, filename): - return pd.read_csv(filename, sep='\t') - + return pd.read_csv(filename, sep="\t") + + class SageReaderParquet(SageReaderBase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -219,5 +231,6 @@ def _load_file(self, filename): return pd.read_parquet(filename) -psm_reader_provider.register_reader('sage_tsv', SageReaderTSV) -psm_reader_provider.register_reader('sage_parquet', SageReaderParquet) \ No newline at end of file +def register_readers(): + psm_reader_provider.register_reader("sage_tsv", SageReaderTSV) + psm_reader_provider.register_reader("sage_parquet", SageReaderParquet) diff --git a/alphabase/quantification/quant_reader/config_dict_loader.py b/alphabase/quantification/quant_reader/config_dict_loader.py index d9528963..70fe78e7 100644 --- a/alphabase/quantification/quant_reader/config_dict_loader.py +++ b/alphabase/quantification/quant_reader/config_dict_loader.py @@ -6,9 +6,13 @@ import itertools import re -INTABLE_CONFIG = os.path.join(pathlib.Path(__file__).parent.absolute(), "../../../alphabase/constants/const_files/quant_reader_config.yaml") #the yaml config is located one directory below the python library files +INTABLE_CONFIG = os.path.join( + pathlib.Path(__file__).parent.absolute(), + "../../../alphabase/constants/const_files/quant_reader_config.yaml", +) # the yaml config is located one directory below the python library files -def get_input_type_and_config_dict(input_file, input_type_to_use = None): + +def get_input_type_and_config_dict(input_file, input_type_to_use=None): all_config_dicts = _load_config(INTABLE_CONFIG) type2relevant_columns = _get_type2relevant_cols(all_config_dicts) @@ -20,40 +24,44 @@ def get_input_type_and_config_dict(input_file, input_type_to_use = None): uploaded_data_columns = set(pd.read_csv(input_file, sep=sep, nrows=1).columns) for input_type in type2relevant_columns.keys(): - if (input_type_to_use is not None) and (input_type!=input_type_to_use): + if (input_type_to_use is not None) and (input_type != input_type_to_use): continue relevant_columns = type2relevant_columns.get(input_type) - relevant_columns = [x for x in relevant_columns if x] #filter None values + relevant_columns = [x for x in relevant_columns if x] # filter None values if set(relevant_columns).issubset(uploaded_data_columns): - config_dict = all_config_dicts.get(input_type) + config_dict = all_config_dicts.get(input_type) return input_type, config_dict, sep - + raise TypeError("format not specified in intable_config.yaml!") + def _get_original_file_from_aq_reformat(input_file): - matched = re.match("(.*)(\..*\.)(aq_reformat\.tsv)",input_file) + matched = re.match("(.*)(\..*\.)(aq_reformat\.tsv)", input_file) return matched.group(1) + def _get_seperator(input_file): filename = str(input_file) - if '.csv' in filename: - sep=',' - if '.tsv' in filename: - sep='\t' - if '.txt' in filename: - sep='\t' - - if 'sep' not in locals(): - raise TypeError(f"neither of the file extensions (.tsv, .csv, .txt) detected for file {input_file}! Your filename has to contain one of these extensions. Please modify your file name accordingly.") + if ".csv" in filename: + sep = "," + if ".tsv" in filename: + sep = "\t" + if ".txt" in filename: + sep = "\t" + + if "sep" not in locals(): + raise TypeError( + f"neither of the file extensions (.tsv, .csv, .txt) detected for file {input_file}! Your filename has to contain one of these extensions. Please modify your file name accordingly." + ) return sep - def _load_config(config_yaml): - with open(config_yaml, 'r') as stream: + with open(config_yaml, "r") as stream: config_all = yaml.safe_load(stream) return config_all + def _get_type2relevant_cols(config_all): type2relcols = {} for type in config_all.keys(): @@ -66,39 +74,50 @@ def _get_type2relevant_cols(config_all): def get_relevant_columns_config_dict(config_typedict): filtcols = [] dict_ioncols = [] - for filtconf in config_typedict.get('filters', {}).values(): - filtcols.append(filtconf.get('param')) + for filtconf in config_typedict.get("filters", {}).values(): + filtcols.append(filtconf.get("param")) - if 'ion_hierarchy' in config_typedict.keys(): - for headr in config_typedict.get('ion_hierarchy').values(): + if "ion_hierarchy" in config_typedict.keys(): + for headr in config_typedict.get("ion_hierarchy").values(): ioncols = list(itertools.chain.from_iterable(headr.get("mapping").values())) dict_ioncols.extend(ioncols) quant_ids = _get_quant_ids_from_config_dict(config_typedict) sample_ids = _get_sample_ids_from_config_dict(config_typedict) channel_ids = _get_channel_ids_from_config_dict(config_typedict) - relevant_cols = config_typedict.get("protein_cols") + config_typedict.get("ion_cols", []) + sample_ids + quant_ids + filtcols + dict_ioncols + channel_ids - relevant_cols = list(set(relevant_cols)) # to remove possible redudancies + relevant_cols = ( + config_typedict.get("protein_cols") + + config_typedict.get("ion_cols", []) + + sample_ids + + quant_ids + + filtcols + + dict_ioncols + + channel_ids + ) + relevant_cols = list(set(relevant_cols)) # to remove possible redudancies return relevant_cols + def _get_quant_ids_from_config_dict(config_typedict): quantID = config_typedict.get("quant_ID") - if type(quantID) ==type("string"): + if isinstance(quantID, str): return [config_typedict.get("quant_ID")] - if quantID == None: - return[] + if quantID is None: + return [] else: return list(config_typedict.get("quant_ID").values()) + def _get_sample_ids_from_config_dict(config_typedict): sampleID = config_typedict.get("sample_ID") - if type(sampleID) ==type("string"): + if isinstance(sampleID, str): return [config_typedict.get("sample_ID")] - if sampleID == None: + if sampleID is None: return [] else: return config_typedict.get("sample_ID") + def _get_channel_ids_from_config_dict(config_typedict): return config_typedict.get("channel_ID", []) diff --git a/alphabase/quantification/quant_reader/longformat_reader.py b/alphabase/quantification/quant_reader/longformat_reader.py index 677a50e7..2301879c 100644 --- a/alphabase/quantification/quant_reader/longformat_reader.py +++ b/alphabase/quantification/quant_reader/longformat_reader.py @@ -4,7 +4,6 @@ import glob import dask.dataframe as dd import os.path -import sys from . import config_dict_loader from . import quantreader_utils @@ -12,104 +11,187 @@ from . import plexdia_reformatter - - -def reformat_and_write_longtable_according_to_config(input_file, outfile_name, config_dict_for_type, sep = "\t",decimal = ".", enforce_largefile_processing = False, - chunksize =1000_000, use_alphaquant_format = False): +def reformat_and_write_longtable_according_to_config( + input_file, + outfile_name, + config_dict_for_type, + sep="\t", + decimal=".", + enforce_largefile_processing=False, + chunksize=1000_000, + use_alphaquant_format=False, +): """Reshape a long format proteomics results table (e.g. Spectronaut or DIA-NN) to a wide format table. :param file input_file: long format proteomic results table :param string input_type: the configuration key stored in the config file (e.g. "diann_precursor") """ - file_is_large = check_if_file_is_large(input_file, enforce_largefile_processing) if file_is_large: - process_out_of_memory(input_file=input_file, outfile_name=outfile_name, config_dict_for_type=config_dict_for_type, sep=sep, decimal=decimal, - chunksize=chunksize, use_alphaquant_format=use_alphaquant_format) + process_out_of_memory( + input_file=input_file, + outfile_name=outfile_name, + config_dict_for_type=config_dict_for_type, + sep=sep, + decimal=decimal, + chunksize=chunksize, + use_alphaquant_format=use_alphaquant_format, + ) else: - process_in_memory(input_file=input_file, outfile_name=outfile_name, config_dict_for_type=config_dict_for_type, sep=sep, decimal=decimal, - chunksize=chunksize, use_alphaquant_format=use_alphaquant_format) + process_in_memory( + input_file=input_file, + outfile_name=outfile_name, + config_dict_for_type=config_dict_for_type, + sep=sep, + decimal=decimal, + chunksize=chunksize, + use_alphaquant_format=use_alphaquant_format, + ) def check_if_file_is_large(input_file, enforce_largefile_processing): - filesize = os.path.getsize(input_file)/(1024**3) #size in gigabyte - file_is_large = (filesize>10 and str(input_file).endswith(".zip")) or filesize>50 or enforce_largefile_processing + filesize = os.path.getsize(input_file) / (1024**3) # size in gigabyte + file_is_large = ( + (filesize > 10 and str(input_file).endswith(".zip")) + or filesize > 50 + or enforce_largefile_processing + ) return file_is_large - - -def process_out_of_memory(input_file, outfile_name, config_dict_for_type, sep = "\t",decimal = ".", - chunksize =1000_000, use_alphaquant_format = False): +def process_out_of_memory( + input_file, + outfile_name, + config_dict_for_type, + sep="\t", + decimal=".", + chunksize=1000_000, + use_alphaquant_format=False, +): tmpfile_large = get_tmpfile_location(input_file) remove_possible_old_tmpfiles(tmpfile_large=tmpfile_large, outfile_name=outfile_name) - - relevant_cols = config_dict_loader.get_relevant_columns_config_dict(config_dict_for_type) - input_df_it = pd.read_csv(input_file, sep = sep, decimal=decimal, usecols = relevant_cols, encoding ='latin1', chunksize = chunksize) + + relevant_cols = config_dict_loader.get_relevant_columns_config_dict( + config_dict_for_type + ) + input_df_it = pd.read_csv( + input_file, + sep=sep, + decimal=decimal, + usecols=relevant_cols, + encoding="latin1", + chunksize=chunksize, + ) header = True - + for input_df_subset in input_df_it: - input_df_subset = adapt_subtable(input_df_subset, config_dict_for_type, use_alphaquant_format) - write_chunk_to_file(input_df_subset,tmpfile_large, header, write_index=True) + input_df_subset = adapt_subtable( + input_df_subset, config_dict_for_type, use_alphaquant_format + ) + write_chunk_to_file(input_df_subset, tmpfile_large, header, write_index=True) header = False - process_with_dask(tmpfile_columnfilt=tmpfile_large , outfile_name = outfile_name, config_dict_for_type=config_dict_for_type, use_alphaquant_format=use_alphaquant_format) + process_with_dask( + tmpfile_columnfilt=tmpfile_large, + outfile_name=outfile_name, + config_dict_for_type=config_dict_for_type, + use_alphaquant_format=use_alphaquant_format, + ) + def get_tmpfile_location(input_file): - return f"{input_file}.tmp.longformat.columnfilt.tsv" #only needed when file is large + return ( + f"{input_file}.tmp.longformat.columnfilt.tsv" # only needed when file is large + ) + def remove_possible_old_tmpfiles(tmpfile_large, outfile_name): - #remove potential leftovers from previous processings + # remove potential leftovers from previous processings if os.path.exists(tmpfile_large): os.remove(tmpfile_large) if os.path.exists(outfile_name): os.remove(outfile_name) -def process_in_memory(input_file, outfile_name, config_dict_for_type, sep = "\t",decimal = ".", - chunksize =1000_000, use_alphaquant_format = False): - - relevant_cols = config_dict_loader.get_relevant_columns_config_dict(config_dict_for_type) - input_df_it = pd.read_csv(input_file, sep = sep, decimal=decimal, usecols = relevant_cols, encoding ='latin1', chunksize = chunksize) +def process_in_memory( + input_file, + outfile_name, + config_dict_for_type, + sep="\t", + decimal=".", + chunksize=1000_000, + use_alphaquant_format=False, +): + relevant_cols = config_dict_loader.get_relevant_columns_config_dict( + config_dict_for_type + ) + input_df_it = pd.read_csv( + input_file, + sep=sep, + decimal=decimal, + usecols=relevant_cols, + encoding="latin1", + chunksize=chunksize, + ) input_df_list = [] for input_df_subset in input_df_it: - input_df_subset = adapt_subtable(input_df_subset, config_dict_for_type, use_alphaquant_format) + input_df_subset = adapt_subtable( + input_df_subset, config_dict_for_type, use_alphaquant_format + ) input_df_list.append(input_df_subset) input_df = pd.concat(input_df_list) input_reshaped = reshape_input_df(input_df, config_dict_for_type) - input_reshaped.to_csv(outfile_name, sep = "\t", index = None) + input_reshaped.to_csv(outfile_name, sep="\t", index=None) def adapt_subtable(input_df_subset, config_dict, use_alphaquant_format): - input_df_subset = quantreader_utils.filter_input(config_dict.get("filters", {}), input_df_subset) + input_df_subset = quantreader_utils.filter_input( + config_dict.get("filters", {}), input_df_subset + ) if "ion_hierarchy" in config_dict.keys(): - return table_reformatter.merge_protein_cols_and_config_dict(input_df_subset, config_dict, use_alphaquant_format) + return table_reformatter.merge_protein_cols_and_config_dict( + input_df_subset, config_dict, use_alphaquant_format + ) else: - return table_reformatter.merge_protein_and_ion_cols(input_df_subset, config_dict) + return table_reformatter.merge_protein_and_ion_cols( + input_df_subset, config_dict + ) -def write_chunk_to_file(chunk, filepath ,write_header, write_index): + +def write_chunk_to_file(chunk, filepath, write_header, write_index): """write chunk of pandas dataframe to a file""" - chunk.to_csv(filepath, header=write_header, mode='a', sep = "\t", index = write_index) + chunk.to_csv(filepath, header=write_header, mode="a", sep="\t", index=write_index) + def reshape_input_df(input_df, config_dict): - input_df = input_df.astype({'quant_val': 'float'}) - input_df = plexdia_reformatter.adapt_input_df_columns_in_case_of_mDIA(input_df=input_df, config_dict_for_type=config_dict) + input_df = input_df.astype({"quant_val": "float"}) + input_df = plexdia_reformatter.adapt_input_df_columns_in_case_of_mDIA( + input_df=input_df, config_dict_for_type=config_dict + ) column_names = get_column_names(input_df) input_df = adapt_input_df(input_df, column_names) - input_reshaped = pd.pivot_table(input_df, index = ['protein', 'quant_id']+column_names, columns = config_dict.get("sample_ID"), values = 'quant_val', fill_value=0) + input_reshaped = pd.pivot_table( + input_df, + index=["protein", "quant_id"] + column_names, + columns=config_dict.get("sample_ID"), + values="quant_val", + fill_value=0, + ) input_reshaped = input_reshaped.reset_index() return input_reshaped + def get_column_names(input_df): if input_df.index.names[0] is None: return [] else: return input_df.index.names + def adapt_input_df(input_df, column_names): - if len(column_names)==0: + if len(column_names) == 0: return input_df.reset_index() else: input_df = input_df.reset_index() @@ -117,37 +199,42 @@ def adapt_input_df(input_df, column_names): return input_df - - -def process_with_dask(*, tmpfile_columnfilt, outfile_name, config_dict_for_type, use_alphaquant_format): - df = dd.read_csv(tmpfile_columnfilt, sep = "\t") - allcols = df[config_dict_for_type.get("sample_ID")].drop_duplicates().compute() # the columns of the output table are the sample IDs - allcols = plexdia_reformatter.extend_sample_allcolumns_for_mDIA_case(allcols_samples=allcols, config_dict_for_type=config_dict_for_type) - allcols = ['protein', 'quant_id'] + sorted(allcols) +def process_with_dask( + *, tmpfile_columnfilt, outfile_name, config_dict_for_type, use_alphaquant_format +): + df = dd.read_csv(tmpfile_columnfilt, sep="\t") + allcols = ( + df[config_dict_for_type.get("sample_ID")].drop_duplicates().compute() + ) # the columns of the output table are the sample IDs + allcols = plexdia_reformatter.extend_sample_allcolumns_for_mDIA_case( + allcols_samples=allcols, config_dict_for_type=config_dict_for_type + ) + allcols = ["protein", "quant_id"] + sorted(allcols) if not use_alphaquant_format: hierarchy_columns = get_hierarchy_names_from_config_dict(config_dict_for_type) allcols = allcols + hierarchy_columns - df = df.set_index('protein') + df = df.set_index("protein") sorted_filedir = f"{tmpfile_columnfilt}_sorted" - df.to_csv(sorted_filedir, sep = "\t") - #now the files are sorted and can be pivoted chunkwise (multiindex pivoting at the moment not possible in dask) + df.to_csv(sorted_filedir, sep="\t") + # now the files are sorted and can be pivoted chunkwise (multiindex pivoting at the moment not possible in dask) files_dask = glob.glob(f"{sorted_filedir}/*part") header = True for file in files_dask: if use_alphaquant_format: - input_df = pd.read_csv(file, sep = "\t") + input_df = pd.read_csv(file, sep="\t") else: - input_df = pd.read_csv(file, sep = "\t", index_col=hierarchy_columns) - if len(input_df.index) <2: + input_df = pd.read_csv(file, sep="\t", index_col=hierarchy_columns) + if len(input_df.index) < 2: continue input_reshaped = reshape_input_df(input_df, config_dict_for_type) input_reshaped = sort_and_add_columns(input_reshaped, allcols) - write_chunk_to_file(input_reshaped, outfile_name, header, write_index = False) + write_chunk_to_file(input_reshaped, outfile_name, header, write_index=False) header = False os.remove(tmpfile_columnfilt) shutil.rmtree(sorted_filedir) + def get_hierarchy_names_from_config_dict(config_dict_for_type): hierarchy_names = [] if "ion_hierarchy" in config_dict_for_type.keys(): @@ -157,15 +244,10 @@ def get_hierarchy_names_from_config_dict(config_dict_for_type): return list(set(hierarchy_names)) else: return [] - + def sort_and_add_columns(input_reshaped, allcols): missing_cols = set(allcols) - set(input_reshaped.columns) input_reshaped[list(missing_cols)] = 0 input_reshaped = input_reshaped[allcols] return input_reshaped - - - - - diff --git a/alphabase/quantification/quant_reader/plexdia_reformatter.py b/alphabase/quantification/quant_reader/plexdia_reformatter.py index 31a7921e..d27b6339 100644 --- a/alphabase/quantification/quant_reader/plexdia_reformatter.py +++ b/alphabase/quantification/quant_reader/plexdia_reformatter.py @@ -1,7 +1,10 @@ +import re + + def extend_sample_allcolumns_for_mDIA_case(allcols_samples, config_dict_for_type): if is_mDIA_table(config_dict_for_type): new_allcols = [] - channels = ['Dimethyl-n-0', 'Dimethyl-n-4', 'Dimethyl-n-8'] + channels = ["Dimethyl-n-0", "Dimethyl-n-4", "Dimethyl-n-8"] for channel in channels: for sample in allcols_samples: new_allcols.append(merge_channel_and_sample_string(sample, channel)) @@ -11,9 +14,10 @@ def extend_sample_allcolumns_for_mDIA_case(allcols_samples, config_dict_for_type # Cell -#mDIA case +# mDIA case -def adapt_input_df_columns_in_case_of_mDIA(input_df,config_dict_for_type): + +def adapt_input_df_columns_in_case_of_mDIA(input_df, config_dict_for_type): if is_mDIA_table(config_dict_for_type): input_df = extend_sampleID_column_for_mDIA_case(input_df, config_dict_for_type) input_df = set_mtraq_reduced_ion_column_into_dataframe(input_df) @@ -22,46 +26,52 @@ def adapt_input_df_columns_in_case_of_mDIA(input_df,config_dict_for_type): return input_df -def extend_sampleID_column_for_mDIA_case(input_df,config_dict_for_type): +def extend_sampleID_column_for_mDIA_case(input_df, config_dict_for_type): channels_per_peptide = parse_channel_from_peptide_column(input_df) - return merge_sample_id_and_channels(input_df, channels_per_peptide, config_dict_for_type) + return merge_sample_id_and_channels( + input_df, channels_per_peptide, config_dict_for_type + ) def set_mtraq_reduced_ion_column_into_dataframe(input_df): - new_ions = remove_mtraq_modifications_from_ion_ids(input_df['quant_id']) - input_df['quant_id'] = new_ions + new_ions = remove_mtraq_modifications_from_ion_ids(input_df["quant_id"]) + input_df["quant_id"] = new_ions return input_df + def remove_mtraq_modifications_from_ion_ids(ions): new_ions = [] for ion in ions: - new_ions.append( re.sub("\(Dimethyl-\w-\d\)","", ion)) + new_ions.append(re.sub("\(Dimethyl-\w-\d\)", "", ion)) return new_ions def is_mDIA_table(config_dict_for_type): - return config_dict_for_type.get('channel_ID') == ['Channel.0', 'Channel.4'] + return config_dict_for_type.get("channel_ID") == ["Channel.0", "Channel.4"] -import re def parse_channel_from_peptide_column(input_df): channels = [] - for pep in input_df['Modified.Sequence']: + for pep in input_df["Modified.Sequence"]: pattern = "(.*)(\(Dimethyl-n-.\))(.*)" matched = re.match(pattern, pep) num_appearances = pep.count("Dimethyl-n-") - if matched and num_appearances==1: + if matched and num_appearances == 1: channels.append(matched.group(2)) else: channels.append("NA") return channels + def merge_sample_id_and_channels(input_df, channels, config_dict_for_type): sample_id = config_dict_for_type.get("sample_ID") sample_ids = list(input_df[sample_id]) - input_df[sample_id] = [merge_channel_and_sample_string(sample_ids[idx], channels[idx]) for idx in range(len(sample_ids))] + input_df[sample_id] = [ + merge_channel_and_sample_string(sample_ids[idx], channels[idx]) + for idx in range(len(sample_ids)) + ] return input_df + def merge_channel_and_sample_string(sample, channel): return f"{sample}_{channel}" - diff --git a/alphabase/quantification/quant_reader/quant_reader_manager.py b/alphabase/quantification/quant_reader/quant_reader_manager.py index 665161da..98dcb0b3 100644 --- a/alphabase/quantification/quant_reader/quant_reader_manager.py +++ b/alphabase/quantification/quant_reader/quant_reader_manager.py @@ -4,7 +4,13 @@ from . import wideformat_reader -def import_data(input_file, input_type_to_use = None, samples_subset = None, results_dir = None, use_alphaquant_format = False): +def import_data( + input_file, + input_type_to_use=None, + samples_subset=None, + results_dir=None, + use_alphaquant_format=False, +): """ Function to import peptide level data. Depending on available columns in the provided file, the function identifies the type of input used (e.g. Spectronaut, MaxQuant, DIA-NN), reformats if necessary @@ -17,35 +23,52 @@ def import_data(input_file, input_type_to_use = None, samples_subset = None, res if "aq_reformat" in input_file: file_to_read = input_file else: - file_to_read = reformat_and_save_input_file(input_file=input_file, input_type_to_use=input_type_to_use, use_alphaquant_format = use_alphaquant_format) - - input_reshaped = pd.read_csv(file_to_read, sep = "\t", encoding = 'latin1', usecols=samples_subset) - input_reshaped = input_reshaped.drop_duplicates(subset='quant_id') + file_to_read = reformat_and_save_input_file( + input_file=input_file, + input_type_to_use=input_type_to_use, + use_alphaquant_format=use_alphaquant_format, + ) + + input_reshaped = pd.read_csv( + file_to_read, sep="\t", encoding="latin1", usecols=samples_subset + ) + input_reshaped = input_reshaped.drop_duplicates(subset="quant_id") return input_reshaped + def add_ion_protein_headers_if_applicable(samples_subset): if samples_subset is not None: return samples_subset + ["quant_id", "protein"] else: return None -def reformat_and_save_input_file(input_file, input_type_to_use = None, use_alphaquant_format = False): - - input_type, config_dict_for_type, sep = config_dict_loader.get_input_type_and_config_dict(input_file, input_type_to_use) + +def reformat_and_save_input_file( + input_file, input_type_to_use=None, use_alphaquant_format=False +): + input_type, config_dict_for_type, sep = ( + config_dict_loader.get_input_type_and_config_dict(input_file, input_type_to_use) + ) print(f"using input type {input_type}") - format = config_dict_for_type.get('format') + format = config_dict_for_type.get("format") outfile_name = f"{input_file}.{input_type}.aq_reformat.tsv" if format == "longtable": - longformat_reader.reformat_and_write_longtable_according_to_config(input_file, outfile_name,config_dict_for_type, sep = sep, use_alphaquant_format=use_alphaquant_format) + longformat_reader.reformat_and_write_longtable_according_to_config( + input_file, + outfile_name, + config_dict_for_type, + sep=sep, + use_alphaquant_format=use_alphaquant_format, + ) elif format == "widetable": - wideformat_reader.reformat_and_write_wideformat_table(input_file, outfile_name, config_dict_for_type) + wideformat_reader.reformat_and_write_wideformat_table( + input_file, outfile_name, config_dict_for_type + ) else: - raise Exception('Format not recognized!') + raise Exception("Format not recognized!") return outfile_name + def set_quanttable_config_location(quanttable_config_file): config_dict_loader.INTABLE_CONFIG = quanttable_config_file - - - diff --git a/alphabase/quantification/quant_reader/quantreader_utils.py b/alphabase/quantification/quant_reader/quantreader_utils.py index 7c6c3f38..49c094fc 100644 --- a/alphabase/quantification/quant_reader/quantreader_utils.py +++ b/alphabase/quantification/quant_reader/quantreader_utils.py @@ -1,35 +1,37 @@ def filter_input(filter_dict, input): - if filter_dict == None: + if filter_dict is None: return input - for filtname,filterconf in filter_dict.items(): - param = filterconf.get('param') - comparator = filterconf.get('comparator') - value = filterconf.get('value') - - if comparator not in [">",">=", "<", "<=", "==", "!="]: - raise TypeError(f"cannot identify the filter comparator of {filtname} given in the longtable config yaml!") - - if comparator=="==": - input = input[input[param] ==value] + for filtname, filterconf in filter_dict.items(): + param = filterconf.get("param") + comparator = filterconf.get("comparator") + value = filterconf.get("value") + + if comparator not in [">", ">=", "<", "<=", "==", "!="]: + raise TypeError( + f"cannot identify the filter comparator of {filtname} given in the longtable config yaml!" + ) + + if comparator == "==": + input = input[input[param] == value] continue try: - input = input.astype({f"{param}" : "float"}) - except: + input = input.astype({f"{param}": "float"}) + except Exception: pass - if comparator==">": - input = input[input[param].astype(type(value)) >value] + if comparator == ">": + input = input[input[param].astype(type(value)) > value] - if comparator==">=": - input = input[input[param].astype(type(value)) >=value] + if comparator == ">=": + input = input[input[param].astype(type(value)) >= value] - if comparator=="<": - input = input[input[param].astype(type(value)) value_threshold] - #exploded_input = exploded_input.rename(columns = {'var1': split_col}) + exploded_input = exploded_input[exploded_input[split_col] > value_threshold] + # exploded_input = exploded_input.rename(columns = {'var1': split_col}) return exploded_input + def adapt_headers_on_extended_df(ion_headers_grouped, splitcol2sep): - #in the case that one column has been split, we need to designate the "naming" column + # in the case that one column has been split, we need to designate the "naming" column ion_headers_grouped_copy = copy.deepcopy(ion_headers_grouped) for vals in ion_headers_grouped_copy: if splitcol2sep is not None: @@ -125,27 +152,34 @@ def adapt_headers_on_extended_df(ion_headers_grouped, splitcol2sep): def merge_protein_and_ion_cols(input_df, config_dict): - protein_cols = config_dict.get("protein_cols") + protein_cols = config_dict.get("protein_cols") ion_cols = config_dict.get("ion_cols") - input_df['protein'] = join_columns(input_df, protein_cols) - input_df['quant_id'] = join_columns(input_df, ion_cols) - input_df = input_df.rename(columns = {config_dict.get('quant_ID') : "quant_val"}) + input_df["protein"] = join_columns(input_df, protein_cols) + input_df["quant_id"] = join_columns(input_df, ion_cols) + input_df = input_df.rename(columns={config_dict.get("quant_ID"): "quant_val"}) return input_df -def add_index_and_metadata_columns(df_subset, ion_hierarchy_local, ion_headers_grouped, quant_id_dict, hierarchy_type): +def add_index_and_metadata_columns( + df_subset, ion_hierarchy_local, ion_headers_grouped, quant_id_dict, hierarchy_type +): """puts together the hierarchical ion names as a column in a given input dataframe""" - + for idx in range(len(ion_hierarchy_local)): hierarchy_name = ion_hierarchy_local[idx] headers = ion_headers_grouped[idx] - df_subset[hierarchy_name] = join_columns(df_subset, headers)# df_subset[headers].apply(lambda x: '_'.join(x.astype(str)), axis=1) - df_subset[hierarchy_name] = f"{hierarchy_name}_" +df_subset[hierarchy_name] - - df_subset['quant_id'] = join_columns(df_subset, ion_hierarchy_local, separator='_')# df_subset[ion_hierarchy_local].apply(lambda x: '_AND_'.join(x.astype(str)), axis=1) + df_subset[hierarchy_name] = join_columns( + df_subset, headers + ) # df_subset[headers].apply(lambda x: '_'.join(x.astype(str)), axis=1) + df_subset[hierarchy_name] = f"{hierarchy_name}_" + df_subset[hierarchy_name] + df_subset["quant_id"] = join_columns( + df_subset, ion_hierarchy_local, separator="_" + ) # df_subset[ion_hierarchy_local].apply(lambda x: '_AND_'.join(x.astype(str)), axis=1) df_subset = df_subset.set_index(ion_hierarchy_local) - if quant_id_dict!= None: - df_subset = df_subset.rename(columns = {quant_id_dict.get(hierarchy_type) : "quant_val"}) - return df_subset \ No newline at end of file + if quant_id_dict is not None: + df_subset = df_subset.rename( + columns={quant_id_dict.get(hierarchy_type): "quant_val"} + ) + return df_subset diff --git a/alphabase/quantification/quant_reader/wideformat_reader.py b/alphabase/quantification/quant_reader/wideformat_reader.py index dd9707b8..b1fdaa66 100644 --- a/alphabase/quantification/quant_reader/wideformat_reader.py +++ b/alphabase/quantification/quant_reader/wideformat_reader.py @@ -4,19 +4,26 @@ def reformat_and_write_wideformat_table(peptides_tsv, outfile_name, config_dict): - input_df = pd.read_csv(peptides_tsv,sep="\t", encoding ='latin1') + input_df = pd.read_csv(peptides_tsv, sep="\t", encoding="latin1") filter_dict = config_dict.get("filters") - protein_cols = config_dict.get("protein_cols") - ion_cols = config_dict.get("ion_cols") + input_df = quantreader_utils.filter_input(filter_dict, input_df) - #input_df = merge_protein_and_ion_cols(input_df, config_dict) - input_df = table_reformatter.merge_protein_cols_and_config_dict(input_df, config_dict) - if 'quant_pre_or_suffix' in config_dict.keys(): - quant_pre_or_suffix = config_dict.get('quant_pre_or_suffix') - headers = ['protein', 'quant_id'] + list(filter(lambda x: x.startswith(quant_pre_or_suffix) or x.endswith(quant_pre_or_suffix), input_df.columns)) + # input_df = merge_protein_and_ion_cols(input_df, config_dict) + input_df = table_reformatter.merge_protein_cols_and_config_dict( + input_df, config_dict + ) + if "quant_pre_or_suffix" in config_dict.keys(): + quant_pre_or_suffix = config_dict.get("quant_pre_or_suffix") + headers = ["protein", "quant_id"] + list( + filter( + lambda x: x.startswith(quant_pre_or_suffix) + or x.endswith(quant_pre_or_suffix), + input_df.columns, + ) + ) input_df = input_df[headers] - input_df = input_df.rename(columns = lambda x : x.replace(quant_pre_or_suffix, "")) + input_df = input_df.rename(columns=lambda x: x.replace(quant_pre_or_suffix, "")) + + # input_df = input_df.reset_index() - #input_df = input_df.reset_index() - - input_df.to_csv(outfile_name, sep = '\t', index = None) \ No newline at end of file + input_df.to_csv(outfile_name, sep="\t", index=None) diff --git a/alphabase/scoring/__init__.py b/alphabase/scoring/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/alphabase/scoring/fdr.py b/alphabase/scoring/fdr.py deleted file mode 100644 index 5817e52a..00000000 --- a/alphabase/scoring/fdr.py +++ /dev/null @@ -1,161 +0,0 @@ -import numba -import numpy as np -import pandas as pd - -@numba.njit -def fdr_to_q_values( - fdr_values:np.ndarray -)->np.ndarray: - """convert FDR values to q_values. - - Parameters - ---------- - fdr_values : np.ndarray - FDR values, they should be - sorted according to the descending order of the `score` - - Returns - ------- - np.ndarray - q_values - - """ - q_values = np.zeros_like(fdr_values) - min_q_value = np.max(fdr_values) - for i in range(len(fdr_values) - 1, -1, -1): - fdr = fdr_values[i] - if fdr < min_q_value: - min_q_value = fdr - q_values[i] = min_q_value - return q_values - -def calculate_fdr( - df:pd.DataFrame, - score_column:str, - decoy_column:str='decoy' -)->pd.DataFrame: - """Calculate FDR values (q_values in fact) for the given dataframe - - Parameters - ---------- - df : pd.DataFrame - PSM dataframe to calculate FDRs - - score_column : str - score column to sort in decending order - - decoy_column : str, optional - decoy column in the dataframe. - 1=target, 0=decoy. Defaults to 'decoy'. - - Returns - ------- - pd.DataFrame - PSM dataframe with 'fdr' column added - - """ - df = df.reset_index(drop=True).sort_values( - [score_column,decoy_column], ascending=False - ) - target_values = 1-df[decoy_column].values - decoy_cumsum = np.cumsum(df[decoy_column].values) - target_cumsum = np.cumsum(target_values) - fdr_values = decoy_cumsum/target_cumsum - df['fdr'] = fdr_to_q_values(fdr_values) - return df - -#wrapper -calc_fdr_for_df = calculate_fdr - -@numba.njit -def fdr_from_ref( - sorted_scores:np.ndarray, - ref_scores:np.ndarray, - ref_fdr_values:np.ndarray -)->np.ndarray: - """ Calculate FDR values from the given reference scores and fdr_values. - It is used to extend peptide-level or sequence-level FDR (reference) - to each PSM, as PSMs are more useful for quantification. - - Parameters - ---------- - sorted_scores : np.array - the scores to calculate FDRs, - they must be sorted in decending order. - - ref_scores : np.array - reference scores that used to - calculate ref_fdr_values, also sorted in decending order. - - ref_fdr_values : np.array - fdr values corresponding to ref_scores - - Returns - ------- - np.array - fdr values corresponding to sorted_scores. - - """ - q_values = np.zeros_like(sorted_scores) - i,j = 0,0 - while i < len(sorted_scores) and j < len(ref_scores): - if sorted_scores[i] >= ref_scores[j]: - q_values[i] = ref_fdr_values[j] - i += 1 - else: - j += 1 - while i < len(sorted_scores): - q_values[i] = ref_fdr_values[-1] - i += 1 - return q_values - -def calculate_fdr_from_ref( - df: pd.DataFrame, - ref_scores:np.ndarray, - ref_fdr_values:np.ndarray, - score_column:str, - decoy_column:str='decoy' -)->pd.DataFrame: - """ Calculate FDR values for a PSM dataframe from the given reference - scores and fdr_values. It is used to extend peptide-level or - sequence-level FDR (reference) to each PSM, as PSMs are more useful - for quantification. - `` - - Parameters - ---------- - df : pd.DataFrame - PSM dataframe - - ref_scores : np.array - reference scores that used to - calculate ref_fdr_values, also sorted in decending order. - - ref_fdr_values : np.array - fdr values corresponding to ref_scores - - score_column : str - score column in the dataframe - - decoy_column : str, optional - decoy column in the dataframe. - 1=target, 0=decoy. Defaults to 'decoy'. - - Returns - ------- - pd.DataFrame - dataframe with 'fdr' column added - - """ - df = df.reset_index(drop=True).sort_values( - [score_column,decoy_column], ascending=False - ) - sorted_idxes = np.argsort(ref_fdr_values) - ref_scores = ref_scores[sorted_idxes] - ref_q_values = ref_fdr_values[sorted_idxes] - df['fdr'] = fdr_from_ref( - df.score.values, ref_scores, ref_q_values - ) - return df - -calc_fdr_from_ref_for_df = calculate_fdr_from_ref diff --git a/alphabase/scoring/feature_extraction_base.py b/alphabase/scoring/feature_extraction_base.py deleted file mode 100644 index 73c7d683..00000000 --- a/alphabase/scoring/feature_extraction_base.py +++ /dev/null @@ -1,61 +0,0 @@ -import pandas as pd - -class BaseFeatureExtractor: - def __init__(self): - self._feature_list = ['score','nAA','charge'] - - @property - def feature_list(self)->list: - """ - This is a property. It tells ML scoring modules - what features (columns) are extracted by - this FeatureExtractor for scoring. - - Returns - ------- - list - feature names (columns) in the PSM dataframe - """ - - self._feature_list = list(set(self._feature_list)) - return self._feature_list - - def extract_features(self, - psm_df:pd.DataFrame, - *args, **kwargs - )->pd.DataFrame: - """ - Extract the scoring features (self._feature_list) - and append them inplace into candidate PSMs (psm_df). - - **All sub-classes must re-implement this method.** - - Parameters - ---------- - psm_df : pd.DataFrame - PSMs to be rescored - - Returns - ------- - pd.DataFrame - psm_df with appended feature columns extracted by this extractor - """ - return psm_df - - def update_features(self,psm_df:pd.DataFrame)->pd.DataFrame: - """ - This method allow us to update adaptive features - during the iteration of Percolator algorithm - - Parameters - ---------- - psm_df : pd.DataFrame - psm_df - - Returns - ------- - pd.DataFrame - psm_df with updated feature values - """ - return psm_df - diff --git a/alphabase/scoring/ml_scoring.py b/alphabase/scoring/ml_scoring.py deleted file mode 100644 index 7c9f5864..00000000 --- a/alphabase/scoring/ml_scoring.py +++ /dev/null @@ -1,374 +0,0 @@ -import pandas as pd -import numpy as np - -from sklearn.linear_model import LogisticRegression -from sklearn.base import BaseEstimator - -from alphabase.scoring.feature_extraction_base import BaseFeatureExtractor -from alphabase.scoring.fdr import ( - calculate_fdr, - calculate_fdr_from_ref, - fdr_to_q_values, - fdr_from_ref, -) - -class Percolator: - def __init__(self): - self._feature_extractor:BaseFeatureExtractor = BaseFeatureExtractor() - self._ml_model = LogisticRegression() - - self.fdr_level = 'psm' # psm, precursor, peptide, or sequence - self.training_fdr = 0.01 - self.per_raw_fdr = False - - self.max_training_sample = 200000 - self.min_training_sample = 100 - self.cv_fold = 1 - self.iter_num = 1 - - self._base_features = ['score','nAA','charge'] - - @property - def feature_list(self)->list: - """ Get extracted feature_list. Property, read-only """ - return list(set( - self._base_features+ - self.feature_extractor.feature_list - )) - - @property - def ml_model(self): - """ - ML model in Percolator. - It can be sklearn models or other models but implement - the methods `fit()` and `decision_function()` (or `predict_proba()`) - which are the same as sklearn models. - """ - return self._ml_model - - @ml_model.setter - def ml_model(self, model): - self._ml_model = model - - @property - def feature_extractor(self)->BaseFeatureExtractor: - """ - The feature extractor inherited from `BaseFeatureExtractor` - """ - return self._feature_extractor - - @feature_extractor.setter - def feature_extractor(self, fe:BaseFeatureExtractor): - self._feature_extractor = fe - - def extract_features(self, - psm_df:pd.DataFrame, - *args, **kwargs - )->pd.DataFrame: - """ - Extract features for rescoring. - - *args and **kwargs are used for - `self.feature_extractor.extract_features`. - - Parameters - ---------- - psm_df : pd.DataFrame - PSM DataFrame - - Returns - ------- - pd.DataFrame - psm_df with feature columns appended inplace. - """ - psm_df['ml_score'] = psm_df.score - psm_df = self._estimate_psm_fdr(psm_df) - return self._feature_extractor.extract_features( - psm_df, *args, **kwargs - ) - - def rescore(self, - df:pd.DataFrame - )->pd.DataFrame: - """ - Estimate ML scores and then FDRs (q-values) - - Parameters - ---------- - df : pd.DataFrame - psm_df - - Returns - ------- - pd.DataFrame - psm_df with `ml_score` and `fdr` columns updated inplace - """ - for i in range(self.iter_num): - df = self._cv_score(df) - df = self._estimate_fdr(df, 'psm', False) - df = self.feature_extractor.update_features(df) - df = self._estimate_fdr(df) - return df - - def run_rerank_workflow(self, - top_k_psm_df:pd.DataFrame, - rerank_column:str='spec_idx', - *args, **kwargs - )->pd.DataFrame: - """ - Run percolator workflow with reranking - the peptides for each spectrum. - - - self.extract_features() - - self.rescore() - - *args and **kwargs are used for - `self.feature_extractor.extract_features`. - - Parameters - ---------- - top_k_psm_df : pd.DataFrame - PSM DataFrame - - rerank_column : str - The column use to rerank PSMs. - - For example, use the following code to select - the top-ranked peptide for each spectrum. - ``` - rerank_column = 'spec_idx' # scan_num - idx = top_k_psm_df.groupby(['raw_name',rerank_column])['ml_score'].idxmax() - psm_df = top_k_psm_df.loc[idx].copy() - ``` - Returns - ------- - pd.DataFrame - Only top-scored PSM is returned for - each group of the `rerank_column`. - """ - top_k_psm_df = self.extract_features( - top_k_psm_df, *args, **kwargs - ) - idxmax = top_k_psm_df.groupby( - ['raw_name',rerank_column] - )['ml_score'].idxmax() - - df = top_k_psm_df.loc[idxmax].copy() - self._train_and_score(df) - - top_k_psm_df = self._predict(top_k_psm_df) - idxmax = top_k_psm_df.groupby( - ['raw_name',rerank_column] - )['ml_score'].idxmax() - return top_k_psm_df.loc[idxmax].copy() - - def run_rescore_workflow(self, - psm_df:pd.DataFrame, - *args, **kwargs - )->pd.DataFrame: - """ - Run percolator workflow: - - - self.extract_features() - - self.rescore() - - *args and **kwargs are used for - `self.feature_extractor.extract_features`. - - Parameters - ---------- - psm_df : pd.DataFrame - PSM DataFrame - - Returns - ------- - pd.DataFrame - psm_df with feature columns appended inplace. - """ - df = self.extract_features( - psm_df, *args, **kwargs - ) - return self.rescore(df) - - def _estimate_fdr_per_raw(self, - df:pd.DataFrame, - fdr_level:str - )->pd.DataFrame: - df_list = [] - for raw_name, df_raw in df.groupby('raw_name'): - df_list.append(self._estimate_fdr(df_raw, - fdr_level = fdr_level, - per_raw_fdr = False - )) - return pd.concat(df_list, ignore_index=True) - - def _estimate_psm_fdr(self, - df:pd.DataFrame, - )->pd.DataFrame: - return calculate_fdr(df, 'ml_score', 'decoy') - - def _estimate_fdr(self, - df:pd.DataFrame, - fdr_level:str=None, - per_raw_fdr:bool=None, - )->pd.DataFrame: - if fdr_level is None: - fdr_level = self.fdr_level - if per_raw_fdr is None: - per_raw_fdr = self.per_raw_fdr - - if per_raw_fdr: - return self._estimate_fdr_per_raw( - df, fdr_level=fdr_level - ) - - if fdr_level == 'psm': - return self._estimate_psm_fdr(df) - else: - if fdr_level == 'precursor': - _df = df.groupby([ - 'sequence','mods','mod_sites','charge','decoy' - ])['ml_score'].max() - elif fdr_level == 'peptide': - _df = df.groupby([ - 'sequence','mods','mod_sites','decoy' - ])['ml_score'].max() - else: - _df = df.groupby(['sequence','decoy'])['ml_score'].max() - _df = self._estimate_psm_fdr(_df) - df['fdr'] = fdr_from_ref( - df['ml_score'].values, _df['ml_score'].values, - _df['fdr'].values - ) - return df - - def _train(self, - train_t_df:pd.DataFrame, - train_d_df:pd.DataFrame - ): - train_t_df = train_t_df[train_t_df.fdr<=self.training_fdr] - - if len(train_t_df) > self.max_training_sample: - train_t_df = train_t_df.sample( - n=self.max_training_sample, - random_state=1337 - ) - if len(train_d_df) > self.max_training_sample: - train_d_df = train_d_df.sample( - n=self.max_training_sample, - random_state=1337 - ) - - train_df = pd.concat((train_t_df, train_d_df)) - train_label = np.ones(len(train_df),dtype=np.int8) - train_label[len(train_t_df):] = 0 - - self._ml_model.fit( - train_df[self.feature_list].values, - train_label - ) - - def _predict(self, test_df): - try: - test_df['ml_score'] = self._ml_model.decision_function( - test_df[self.feature_list].values - ) - except AttributeError: - test_df['ml_score'] = self._ml_model.predict_proba( - test_df[self.feature_list].values - ) - return test_df - - def _train_and_score(self, - df:pd.DataFrame - )->pd.DataFrame: - - df_target = df[df.decoy == 0] - df_decoy = df[df.decoy != 0] - - if ( - np.sum(df_target.fdr<=self.training_fdr) < - self.min_training_sample or - len(df_decoy) < self.min_training_sample - ): - return df - - self._train(df_target, df_decoy) - test_df = pd.concat( - [df_target, df_decoy], - ignore_index=True - ) - - return self._predict(test_df) - - def _cv_score(self, df:pd.DataFrame)->pd.DataFrame: - """ - Apply cross-validation for rescoring. - - It will split `df` into K folds. For each fold, - its ML scores are predicted by a model which - is trained by other K-1 folds . - - Parameters - ---------- - df : pd.DataFrame - PSMs to be rescored - - Returns - ------- - pd.DataFrame - PSMs after rescoring - """ - - if self.cv_fold <= 1: - return self._train_and_score(df) - - df = df.sample( - frac=1, random_state=1337 - ).reset_index(drop=True) - - df_target = df[df.decoy == 0] - df_decoy = df[df.decoy != 0] - - if ( - np.sum(df_target.fdr<=self.training_fdr) < - self.min_training_sample*self.cv_fold - or len(df_decoy) < - self.min_training_sample*self.cv_fold - ): - return df - - test_df_list = [] - for i in range(self.cv_fold): - t_mask = np.ones(len(df_target), dtype=bool) - _slice = slice(i, len(df_target), self.cv_fold) - t_mask[_slice] = False - train_t_df = df_target[t_mask] - test_t_df = df_target[_slice] - - d_mask = np.ones(len(df_decoy), dtype=bool) - _slice = slice(i, len(df_decoy), self.cv_fold) - d_mask[_slice] = False - train_d_df = df_decoy[d_mask] - test_d_df = df_decoy[_slice] - - self._train(train_t_df, train_d_df) - - test_df = pd.concat((test_t_df, test_d_df)) - test_df_list.append(self._predict(test_df)) - - return pd.concat(test_df_list, ignore_index=True) - -class SupervisedPercolator(Percolator): - """ - DIA-NN like scoring. - """ - def __init__(self): - super().__init__() - self.training_fdr = 100000 # disable target filtration on FDR, which is the same as DiaNN but different from Percolator - - def rescore(self, psm_df:pd.DataFrame)->pd.DataFrame: - # We don't need iteration anymore, - # but cross validation may be still necessary - psm_df = self._cv_score(psm_df) - return self._estimate_fdr(psm_df) \ No newline at end of file diff --git a/alphabase/spectral_library/base.py b/alphabase/spectral_library/base.py index 7e4ba3e9..972db75c 100644 --- a/alphabase/spectral_library/base.py +++ b/alphabase/spectral_library/base.py @@ -6,10 +6,25 @@ import warnings import re -import alphabase.peptide.fragment as fragment -import alphabase.peptide.precursor as precursor +from alphabase.peptide.fragment import ( + create_fragment_mz_dataframe, + calc_fragment_count, + filter_fragment_number, + join_left, + remove_unused_fragments, +) +from alphabase.peptide.precursor import ( + update_precursor_mz, + refine_precursor_df, + calc_precursor_isotope_intensity_mp, + calc_precursor_isotope_intensity, + calc_precursor_isotope_info_mp, + calc_precursor_isotope_info, + hash_precursor_df, +) from alphabase.io.hdf import HDF_File + class SpecLibBase(object): """ Base spectral library in alphabase and alphapeptdeep. @@ -29,50 +44,59 @@ class SpecLibBase(object): same as `decoy` in Parameters in :meth:`__init__`. """ - key_numeric_columns:list = [ - 'ccs_pred', 'charge', - 'decoy', - 'frag_stop_idx', 'frag_start_idx', - 'isotope_m1_intensity', 'isotope_m1_mz', - 'isotope_apex_mz', 'isotope_apex_intensity', - 'isotope_apex_offset', - 'isotope_right_most_mz', 'isotope_right_most_intensity', - 'isotope_right_most_offset', - 'miss_cleavage', - 'mobility_pred', 'mobility', - 'nAA', 'precursor_mz', - 'rt_pred', 'rt_norm_pred', 'rt', - 'labeling_channel', + key_numeric_columns: list = [ + "ccs_pred", + "charge", + "decoy", + "frag_stop_idx", + "frag_start_idx", + "isotope_m1_intensity", + "isotope_m1_mz", + "isotope_apex_mz", + "isotope_apex_intensity", + "isotope_apex_offset", + "isotope_right_most_mz", + "isotope_right_most_intensity", + "isotope_right_most_offset", + "miss_cleavage", + "mobility_pred", + "mobility", + "nAA", + "precursor_mz", + "rt_pred", + "rt_norm_pred", + "rt", + "labeling_channel", ] """ - list of str: Key numeric columns to be saved - into library/precursor_df in the hdf file for fast loading, + list of str: Key numeric columns to be saved + into library/precursor_df in the hdf file for fast loading, others will be saved into library/mod_seq_df instead. """ - def __init__(self, - # ['b_z1','b_z2','y_z1','y_modloss_z1', ...]; - # 'b_z1': 'b' is the fragment type and + def __init__( + self, + # ['b_z1','b_z2','y_z1','y_modloss_z1', ...]; + # 'b_z1': 'b' is the fragment type and # 'z1' is the charge state z=1. - charged_frag_types:typing.List[str] = [ - 'b_z1','b_z2','y_z1', 'y_z2' - ], - precursor_mz_min = 400, precursor_mz_max = 6000, - decoy:str = None, + charged_frag_types: typing.List[str] = ["b_z1", "b_z2", "y_z1", "y_z2"], + precursor_mz_min=400, + precursor_mz_max=6000, + decoy: str = None, ): """ Parameters ---------- charged_frag_types : typing.List[str], optional - fragment types with charge. + fragment types with charge. Defaults to [ 'b_z1','b_z2','y_z1', 'y_z2' ]. precursor_mz_min : int, optional - Use this to clip precursor df. + Use this to clip precursor df. Defaults to 400. precursor_mz_max : int, optional - Use this to clip precursor df. + Use this to clip precursor df. Defaults to 6000. decoy : str, optional @@ -87,9 +111,9 @@ def __init__(self, self.max_precursor_mz = precursor_mz_max self.decoy = decoy - + @property - def precursor_df(self)->pd.DataFrame: + def precursor_df(self) -> pd.DataFrame: """ Precursor dataframe with columns 'sequence', 'mods', 'mod_sites', 'charge', etc, @@ -98,45 +122,44 @@ def precursor_df(self)->pd.DataFrame: return self._precursor_df @precursor_df.setter - def precursor_df(self, df:pd.DataFrame): + def precursor_df(self, df: pd.DataFrame): self._precursor_df = df - precursor.refine_precursor_df( + refine_precursor_df( self._precursor_df, drop_frag_idx=False, ensure_data_validity=True, ) @property - def peptide_df(self)->pd.DataFrame: + def peptide_df(self) -> pd.DataFrame: """ Peptide dataframe with columns 'sequence', 'mods', 'mod_sites', 'charge', etc, - identical to :attr:`precursor_df`. + identical to :attr:`precursor_df`. """ return self._precursor_df @peptide_df.setter - def peptide_df(self, df:pd.DataFrame): + def peptide_df(self, df: pd.DataFrame): self.precursor_df = df @property - def fragment_mz_df(self)->pd.DataFrame: + def fragment_mz_df(self) -> pd.DataFrame: """ - The fragment mz dataframe with + The fragment mz dataframe with fragment types as columns (['b_z1', 'y_z2', ...]) """ return self._fragment_mz_df @property - def fragment_intensity_df(self)->pd.DataFrame: + def fragment_intensity_df(self) -> pd.DataFrame: """ - The fragment intensity dataframe with + The fragment intensity dataframe with fragment types as columns (['b_z1', 'y_z2', ...]) """ return self._fragment_intensity_df - - def available_dense_fragment_dfs(self)->list: + def available_dense_fragment_dfs(self) -> list: """ Return the available dense fragment dataframes By dynamically checking the attributes of the object. @@ -147,15 +170,12 @@ def available_dense_fragment_dfs(self)->list: list List of available fragment dataframes """ - return [ - attr for attr in dir(self) - if re.match(r'_fragment_.*_df', attr) - ] - + return [attr for attr in dir(self) if re.match(r"_fragment_.*_df", attr)] + def copy(self): """ Return a copy of the spectral library object. - + Returns ------- SpecLibBase @@ -165,25 +185,30 @@ def copy(self): new_instance.__dict__ = copy.deepcopy(self.__dict__) return new_instance - + def append( - self, - other : 'SpecLibBase', - dfs_to_append : typing.List[str] = ['_precursor_df','_fragment_intensity_df', '_fragment_mz_df','_fragment_intensity_predicted_df'], - remove_unused_dfs:bool = True, - ): + self, + other: "SpecLibBase", + dfs_to_append: typing.List[str] = [ + "_precursor_df", + "_fragment_intensity_df", + "_fragment_mz_df", + "_fragment_intensity_predicted_df", + ], + remove_unused_dfs: bool = True, + ): """ - Append another SpecLibBase object to the current one in place. + Append another SpecLibBase object to the current one in place. All matching dataframes in the second object will be appended to the current one. Dataframes missing in the current object will be ignored. All matching columns in the second object will be appended to the current one. Columns missing in the current object will be ignored. Dataframes and columns missing in the second object will raise an error. - + Parameters ---------- other : SpecLibBase Second SpecLibBase object to be appended. - + dfs_to_append : list, optional List of dataframes to be appended. Defaults to ['_precursor_df','_fragment_intensity_df', '_fragment_mz_df','_fragment_intensity_predicted_df']. @@ -191,11 +216,11 @@ def append( remove_unused_dfs : bool, optional Remove dataframes from the current library that are not used in the append, this is crucial when using the remove unused fragments function after appending a library, inorder to have all fragment dataframes of the same size. When set to false the unused dataframes will be kept. - + Returns ------- None - + """ if remove_unused_dfs: current_frag_dfs = self.available_dense_fragment_dfs() @@ -212,7 +237,7 @@ def check_matching_columns(df1, df2): raise ValueError( f"The columns are not compatible. {missing_columns} are missing in the dataframe which should be appended." ) - + missing_columns = set(df2.columns) - set(df1.columns) if len(missing_columns) > 0: warnings.warn( @@ -220,16 +245,14 @@ def check_matching_columns(df1, df2): ) return df1.columns.values - + # get subset of dataframes and columns to append # will fail if the speclibs are not compatible matching_columns = [] for attr in dfs_to_append: if hasattr(self, attr) and hasattr(other, attr): matching_columns.append( - check_matching_columns( - getattr(self, attr), getattr(other, attr) - ) + check_matching_columns(getattr(self, attr), getattr(other, attr)) ) elif hasattr(self, attr) and not hasattr(other, attr): raise ValueError( @@ -241,7 +264,7 @@ def check_matching_columns(df1, df2): n_fragments = [] # get subset of dfs_to_append starting with _fragment for attr in dfs_to_append: - if attr.startswith('_fragment'): + if attr.startswith("_fragment"): if hasattr(self, attr): n_current_fragments = len(getattr(self, attr)) if n_current_fragments > 0: @@ -249,54 +272,42 @@ def check_matching_columns(df1, df2): if not np.all(np.array(n_fragments) == n_fragments[0]): raise ValueError( - f"The libraries can't be appended as the number of fragments in the current libraries are not the same." + "The libraries can't be appended as the number of fragments in the current libraries are not the same." ) - - for attr, matching_columns in zip( - dfs_to_append, - matching_columns - ): + + for attr, matching_columns in zip(dfs_to_append, matching_columns): if hasattr(self, attr) and hasattr(other, attr): - current_df = getattr(self, attr) # copy dataframes to avoid changing the original ones other_df = getattr(other, attr)[matching_columns].copy() - if attr.startswith('_precursor'): - + if attr.startswith("_precursor"): frag_idx_increment = 0 - for fragment_df in ['_fragment_intensity_df', '_fragment_mz_df']: + for fragment_df in ["_fragment_intensity_df", "_fragment_mz_df"]: if hasattr(self, fragment_df): if len(getattr(self, fragment_df)) > 0: frag_idx_increment = len(getattr(self, fragment_df)) - - if 'frag_start_idx' in other_df.columns: - other_df['frag_start_idx'] += frag_idx_increment - if 'frag_stop_idx' in other_df.columns: - other_df['frag_stop_idx'] += frag_idx_increment + if "frag_start_idx" in other_df.columns: + other_df["frag_start_idx"] += frag_idx_increment + + if "frag_stop_idx" in other_df.columns: + other_df["frag_stop_idx"] += frag_idx_increment setattr( - self, attr, + self, + attr, pd.concat( - [ - current_df, - other_df - ], - axis=0, - ignore_index=True, - sort=False - ).reset_index(drop=True) + [current_df, other_df], axis=0, ignore_index=True, sort=False + ).reset_index(drop=True), ) def refine_df(self): """ Sort nAA and reset_index for faster calculation (or prediction) """ - precursor.refine_precursor_df( - self._precursor_df - ) + refine_precursor_df(self._precursor_df) def append_decoy_sequence(self): """ @@ -309,30 +320,29 @@ def append_decoy_sequence(self): ... ``` """ - from alphabase.spectral_library.decoy import ( - decoy_lib_provider - ) + from alphabase.spectral_library.decoy import decoy_lib_provider + # register 'protein_reverse' to the decoy_lib_provider - import alphabase.protein.protein_level_decoy + from alphabase.protein.protein_level_decoy import register_decoy - decoy_lib = ( - decoy_lib_provider.get_decoy_lib( - self.decoy, self - ) - ) - if decoy_lib is None: return None + register_decoy() + + decoy_lib = decoy_lib_provider.get_decoy_lib(self.decoy, self) + if decoy_lib is None: + return None decoy_lib.decoy_sequence() decoy_lib.append_to_target_lib() def clip_by_precursor_mz_(self): - ''' + """ Clip self._precursor_df inplace by self.min_precursor_mz and self.max_precursor_mz - ''' + """ self._precursor_df.drop( self._precursor_df.loc[ - (self._precursor_df['precursor_mz']self.max_precursor_mz) - ].index, inplace=True + (self._precursor_df["precursor_mz"] < self.min_precursor_mz) + | (self._precursor_df["precursor_mz"] > self.max_precursor_mz) + ].index, + inplace=True, ) self._precursor_df.reset_index(drop=True, inplace=True) @@ -340,7 +350,7 @@ def calc_precursor_mz(self): """ Calculate precursor mz for self._precursor_df """ - fragment.update_precursor_mz(self._precursor_df) + update_precursor_mz(self._precursor_df) def calc_and_clip_precursor_mz(self): """ @@ -350,17 +360,18 @@ def calc_and_clip_precursor_mz(self): self.calc_precursor_mz() self.clip_by_precursor_mz_() - def calc_precursor_isotope_intensity(self, - max_isotope = 6, - min_right_most_intensity = 0.001, - mp_batch_size = 10000, - mp_process_num = 8, - normalize:typing.Literal['mono','sum'] = "sum", + def calc_precursor_isotope_intensity( + self, + max_isotope=6, + min_right_most_intensity=0.001, + mp_batch_size=10000, + mp_process_num=8, + normalize: typing.Literal["mono", "sum"] = "sum", ): """ Calculate and append the isotope intensity columns into self.precursor_df. - See `alphabase.peptide.precursor.calc_precursor_isotope_intensity` for details. - + See `alphabase.peptide.calc_precursor_isotope_intensity` for details. + Parameters ---------- @@ -375,39 +386,36 @@ def calc_precursor_isotope_intensity(self, mp_processes : int, optional The number of processes for multiprocessing. - + """ - if 'precursor_mz' not in self._precursor_df.columns: + if "precursor_mz" not in self._precursor_df.columns: self.calc_and_clip_precursor_mz() - if mp_process_num>1 and len(self.precursor_df)>mp_batch_size: - ( - self._precursor_df - ) = precursor.calc_precursor_isotope_intensity_mp( - self.precursor_df, - max_isotope = max_isotope, - min_right_most_intensity = min_right_most_intensity, + if mp_process_num > 1 and len(self.precursor_df) > mp_batch_size: + (self._precursor_df) = calc_precursor_isotope_intensity_mp( + self.precursor_df, + max_isotope=max_isotope, + min_right_most_intensity=min_right_most_intensity, normalize=normalize, - mp_process_num = mp_process_num, + mp_process_num=mp_process_num, mp_batch_size=mp_batch_size, ) else: - ( - self._precursor_df - ) = precursor.calc_precursor_isotope_intensity( - self.precursor_df, - max_isotope = max_isotope, + (self._precursor_df) = calc_precursor_isotope_intensity( + self.precursor_df, + max_isotope=max_isotope, normalize=normalize, - min_right_most_intensity = min_right_most_intensity, + min_right_most_intensity=min_right_most_intensity, ) - def calc_precursor_isotope(self, - max_isotope = 6, - min_right_most_intensity = 0.001, - mp_batch_size = 10000, - mp_process_num = 8, - normalize:typing.Literal['mono','sum'] = "sum", + def calc_precursor_isotope( + self, + max_isotope=6, + min_right_most_intensity=0.001, + mp_batch_size=10000, + mp_process_num=8, + normalize: typing.Literal["mono", "sum"] = "sum", ): return self.calc_precursor_isotope_intensity( max_isotope=max_isotope, @@ -415,64 +423,49 @@ def calc_precursor_isotope(self, normalize=normalize, mp_batch_size=mp_batch_size, mp_process_num=mp_process_num, - ) - - def calc_precursor_isotope_info(self, - mp_process_num:int=8, + ) + + def calc_precursor_isotope_info( + self, + mp_process_num: int = 8, mp_process_bar=None, - mp_batch_size = 10000, + mp_batch_size=10000, ): """ Append isotope columns into self.precursor_df. - See `alphabase.peptide.precursor.calc_precursor_isotope` for details. + See `alphabase.peptide.calc_precursor_isotope` for details. """ - if 'precursor_mz' not in self._precursor_df.columns: + if "precursor_mz" not in self._precursor_df.columns: self.calc_and_clip_precursor_mz() - if ( - mp_process_num > 1 and - len(self.precursor_df)>mp_batch_size - ): - ( - self._precursor_df - ) = precursor.calc_precursor_isotope_info_mp( - self.precursor_df, + if mp_process_num > 1 and len(self.precursor_df) > mp_batch_size: + (self._precursor_df) = calc_precursor_isotope_info_mp( + self.precursor_df, processes=mp_process_num, process_bar=mp_process_bar, ) else: - ( - self._precursor_df - ) = precursor.calc_precursor_isotope_info( - self.precursor_df - ) + (self._precursor_df) = calc_precursor_isotope_info(self.precursor_df) def calc_fragment_mz_df(self): """ TODO: use multiprocessing here or in the `create_fragment_mz_dataframe` function. """ - if ( - self.charged_frag_types is not None - or len(self.charged_frag_types) - ): - ( - self._fragment_mz_df - ) = fragment.create_fragment_mz_dataframe( - self.precursor_df, self.charged_frag_types, + if self.charged_frag_types is not None or len(self.charged_frag_types): + (self._fragment_mz_df) = create_fragment_mz_dataframe( + self.precursor_df, + self.charged_frag_types, ) else: - print('Skip fragment calculation as self.charged_frag_types is None or empty') + print( + "Skip fragment calculation as self.charged_frag_types is None or empty" + ) def hash_precursor_df(self): """Insert hash codes for peptides and precursors""" - precursor.hash_precursor_df( - self._precursor_df - ) - - def annotate_fragments_from_speclib(self, - donor_speclib, - verbose = True - ): + hash_precursor_df(self._precursor_df) + + def annotate_fragments_from_speclib(self, donor_speclib, verbose=True): """ Annotate self.precursor_df with fragments from donor_speclib. The donor_speclib must have a fragment_mz_df and can optionally have a fragment_intensity_df. @@ -485,16 +478,14 @@ def annotate_fragments_from_speclib(self, verbose : bool, optional Print progress, by default True, for example:: - + 2022-12-16 00:52:08> Speclib with 4 precursors will be reannotated with speclib with 12 precursors and 504 fragments 2022-12-16 00:52:08> A total of 4 precursors were succesfully annotated, 0 precursors were not matched - - + + """ - self = annotate_fragments_from_speclib( - self, donor_speclib, verbose = verbose - ) - + self = annotate_fragments_from_speclib(self, donor_speclib, verbose=verbose) + def remove_unused_fragments(self): """ Remove unused fragments from all available fragment dataframes. @@ -503,36 +494,29 @@ def remove_unused_fragments(self): available_fragments_df = self.available_dense_fragment_dfs() non_zero_dfs = [ - df for df in available_fragments_df - if len(getattr(self, df)) > 0 + df for df in available_fragments_df if len(getattr(self, df)) > 0 ] - to_compress = [ - getattr(self, df) for df in non_zero_dfs - ] - self._precursor_df, compressed_dfs = fragment.remove_unused_fragments( + to_compress = [getattr(self, df) for df in non_zero_dfs] + self._precursor_df, compressed_dfs = remove_unused_fragments( self._precursor_df, to_compress ) for df, compressed_df in zip(non_zero_dfs, compressed_dfs): setattr(self, df, compressed_df) - def calc_fragment_count(self): """ - Count the number of non-zero fragments for each precursor. + Count the number of non-zero fragments for each Creates the column 'n_fragments' in self._precursor_df. """ - self._precursor_df['n_fragments'] = fragment.calc_fragment_count( - self._precursor_df, - self._fragment_intensity_df + self._precursor_df["n_fragments"] = calc_fragment_count( + self._precursor_df, self._fragment_intensity_df ) - + def filter_fragment_number( - self, - n_fragments_allowed_column_name='n_fragments_allowed', - n_allowed=999 - ): + self, n_fragments_allowed_column_name="n_fragments_allowed", n_allowed=999 + ): """ Filter the top k fragments for each precursor based on a global setting and a precursor wise column. The smaller one will be used. Can be used to make sure that target and decoy have the same number of fragments. @@ -540,34 +524,29 @@ def filter_fragment_number( Parameters ---------- n_fragments_allowed_column_name : str, optional, default 'n_fragments_allowed' - The column name in self._precursor_df that contains the number of fragments allowed for each precursor. + The column name in self._precursor_df that contains the number of fragments allowed for each n_allowed : int, optional, default 999 - The global setting for the number of fragments allowed for each precursor. + The global setting for the number of fragments allowed for each """ - fragment.filter_fragment_number( + filter_fragment_number( self._precursor_df, self._fragment_intensity_df, n_fragments_allowed_column_name=n_fragments_allowed_column_name, - n_allowed=n_allowed + n_allowed=n_allowed, ) - def _get_hdf_to_save(self, - hdf_file, - delete_existing=False - ): + def _get_hdf_to_save(self, hdf_file, delete_existing=False): """Internal function to get a HDF group to write""" _hdf = HDF_File( - hdf_file, - read_only=False, - truncate=True, - delete_existing=delete_existing + hdf_file, read_only=False, truncate=True, delete_existing=delete_existing ) return _hdf.library - def _get_hdf_to_load(self, - hdf_file, + def _get_hdf_to_load( + self, + hdf_file, ): """Internal function to get a HDF group to read""" _hdf = HDF_File( @@ -575,22 +554,15 @@ def _get_hdf_to_load(self, ) return _hdf.library - def save_df_to_hdf(self, - hdf_file:str, - df_key: str, - df: pd.DataFrame, - delete_existing=False + def save_df_to_hdf( + self, hdf_file: str, df_key: str, df: pd.DataFrame, delete_existing=False ): """Save a new HDF group or dataset into existing HDF file""" - self._get_hdf_to_save( - hdf_file, - delete_existing=delete_existing - ).add_group(df_key, df) - - def load_df_from_hdf(self, - hdf_file:str, - df_name: str - )->pd.DataFrame: + self._get_hdf_to_save(hdf_file, delete_existing=delete_existing).add_group( + df_key, df + ) + + def load_df_from_hdf(self, hdf_file: str, df_name: str) -> pd.DataFrame: """Load specific dataset (dataframe) from hdf_file. Parameters @@ -606,66 +578,55 @@ def load_df_from_hdf(self, pd.DataFrame Loaded dataframe """ - return self._get_hdf_to_load( - hdf_file - ).__getattribute__(df_name).values + return self._get_hdf_to_load(hdf_file).__getattribute__(df_name).values - def save_hdf(self, hdf_file:str): + def save_hdf(self, hdf_file: str): """Save library dataframes into hdf_file. For `self.precursor_df`, this method will save it into two hdf groups in hdf_file: `library/precursor_df` and `library/mod_seq_df`. - `library/precursor_df` contains all essential numberic columns those + `library/precursor_df` contains all essential numberic columns those can be loaded faster from hdf file into memory: 'precursor_mz', 'charge', 'mod_seq_hash', 'mod_seq_charge_hash', 'frag_start_idx', 'frag_stop_idx', 'decoy', 'rt_pred', 'ccs_pred', - 'mobility_pred', 'miss_cleave', 'nAA', + 'mobility_pred', 'miss_cleave', 'nAA', ['isotope_mz_m1', 'isotope_intensity_m1'], ... - `library/mod_seq_df` contains all string columns and the other + `library/mod_seq_df` contains all string columns and the other not essential columns: 'sequence','mods','mod_sites', ['proteins', 'genes']... - as well as 'mod_seq_hash', 'mod_seq_charge_hash' columns to map + as well as 'mod_seq_hash', 'mod_seq_charge_hash' columns to map back to `precursor_df` Parameters ---------- hdf_file : str the hdf file path to save - + """ - _hdf = HDF_File( - hdf_file, - read_only=False, - truncate=True, - delete_existing=True - ) - if 'mod_seq_charge_hash' not in self._precursor_df.columns: + _hdf = HDF_File(hdf_file, read_only=False, truncate=True, delete_existing=True) + if "mod_seq_charge_hash" not in self._precursor_df.columns: self.hash_precursor_df() - key_columns = self.key_numeric_columns+[ - 'mod_seq_hash', 'mod_seq_charge_hash' - ] + key_columns = self.key_numeric_columns + ["mod_seq_hash", "mod_seq_charge_hash"] _hdf.library = { - 'mod_seq_df': self._precursor_df[ + "mod_seq_df": self._precursor_df[ [ - col for col in self._precursor_df.columns + col + for col in self._precursor_df.columns if col not in self.key_numeric_columns ] ], - 'precursor_df': self._precursor_df[ - [ - col for col in self._precursor_df.columns - if col in key_columns - ] + "precursor_df": self._precursor_df[ + [col for col in self._precursor_df.columns if col in key_columns] ], - 'fragment_mz_df': self._fragment_mz_df, - 'fragment_intensity_df': self._fragment_intensity_df, + "fragment_mz_df": self._fragment_mz_df, + "fragment_intensity_df": self._fragment_intensity_df, } - - def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): + + def load_hdf(self, hdf_file: str, load_mod_seq: bool = False): """Load the hdf library from hdf_file Parameters @@ -674,48 +635,49 @@ def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): hdf library path to load load_mod_seq : bool, optional - if also load mod_seq_df. + if also load mod_seq_df. Defaults to False. - + """ _hdf = HDF_File( hdf_file, ) - self._precursor_df:pd.DataFrame = _hdf.library.precursor_df.values + self._precursor_df: pd.DataFrame = _hdf.library.precursor_df.values if load_mod_seq: - key_columns = self.key_numeric_columns+[ - 'mod_seq_hash', 'mod_seq_charge_hash' + key_columns = self.key_numeric_columns + [ + "mod_seq_hash", + "mod_seq_charge_hash", ] mod_seq_df = _hdf.library.mod_seq_df.values - cols = [ - col for col in mod_seq_df.columns - if col not in key_columns - ] + cols = [col for col in mod_seq_df.columns if col not in key_columns] self._precursor_df[cols] = mod_seq_df[cols] - + self._fragment_mz_df = _hdf.library.fragment_mz_df.values self._fragment_intensity_df = _hdf.library.fragment_intensity_df.values self._fragment_mz_df = self._fragment_mz_df[ [ - frag for frag in self.charged_frag_types + frag + for frag in self.charged_frag_types if frag in self._fragment_mz_df.columns ] ] self._fragment_intensity_df = self._fragment_intensity_df[ [ - frag for frag in self.charged_frag_types + frag + for frag in self.charged_frag_types if frag in self._fragment_intensity_df.columns ] ] - + + def annotate_fragments_from_speclib( - speclib: SpecLibBase, + speclib: SpecLibBase, fragment_speclib: SpecLibBase, - verbose = True, -)->SpecLibBase: + verbose=True, +) -> SpecLibBase: """Reannotate an SpecLibBase library with fragments from a different SpecLibBase. - + Parameters ---------- speclib: alphabase.spectral_library.library_base.SpecLibBase @@ -729,16 +691,20 @@ def annotate_fragments_from_speclib( alphabase.spectral_library.library_base.SpecLibBase newly annotated spectral library - + """ if verbose: num_precursor_left = len(speclib.precursor_df) num_precursor_right = len(fragment_speclib.precursor_df) - num_fragments_right = len(fragment_speclib.fragment_mz_df) * len(fragment_speclib.fragment_mz_df.columns) - logging.info(f'Speclib with {num_precursor_left:,} precursors will be reannotated with speclib with {num_precursor_right:,} precursors and {num_fragments_right:,} fragments') + num_fragments_right = len(fragment_speclib.fragment_mz_df) * len( + fragment_speclib.fragment_mz_df.columns + ) + logging.info( + f"Speclib with {num_precursor_left:,} precursors will be reannotated with speclib with {num_precursor_right:,} precursors and {num_fragments_right:,} fragments" + ) # reannotation is based on mod_seq_hash column - hash_column_name = 'mod_seq_hash' + hash_column_name = "mod_seq_hash" # create hash columns if missing if hash_column_name not in speclib.precursor_df.columns: @@ -750,25 +716,30 @@ def annotate_fragments_from_speclib( speclib_hash = speclib.precursor_df[hash_column_name].values fragment_speclib_hash = fragment_speclib.precursor_df[hash_column_name].values - speclib_indices = fragment.join_left(speclib_hash, fragment_speclib_hash) + speclib_indices = join_left(speclib_hash, fragment_speclib_hash) - matched_mask = (speclib_indices >= 0) + matched_mask = speclib_indices >= 0 if verbose: matched_count = np.sum(matched_mask) not_matched_count = np.sum(~matched_mask) - - logging.info(f'A total of {matched_count:,} precursors were succesfully annotated, {not_matched_count:,} precursors were not matched') + logging.info( + f"A total of {matched_count:,} precursors were succesfully annotated, {not_matched_count:,} precursors were not matched" + ) + + frag_start_idx = fragment_speclib.precursor_df["frag_start_idx"].values[ + speclib_indices + ] + frag_stop_idx = fragment_speclib.precursor_df["frag_stop_idx"].values[ + speclib_indices + ] - frag_start_idx = fragment_speclib.precursor_df['frag_start_idx'].values[speclib_indices] - frag_stop_idx = fragment_speclib.precursor_df['frag_stop_idx'].values[speclib_indices] - speclib._precursor_df = speclib._precursor_df[matched_mask].copy() - speclib._precursor_df['frag_start_idx'] = frag_start_idx[matched_mask] - speclib._precursor_df['frag_stop_idx'] = frag_stop_idx[matched_mask] + speclib._precursor_df["frag_start_idx"] = frag_start_idx[matched_mask] + speclib._precursor_df["frag_stop_idx"] = frag_stop_idx[matched_mask] speclib._fragment_mz_df = fragment_speclib._fragment_mz_df.copy() speclib._fragment_intensity_df = fragment_speclib._fragment_intensity_df.copy() - return speclib \ No newline at end of file + return speclib diff --git a/alphabase/spectral_library/decoy.py b/alphabase/spectral_library/decoy.py index fe490b4e..2f3e4dc2 100644 --- a/alphabase/spectral_library/decoy.py +++ b/alphabase/spectral_library/decoy.py @@ -2,19 +2,21 @@ from typing import Any import pandas as pd import multiprocessing as mp -from functools import partial from alphabase.spectral_library.base import SpecLibBase -from alphabase.io.hdf import HDF_File + def _batchify_series(series, mp_batch_size): """Internal funciton for multiprocessing""" for i in range(0, len(series), mp_batch_size): - yield series.iloc[i:i+mp_batch_size] + yield series.iloc[i : i + mp_batch_size] + + class BaseDecoyGenerator(object): """ Base class for decoy generator. A class is used instead of a function to make as it needs to be pickled for multiprocessing. """ + def __call__(self, series: pd.Series) -> pd.Series: """ Main entry of this class, it calls follows methods: @@ -23,15 +25,16 @@ def __call__(self, series: pd.Series) -> pd.Series: return series.apply(self._decoy) - def _decoy(self, sequence:str) -> str: - raise NotImplementedError('Subclass should implement this method.') + def _decoy(self, sequence: str) -> str: + raise NotImplementedError("Subclass should implement this method.") -class DIANNDecoyGenerator(BaseDecoyGenerator): - def __init__(self, - raw_AAs:str = 'GAVLIFMPWSCTYHKRQENDBJOUXZ', - mutated_AAs:str = 'LLLVVLLLLTSSSSLLNDQEVVVVVV' - ): +class DIANNDecoyGenerator(BaseDecoyGenerator): + def __init__( + self, + raw_AAs: str = "GAVLIFMPWSCTYHKRQENDBJOUXZ", + mutated_AAs: str = "LLLVVLLLLTSSSSLLNDQEVVVVVV", + ): """ DiaNN-like decoy peptide generator @@ -39,27 +42,29 @@ def __init__(self, ---------- raw_AAs : str, optional - AAs those DiaNN decoy from. + AAs those DiaNN decoy from. Defaults to 'GAVLIFMPWSCTYHKRQENDBJOUXZ'. mutated_AAs : str, optional - AAs those DiaNN decoy to. + AAs those DiaNN decoy to. Defaults to 'LLLVVLLLLTSSSSLLNDQEVVVVVV'. - + """ self.raw_AAs = raw_AAs self.mutated_AAs = mutated_AAs - def _decoy(self, sequence: str) -> str: - return sequence[0]+ \ - self.mutated_AAs[self.raw_AAs.index(sequence[1])]+ \ - sequence[2:-2]+ \ - self.mutated_AAs[self.raw_AAs.index(sequence[-2])]+ \ - sequence[-1] + return ( + sequence[0] + + self.mutated_AAs[self.raw_AAs.index(sequence[1])] + + sequence[2:-2] + + self.mutated_AAs[self.raw_AAs.index(sequence[-2])] + + sequence[-1] + ) + class PseudoReverseDecoyGenerator(BaseDecoyGenerator): - def __init__(self, fix_C_term:bool=True): + def __init__(self, fix_C_term: bool = True): """ Pseudo-reverse decoy generator. @@ -67,7 +72,7 @@ def __init__(self, fix_C_term:bool=True): ---------- fix_C_term : bool, optional - If fix C-term AA when decoy. + If fix C-term AA when decoy. Defaults to True. """ @@ -75,17 +80,19 @@ def __init__(self, fix_C_term:bool=True): def _decoy(self, sequence: str) -> str: if self.fix_C_term: - return (sequence[:-1][::-1] + sequence[-1]) + return sequence[:-1][::-1] + sequence[-1] else: return sequence[::-1] + class SpecLibDecoy(SpecLibBase): """ Pseudo-reverse peptide decoy generator. """ - def __init__(self, - target_lib:SpecLibBase, + def __init__( + self, + target_lib: SpecLibBase, decoy_generator: Any = PseudoReverseDecoyGenerator, **kwargs, ): @@ -96,9 +103,9 @@ def __init__(self, Target library to decoy. fix_C_term : bool, optional - If fix C-term AA when decoy. + If fix C-term AA when decoy. Defaults to True. - + Attributes ---------- target_lib : SpecLibBase @@ -107,15 +114,11 @@ def __init__(self, self.__dict__ = copy.deepcopy(target_lib.__dict__) self.target_lib = target_lib - self.generator = decoy_generator( - **kwargs - ) + self.generator = decoy_generator(**kwargs) def translate_to_decoy( - self, - multiprocessing : bool = True, - mp_batch_size=10000, - mp_process_num: int = 8): + self, multiprocessing: bool = True, mp_batch_size=10000, mp_process_num: int = 8 + ): """ Main entry of this class, it calls follows methods: - self.decoy_sequence() @@ -134,34 +137,30 @@ def translate_to_decoy( mp_process_num : int, optional Number of processes for multiprocessing. Defaults to 8. - + """ self.decoy_sequence( multiprocessing=multiprocessing, mp_batch_size=mp_batch_size, - mp_process_num=mp_process_num + mp_process_num=mp_process_num, ) def append_to_target_lib(self): """ A decoy method should define how to append itself to target_lib. - Sub-classes should override this method when necessary. + Sub-classes should override this method when necessary. """ self._remove_target_seqs() - self._precursor_df['decoy'] = 1 - self.target_lib._precursor_df['decoy'] = 0 - self.target_lib._precursor_df = pd.concat(( - self.target_lib._precursor_df, - self._precursor_df - ), ignore_index=True) + self._precursor_df["decoy"] = 1 + self.target_lib._precursor_df["decoy"] = 0 + self.target_lib._precursor_df = pd.concat( + (self.target_lib._precursor_df, self._precursor_df), ignore_index=True + ) self.target_lib.refine_df() def decoy_sequence( - self, - multiprocessing: bool = True, - mp_batch_size=10000, - mp_process_num: int = 8 - ): + self, multiprocessing: bool = True, mp_batch_size=10000, mp_process_num: int = 8 + ): """ Generate decoy sequences from `self.target_lib`. Sub-classes should override the `_decoy_seq` method when necessary. @@ -183,56 +182,51 @@ def decoy_sequence( """ if not multiprocessing or self._precursor_df.shape[0] < mp_batch_size: - self._precursor_df['sequence'] = self.generator(self._precursor_df['sequence']) + self._precursor_df["sequence"] = self.generator( + self._precursor_df["sequence"] + ) self._remove_target_seqs() return - - sequence_batches = list(_batchify_series( - self._precursor_df['sequence'], mp_batch_size - )) + + sequence_batches = list( + _batchify_series(self._precursor_df["sequence"], mp_batch_size) + ) series_list = [] with mp.get_context("spawn").Pool(mp_process_num) as p: - processing = p.imap( - self.generator, - sequence_batches - ) + processing = p.imap(self.generator, sequence_batches) for df in processing: series_list.append(df) - self._precursor_df['sequence'] = pd.concat(series_list) + self._precursor_df["sequence"] = pd.concat(series_list) self._remove_target_seqs() def _remove_target_seqs(self): - target_seqs = set( - self.target_lib._precursor_df.sequence.values - ) + target_seqs = set(self.target_lib._precursor_df.sequence.values) self._precursor_df.drop( - self._precursor_df.loc[ - self._precursor_df.sequence.isin(target_seqs) - ].index, inplace=True + self._precursor_df.loc[self._precursor_df.sequence.isin(target_seqs)].index, + inplace=True, ) + class SpecLibDecoyProvider(object): def __init__(self): self.decoy_dict = {} - def register(self, name:str, decoy_class:SpecLibDecoy): + def register(self, name: str, decoy_class: SpecLibDecoy): """Register a new decoy class""" self.decoy_dict[name.lower()] = decoy_class - def get_decoy_lib(self, - name:str, - target_lib:SpecLibBase, - **kwargs - )->SpecLibDecoy: - """Get an object of a subclass of `SpecLibDecoy` based on + def get_decoy_lib( + self, name: str, target_lib: SpecLibBase, **kwargs + ) -> SpecLibDecoy: + """Get an object of a subclass of `SpecLibDecoy` based on registered name. Parameters ---------- name : str Registered decoy class name - + target_lib : SpecLibBase Target library for decoy generation @@ -241,24 +235,24 @@ def get_decoy_lib(self, SpecLibDecoy Decoy library object """ - if not name: return None + if not name: + return None name = name.lower() if name == "none" or name == "null": return None if name in self.decoy_dict: return SpecLibDecoy( - target_lib, - decoy_generator = self.decoy_dict[name], - **kwargs + target_lib, decoy_generator=self.decoy_dict[name], **kwargs ) else: - raise ValueError(f'Decoy method {name} not found.') + raise ValueError(f"Decoy method {name} not found.") + -decoy_lib_provider:SpecLibDecoyProvider = SpecLibDecoyProvider() +decoy_lib_provider: SpecLibDecoyProvider = SpecLibDecoyProvider() """ -Factory object of `SpecLibDecoyProvider` to +Factory object of `SpecLibDecoyProvider` to register and get different types of decoy methods. """ -decoy_lib_provider.register('pseudo_reverse', PseudoReverseDecoyGenerator) -decoy_lib_provider.register('diann', DIANNDecoyGenerator) +decoy_lib_provider.register("pseudo_reverse", PseudoReverseDecoyGenerator) +decoy_lib_provider.register("diann", DIANNDecoyGenerator) diff --git a/alphabase/spectral_library/flat.py b/alphabase/spectral_library/flat.py index e50e3723..3257eb00 100644 --- a/alphabase/spectral_library/flat.py +++ b/alphabase/spectral_library/flat.py @@ -2,26 +2,21 @@ import numpy as np import warnings -from alphabase.spectral_library.base import ( - SpecLibBase -) -from alphabase.peptide.fragment import ( - flatten_fragments -) +from alphabase.spectral_library.base import SpecLibBase +from alphabase.peptide.fragment import flatten_fragments, remove_unused_fragments from alphabase.io.hdf import HDF_File -import alphabase.peptide.precursor as precursor class SpecLibFlat(SpecLibBase): - """ + """ Flatten the spectral library (SpecLibBase) by using :meth:`parse_base_library`. Attributes ---------- custom_fragment_df_columns : list of str - 'mz' and 'intensity' columns are required in :attr:`fragment_df`, - others could be customized. + 'mz' and 'intensity' columns are required in :attr:`fragment_df`, + others could be customized. It can include ['type','number','position','charge','loss_type']. min_fragment_intensity : float @@ -29,25 +24,31 @@ class SpecLibFlat(SpecLibBase): keep_top_k_fragments : float top k highest peaks to keep in :attr:`fragment_df`. - + """ - key_numeric_columns = SpecLibBase.key_numeric_columns+[ - 'flat_frag_start_idx','flat_frag_stop_idx' + key_numeric_columns = SpecLibBase.key_numeric_columns + [ + "flat_frag_start_idx", + "flat_frag_stop_idx", ] - """ - :obj:`SpecLibBase.key_numeric_columns ` + """ + :obj:`SpecLibBase.key_numeric_columns ` + `['flat_frag_start_idx','flat_frag_stop_idx']`. """ - def __init__(self, - charged_frag_types:list = ['b_z1','b_z2','y_z1','y_z2'], - min_fragment_intensity:float = 0.001, - keep_top_k_fragments:int = 1000, - custom_fragment_df_columns:list = [ - 'type','number','position','charge','loss_type' + def __init__( + self, + charged_frag_types: list = ["b_z1", "b_z2", "y_z1", "y_z2"], + min_fragment_intensity: float = 0.001, + keep_top_k_fragments: int = 1000, + custom_fragment_df_columns: list = [ + "type", + "number", + "position", + "charge", + "loss_type", ], - **kwargs + **kwargs, ): """ Parameters @@ -59,7 +60,7 @@ def __init__(self, top k highest peaks to keep, by default 1000 custom_fragment_df_columns : list, optional - See :attr:`custom_fragment_df_columns`, + See :attr:`custom_fragment_df_columns`, defaults to ['type','number','position','charge','loss_type'] """ super().__init__(charged_frag_types=charged_frag_types) @@ -69,120 +70,119 @@ def __init__(self, self.custom_fragment_df_columns = custom_fragment_df_columns @property - def fragment_df(self)->pd.DataFrame: + def fragment_df(self) -> pd.DataFrame: """The flat fragment dataframe with columns (['mz', 'intensity'] + :attr:`custom_fragment_df_columns`.) """ return self._fragment_df @property - def protein_df(self)->pd.DataFrame: - """ Protein dataframe """ + def protein_df(self) -> pd.DataFrame: + """Protein dataframe""" return self._protein_df - + def available_dense_fragment_dfs(self): """Return the available dense fragment dataframes. This method is inherited from :class:`SpecLibBase` and will return an empty list for a flat library. """ return [] - + def remove_unused_fragments(self): """Remove unused fragments from fragment_df. This method is inherited from :class:`SpecLibBase` and has not been implemented for a flat library. """ - raise NotImplementedError("remove_unused_fragments is not implemented for a flat library") - - def parse_base_library(self, - library:SpecLibBase, - keep_original_frag_dfs:bool=False, - copy_precursor_df:bool=False, - **kwargs + self._precursor_df, (self._fragment_df,) = remove_unused_fragments( + self._precursor_df, + (self._fragment_df,), + frag_start_col="flat_frag_start_idx", + frag_stop_col="flat_frag_stop_idx", + ) + + def parse_base_library( + self, + library: SpecLibBase, + keep_original_frag_dfs: bool = False, + copy_precursor_df: bool = False, + **kwargs, ): - """ - Flatten an library object of SpecLibBase or its inherited class. + """ + Flatten an library object of SpecLibBase or its inherited class. This method will generate :attr:`precursor_df` and :attr:`fragment_df` - The fragments in fragment_df can be located by - `flat_frag_start_idx` and `flat_frag_stop_idx` in precursor_df. + The fragments in fragment_df can be located by + `flat_frag_start_idx` and `flat_frag_stop_idx` in precursor_df. Parameters ---------- library : SpecLibBase A library object with attributes `precursor_df`, `fragment_mz_df` and `fragment_intensity_df`. - + keep_original_frag_dfs : bool, default True - If `fragment_mz_df` and `fragment_intensity_df` are + If `fragment_mz_df` and `fragment_intensity_df` are kept in this library. copy_precursor_df : bool, default False - If True, make a copy of `precursor_df` from `library`, - otherwise `flat_frag_start_idx` and `flat_frag_stop_idx` + If True, make a copy of `precursor_df` from `library`, + otherwise `flat_frag_start_idx` and `flat_frag_stop_idx` columns will also append to the `library`. """ self._precursor_df, self._fragment_df = flatten_fragments( - library.precursor_df.copy() if copy_precursor_df else library.precursor_df, - library.fragment_mz_df, + library.precursor_df.copy() if copy_precursor_df else library.precursor_df, + library.fragment_mz_df, library.fragment_intensity_df, min_fragment_intensity=self.min_fragment_intensity, keep_top_k_fragments=self.keep_top_k_fragments, custom_columns=self.custom_fragment_df_columns, - **kwargs + **kwargs, ) - - if hasattr(library, 'protein_df'): + + if hasattr(library, "protein_df"): self._protein_df = library.protein_df else: self._protein_df = pd.DataFrame() if keep_original_frag_dfs: - self.charged_frag_types = library.fragment_mz_df.columns.values for dense_frag_df in library.available_dense_fragment_dfs(): setattr(self, dense_frag_df, getattr(library, dense_frag_df)) warnings.warn( "The SpecLibFlat object will have a strictly flat representation in the future. keep_original_frag_dfs=True will be deprecated.", - DeprecationWarning + DeprecationWarning, ) - - def save_hdf(self, hdf_file:str): + def save_hdf(self, hdf_file: str): """Save library dataframes into hdf_file. For `self.precursor_df`, this method will save it into two hdf groups: hdf_file: `library/precursor_df` and `library/mod_seq_df`. - `library/precursor_df` contains all essential numberic columns those + `library/precursor_df` contains all essential numberic columns those can be loaded faster from hdf file into memory: `['precursor_mz', 'charge', 'mod_seq_hash', 'mod_seq_charge_hash', - 'frag_start_idx', 'frag_stop_idx', 'flat_frag_start_idx', 'flat_frag_stop_idx', - 'decoy', 'rt_pred', 'ccs_pred', 'mobility_pred', 'miss_cleave', 'nAA', + 'frag_start_idx', 'frag_stop_idx', 'flat_frag_start_idx', 'flat_frag_stop_idx', + 'decoy', 'rt_pred', 'ccs_pred', 'mobility_pred', 'miss_cleave', 'nAA', 'isotope_mz_m1', 'isotope_intensity_m1', ...]` - `library/mod_seq_df` contains all string columns and the other + `library/mod_seq_df` contains all string columns and the other not essential columns: 'sequence','mods','mod_sites', ['proteins', 'genes']... - as well as 'mod_seq_hash', 'mod_seq_charge_hash' columns to map + as well as 'mod_seq_hash', 'mod_seq_charge_hash' columns to map back to `precursor_df` Parameters ---------- hdf_file : str the hdf file path to save - + """ super().save_hdf(hdf_file) - _hdf = HDF_File( - hdf_file, - read_only=False, - truncate=True, - delete_existing=False - ) + _hdf = HDF_File(hdf_file, read_only=False, truncate=True, delete_existing=False) _hdf.library.fragment_df = self.fragment_df _hdf.library.protein_df = self.protein_df _hdf.library.fragment_mz_df = self.fragment_mz_df _hdf.library.fragment_intensity_df = self.fragment_intensity_df - - def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): + + def load_hdf(self, hdf_file: str, load_mod_seq: bool = False): """Load the hdf library from hdf_file Parameters @@ -191,9 +191,9 @@ def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): hdf library path to load load_mod_seq : bool, optional - if also load mod_seq_df. + if also load mod_seq_df. Defaults to False. - + """ super().load_hdf(hdf_file, load_mod_seq=load_mod_seq) _hdf = HDF_File( @@ -203,8 +203,8 @@ def load_hdf(self, hdf_file:str, load_mod_seq:bool=False): self._protein_df = _hdf.library.protein_df.values self._fragment_mz_df = _hdf.library.fragment_mz_df.values self._fragment_intensity_df = _hdf.library.fragment_intensity_df.values - - def get_full_charged_types(self,frag_df:pd.DataFrame) -> list: + + def get_full_charged_types(self, frag_df: pd.DataFrame) -> list: """ Infer the full set of charged fragment types from the fragment dataframe by full we mean a complete set of fragment types for each charge @@ -221,29 +221,31 @@ def get_full_charged_types(self,frag_df:pd.DataFrame) -> list: The full set of charged fragment types in the form of a list of strings such as ['a_z1','b_z1','c_z1','x_z1','y_z1','z_z1'] """ - unique_charge_type_pairs = frag_df[['type','loss_type','charge']].drop_duplicates() - #Fragtypes from ascii to char - self.frag_types_as_char = {i: chr(i) for i in unique_charge_type_pairs['type'].unique()} + unique_charge_type_pairs = frag_df[ + ["type", "loss_type", "charge"] + ].drop_duplicates() + # Fragtypes from ascii to char + self.frag_types_as_char = { + i: chr(i) for i in unique_charge_type_pairs["type"].unique() + } charged_frag_types = set() # Now if we have a fragment type that is a,b,c we should have the corresponding x,y,z - - corresponding = { - 'a':'x', - 'b':'y', - 'c':'z', - 'x':'a', - 'y':'b', - 'z':'c' - } - loss_number_to_type = {0: '', 18: '_H2O', 17: '_NH3',98: '_modloss'} - for type,loss,max_charge in unique_charge_type_pairs.values: - for possible_charge in range(1,max_charge+1): + + corresponding = {"a": "x", "b": "y", "c": "z", "x": "a", "y": "b", "z": "c"} + loss_number_to_type = {0: "", 18: "_H2O", 17: "_NH3", 98: "_modloss"} + for type, loss, max_charge in unique_charge_type_pairs.values: + for possible_charge in range(1, max_charge + 1): # Add the string for this pair - charged_frag_types.add(f"{self.frag_types_as_char[type]}{loss_number_to_type[loss]}_z{possible_charge}") + charged_frag_types.add( + f"{self.frag_types_as_char[type]}{loss_number_to_type[loss]}_z{possible_charge}" + ) # Add the string for the corresponding pair - charged_frag_types.add(f"{corresponding[self.frag_types_as_char[type]]}{loss_number_to_type[loss]}_z{possible_charge}") + charged_frag_types.add( + f"{corresponding[self.frag_types_as_char[type]]}{loss_number_to_type[loss]}_z{possible_charge}" + ) return list(charged_frag_types) + def to_SpecLibBase(self) -> SpecLibBase: """ Convert the flat library to SpecLibBase object. @@ -251,111 +253,145 @@ def to_SpecLibBase(self) -> SpecLibBase: Returns: -------- SpecLibBase - A SpecLibBase object with `precursor_df`, `fragment_mz_df` and `fragment_intensity_df`, and + A SpecLibBase object with `precursor_df`, `fragment_mz_df` and `fragment_intensity_df`, and '_additional_fragment_columns_df' if there was more than mz and intensity in the original fragment_df. """ # Check that fragment_df has the following columns ['mz', 'intensity', 'type', 'charge', 'position', 'loss_type'] - assert set(['mz', 'intensity', 'type', 'charge', 'position', 'loss_type']).issubset(self._fragment_df.columns), f'fragment_df does not have the following columns: {set(["mz", "intensity", "type", "charge", "position", "loss_type"]) - set(self._fragment_df.columns)}' - self.charged_frag_types = self.get_full_charged_types(self._fragment_df) # Infer the full set of charged fragment types from data + assert set( + ["mz", "intensity", "type", "charge", "position", "loss_type"] + ).issubset( + self._fragment_df.columns + ), f'fragment_df does not have the following columns: {set(["mz", "intensity", "type", "charge", "position", "loss_type"]) - set(self._fragment_df.columns)}' + self.charged_frag_types = self.get_full_charged_types( + self._fragment_df + ) # Infer the full set of charged fragment types from data # charged_frag_types = self.charged_frag_types #Use pre-defined charged_frag_types - frag_type_to_col_dict = dict(zip( - self.charged_frag_types, - range(len(self.charged_frag_types)) - )) - loss_number_to_type = {0: '', 18: '_H2O', 17: '_NH3',98: '_modloss'} - - available_frag_types = self._fragment_df['type'].unique() + frag_type_to_col_dict = dict( + zip(self.charged_frag_types, range(len(self.charged_frag_types))) + ) + loss_number_to_type = {0: "", 18: "_H2O", 17: "_NH3", 98: "_modloss"} + + available_frag_types = self._fragment_df["type"].unique() self.frag_types_as_char = {i: chr(i) for i in available_frag_types} frag_types_z_charge = ( - self._fragment_df['type'].map(self.frag_types_as_char) + - self._fragment_df['loss_type'].map(loss_number_to_type) + - '_z' + - self._fragment_df['charge'].astype(str) + self._fragment_df["type"].map(self.frag_types_as_char) + + self._fragment_df["loss_type"].map(loss_number_to_type) + + "_z" + + self._fragment_df["charge"].astype(str) ) - #Print number of nAA less 1 - accumlated_nAA = (self._precursor_df['nAA']-1).cumsum() + # Print number of nAA less 1 + accumlated_nAA = (self._precursor_df["nAA"] - 1).cumsum() # Define intensity and mz as a matrix of shape (accumlated_nAA[-1], len(self.charged_frag_types), 2) - 2 for mz and intensity - intensity_and_mz = np.zeros((accumlated_nAA.iloc[-1], len(self.charged_frag_types), 2)) + intensity_and_mz = np.zeros( + (accumlated_nAA.iloc[-1], len(self.charged_frag_types), 2) + ) # Start indices for each precursor is the accumlated nAA of the previous precursor and for the first precursor is 0 start_indexes = accumlated_nAA.shift(1).fillna(0).astype(int) - - + column_indices = frag_types_z_charge.map(frag_type_to_col_dict) # We need to calculate for each fragment the precursor_idx that maps a fragment to a precursor drop_precursor_idx = False - if 'precursor_idx' not in self._fragment_df.columns: - drop_precursor_idx = True + if "precursor_idx" not in self._fragment_df.columns: + drop_precursor_idx = True # Sort precursor_df by 'flat_frag_start_idx' - self._precursor_df = self._precursor_df.sort_values('flat_frag_start_idx') + self._precursor_df = self._precursor_df.sort_values("flat_frag_start_idx") # Add precursor_idx to precursor_df as 0,1,2,3... - self._precursor_df['precursor_idx'] = range(self._precursor_df.shape[0]) + self._precursor_df["precursor_idx"] = range(self._precursor_df.shape[0]) # Add precursor_idx to fragment_df - frag_precursor_idx = np.repeat(self._precursor_df['precursor_idx'], self._precursor_df['flat_frag_stop_idx'] - self._precursor_df['flat_frag_start_idx']) + frag_precursor_idx = np.repeat( + self._precursor_df["precursor_idx"], + self._precursor_df["flat_frag_stop_idx"] + - self._precursor_df["flat_frag_start_idx"], + ) + + assert ( + len(frag_precursor_idx) == self._fragment_df.shape[0] + ), f"Number of fragments {len(frag_precursor_idx)} is not equal to the number of rows in fragment_df {self._fragment_df.shape[0]}" - assert len(frag_precursor_idx) == self._fragment_df.shape[0], f'Number of fragments {len(frag_precursor_idx)} is not equal to the number of rows in fragment_df {self._fragment_df.shape[0]}' - - self._fragment_df['precursor_idx'] = frag_precursor_idx.values + self._fragment_df["precursor_idx"] = frag_precursor_idx.values + + # Row indices of a fragment being the accumlated nAA of the precursor + fragment position -1 + precursor_idx_to_accumlated_nAA = dict( + zip(self._precursor_df["precursor_idx"], start_indexes) + ) + row_indices = ( + self._fragment_df["precursor_idx"].map( + precursor_idx_to_accumlated_nAA, na_action="ignore" + ) + + self._fragment_df["position"] + ) - #Row indices of a fragment being the accumlated nAA of the precursor + fragment position -1 - precursor_idx_to_accumlated_nAA = dict(zip(self._precursor_df['precursor_idx'], start_indexes)) - row_indices = self._fragment_df['precursor_idx'].map(precursor_idx_to_accumlated_nAA,na_action = 'ignore') + self._fragment_df['position'] - # Drop elements were the column_indices is nan and drop them from both row_indices and column_indices nan_indices = column_indices.index[column_indices.isna()] row_indices = row_indices.drop(nan_indices) column_indices = column_indices.drop(nan_indices) - assert row_indices.shape[0] == column_indices.shape[0], f'row_indices {row_indices.shape[0]} is not equal to column_indices {column_indices.shape[0]}' + assert ( + row_indices.shape[0] == column_indices.shape[0] + ), f"row_indices {row_indices.shape[0]} is not equal to column_indices {column_indices.shape[0]}" + assert ( + np.max(row_indices) <= intensity_and_mz.shape[0] + ), f"row_indices {np.max(row_indices)} is greater than the number of fragments {intensity_and_mz.shape[0]}" - assert np.max(row_indices) <= intensity_and_mz.shape[0], f'row_indices {np.max(row_indices)} is greater than the number of fragments {intensity_and_mz.shape[0]}' - # Assign the intensity and mz to the correct position in the matrix - intensity_indices = np.array((row_indices, column_indices,np.zeros_like(row_indices)), dtype=int).tolist() - mz_indices = np.array((row_indices, column_indices,np.ones_like(row_indices)), dtype=int).tolist() - - intensity_and_mz[tuple(intensity_indices)] = self._fragment_df['intensity'] - intensity_and_mz[tuple(mz_indices)] = self._fragment_df['mz'] - - #Create fragment_mz_df and fragment_intensity_df - fragment_mz_df = pd.DataFrame(intensity_and_mz[:,:,1], columns = self.charged_frag_types) - fragment_intensity_df = pd.DataFrame(intensity_and_mz[:,:,0], columns = self.charged_frag_types) + intensity_indices = np.array( + (row_indices, column_indices, np.zeros_like(row_indices)), dtype=int + ).tolist() + mz_indices = np.array( + (row_indices, column_indices, np.ones_like(row_indices)), dtype=int + ).tolist() + + intensity_and_mz[tuple(intensity_indices)] = self._fragment_df["intensity"] + intensity_and_mz[tuple(mz_indices)] = self._fragment_df["mz"] + + # Create fragment_mz_df and fragment_intensity_df + fragment_mz_df = pd.DataFrame( + intensity_and_mz[:, :, 1], columns=self.charged_frag_types + ) + fragment_intensity_df = pd.DataFrame( + intensity_and_mz[:, :, 0], columns=self.charged_frag_types + ) - #Add columns frag_start_idx and frag_stop_idx to the precursor_df - self._precursor_df['frag_start_idx'] = start_indexes - self._precursor_df['frag_stop_idx'] = accumlated_nAA + # Add columns frag_start_idx and frag_stop_idx to the precursor_df + self._precursor_df["frag_start_idx"] = start_indexes + self._precursor_df["frag_stop_idx"] = accumlated_nAA - #Drop precursor Idx from both fragment_df and precursor_df + # Drop precursor Idx from both fragment_df and precursor_df if drop_precursor_idx: - self._fragment_df = self._fragment_df.drop(columns = ['precursor_idx']) - self._precursor_df = self._precursor_df.drop(columns = ['precursor_idx']) - + self._fragment_df = self._fragment_df.drop(columns=["precursor_idx"]) + self._precursor_df = self._precursor_df.drop(columns=["precursor_idx"]) - #Drop flat indices from precursor_df - self._precursor_df = self._precursor_df.drop(columns = ['flat_frag_start_idx','flat_frag_stop_idx']) - - + # Drop flat indices from precursor_df + self._precursor_df = self._precursor_df.drop( + columns=["flat_frag_start_idx", "flat_frag_stop_idx"] + ) - #Create SpecLibBase object + # Create SpecLibBase object spec_lib_base = SpecLibBase() spec_lib_base._precursor_df = self._precursor_df spec_lib_base._fragment_mz_df = fragment_mz_df spec_lib_base._fragment_intensity_df = fragment_intensity_df spec_lib_base.charged_frag_types = self.charged_frag_types - + # Add additional columns from frag_df that were not mz and intensity - additional_columns = set(self._fragment_df.columns) - set(['mz','intensity','type','charge','position','loss_type']) + additional_columns = set(self._fragment_df.columns) - set( + ["mz", "intensity", "type", "charge", "position", "loss_type"] + ) for col in additional_columns: - additional_matrix = np.zeros((accumlated_nAA.iloc[-1], len(self.charged_frag_types))) + additional_matrix = np.zeros( + (accumlated_nAA.iloc[-1], len(self.charged_frag_types)) + ) data_indices = np.array((row_indices, column_indices), dtype=int).tolist() additional_matrix[tuple(data_indices)] = self._fragment_df[col] - additional_df = pd.DataFrame(additional_matrix, columns = self.charged_frag_types) - setattr(spec_lib_base,f'_fragment_{col}_df',additional_df) + additional_df = pd.DataFrame( + additional_matrix, columns=self.charged_frag_types + ) + setattr(spec_lib_base, f"_fragment_{col}_df", additional_df) - - return spec_lib_base \ No newline at end of file + return spec_lib_base diff --git a/alphabase/spectral_library/reader.py b/alphabase/spectral_library/reader.py index 745fd248..d5d8c349 100644 --- a/alphabase/spectral_library/reader.py +++ b/alphabase/spectral_library/reader.py @@ -1,38 +1,40 @@ import typing -import os import numpy as np import pandas as pd from tqdm import tqdm from alphabase.peptide.mobility import mobility_to_ccs_for_df -from alphabase.io.psm_reader.dia_search_reader import SpectronautReader -from alphabase.io.psm_reader.maxquant_reader import MaxQuantReader +from alphabase.psm_reader.maxquant_reader import MaxQuantReader from alphabase.spectral_library.base import SpecLibBase from alphabase.psm_reader.psm_reader import psm_reader_yaml from alphabase.psm_reader import psm_reader_provider -from alphabase.constants._const import CONST_FILE_FOLDER, PEAK_INTENSITY_DTYPE -from alphabase.yaml_utils import load_yaml +from alphabase.constants._const import PEAK_INTENSITY_DTYPE + class LibraryReaderBase(MaxQuantReader, SpecLibBase): - def __init__(self, - charged_frag_types:typing.List[str] = [ - 'b_z1','b_z2','y_z1', 'y_z2', - 'b_modloss_z1','b_modloss_z2', - 'y_modloss_z1', 'y_modloss_z2' + def __init__( + self, + charged_frag_types: typing.List[str] = [ + "b_z1", + "b_z2", + "y_z1", + "y_z2", + "b_modloss_z1", + "b_modloss_z2", + "y_modloss_z1", + "y_modloss_z2", ], - column_mapping:dict = None, - modification_mapping:dict = None, - fdr = 0.01, - fixed_C57 = False, - mod_seq_columns=psm_reader_yaml[ - 'library_reader_base' - ]['mod_seq_columns'], - rt_unit='irt', - precursor_mz_min:float = 400, - precursor_mz_max:float = 2000, - decoy:str = None, - **kwargs + column_mapping: dict = None, + modification_mapping: dict = None, + fdr=0.01, + fixed_C57=False, + mod_seq_columns=psm_reader_yaml["library_reader_base"]["mod_seq_columns"], + rt_unit="irt", + precursor_mz_min: float = 400, + precursor_mz_max: float = 2000, + decoy: str = None, + **kwargs, ): """ @@ -47,7 +49,7 @@ def __init__(self, column_mapping: dict Dictionary mapping the column names in the csv file to the column names in the spectral library. - The default is None, which uses the `library_reader_base` column mapping in `psm_reader.yaml` + The default is None, which uses the `library_reader_base` column mapping in `psm_reader.yaml` modification_mapping: dict Dictionary mapping the modification names in the csv file to the modification names in the spectral library. @@ -57,7 +59,7 @@ def __init__(self, default is 0.01 fixed_C57: bool - + mod_seq_columns: list of str List of column names in the csv file containing the modified sequence. By default the mapping is taken from `psm_reader.yaml` @@ -77,19 +79,21 @@ def __init__(self, Can be either `pseudo_reverse` or `diann` """ - SpecLibBase.__init__(self, - charged_frag_types = charged_frag_types, + SpecLibBase.__init__( + self, + charged_frag_types=charged_frag_types, precursor_mz_min=precursor_mz_min, precursor_mz_max=precursor_mz_max, - decoy=decoy + decoy=decoy, ) - MaxQuantReader.__init__(self, - column_mapping = column_mapping, - modification_mapping = modification_mapping, - fdr = fdr, - keep_decoy = False, - fixed_C57 = fixed_C57, + MaxQuantReader.__init__( + self, + column_mapping=column_mapping, + modification_mapping=modification_mapping, + fdr=fdr, + keep_decoy=False, + fixed_C57=fixed_C57, mod_seq_columns=mod_seq_columns, rt_unit=rt_unit, ) @@ -98,12 +102,9 @@ def _init_column_mapping(self): """ Initialize the column mapping from the `psm_reader.yaml` file. """ - self.column_mapping = psm_reader_yaml[ - 'library_reader_base' - ]['column_mapping'] - - def _find_key_columns(self, lib_df:pd.DataFrame): + self.column_mapping = psm_reader_yaml["library_reader_base"]["column_mapping"] + def _find_key_columns(self, lib_df: pd.DataFrame): """ Find and create the key columns for the spectral library. @@ -112,24 +113,23 @@ def _find_key_columns(self, lib_df:pd.DataFrame): lib_df: pd.DataFrame Dataframe containing the spectral library. - + """ - if 'fragment_loss_type' not in lib_df.columns: - lib_df['fragment_loss_type'] = '' + if "fragment_loss_type" not in lib_df.columns: + lib_df["fragment_loss_type"] = "" - lib_df.fillna({'fragment_loss_type':''}, inplace=True) + lib_df.fillna({"fragment_loss_type": ""}, inplace=True) lib_df.replace( - {'fragment_loss_type':'noloss'}, - {'fragment_loss_type':''},inplace=True + {"fragment_loss_type": "noloss"}, {"fragment_loss_type": ""}, inplace=True ) - if 'mods' not in lib_df.columns: - lib_df['mods'] = '' + if "mods" not in lib_df.columns: + lib_df["mods"] = "" - if 'mod_sites' not in lib_df.columns: - lib_df['mod_sites'] = '' + if "mod_sites" not in lib_df.columns: + lib_df["mod_sites"] = "" - def _get_fragment_intensity(self, lib_df:pd.DataFrame): + def _get_fragment_intensity(self, lib_df: pd.DataFrame): """ Create the self._fragment_intensity dataframe from a given spectral library. @@ -144,17 +144,16 @@ def _get_fragment_intensity(self, lib_df:pd.DataFrame): ------- precursor_df: pd.DataFrame Dataframe containing the fragment intensity. - + """ - frag_col_dict = dict(zip( - self.charged_frag_types, - range(len(self.charged_frag_types)) - )) + frag_col_dict = dict( + zip(self.charged_frag_types, range(len(self.charged_frag_types))) + ) self._find_key_columns(lib_df) # drop all columns which are all NaN as they prohibit grouping - lib_df = lib_df.dropna(axis=1, how='all') + lib_df = lib_df.dropna(axis=1, how="all") precursor_df_list = [] @@ -162,83 +161,84 @@ def _get_fragment_intensity(self, lib_df:pd.DataFrame): nAA_list = [] fragment_columns = [ - 'fragment_mz','fragment_type','fragment_charge','fragment_series','fragment_loss_type','fragment_intensity' + "fragment_mz", + "fragment_type", + "fragment_charge", + "fragment_series", + "fragment_loss_type", + "fragment_intensity", ] # by default, all non-fragment columns are used to group the library non_fragment_columns = list(set(lib_df.columns) - set(fragment_columns)) - - for keys, df_group in tqdm(lib_df.groupby( - non_fragment_columns - )): + for keys, df_group in tqdm(lib_df.groupby(non_fragment_columns)): precursor_columns = dict(zip(non_fragment_columns, keys)) - nAA = len(precursor_columns['sequence']) + nAA = len(precursor_columns["sequence"]) intens = np.zeros( - (nAA-1, len(self.charged_frag_types)), + (nAA - 1, len(self.charged_frag_types)), dtype=PEAK_INTENSITY_DTYPE, ) for frag_type, frag_num, loss_type, frag_charge, inten in df_group[ [ - 'fragment_type','fragment_series','fragment_loss_type', - 'fragment_charge','fragment_intensity' + "fragment_type", + "fragment_series", + "fragment_loss_type", + "fragment_charge", + "fragment_intensity", ] ].values: - if frag_type in 'abc': + if frag_type in "abc": frag_num -= 1 - elif frag_type in 'xyz': - frag_num = nAA-frag_num-1 + elif frag_type in "xyz": + frag_num = nAA - frag_num - 1 else: continue - - if loss_type == '': - frag_type = f'{frag_type}_z{frag_charge}' - elif loss_type == 'H3PO4': - frag_type = f'{frag_type}_modloss_z{frag_charge}' - elif loss_type == 'H2O': - frag_type = f'{frag_type}_H2O_z{frag_charge}' - elif loss_type == 'NH3': - frag_type = f'{frag_type}_NH3_z{frag_charge}' - elif loss_type == 'unknown': # DiaNN+fragger - frag_type = f'{frag_type}_z{frag_charge}' + + if loss_type == "": + frag_type = f"{frag_type}_z{frag_charge}" + elif loss_type == "H3PO4": + frag_type = f"{frag_type}_modloss_z{frag_charge}" + elif loss_type == "H2O": + frag_type = f"{frag_type}_H2O_z{frag_charge}" + elif loss_type == "NH3": + frag_type = f"{frag_type}_NH3_z{frag_charge}" + elif loss_type == "unknown": # DiaNN+fragger + frag_type = f"{frag_type}_z{frag_charge}" else: continue - + if frag_type not in frag_col_dict: continue frag_col_idx = frag_col_dict[frag_type] intens[frag_num, frag_col_idx] = inten max_inten = np.max(intens) - if max_inten <= 0: continue + if max_inten <= 0: + continue intens /= max_inten - precursor_df_list.append(precursor_columns) + precursor_df_list.append(precursor_columns) frag_intens_list.append(intens) nAA_list.append(nAA) df = pd.DataFrame(precursor_df_list) - self._fragment_intensity_df = pd.DataFrame( - np.concatenate(frag_intens_list), - columns = self.charged_frag_types + np.concatenate(frag_intens_list), columns=self.charged_frag_types ) - indices = np.zeros(len(nAA_list)+1, dtype=np.int64) - indices[1:] = np.array(nAA_list)-1 + indices = np.zeros(len(nAA_list) + 1, dtype=np.int64) + indices[1:] = np.array(nAA_list) - 1 indices = np.cumsum(indices) - df['frag_start_idx'] = indices[:-1] - df['frag_stop_idx'] = indices[1:] + df["frag_start_idx"] = indices[:-1] + df["frag_stop_idx"] = indices[1:] return df - def _load_file( - self, - filename:str - ): + def _load_file(self, filename: str): """ Load the spectral library from a csv file. Reimplementation of `PSMReaderBase._translate_columns`. @@ -246,16 +246,15 @@ def _load_file( csv_sep = self._get_table_delimiter(filename) - df = pd.read_csv(filename, sep=csv_sep,keep_default_na=False) + df = pd.read_csv(filename, sep=csv_sep, keep_default_na=False) self._find_mod_seq_column(df) - + return df - def _post_process( - self, - lib_df:pd.DataFrame, - ): + self, + lib_df: pd.DataFrame, + ): """ Process the spectral library and create the `fragment_intensity`, `fragment_mz`dataframe. Reimplementation of `PSMReaderBase._post_process`. @@ -263,50 +262,51 @@ def _post_process( # identify unknown modifications len_before = len(self._psm_df) - self._psm_df = self._psm_df[ - ~self._psm_df['mods'].isna() - ] + self._psm_df = self._psm_df[~self._psm_df["mods"].isna()] len_after = len(self._psm_df) if len_before != len_after: print( - f'{len_before-len_after} Entries with unknown modifications are removed' - ) - - if 'nAA' not in self._psm_df.columns: - self._psm_df['nAA'] = self._psm_df.sequence.str.len() + f"{len_before-len_after} Entries with unknown modifications are removed" + ) + + if "nAA" not in self._psm_df.columns: + self._psm_df["nAA"] = self._psm_df.sequence.str.len() self._psm_df = self._get_fragment_intensity(self._psm_df) - + self.normalize_rt_by_raw_name() - - if 'mobility' in self._psm_df.columns: - self._psm_df['ccs'] = ( - mobility_to_ccs_for_df( - self._psm_df, - 'mobility' - ) - ) - self._psm_df.drop('modified_sequence', axis=1, inplace=True) + if "mobility" in self._psm_df.columns: + self._psm_df["ccs"] = mobility_to_ccs_for_df(self._psm_df, "mobility") + + self._psm_df.drop("modified_sequence", axis=1, inplace=True) self._precursor_df = self._psm_df self.calc_fragment_mz_df() + # legacy SWATHLibraryReader = LibraryReaderBase + class LibraryReaderFromRawData(SpecLibBase): - def __init__(self, - charged_frag_types:typing.List[str] = [ - 'b_z1','b_z2','y_z1', 'y_z2', - 'b_modloss_z1','b_modloss_z2', - 'y_modloss_z1', 'y_modloss_z2' + def __init__( + self, + charged_frag_types: typing.List[str] = [ + "b_z1", + "b_z2", + "y_z1", + "y_z2", + "b_modloss_z1", + "b_modloss_z2", + "y_modloss_z1", + "y_modloss_z2", ], - precursor_mz_min:float = 400, - precursor_mz_max:float = 2000, - decoy:str = None, - **kwargs + precursor_mz_min: float = 400, + precursor_mz_max: float = 2000, + decoy: str = None, + **kwargs, ): super().__init__( charged_frag_types=charged_frag_types, @@ -314,8 +314,8 @@ def __init__(self, precursor_mz_max=precursor_mz_max, decoy=decoy, ) - - def import_psms(self, psm_files:list, psm_type:str): + + def import_psms(self, psm_files: list, psm_type: str): psm_reader = psm_reader_provider.get_reader(psm_type) if isinstance(psm_files, str): self._precursor_df = psm_reader.import_file(psm_files) @@ -327,8 +327,8 @@ def import_psms(self, psm_files:list, psm_type:str): self._precursor_df = pd.concat(psm_df_list, ignore_index=True) self._psm_df = self._precursor_df - def extract_fragments(self, raw_files:list): - """ Include two steps: + def extract_fragments(self, raw_files: list): + """Include two steps: 1. self.calc_fragment_mz_df() to generate self.fragment_mz_df 2. Extract self.fragment_intensity_df from RAW files using AlphaRAW @@ -338,4 +338,4 @@ def extract_fragments(self, raw_files:list): RAW file paths """ self.calc_fragment_mz_df() - # TODO Use AlphaRAW to extract fragment intensities \ No newline at end of file + # TODO Use AlphaRAW to extract fragment intensities diff --git a/alphabase/spectral_library/translate.py b/alphabase/spectral_library/translate.py index 346ac670..5e710200 100644 --- a/alphabase/spectral_library/translate.py +++ b/alphabase/spectral_library/translate.py @@ -11,15 +11,16 @@ from alphabase.utils import explode_multiple_columns -#@numba.njit #(cannot use numba for pd.Series) + +# @numba.njit #(cannot use numba for pd.Series) def create_modified_sequence( - seq_mods_sites:typing.Tuple, # must be ('sequence','mods','mod_sites') - translate_mod_dict:dict=None, - mod_sep='[]', - nterm = '_', - cterm = '_' + seq_mods_sites: typing.Tuple, # must be ('sequence','mods','mod_sites') + translate_mod_dict: dict = None, + mod_sep="[]", + nterm="_", + cterm="_", ): - ''' + """ Translate `(sequence, mods, mod_sites)` into a modified sequence. Used by `df.apply()`. For example, `('ABCDEFG','Mod1@A;Mod2@E','1;5')`->`_A[Mod1@A]BCDE[Mod2@E]FG_`. @@ -36,93 +37,102 @@ def create_modified_sequence( mod_sep : str '[]' or '()', default '[]' - ''' + """ mod_seq, mods, mod_sites = seq_mods_sites if mods: - mods = mods.split(';') - mod_sites = [int(i) for i in mod_sites.split(';')] + mods = mods.split(";") + mod_sites = [int(i) for i in mod_sites.split(";")] rev_order = np.argsort(mod_sites)[::-1] mod_sites = [mod_sites[rev_order[i]] for i in range(len(mod_sites))] mods = [mods[rev_order[i]] for i in range(len(mods))] if translate_mod_dict is None: - mods = [mod[:mod.find('@')] for mod in mods] + mods = [mod[: mod.find("@")] for mod in mods] else: mods = [translate_mod_dict[mod] for mod in mods] for _site, mod in zip(mod_sites, mods): if _site > 0: - mod_seq = mod_seq[:_site] + mod_sep[0]+mod+mod_sep[1] + mod_seq[_site:] + mod_seq = ( + mod_seq[:_site] + mod_sep[0] + mod + mod_sep[1] + mod_seq[_site:] + ) elif _site == -1: - cterm += mod_sep[0]+mod+mod_sep[1] + cterm += mod_sep[0] + mod + mod_sep[1] elif _site == 0: - nterm += mod_sep[0]+mod+mod_sep[1] + nterm += mod_sep[0] + mod + mod_sep[1] else: - mod_seq = mod_seq[:_site] + mod_sep[0]+mod+mod_sep[1] + mod_seq[_site:] + mod_seq = ( + mod_seq[:_site] + mod_sep[0] + mod + mod_sep[1] + mod_seq[_site:] + ) return nterm + mod_seq + cterm + @numba.njit -def _get_frag_info_from_column_name(column:str): - ''' +def _get_frag_info_from_column_name(column: str): + """ Only used when converting alphabase libraries into other libraries - ''' - idx = column.rfind('_') + """ + idx = column.rfind("_") frag_type = column[:idx] - charge = column[idx+2:] - if len(frag_type)==1: - loss_type = 'noloss' + charge = column[idx + 2 :] + if len(frag_type) == 1: + loss_type = "noloss" else: - idx = frag_type.find('_') - loss_type = frag_type[idx+1:] + idx = frag_type.find("_") + loss_type = frag_type[idx + 1 :] frag_type = frag_type[0] return frag_type, loss_type, charge + def _get_frag_num(columns, rows, frag_len): frag_nums = [] - for r,c in zip(rows, columns): + for r, c in zip(rows, columns): if is_nterm_frag(c): - frag_nums.append(r+1) + frag_nums.append(r + 1) else: - frag_nums.append(frag_len-r) + frag_nums.append(frag_len - r) return frag_nums + def merge_precursor_fragment_df( - precursor_df:pd.DataFrame, - fragment_mz_df:pd.DataFrame, - fragment_inten_df:pd.DataFrame, - top_n_inten:int, - frag_type_head:str='FragmentType', - frag_mass_head:str='FragmentMz', - frag_inten_head:str='RelativeIntensity', - frag_charge_head:str='FragmentCharge', - frag_series_head:str='FragmentNumber', - frag_loss_head:str='FragmentLossType', + precursor_df: pd.DataFrame, + fragment_mz_df: pd.DataFrame, + fragment_inten_df: pd.DataFrame, + top_n_inten: int, + frag_type_head: str = "FragmentType", + frag_mass_head: str = "FragmentMz", + frag_inten_head: str = "RelativeIntensity", + frag_charge_head: str = "FragmentCharge", + frag_series_head: str = "FragmentNumber", + frag_loss_head: str = "FragmentLossType", verbose=True, ): - ''' - Convert alphabase library into a single dataframe. - This method is not important, as it will be only + """ + Convert alphabase library into a single dataframe. + This method is not important, as it will be only used by DiaNN, or spectronaut, or others - ''' + """ df = precursor_df.copy() - frag_columns = fragment_mz_df.columns.values.astype('U') + frag_columns = fragment_mz_df.columns.values.astype("U") frag_type_list = [] frag_loss_list = [] frag_charge_list = [] frag_mass_list = [] frag_inten_list = [] frag_num_list = [] - iters = enumerate(df[['frag_start_idx','frag_stop_idx']].values) + iters = enumerate(df[["frag_start_idx", "frag_stop_idx"]].values) if verbose: iters = tqdm.tqdm(iters) - for i,(start, end) in iters: - intens = fragment_inten_df.iloc[start:end,:].to_numpy(copy=True) # is loc[start:end-1,:] faster? + for i, (start, end) in iters: + intens = fragment_inten_df.iloc[start:end, :].to_numpy( + copy=True + ) # is loc[start:end-1,:] faster? max_inten = np.amax(intens) if max_inten > 0: intens /= max_inten - masses = fragment_mz_df.iloc[start:end,:].values + masses = fragment_mz_df.iloc[start:end, :].values sorted_idx = np.argsort(intens.reshape(-1))[-top_n_inten:][::-1] idx_in_df = np.unravel_index(sorted_idx, masses.shape) - frag_len = end-start + frag_len = end - start rows = np.arange(frag_len, dtype=np.int32)[idx_in_df[0]] columns = frag_columns[idx_in_df[1]] @@ -138,7 +148,7 @@ def merge_precursor_fragment_df( frag_mass_list.append(masses[idx_in_df]) frag_inten_list.append(intens[idx_in_df]) frag_num_list.append(frag_nums) - + df[frag_type_head] = frag_type_list df[frag_mass_head] = frag_mass_list df[frag_inten_head] = frag_inten_list @@ -146,7 +156,8 @@ def merge_precursor_fragment_df( df[frag_series_head] = frag_num_list df[frag_loss_head] = frag_loss_list - return explode_multiple_columns(df, + return explode_multiple_columns( + df, [ frag_type_head, frag_mass_head, @@ -154,7 +165,7 @@ def merge_precursor_fragment_df( frag_charge_head, frag_series_head, frag_loss_head, - ] + ], ) # try: @@ -177,76 +188,73 @@ def merge_precursor_fragment_df( # df[frag_num_head] = _flatten(frag_num_list) # return df + mod_to_unimod_dict = {} -for mod_name,unimod_id in MOD_DF[['mod_name','unimod_id']].values: - if unimod_id==-1 or unimod_id=='-1': continue +for mod_name, unimod_id in MOD_DF[["mod_name", "unimod_id"]].values: + if unimod_id == -1 or unimod_id == "-1": + continue mod_to_unimod_dict[mod_name] = f"UniMod:{unimod_id}" -def is_nterm_frag(frag_type:str): - return frag_type[0] in 'abc' + +def is_nterm_frag(frag_type: str): + return frag_type[0] in "abc" + def mask_fragment_intensity_by_mz_( - fragment_mz_df:pd.DataFrame, - fragment_intensity_df:pd.DataFrame, - min_frag_mz, max_frag_mz + fragment_mz_df: pd.DataFrame, + fragment_intensity_df: pd.DataFrame, + min_frag_mz, + max_frag_mz, ): fragment_intensity_df.mask( - (fragment_mz_df>max_frag_mz)|(fragment_mz_df max_frag_mz) | (fragment_mz_df < min_frag_mz), 0, inplace=True ) + def mask_fragment_intensity_by_frag_nAA( - fragment_intensity_df:pd.DataFrame, - precursor_df:pd.DataFrame, - max_mask_frag_nAA + fragment_intensity_df: pd.DataFrame, precursor_df: pd.DataFrame, max_mask_frag_nAA ): - if max_mask_frag_nAA <= 0: return - b_mask = np.zeros( - len(fragment_intensity_df), - dtype=np.bool_ - ) + if max_mask_frag_nAA <= 0: + return + b_mask = np.zeros(len(fragment_intensity_df), dtype=np.bool_) y_mask = b_mask.copy() for i_frag in range(max_mask_frag_nAA): - b_mask[precursor_df.frag_start_idx.values+i_frag] = True - y_mask[precursor_df.frag_stop_idx.values-i_frag-1] = True - + b_mask[precursor_df.frag_start_idx.values + i_frag] = True + y_mask[precursor_df.frag_stop_idx.values - i_frag - 1] = True + masks = np.zeros( - ( - len(fragment_intensity_df), - len(fragment_intensity_df.columns) - ), dtype=np.bool_ + (len(fragment_intensity_df), len(fragment_intensity_df.columns)), dtype=np.bool_ ) - for i,col in enumerate(fragment_intensity_df.columns.values): + for i, col in enumerate(fragment_intensity_df.columns.values): if is_nterm_frag(col): - masks[:,i] = b_mask + masks[:, i] = b_mask else: - masks[:,i] = y_mask - - fragment_intensity_df.mask( - masks, 0, inplace=True - ) + masks[:, i] = y_mask + + fragment_intensity_df.mask(masks, 0, inplace=True) + def speclib_to_single_df( - speclib:SpecLibBase, + speclib: SpecLibBase, *, - translate_mod_dict:dict = None, - keep_k_highest_fragments:int=12, - min_frag_mz = 200, - max_frag_mz = 2000, - min_frag_intensity = 0.01, - min_frag_nAA = 0, - modloss:str='H3PO4', - frag_type_head:str='FragmentType', - frag_mass_head:str='FragmentMz', - frag_inten_head:str='RelativeIntensity', - frag_charge_head:str='FragmentCharge', - frag_loss_head:str='FragmentLossType', - frag_series_head:str='FragmentNumber', - verbose = True, -)->pd.DataFrame: - ''' + translate_mod_dict: dict = None, + keep_k_highest_fragments: int = 12, + min_frag_mz=200, + max_frag_mz=2000, + min_frag_intensity=0.01, + min_frag_nAA=0, + modloss: str = "H3PO4", + frag_type_head: str = "FragmentType", + frag_mass_head: str = "FragmentMz", + frag_inten_head: str = "RelativeIntensity", + frag_charge_head: str = "FragmentCharge", + frag_loss_head: str = "FragmentLossType", + frag_series_head: str = "FragmentNumber", + verbose=True, +) -> pd.DataFrame: + """ Convert alphabase library to diann (or Spectronaut) library dataframe - This method is not important, as it will be only + This method is not important, as it will be only used by DiaNN, or spectronaut, or others Parameters @@ -255,7 +263,7 @@ def speclib_to_single_df( A dict to map AlphaX modification names to other software, use unimod name if None. Defaults to None. - + keep_k_highest_peaks : int only keep highest fragments for each precursor. Default: 12 @@ -264,28 +272,28 @@ def speclib_to_single_df( pd.DataFrame a single dataframe in the SWATH-like format - ''' + """ df = pd.DataFrame() - df['ModifiedPeptide'] = speclib._precursor_df[ - ['sequence','mods','mod_sites'] + df["ModifiedPeptide"] = speclib._precursor_df[ + ["sequence", "mods", "mod_sites"] ].apply( - create_modified_sequence, + create_modified_sequence, axis=1, translate_mod_dict=translate_mod_dict, - mod_sep='[]' + mod_sep="[]", ) - df['frag_start_idx'] = speclib._precursor_df['frag_start_idx'] - df['frag_stop_idx'] = speclib._precursor_df['frag_stop_idx'] - - df['PrecursorCharge'] = speclib._precursor_df['charge'] + df["frag_start_idx"] = speclib._precursor_df["frag_start_idx"] + df["frag_stop_idx"] = speclib._precursor_df["frag_stop_idx"] - for rt_col in ['irt_pred','rt_pred','rt','irt','rt_norm']: + df["PrecursorCharge"] = speclib._precursor_df["charge"] + + for rt_col in ["irt_pred", "rt_pred", "rt", "irt", "rt_norm"]: if rt_col in speclib.precursor_df.columns: - df['RT'] = speclib.precursor_df[rt_col] + df["RT"] = speclib.precursor_df[rt_col] break - if 'RT' not in df.columns: - raise ValueError('precursor_df must contain the RT columns') + if "RT" not in df.columns: + raise ValueError("precursor_df must contain the RT columns") # if 'irt_pred' in speclib._precursor_df.columns: # df['RT'] = speclib._precursor_df['irt_pred'] # elif 'rt_pred' in speclib._precursor_df.columns: @@ -295,36 +303,36 @@ def speclib_to_single_df( # else: # raise ValueError('precursor_df must contain the "rt_pred" or "rt_norm" column') - for im_col in ['mobility_pred','mobility']: + for im_col in ["mobility_pred", "mobility"]: if im_col in speclib.precursor_df.columns: - df['IonMobility'] = speclib.precursor_df[im_col] + df["IonMobility"] = speclib.precursor_df[im_col] break # if 'mobility_pred' in speclib._precursor_df.columns: # df['IonMobility'] = speclib._precursor_df.mobility_pred # elif 'mobility' in speclib._precursor_df.columns: # df['IonMobility'] = speclib._precursor_df.mobility - + # df['LabelModifiedSequence'] = df['ModifiedPeptide'] - df['StrippedPeptide'] = speclib.precursor_df['sequence'] + df["StrippedPeptide"] = speclib.precursor_df["sequence"] - if 'precursor_mz' not in speclib._precursor_df.columns: + if "precursor_mz" not in speclib._precursor_df.columns: speclib.calc_precursor_mz() - df['PrecursorMz'] = speclib._precursor_df['precursor_mz'] + df["PrecursorMz"] = speclib._precursor_df["precursor_mz"] - for prot_col in ['uniprot_ids','proteins']: + for prot_col in ["uniprot_ids", "proteins"]: if prot_col in speclib.precursor_df.columns: - df['ProteinID'] = speclib.precursor_df[prot_col] + df["ProteinID"] = speclib.precursor_df[prot_col] break # if 'uniprot_ids' in speclib._precursor_df.columns: # df['ProteinID'] = speclib._precursor_df.uniprot_ids # elif 'proteins' in speclib._precursor_df.columns: # df['ProteinID'] = speclib._precursor_df.proteins - if 'genes' in speclib._precursor_df.columns: - df['Genes'] = speclib._precursor_df['genes'] + if "genes" in speclib._precursor_df.columns: + df["Genes"] = speclib._precursor_df["genes"] - if 'decoy' in speclib._precursor_df.columns: - df['Decoy'] = speclib._precursor_df['decoy'] + if "decoy" in speclib._precursor_df.columns: + df["Decoy"] = speclib._precursor_df["decoy"] # if 'protein_group' in speclib._precursor_df.columns: # df['ProteinGroups'] = speclib._precursor_df['protein_group'] @@ -333,14 +341,15 @@ def speclib_to_single_df( mask_fragment_intensity_by_mz_( speclib._fragment_mz_df, speclib._fragment_intensity_df, - min_frag_mz, max_frag_mz + min_frag_mz, + max_frag_mz, ) if min_frag_nAA > 0: mask_fragment_intensity_by_frag_nAA( speclib._fragment_intensity_df, speclib._precursor_df, - max_mask_frag_nAA=min_frag_nAA-1 + max_mask_frag_nAA=min_frag_nAA - 1, ) df = merge_precursor_fragment_df( @@ -354,61 +363,72 @@ def speclib_to_single_df( frag_charge_head=frag_charge_head, frag_loss_head=frag_loss_head, frag_series_head=frag_series_head, - verbose=verbose + verbose=verbose, ) - df = df[df['RelativeIntensity']>min_frag_intensity] - df.loc[df[frag_loss_head]=='modloss',frag_loss_head] = modloss + df = df[df["RelativeIntensity"] > min_frag_intensity] + df.loc[df[frag_loss_head] == "modloss", frag_loss_head] = modloss + + return df.drop(["frag_start_idx", "frag_stop_idx"], axis=1) - return df.drop(['frag_start_idx','frag_stop_idx'], axis=1) def speclib_to_swath_df( - speclib:SpecLibBase, + speclib: SpecLibBase, *, - keep_k_highest_fragments:int=12, - min_frag_mz = 200, - max_frag_mz = 2000, - min_frag_intensity = 0.01, -)->pd.DataFrame: + keep_k_highest_fragments: int = 12, + min_frag_mz=200, + max_frag_mz=2000, + min_frag_intensity=0.01, +) -> pd.DataFrame: speclib_to_single_df( - speclib, + speclib, translate_mod_dict=None, keep_k_highest_fragments=keep_k_highest_fragments, - min_frag_mz = min_frag_mz, - max_frag_mz = max_frag_mz, - min_frag_intensity = min_frag_intensity, + min_frag_mz=min_frag_mz, + max_frag_mz=max_frag_mz, + min_frag_intensity=min_frag_intensity, ) + class WritingProcess(mp.Process): def __init__(self, task_queue, tsv, *args, **kwargs): - self.task_queue:mp.Queue = task_queue + self.task_queue: mp.Queue = task_queue self.tsv = tsv super().__init__(*args, **kwargs) def run(self): while True: df, batch = self.task_queue.get() - if df is None: break - if tuple([int(i) for i in pd.__version__.split(".")[:2]]) >= (1,5): - newline=dict(lineterminator="\n") + if df is None: + break + if tuple([int(i) for i in pd.__version__.split(".")[:2]]) >= (1, 5): + newline = dict(lineterminator="\n") else: - newline=dict(line_terminator="\n") - df.to_csv(self.tsv, header=(batch==0), sep="\t", mode="a", index=False, **newline) + newline = dict(line_terminator="\n") + df.to_csv( + self.tsv, + header=(batch == 0), + sep="\t", + mode="a", + index=False, + **newline, + ) + def translate_to_tsv( - speclib:SpecLibBase, - tsv:str, + speclib: SpecLibBase, + tsv: str, *, - keep_k_highest_fragments:int=12, - min_frag_mz:float = 200, - max_frag_mz:float = 2000, - min_frag_intensity:float = 0.01, - min_frag_nAA:int = 0, - batch_size:int = 100000, - translate_mod_dict:dict = None, - multiprocessing:bool=True + keep_k_highest_fragments: int = 12, + min_frag_mz: float = 200, + max_frag_mz: float = 2000, + min_frag_intensity: float = 0.01, + min_frag_nAA: int = 0, + batch_size: int = 100000, + translate_mod_dict: dict = None, + multiprocessing: bool = True, ): if multiprocessing: - queue_size = 1000000//batch_size + queue_size = 1000000 // batch_size if queue_size < 2: queue_size = 2 elif queue_size > 10: @@ -419,41 +439,45 @@ def translate_to_tsv( mask_fragment_intensity_by_mz_( speclib._fragment_mz_df, speclib._fragment_intensity_df, - min_frag_mz, max_frag_mz + min_frag_mz, + max_frag_mz, ) if min_frag_nAA > 0: mask_fragment_intensity_by_frag_nAA( speclib._fragment_intensity_df, speclib._precursor_df, - max_mask_frag_nAA=min_frag_nAA-1 + max_mask_frag_nAA=min_frag_nAA - 1, ) if isinstance(tsv, str): - with open(tsv, "w"): pass + with open(tsv, "w"): + pass _speclib = SpecLibBase() _speclib._fragment_intensity_df = speclib._fragment_intensity_df _speclib._fragment_mz_df = speclib._fragment_mz_df precursor_df = speclib._precursor_df for i in tqdm.tqdm(range(0, len(precursor_df), batch_size)): - _speclib._precursor_df = precursor_df.iloc[i:i+batch_size] + _speclib._precursor_df = precursor_df.iloc[i : i + batch_size] df = speclib_to_single_df( - _speclib, translate_mod_dict=translate_mod_dict, + _speclib, + translate_mod_dict=translate_mod_dict, keep_k_highest_fragments=keep_k_highest_fragments, min_frag_mz=0, max_frag_mz=0, min_frag_intensity=min_frag_intensity, min_frag_nAA=0, - verbose=False + verbose=False, ) if multiprocessing: df_head_queue.put((df, i)) else: - if tuple([int(i) for i in pd.__version__.split(".")[:2]]) >= (1,5): - newline=dict(lineterminator="\n") + if tuple([int(i) for i in pd.__version__.split(".")[:2]]) >= (1, 5): + newline = dict(lineterminator="\n") else: - newline=dict(line_terminator="\n") - df.to_csv(tsv, header=(i==0), sep="\t", mode='a', index=False, **newline) + newline = dict(line_terminator="\n") + df.to_csv(tsv, header=(i == 0), sep="\t", mode="a", index=False, **newline) if multiprocessing: df_head_queue.put((None, None)) - print("Translation finished, it will take several minutes to export the rest precursors to the tsv file...") + print( + "Translation finished, it will take several minutes to export the rest precursors to the tsv file..." + ) writing_process.join() - diff --git a/alphabase/spectral_library/validate.py b/alphabase/spectral_library/validate.py index 4381daa6..c4b9ac38 100644 --- a/alphabase/spectral_library/validate.py +++ b/alphabase/spectral_library/validate.py @@ -3,14 +3,15 @@ from typing import Union, List -class Column(): + +class Column: def __init__( - self, - name : str, - type : Union[str, type, np.dtype], - allow_NaN : bool = False, - allow_inf : bool = False - ): + self, + name: str, + type: Union[str, type, np.dtype], + allow_NaN: bool = False, + allow_inf: bool = False, + ): """ Base class for validating a single column. The column is safely cast to the specified type inplace. @@ -39,7 +40,7 @@ def __init__( type: Union[type, np.dtype] Type of the column - + """ self.name = name @@ -52,10 +53,7 @@ def __init__( self.allow_NaN = allow_NaN self.allow_inf = allow_inf - def __call__( - self, - df : pd.DataFrame - ): + def __call__(self, df: pd.DataFrame): """ Validates the column. @@ -70,43 +68,47 @@ def __call__( if np.can_cast(df[self.name].dtype, self.type): df[self.name] = df[self.name].astype(self.type) else: - raise ValueError(f"Validation failed: Column {self.name} of type {_get_type_name(df[self.name].dtype)} cannot be cast to {_get_type_name(self.type)}") - + raise ValueError( + f"Validation failed: Column {self.name} of type {_get_type_name(df[self.name].dtype)} cannot be cast to {_get_type_name(self.type)}" + ) + if not self.allow_NaN: if df[self.name].isna().any(): - raise ValueError(f"Validation failed: Column {self.name} contains NaN values") - + raise ValueError( + f"Validation failed: Column {self.name} contains NaN values" + ) + if not self.allow_inf: if not np.isfinite(df[self.name]).all(): - raise ValueError(f"Validation failed: Column {self.name} contains inf values") + raise ValueError( + f"Validation failed: Column {self.name} contains inf values" + ) + class Optional(Column): """ Optional column to be validated. If the column is not present in the dataframe, the validation is skipped. """ + def __init__(self, *args, **kwargs): """ Optional column - + Parameters ---------- - + name: str Name of the column - + type: type Type of the column - + """ - super().__init__( *args, **kwargs) - + super().__init__(*args, **kwargs) - def __call__( - self, - df : pd.DataFrame - ): + def __call__(self, df: pd.DataFrame): """ Casts the column to the specified type if it is present in the dataframe @@ -121,11 +123,13 @@ def __call__( if self.name in df.columns: super().__call__(df) + class Required(Column): """ Required column to be validated. If the column is not present in the dataframe, the validation fails. """ + def __init__(self, *args, **kwargs): """ Required column @@ -142,10 +146,7 @@ def __init__(self, *args, **kwargs): """ super().__init__(*args, **kwargs) - def __call__( - self, - df : pd.DataFrame - ): + def __call__(self, df: pd.DataFrame): """ Casts the column to the specified type if it is present in the dataframe @@ -157,16 +158,16 @@ def __call__( """ - if self.name in df.columns: + if self.name in df.columns: super().__call__(df) else: - raise ValueError(f"Validation failed: Column {self.name} is not present in the dataframe") + raise ValueError( + f"Validation failed: Column {self.name} is not present in the dataframe" + ) -class Schema(): - def __init__( - self, - name : str, - properties: List[Column]): + +class Schema: + def __init__(self, name: str, properties: List[Column]): """ Schema for validating dataframes @@ -185,7 +186,7 @@ def __init__( self.schema = properties for column in self.schema: if not isinstance(column, Column): - raise ValueError(f"Schema must contain only Property objects") + raise ValueError("Schema must contain only Property objects") def __call__(self, df): """ @@ -202,8 +203,8 @@ def __call__(self, df): for column in self.schema: column(df) -def _get_type_name( - type : Union[str, type, np.dtype]) -> str: + +def _get_type_name(type: Union[str, type, np.dtype]) -> str: """ Returns the human readable name of the type @@ -225,4 +226,4 @@ def _get_type_name( elif isinstance(type, np.dtype): return type.name else: - return type.__name__ \ No newline at end of file + return type.__name__ diff --git a/alphabase/statistics/__init__.py b/alphabase/statistics/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/alphabase/statistics/regression.py b/alphabase/statistics/regression.py deleted file mode 100644 index 618a84ad..00000000 --- a/alphabase/statistics/regression.py +++ /dev/null @@ -1,360 +0,0 @@ -import numpy as np - -from sklearn.preprocessing import PolynomialFeatures -from sklearn.base import BaseEstimator, RegressorMixin - -from sklearn.utils.estimator_checks import check_estimator - - -EPSILON = 1e-6 - -class LOESSRegression(BaseEstimator, RegressorMixin): - """scikit-learn estimator which implements a LOESS style local polynomial regression. The number of basis functions or kernels can be explicitly defined which allows for faster and cheaper training and inference. - - Parameters - ---------- - - n_kernels : int - default = 6, The number of local polynomial functions used to approximate the data. The location and extend of the kernels will be distributed to contain an equal number of datapoints in the training set. - - kernel_size : float - default = 2, A factor increasing the kernel size to overlap with the neighboring kernel. - - polynomial_degree : int - default = 2, Degree of the polynomial functions used for the local approximation. - - uniform : bool - default = False, If True, the kernels are distributed uniformly over the input space. - If False, the kernels are distributed to contain an equal number of datapoints. - For every kernel at least polynomial_degree + 1 datapoints are required. - - """ - - def __init__(self, - n_kernels: int = 6, - kernel_size: float = 2., - polynomial_degree: int = 2, - uniform = False): - - self.n_kernels = n_kernels - self.kernel_size = kernel_size - self.polynomial_degree = polynomial_degree - self.uniform = uniform - - def get_params(self, deep: bool = True): - return super().get_params(deep) - - def set_params(self, **params): - return super().set_params(**params) - - def _more_tags(self): - return {'X_types': ['1darray']} - - def intervals_uniform(self, x: np.ndarray): - """Determine the intervals of the kernels. - The kernels are distributed uniformly over the input space. - - Parameters - ---------- - x : numpy.ndarray - float, of shape (n_datapoints) - - Returns - ------- - numpy.ndarray, float - of shape (n_kernels, 2) - """ - - minval = x[0] - maxval = x[-1] - - interval_size = (maxval - minval)/self.n_kernels - - start = np.arange(minval, maxval, interval_size) - (interval_size/2)*(self.kernel_size-1) - stop = start + interval_size + (interval_size)*(self.kernel_size-1) - return np.column_stack([start,stop]) - - def kernel_indices_uniform(self, x: np.ndarray): - """Determine the indices of the datapoints belonging to each kernel. - The kernels are distributed uniformly over the input space. - - Parameters - ---------- - x : numpy.ndarray - float, of shape (n_datapoints) - - Returns - ------- - numpy.ndarray, int - of shape (n_kernels, 2) - - """ - - indices = np.searchsorted(x, self.intervals_uniform(x)) - - return indices.astype(int) - - def kernel_indices_density(self, x: np.ndarray): - """Determine the indices of the datapoints belonging to each kernel. - The kernels are distributed to contain an equal number of datapoints. - - Parameters - ---------- - x : numpy.ndarray - float, of shape (n_datapoints) - - Returns - ------- - numpy.ndarray, int - of shape (n_kernels, 2) - - """ - - num_datapoints = len(x) - interval_size = num_datapoints // self.n_kernels - - start = np.arange(0,self.n_kernels) * interval_size - end = start + interval_size - - interval_extension = ((interval_size * self.kernel_size - interval_size) //2) - - start = start - interval_extension - start = np.maximum(0,start) - - end = end + interval_extension - end = np.minimum(num_datapoints,end) - - return np.column_stack([start,end]).astype(int) - - - def fit(self, x: np.ndarray, y: np.ndarray): - """fit the model passed on provided training data. - - Parameters - ---------- - - x : numpy.ndarray - float, of shape (n_samples,) or (n_samples, 1), Training data. Note that only a single feature is supported at the moment. - - y : numpy.ndarray, float - of shape (n_samples,) or (n_samples, 1) Target values. - - Returns - ------- - - self: object - Returns the fitted estimator. - - """ - - # As required by scikit-learn estimator guidelines - self.n_features_in_ = 1 - - # === start === sanity checks === - # Does not yet work with more than one input dimension - # axis-wise scaling and improved distance function need to be implemented - if len(x.shape) > 1: - if x.shape[1] > 1: - raise ValueError('Input arrays with more than one feature not yet supported. Please provide a matrix of shape (n_datapoints, 1) or (n_datapoints,)') - - # at least two datapoints required - if len(x.flat) < 2: - raise ValueError('At least two datapoints required for fitting.') - - # sanity check for number of datapoints, reduce n_kernels if needed - degrees_freedom = (1 + self.polynomial_degree) * self.n_kernels - - if len(x.flat) < degrees_freedom: - print(f"Curve fitting with {self.n_kernels} kernels and polynomials of {self.polynomial_degree} degree requires at least {degrees_freedom} datapoints.") - - self.n_kernels = np.max([len(x.flat) // (1 + self.polynomial_degree),1]) - - print(f"Number of kernels will be reduced to {self.n_kernels} kernels.") - - # sanity check for number of datapoints, reduce degree of polynomial if necessary - degrees_freedom = (1 + self.polynomial_degree) * self.n_kernels - if len(x.flat) < degrees_freedom: - self.polynomial_degree = len(x.flat) - 1 - - print(f"Polynomial degree will be reduced to {self.polynomial_degree}.") - - # reshape both arrays to column arrays - if len(x.shape) == 1: - x = x[...,np.newaxis] - - if len(y.shape) == 1: - y = y[...,np.newaxis] - - # remove outliers by using only the 0.5 to 99.5 percentile - percentiles = np.percentile(x, [0.1, 99.9]) - mask = (percentiles[0] < x[:,0]) & (x[:,0] < percentiles[1]) - x = x[mask,...] - y = y[mask,...] - - # === end === sanity checks === - - # create flat version of the array for - idx_sorted = np.argsort(x.flat) - x_sorted = x.flat[idx_sorted] - - - # stores if uniform training is still possible this round - uniform = self.uniform - - # === start === kernel indices === - # get kernel indices matrix of shape (n_kernels, 2) - if uniform: - kernel_indices = self.kernel_indices_uniform(x_sorted) - - # check number of datapoints per kernel - if np.any(np.diff(kernel_indices) < (1 + self.polynomial_degree)): - print('Too few datapoints per kernel. Uniform kernels will be replaced by density kernels.') - uniform = False - - # a second if statement is used instead of an if-else to account for failed uniform training - if not uniform: - kernel_indices = self.kernel_indices_density(x_sorted) - - # === end === kernel indices === - - # === start === calculate kernel dimensions === - if uniform: - start_stop = self.intervals_uniform(x_sorted) - self.scale_mean = np.mean(start_stop, axis=1) - self.scale_max = np.max(start_stop, axis=1) - self.scale_mean - - else: - # scale max and scale mean will then be used for calculating the weighht matrix - self.scale_mean = np.zeros((self.n_kernels)) - self.scale_max = np.zeros((self.n_kernels)) - - # scale mean and max are calculated and contain the scaling before applying the kernel - for i, area in enumerate(kernel_indices): - area_slice = slice(*area) - self.scale_mean[i] = x_sorted[area_slice].mean() - self.scale_max[i] = np.max(np.abs(x_sorted[area_slice] - self.scale_mean[i])) - - # === end === calculate kernel dimensions === - - # from here on, the original column arrays are used - w = self.get_weight_matrix(x) - - # build design matrix - polynomial_transform = PolynomialFeatures(self.polynomial_degree) - x_design = polynomial_transform.fit_transform(x) - number_of_dimensions = len(x_design[0]) - - - self.beta = np.zeros((number_of_dimensions,self.n_kernels)) - - for i, weights in enumerate(w.T): - - loadings = np.linalg.inv(x_design.T * weights @ x_design)@x_design.T - beta = (loadings*weights)@y - y_m = np.sum(x_design @ beta, axis=1) - self.beta[:,i] = np.ravel((loadings*weights)@y) - - - return self - - def predict(self, x: np.ndarray): - """Predict using the LOESS model. - - Parameters - ---------- - - x : numpy.ndarray - float, of shape (n_samples,) or (n_samples, 1) Feature data. Note that only a single feature is supported at the moment. - - Returns - ------- - - y : numpy.ndarray, float - of shape (n_samples,) - Target values. - - """ - - if len(x.shape) == 1: - x = x[...,np.newaxis] - - w = self.get_weight_matrix(x) - polynomial_transform = PolynomialFeatures(self.polynomial_degree) - x_design = polynomial_transform.fit_transform(x) - - return np.sum(x_design @ self.beta * w, axis=1) - - - def get_weight_matrix(self, x: np.ndarray): - """Applies the fitted scaling parameter and the kernel to yield a weight matrix. - - The weight matrix is calculated based on the self.scale_mean and self.scale_max parameters which need to be calculated before calling this function. - They define the center and extend of the tricubic kernels. The first and last column are one-padded at the start and beginning to allow for extrapolation. - - Parameters - ---------- - - x: numpy.ndarray - Numpy array of shape (n_datapoints, 1) which should be transformed to weights. - - - Returns - ------- - - numpy.ndarray - Weight matrix with the shape (n_datapoints, n_kernels). - - """ - w = np.tile(x,(1,self.n_kernels)) - - w = w - self.scale_mean - w = w/self.scale_max - - # apply weighting kernel - w = apply_kernel(w) - - w = w/np.sum(w, axis=1, keepdims=True) - - return w - - -def apply_kernel(w): - - num_cols = w.shape[1] - - if num_cols == 1: - return np.ones(w.shape) - - if num_cols == 2: - w[:,0] = left_open_tricubic(w[:,0]) - w[:,1] = right_open_tricubic(w[:,1]) - - return w - - if num_cols > 2 : - w[:,0] = left_open_tricubic(w[:,0]) - w[:,1:-1] = tricubic(w[:,1:-1]) - w[:,-1] = right_open_tricubic(w[:,-1]) - - return w - -def tricubic(x): - """tricubic weight kernel""" - epsilon = EPSILON - mask = np.abs(x) <= 1 - return mask * (np.power(1-np.power(np.abs(x),3),3) + epsilon) - - -def left_open_tricubic(x): - """tricubic weight kernel which weights assigns 1 to values x < 0""" - y = tricubic(x) - y[x < 0] = 1 - return y - - -def right_open_tricubic(x): - """tricubic weight kernel which weights assigns 1 to values x > 0""" - y = tricubic(x) - y[x > 0] = 1 - return y - diff --git a/alphabase/utils.py b/alphabase/utils.py index bd67e805..adc1d4a4 100644 --- a/alphabase/utils.py +++ b/alphabase/utils.py @@ -1,39 +1,39 @@ import tqdm -import os -import sys import pandas as pd import itertools import io + # from alphatims def process_bar(iterator, len_iter): with tqdm.tqdm(total=len_iter) as bar: i = 0 - for i,iter in enumerate(iterator): + for i, iter in enumerate(iterator): yield iter bar.update() - bar.update(len_iter-i-1) + bar.update(len_iter - i - 1) + def _flatten(list_of_lists): - ''' + """ Flatten a list of lists - ''' - return list( - itertools.chain.from_iterable(list_of_lists) - ) + """ + return list(itertools.chain.from_iterable(list_of_lists)) + -def explode_multiple_columns(df:pd.DataFrame, columns:list): +def explode_multiple_columns(df: pd.DataFrame, columns: list): try: return df.explode(columns) except ValueError: # pandas < 1.3.0 - print(f'pandas=={pd.__version__} cannot explode multiple columns') + print(f"pandas=={pd.__version__} cannot explode multiple columns") ret_df = df.explode(columns[0]) for col in columns[1:]: ret_df[col] = _flatten(df[col].values) return ret_df -def get_delimiter(tsv_file:str): + +def get_delimiter(tsv_file: str): if isinstance(tsv_file, io.StringIO): # for unit tests line = tsv_file.readline().strip() @@ -41,6 +41,9 @@ def get_delimiter(tsv_file:str): else: with open(tsv_file, "r") as f: line = f.readline().strip() - if '\t' in line: return '\t' - elif ',' in line: return ',' - else: return '\t' + if "\t" in line: + return "\t" + elif "," in line: + return "," + else: + return "\t" diff --git a/alphabase/yaml_utils.py b/alphabase/yaml_utils.py index 09e48b86..1820079c 100644 --- a/alphabase/yaml_utils.py +++ b/alphabase/yaml_utils.py @@ -1,10 +1,12 @@ import yaml -def load_yaml(filename)->dict: + +def load_yaml(filename) -> dict: with open(filename) as f: settings = yaml.load(f, Loader=yaml.FullLoader) return settings + def save_yaml(filename, settings): with open(filename, "w") as file: yaml.dump(settings, file, sort_keys=False) diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 55371f7b..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: "3" -services: - fastai: &fastai - restart: unless-stopped - working_dir: /data - image: fastai/codespaces - logging: - driver: json-file - options: - max-size: 50m - stdin_open: true - tty: true - volumes: - - .:/data/ - - notebook: - <<: *fastai - command: bash -c "pip install -e . && jupyter notebook --allow-root --no-browser --ip=0.0.0.0 --port=8080 --NotebookApp.token='' --NotebookApp.password=''" - ports: - - "8080:8080" - - watcher: - <<: *fastai - command: watchmedo shell-command --command nbdev_build_docs --pattern *.ipynb --recursive --drop - network_mode: host # for GitHub Codespaces https://github.com/features/codespaces/ - - jekyll: - <<: *fastai - ports: - - "4000:4000" - command: > - bash -c "pip install . - && nbdev_build_docs && cd docs - && bundle i - && chmod -R u+rwx . && bundle exec jekyll serve --host 0.0.0.0" diff --git a/docs/Makefile b/docs/Makefile index 41c270bb..d4bb2cbb 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -17,4 +17,4 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index fb2f0aa3..e87db4ac 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -9,4 +9,4 @@ .autosummary.longtable{ width: 100%; -} \ No newline at end of file +} diff --git a/docs/_static/diagrams/loader_classes.drawio.svg b/docs/_static/diagrams/loader_classes.drawio.svg index c38e37a5..395d7c0c 100644 --- a/docs/_static/diagrams/loader_classes.drawio.svg +++ b/docs/_static/diagrams/loader_classes.drawio.svg @@ -1,4 +1,4 @@ -SpecLibBaseprecursor_dffragment_mz_dffragment_intensity_dfcharged_frag_typesmin_precursor_mzmax_precursor_mzdecoySpecLibDecoytarget_libfix_C_termSpecLibDecoyDiaNNraw_AAsmutated_AAsSpecLibFlatprecursor_dffragment_dfmin_fragment_intensitykeep_top_k_fragmentscustom_fragment_df_columnsPSMReaderBasepsm_dfcolumn_mappingmodification_mappingkeep_fdrkeep_decoy_min_max_rt_normMaxQuantReaderfixed_C57mod_seq_columnAlphaPeptReaderhdf_datasetMSFraggerPepXMLpFindReaderSpectronautReadercsv_sepSwathReaderDiannReaderSpectronautReportReadercsv_sepprecursor_columnLibraryReaderBase_frag_type_columns_frag_number_columns_frag_charge_columns_frag_loss_type_columns_frag_inten_columns \ No newline at end of file +SpecLibBaseprecursor_dffragment_mz_dffragment_intensity_dfcharged_frag_typesmin_precursor_mzmax_precursor_mzdecoySpecLibDecoytarget_libfix_C_termSpecLibDecoyDiaNNraw_AAsmutated_AAsSpecLibFlatprecursor_dffragment_dfmin_fragment_intensitykeep_top_k_fragmentscustom_fragment_df_columnsPSMReaderBasepsm_dfcolumn_mappingmodification_mappingkeep_fdrkeep_decoy_min_max_rt_normMaxQuantReaderfixed_C57mod_seq_columnAlphaPeptReaderhdf_datasetMSFraggerPepXMLpFindReaderSpectronautReadercsv_sepSwathReaderDiannReaderSpectronautReportReadercsv_sepprecursor_columnLibraryReaderBase_frag_type_columns_frag_number_columns_frag_charge_columns_frag_loss_type_columns_frag_inten_columns diff --git a/docs/_static/diagrams/loader_classes_new.drawio.svg b/docs/_static/diagrams/loader_classes_new.drawio.svg index 30165387..3c47f62a 100644 --- a/docs/_static/diagrams/loader_classes_new.drawio.svg +++ b/docs/_static/diagrams/loader_classes_new.drawio.svg @@ -1,4 +1,4 @@ -SpecLibBaseprecursor_dffragment_mz_dffragment_intensity_dfcharged_frag_typesmin_precursor_mzmax_precursor_mzdecoySpecLibDecoytarget_libfix_C_termSpecLibDecoyDiaNNraw_AAsmutated_AAsSpecLibFlatprecursor_dffragment_dfmin_fragment_intensitykeep_top_k_fragmentscustom_fragment_df_columnsPSMReaderBasepsm_dfcolumn_mappingmodification_mappingkeep_fdrkeep_decoy_min_max_rt_normCSVReaderBasefixed_C57mod_seq_columncsv_sepAlphaPeptReaderhdf_datasetMSFraggerPepXMLpFindReaderSpectronautReaderDiannReaderSpectronautReportReadercsv_sepprecursor_columnLibraryReaderBase_frag_type_columns_frag_number_columns_frag_charge_columns_frag_loss_type_columns_frag_inten_columnsAlphaDIAReader \ No newline at end of file +SpecLibBaseprecursor_dffragment_mz_dffragment_intensity_dfcharged_frag_typesmin_precursor_mzmax_precursor_mzdecoySpecLibDecoytarget_libfix_C_termSpecLibDecoyDiaNNraw_AAsmutated_AAsSpecLibFlatprecursor_dffragment_dfmin_fragment_intensitykeep_top_k_fragmentscustom_fragment_df_columnsPSMReaderBasepsm_dfcolumn_mappingmodification_mappingkeep_fdrkeep_decoy_min_max_rt_normCSVReaderBasefixed_C57mod_seq_columncsv_sepAlphaPeptReaderhdf_datasetMSFraggerPepXMLpFindReaderSpectronautReaderDiannReaderSpectronautReportReadercsv_sepprecursor_columnLibraryReaderBase_frag_type_columns_frag_number_columns_frag_charge_columns_frag_loss_type_columns_frag_inten_columnsAlphaDIAReader diff --git a/docs/build_docs.sh b/docs/build_docs.sh index f700e632..ec9c83ca 100644 --- a/docs/build_docs.sh +++ b/docs/build_docs.sh @@ -8,4 +8,4 @@ conda activate alphabasedocs # brew install freetype pip install '../.[development]' make html -conda deactivate \ No newline at end of file +conda deactivate diff --git a/docs/conf.py b/docs/conf.py index f62a1bb2..e900aa78 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,16 +14,17 @@ import sys import importlib import inspect -sys.path.insert(0, os.path.abspath('..')) + +sys.path.insert(0, os.path.abspath("..")) # -- Project information ----------------------------------------------------- -project = 'alphabase' -copyright = '2022, Mann Labs, MPIB' -author = 'Mann Labs, MPIB' +project = "alphabase" +copyright = "2022, Mann Labs, MPIB" +author = "Mann Labs, MPIB" -release = "1.2.3" +release = "1.2.4" # -- General configuration --------------------------------------------------- @@ -31,35 +32,34 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.napoleon', + "sphinx.ext.napoleon", "sphinx.ext.intersphinx", "sphinx.ext.linkcode", - 'sphinx.ext.viewcode', + "sphinx.ext.viewcode", # 'sphinx.ext.autodoc', - 'autodocsumm', - 'nbsphinx', - 'myst_parser', + "autodocsumm", + "nbsphinx", + "myst_parser", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [ - '_build', 'Thumbs.db', '.DS_Store', - '_modidx,py' -] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "_modidx,py"] + +code_url = "https://github.com/mannlabs/alphabase/blob/main" -code_url = f"https://github.com/mannlabs/alphabase/blob/main" def linkcode_resolve(domain, info): # Non-linkable objects from the starter kit in the tutorial. if domain == "js" or info["module"] == "connect4": return - if domain != "py": return + if domain != "py": + return mod = importlib.import_module(info["module"]) if "." in info["fullname"]: @@ -94,18 +94,18 @@ def linkcode_resolve(domain, info): # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'furo' +html_theme = "furo" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] html_css_files = [ - 'css/custom.css', + "css/custom.css", ] autodoc_default_options = { - 'autosummary': True, - 'special-members': '__init__', # Include __init__ methods. -} \ No newline at end of file + "autosummary": True, + "special-members": "__init__", # Include __init__ methods. +} diff --git a/docs/constants/aa.rst b/docs/constants/aa.rst index 00f3d0ba..6adc5a72 100644 --- a/docs/constants/aa.rst +++ b/docs/constants/aa.rst @@ -4,4 +4,4 @@ alphabase.constants.aa .. automodule:: alphabase.constants.aa :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/constants/atom.rst b/docs/constants/atom.rst index 099fd2d8..396211c4 100644 --- a/docs/constants/atom.rst +++ b/docs/constants/atom.rst @@ -4,4 +4,4 @@ alphabase.constants.atom .. automodule:: alphabase.constants.atom :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/constants/isotope.rst b/docs/constants/isotope.rst index b888413c..5d7e5dcb 100644 --- a/docs/constants/isotope.rst +++ b/docs/constants/isotope.rst @@ -4,4 +4,4 @@ alphabase.constants.isotope .. automodule:: alphabase.constants.isotope :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/constants/modification.rst b/docs/constants/modification.rst index 687f9bd1..be3664cf 100644 --- a/docs/constants/modification.rst +++ b/docs/constants/modification.rst @@ -4,4 +4,4 @@ alphabase.constants.modification .. automodule:: alphabase.constants.modification :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst index e866a31b..1914e343 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ Documentation for AlphaBase ===================================== -The infrastructure of AlphaX ecosystem for MS proteomics. +The infrastructure of AlphaX ecosystem for MS proteomics. For more information, see AlphaBase on `GitHub `_. .. toctree:: @@ -15,6 +15,3 @@ For more information, see AlphaBase on `GitHub `. See examples in :doc:`psm_reader notebook <../nbs/psm_readers>`. @@ -13,4 +13,4 @@ See examples in :doc:`psm_reader notebook <../nbs/psm_readers>`. psm_reader/pfind_reader psm_reader/maxquant_reader psm_reader/msfragger_reader - psm_reader/dia_psm_reader \ No newline at end of file + psm_reader/dia_psm_reader diff --git a/docs/modules_scoring.rst b/docs/modules_scoring.rst deleted file mode 100644 index 65df6a49..00000000 --- a/docs/modules_scoring.rst +++ /dev/null @@ -1,9 +0,0 @@ -alphabase.scoring -=========================== - -.. toctree:: - :maxdepth: 1 - - scoring/fdr - scoring/feature_extraction_base - scoring/ml_scoring \ No newline at end of file diff --git a/docs/modules_spectral_library.rst b/docs/modules_spectral_library.rst index 7aa1b52c..b9f833d5 100644 --- a/docs/modules_spectral_library.rst +++ b/docs/modules_spectral_library.rst @@ -3,9 +3,9 @@ alphabase.spectral_library .. toctree:: :maxdepth: 1 - + spectral_library/base spectral_library/flat spectral_library/decoy spectral_library/reader - spectral_library/translate \ No newline at end of file + spectral_library/translate diff --git a/docs/modules_statistics.rst b/docs/modules_statistics.rst deleted file mode 100644 index d1e4b63d..00000000 --- a/docs/modules_statistics.rst +++ /dev/null @@ -1,7 +0,0 @@ -alphabase.statistics -=========================== - -.. toctree:: - :maxdepth: 1 - - statistics/regression \ No newline at end of file diff --git a/docs/nbs/psm_readers.ipynb b/docs/nbs/psm_readers.ipynb index 8c376f66..93e41636 100644 --- a/docs/nbs/psm_readers.ipynb +++ b/docs/nbs/psm_readers.ipynb @@ -23,14 +23,14 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.io.psm_reader import psm_reader_provider" + "from alphabase.psm_reader import psm_reader_provider" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "`alphabase.io.psm_reader.psm_reader_provider` has registered some basic reader classes for the following search engine results:" + "`alphabase.psm_reader.psm_reader_provider` has registered some basic reader classes for the following search engine results:" ] }, { diff --git a/docs/nbs/tutorial_dev_basic_definations.ipynb b/docs/nbs/tutorial_dev_basic_definations.ipynb index 69f2e9e9..1d511830 100644 --- a/docs/nbs/tutorial_dev_basic_definations.ipynb +++ b/docs/nbs/tutorial_dev_basic_definations.ipynb @@ -160,7 +160,7 @@ ], "source": [ "import pandas as pd\n", - "from alphabase.constants.element import CHEM_INFO_DICT\n", + "from alphabase.constants.atom import CHEM_INFO_DICT\n", "pd.DataFrame().from_dict(CHEM_INFO_DICT, orient='index')" ] }, @@ -273,7 +273,7 @@ } ], "source": [ - "from alphabase.constants.element import CHEM_MONO_MASS\n", + "from alphabase.constants.atom import CHEM_MONO_MASS\n", "pd.DataFrame().from_dict(CHEM_MONO_MASS, orient='index')" ] }, @@ -308,7 +308,7 @@ } ], "source": [ - "from alphabase.constants.element import (\n", + "from alphabase.constants.atom import (\n", " MASS_PROTON, MASS_ISOTOPE, MASS_NH3, MASS_H2O\n", ")\n", "MASS_PROTON, MASS_ISOTOPE, MASS_NH3, MASS_H2O" @@ -1452,7 +1452,7 @@ ], "source": [ "import pandas as pd\n", - "from alphabase.constants.element import CHEM_INFO_DICT\n", + "from alphabase.constants.atom import CHEM_INFO_DICT\n", "atom_df = pd.DataFrame().from_dict(CHEM_INFO_DICT, orient='index')\n", "def get_mono(masses_abundances):\n", " masses, abundances = masses_abundances\n", diff --git a/docs/notebooks.rst b/docs/notebooks.rst index 5e07f0fc..b0510a06 100644 --- a/docs/notebooks.rst +++ b/docs/notebooks.rst @@ -11,4 +11,4 @@ Tutorials and notebooks about how to use AlphaBase. nbs/tutorial_dev_spectral_libraries nbs/library_from_fasta nbs/psm_readers - nbs/library_reader \ No newline at end of file + nbs/library_reader diff --git a/docs/peptide/fragment.rst b/docs/peptide/fragment.rst index b4c1ef8e..ca2b391b 100644 --- a/docs/peptide/fragment.rst +++ b/docs/peptide/fragment.rst @@ -4,4 +4,4 @@ alphabase.peptide.fragment .. automodule:: alphabase.peptide.fragment :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/peptide/mass_calc.rst b/docs/peptide/mass_calc.rst index d7bb1c46..24c24605 100644 --- a/docs/peptide/mass_calc.rst +++ b/docs/peptide/mass_calc.rst @@ -4,4 +4,4 @@ alphabase.peptide.mass_calc .. automodule:: alphabase.peptide.mass_calc :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/peptide/mobility.rst b/docs/peptide/mobility.rst index 5965599e..9615bf2f 100644 --- a/docs/peptide/mobility.rst +++ b/docs/peptide/mobility.rst @@ -4,4 +4,4 @@ alphabase.peptide.mobility .. automodule:: alphabase.peptide.mobility :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/peptide/precursor.rst b/docs/peptide/precursor.rst index 4794fddd..1f9ae8bc 100644 --- a/docs/peptide/precursor.rst +++ b/docs/peptide/precursor.rst @@ -4,4 +4,4 @@ alphabase.peptide.precursor .. automodule:: alphabase.peptide.precursor :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/protein/fasta.rst b/docs/protein/fasta.rst index d30eb09f..3e332792 100644 --- a/docs/protein/fasta.rst +++ b/docs/protein/fasta.rst @@ -1,13 +1,13 @@ alphabase.protein.fasta =========================== -The :obj:`SpecLibFasta ` -provides the highest level APIs based on all other -functionalities in AlphaBase. +The :obj:`SpecLibFasta ` +provides the highest level APIs based on all other +functionalities in AlphaBase. See examples in :doc:`library_from_fasta notebook <../nbs/library_from_fasta>`. .. automodule:: alphabase.protein.fasta :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/protein/protein_level_decoy.rst b/docs/protein/protein_level_decoy.rst index 224ccfec..b9c9150c 100644 --- a/docs/protein/protein_level_decoy.rst +++ b/docs/protein/protein_level_decoy.rst @@ -1,12 +1,12 @@ alphabase.protein.protein_level_decoy =========================== -Protein reverse decoy defined in +Protein reverse decoy defined in :obj:`ProteinReverseDecoy `. -This class is also registered in +This class is also registered in :data:`decoy_lib_provider `. .. automodule:: alphabase.protein.protein_level_decoy :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/psm_reader/alphapept_reader.rst b/docs/psm_reader/alphapept_reader.rst index 4f38c69b..100a9119 100644 --- a/docs/psm_reader/alphapept_reader.rst +++ b/docs/psm_reader/alphapept_reader.rst @@ -4,4 +4,4 @@ alphabase.psm_reader.alphapept_reader .. automodule:: alphabase.psm_reader.alphapept_reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/psm_reader/dia_psm_reader.rst b/docs/psm_reader/dia_psm_reader.rst index c18ea9f2..a00b75da 100644 --- a/docs/psm_reader/dia_psm_reader.rst +++ b/docs/psm_reader/dia_psm_reader.rst @@ -4,4 +4,4 @@ alphabase.psm_reader.dia_psm_reader .. automodule:: alphabase.psm_reader.dia_psm_reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/psm_reader/maxquant_reader.rst b/docs/psm_reader/maxquant_reader.rst index c588e67e..0439ef9e 100644 --- a/docs/psm_reader/maxquant_reader.rst +++ b/docs/psm_reader/maxquant_reader.rst @@ -4,4 +4,4 @@ alphabase.psm_reader.maxquant_reader .. automodule:: alphabase.psm_reader.maxquant_reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/psm_reader/msfragger_reader.rst b/docs/psm_reader/msfragger_reader.rst index b1dcdea2..893a6295 100644 --- a/docs/psm_reader/msfragger_reader.rst +++ b/docs/psm_reader/msfragger_reader.rst @@ -4,4 +4,4 @@ alphabase.psm_reader.msfragger_reader .. automodule:: alphabase.psm_reader.msfragger_reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/psm_reader/pfind_reader.rst b/docs/psm_reader/pfind_reader.rst index a1fab901..1da99ebb 100644 --- a/docs/psm_reader/pfind_reader.rst +++ b/docs/psm_reader/pfind_reader.rst @@ -4,4 +4,4 @@ alphabase.psm_reader.pfind_reader .. automodule:: alphabase.psm_reader.pfind_reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/psm_reader/psm_reader.rst b/docs/psm_reader/psm_reader.rst index 7bd58aa8..9a37bc38 100644 --- a/docs/psm_reader/psm_reader.rst +++ b/docs/psm_reader/psm_reader.rst @@ -6,4 +6,4 @@ See examples in :doc:`psm_reader notebook <../nbs/psm_readers>`. .. automodule:: alphabase.psm_reader.psm_reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/scoring/fdr.rst b/docs/scoring/fdr.rst deleted file mode 100644 index b469b06d..00000000 --- a/docs/scoring/fdr.rst +++ /dev/null @@ -1,7 +0,0 @@ -alphabase.scoring.fdr -=========================== - -.. automodule:: alphabase.scoring.fdr - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/scoring/feature_extraction_base.rst b/docs/scoring/feature_extraction_base.rst deleted file mode 100644 index 03e73049..00000000 --- a/docs/scoring/feature_extraction_base.rst +++ /dev/null @@ -1,7 +0,0 @@ -alphabase.scoring.feature_extraction_base -=========================================== - -.. automodule:: alphabase.scoring.feature_extraction_base - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/scoring/ml_scoring.rst b/docs/scoring/ml_scoring.rst deleted file mode 100644 index 6d623b2a..00000000 --- a/docs/scoring/ml_scoring.rst +++ /dev/null @@ -1,7 +0,0 @@ -alphabase.scoring.ml_scoring -=================================== - -.. automodule:: alphabase.scoring.ml_scoring - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/spectral_library/base.rst b/docs/spectral_library/base.rst index f4c508dc..dc92187f 100644 --- a/docs/spectral_library/base.rst +++ b/docs/spectral_library/base.rst @@ -4,4 +4,4 @@ alphabase.spectral_library.base .. automodule:: alphabase.spectral_library.base :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/spectral_library/decoy.rst b/docs/spectral_library/decoy.rst index 5017802f..5ce27b6f 100644 --- a/docs/spectral_library/decoy.rst +++ b/docs/spectral_library/decoy.rst @@ -4,4 +4,4 @@ alphabase.spectral_library.decoy .. automodule:: alphabase.spectral_library.decoy :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/spectral_library/flat.rst b/docs/spectral_library/flat.rst index b554ebdf..d354b9d1 100644 --- a/docs/spectral_library/flat.rst +++ b/docs/spectral_library/flat.rst @@ -4,4 +4,4 @@ alphabase.spectral_library.flat .. automodule:: alphabase.spectral_library.flat :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/spectral_library/reader.rst b/docs/spectral_library/reader.rst index 085223b3..ce926dda 100644 --- a/docs/spectral_library/reader.rst +++ b/docs/spectral_library/reader.rst @@ -6,4 +6,4 @@ See examples in :doc:`library_reader notebook <../nbs/library_reader>`. .. automodule:: alphabase.spectral_library.reader :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/spectral_library/translate.rst b/docs/spectral_library/translate.rst index 99eee904..1ec5f86c 100644 --- a/docs/spectral_library/translate.rst +++ b/docs/spectral_library/translate.rst @@ -4,4 +4,4 @@ alphabase.spectral_library.translate .. automodule:: alphabase.spectral_library.translate :members: :undoc-members: - :show-inheritance: \ No newline at end of file + :show-inheritance: diff --git a/docs/statistics/regression.rst b/docs/statistics/regression.rst deleted file mode 100644 index d547e9cb..00000000 --- a/docs/statistics/regression.rst +++ /dev/null @@ -1,7 +0,0 @@ -alphabase.statistics.regression -=================================== - -.. automodule:: alphabase.statistics.regression - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/extra_requirements/development.txt b/extra_requirements/development.txt index e2fb8ec8..111489b4 100644 --- a/extra_requirements/development.txt +++ b/extra_requirements/development.txt @@ -3,7 +3,6 @@ twine bumpversion pipdeptree ipykernel -nbdev pyteomics scikit-learn matplotlib @@ -30,4 +29,6 @@ xxhash regex pydivsufsort pyahocorasick -pytest \ No newline at end of file +pytest +pre-commit==3.7.0 +nbmake==1.5.3 diff --git a/misc/checklist.txt b/misc/checklist.txt index 95f07194..fe64d26a 100644 --- a/misc/checklist.txt +++ b/misc/checklist.txt @@ -68,4 +68,4 @@ PyPi up-to-date? conda activate alphabase_pip_test # WARNING!!!!! Test on all OS pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple "alphabase" - twine upload dist/* \ No newline at end of file + twine upload dist/* diff --git a/misc/conda_dev_env.yaml b/misc/conda_dev_env.yaml index 7162e568..e4ea93b0 100644 --- a/misc/conda_dev_env.yaml +++ b/misc/conda_dev_env.yaml @@ -3,4 +3,4 @@ channels: - defaults dependencies: - pip: - - -e ../.[development] \ No newline at end of file + - -e ../.[development] diff --git a/nbdev_nbs/.gitignore b/nbdev_nbs/.gitignore deleted file mode 100644 index 075b2542..00000000 --- a/nbdev_nbs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/.quarto/ diff --git a/nbdev_nbs/_quarto.yml b/nbdev_nbs/_quarto.yml deleted file mode 100644 index 7ffb44c1..00000000 --- a/nbdev_nbs/_quarto.yml +++ /dev/null @@ -1,23 +0,0 @@ -project: - type: website - -format: - html: - theme: cosmo - css: styles.css - toc: true - -website: - twitter-card: true - open-graph: true - repo-actions: [issue] - navbar: - background: primary - search: true - right: - - icon: github - href: "https://github.com/MannLabs/alphabase" - sidebar: - style: floating - -metadata-files: [nbdev.yml, sidebar.yml] \ No newline at end of file diff --git a/nbdev_nbs/constants/.gitattributes b/nbdev_nbs/constants/.gitattributes deleted file mode 100644 index 39676312..00000000 --- a/nbdev_nbs/constants/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -**/*.ipynb filter=clean-nbs -**/*.ipynb diff=ipynb diff --git a/nbdev_nbs/nbdev.yml b/nbdev_nbs/nbdev.yml deleted file mode 100644 index 5b43f0f8..00000000 --- a/nbdev_nbs/nbdev.yml +++ /dev/null @@ -1,9 +0,0 @@ -project: - output-dir: docs - -website: - title: "alphabase" - site-url: "https://MannLabs.github.io/alphabase" - description: "Base functionalities for AlphaPept Ecosystems" - repo-branch: main - repo-url: "https://github.com/MannLabs/alphabase" diff --git a/nbdev_nbs/scoring/fdr.ipynb b/nbdev_nbs/scoring/fdr.ipynb deleted file mode 100644 index 58a81e59..00000000 --- a/nbdev_nbs/scoring/fdr.ipynb +++ /dev/null @@ -1,164 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#---#| default_exp scoring.fdr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# FDR functionalities" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Functionalities to calculate FDR.\n", - "\n", - "> In alphabase dataframes, we refer fdr values as q_values without loss of generacity." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from alphabase.scoring.fdr import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "f_score = np.random.random(500)*9.9\n", - "\n", - "df = pd.concat([\n", - " pd.DataFrame(\n", - " {\n", - " 'score': np.random.random(500)*10+11,\n", - " 'decoy': 0,\n", - " 'kind': True,\n", - " }\n", - " ),\n", - " pd.DataFrame(\n", - " {\n", - " 'score': f_score+0.01,\n", - " 'decoy': 1,\n", - " 'kind': False\n", - " }\n", - " ),\n", - " pd.DataFrame(\n", - " {\n", - " 'score': f_score,\n", - " 'decoy': 0,\n", - " 'kind': False\n", - " }\n", - " ),\n", - " pd.DataFrame(\n", - " {\n", - " 'score': np.random.random(5)+10,\n", - " 'decoy': 1,\n", - " 'kind': False\n", - " }\n", - " )\n", - "])\n", - "\n", - "df = calculate_fdr(df, 'score', 'decoy')\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df[(df.fdr < 0.01)&(df.decoy==0)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "assert len(df[(df.fdr < 0.01)&(df.decoy==0)]) == 500" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "\n", - "f_score = np.random.random(500)*9.9\n", - "\n", - "dff = pd.concat([\n", - " pd.DataFrame(\n", - " {\n", - " 'score': np.random.random(500)*10+11,\n", - " 'decoy': 0\n", - " }\n", - " ),\n", - " pd.DataFrame(\n", - " {\n", - " 'score': f_score+0.01,\n", - " 'decoy': 1\n", - " }\n", - " ),\n", - " pd.DataFrame(\n", - " {\n", - " 'score': f_score,\n", - " 'decoy': 0\n", - " }\n", - " ),\n", - " pd.DataFrame(\n", - " {\n", - " 'score': np.random.random(5)+10,\n", - " 'decoy': 1\n", - " }\n", - " )\n", - "\n", - "])\n", - "\n", - "dff['fdr'] = fdr_from_ref(dff.score.values, df.score.values, df.fdr.values)\n", - "\n", - "assert len(dff[(dff.fdr < 0.01)&(dff.decoy==0)]) == 500" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "dff = calculate_fdr_from_ref(dff, df.score.values, df.fdr.values, 'score')\n", - "assert len(dff[(dff.fdr < 0.01)&(dff.decoy==0)]) == 500" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/nbdev_nbs/scoring/feature_extraction_base.ipynb b/nbdev_nbs/scoring/feature_extraction_base.ipynb deleted file mode 100644 index af736888..00000000 --- a/nbdev_nbs/scoring/feature_extraction_base.ipynb +++ /dev/null @@ -1,22 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#---#| default_exp scoring.feature_extraction_base" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/nbdev_nbs/scoring/ml_scoring_base.ipynb b/nbdev_nbs/scoring/ml_scoring_base.ipynb deleted file mode 100644 index 7899a0b2..00000000 --- a/nbdev_nbs/scoring/ml_scoring_base.ipynb +++ /dev/null @@ -1,748 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#---#| default_exp scoring.ml_scoring" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Base Class of ML Scoring Methods" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from alphabase.scoring.ml_scoring import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are two key modules in ML-based rescoring: feature extraction and rescoring algorithm. Here we designed these two modules as flexible as possible for future extensions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Feature extraction\n", - "\n", - "The feature extractor is more important than the ML methods, so we designed a flexible architecture for feature extraction. As shown in `BaseFeatureExtractor`, a feature extractor inherited from `BaseFeatureExtractor` must re-implement `BaseFeatureExtractor.extract_features`, and tells the ML methods what are the extracted features by providing `BaseFeatureExtractor.feature_list`. \n", - "\n", - "For example, if we have two feature extractors, `AlphaPeptFE` and `AlphaPeptDeepFE`:\n", - "\n", - "```python\n", - "class AlphaPeptFE(BaseFeatureExtractor):\n", - " def extract_features(self, psm_df):\n", - " psm_df['ap_f1'] = ...\n", - " self._feature_list.append('ap_f1')\n", - " psm_df['ap_f2'] = ...\n", - " self._feature_list.append('ap_f2')\n", - "\n", - "class AlphaPeptDeepFE(BaseFeatureExtractor):\n", - " def extract_features(self, psm_df):\n", - " psm_df['ad_f1'] = ...\n", - " self._feature_list.append('ad_f1')\n", - " psm_df['ad_f2'] = ...\n", - " self._feature_list.append('ad_f2')\n", - "```\n", - "\n", - "We can easily design a new feature extractor which combines these two and more feature extractors:\n", - "\n", - "```python\n", - "class CombFE(BaseFeatureExtractor):\n", - " def __init__(self):\n", - " self.fe_list = [AlphaPeptFE(),AlphaPeptDeepFE()]\n", - "\n", - " def extract_features(self, psm_df):\n", - " for fe in self.fe_list:\n", - " fe.extract_features(psm_df)\n", - "\n", - " @property\n", - " def feature_list(self):\n", - " f_set = set()\n", - " for fe in self.fe_list:\n", - " f_set.update(fe.feature_list)\n", - " return list(f_set)\n", - "```\n", - "\n", - "This will be useful for rescoring with DL features, for instance, when AlphaPeptDeep is or is not installed." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Rescoring Algorithm\n", - "\n", - "The rescoring algorithm called `Percolator` (Kall et al. 2007) based on the semi-supervised learning algorithm is still the most widely used in MS-based proteomics. Therefore, we used `Percolator` as the base rescoring class and others can re-implement its methods for different algorithms. as well as different \n", - "\n", - "1. Rescoring algorithm. We have provided the base rescoring code structure in `Percolator`. If we are going to support DiaNN's brute-force supervised learning methods, we can define the class like this:\n", - "\n", - "```python\n", - "class DiaNNRescoring(Percolator):\n", - " def __init__(self):\n", - " super().__init__()\n", - " self.training_fdr = 100000 # disable target filtration on FDR, which is the same as DiaNN but different from Percolator\n", - "\n", - " self._ml_model.fit(\n", - " train_df[self.feature_list].values, \n", - " train_label\n", - " )\n", - " def rescore(self, psm_df):\n", - " # We don't need iteration anymore, but cross validation is still necessary\n", - " df = self._cv_score(df)\n", - " return self._estimate_fdr(df)\n", - "```\n", - "\n", - "2. ML models. Personally, `Percolator` with a linear classifier (SVM or LogisticRegression) is prefered. But as a framework, we should support different ML models. We can easily switch to the random forest by `self.ml_model = RandomForestClassifier()`. We can also use a DL model which provides sklearn-like `fit()` and `decision_function()` APIs for rescoring." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Simple Examples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "54\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
scorenAAchargedecoyspec_idxraw_nameml_scorefdr
099.701130253049raw73.8061770.0
197.37148616207raw70.6740980.0
296.52063120200raw69.4633210.0
394.903888103027raw66.6481270.0
494.770806293045raw66.6209600.0
...........................
1950.95409472150raw-70.6099851.0
1960.778568132192raw-70.8140781.0
1970.823450263012raw-70.9927521.0
1980.814022103184raw-71.1478091.0
1990.460099143019raw-71.6308211.0
\n", - "

200 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " score nAA charge decoy spec_idx raw_name ml_score fdr\n", - "0 99.701130 25 3 0 49 raw 73.806177 0.0\n", - "1 97.371486 16 2 0 7 raw 70.674098 0.0\n", - "2 96.520631 20 2 0 0 raw 69.463321 0.0\n", - "3 94.903888 10 3 0 27 raw 66.648127 0.0\n", - "4 94.770806 29 3 0 45 raw 66.620960 0.0\n", - ".. ... ... ... ... ... ... ... ...\n", - "195 0.954094 7 2 1 50 raw -70.609985 1.0\n", - "196 0.778568 13 2 1 92 raw -70.814078 1.0\n", - "197 0.823450 26 3 0 12 raw -70.992752 1.0\n", - "198 0.814022 10 3 1 84 raw -71.147809 1.0\n", - "199 0.460099 14 3 0 19 raw -71.630821 1.0\n", - "\n", - "[200 rows x 8 columns]" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.DataFrame({\n", - " 'score': list(np.random.uniform(0,100,100))+list(np.random.uniform(0,50,100)),\n", - " 'nAA': list(np.random.randint(7,30,200)),\n", - " 'charge': list(np.random.randint(2,4,200)),\n", - " 'decoy': [0]*100+[1]*100,\n", - " 'spec_idx': np.repeat(np.arange(100),2),\n", - " 'raw_name': 'raw',\n", - "})\n", - "perc = Percolator()\n", - "perc.min_training_sample = 10\n", - "df = perc.run_rescore_workflow(df)\n", - "print(np.sum(df.fdr<=0.01))\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "37\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
scorenAAchargedecoyspec_idxraw_nameml_scorefdr
296.52063120200raw57.9438870.000000
3273.4523387201raw30.8718460.000000
7145.33304627302raw-8.4570470.180328
5149.98908811303raw0.3759160.000000
12225.8281939204raw-30.2344430.576923
...........................
10930.181791223195raw-26.8780130.480000
9238.893862173196raw-14.8613470.333333
9039.019470182197raw-15.0369740.333333
14717.662388223198raw-42.8464900.729412
7843.686495242199raw-10.1695120.265625
\n", - "

100 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " score nAA charge decoy spec_idx raw_name ml_score fdr\n", - "2 96.520631 20 2 0 0 raw 57.943887 0.000000\n", - "32 73.452338 7 2 0 1 raw 30.871846 0.000000\n", - "71 45.333046 27 3 0 2 raw -8.457047 0.180328\n", - "51 49.989088 11 3 0 3 raw 0.375916 0.000000\n", - "122 25.828193 9 2 0 4 raw -30.234443 0.576923\n", - ".. ... ... ... ... ... ... ... ...\n", - "109 30.181791 22 3 1 95 raw -26.878013 0.480000\n", - "92 38.893862 17 3 1 96 raw -14.861347 0.333333\n", - "90 39.019470 18 2 1 97 raw -15.036974 0.333333\n", - "147 17.662388 22 3 1 98 raw -42.846490 0.729412\n", - "78 43.686495 24 2 1 99 raw -10.169512 0.265625\n", - "\n", - "[100 rows x 8 columns]" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = perc.run_rerank_workflow(df, rerank_column='spec_idx')\n", - "print(np.sum(df.fdr<=0.01))\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "50\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
scorenAAchargedecoyspec_idxraw_nameml_scorefdr
194.47948922303raw3.6605540.000000
1484.871839273040raw3.3695190.000000
294.021258153027raw3.3127990.000000
692.068047173026raw3.2989970.000000
592.155700282016raw3.2894030.000000
...........................
1904.059851132159raw-2.1857520.979798
1866.42572882188raw-2.2879180.989899
1952.26029392156raw-2.4679611.000000
1971.73845772160raw-2.5885451.000000
990.61705382043raw-2.6033081.000000
\n", - "

200 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " score nAA charge decoy spec_idx raw_name ml_score fdr\n", - "1 94.479489 22 3 0 3 raw 3.660554 0.000000\n", - "14 84.871839 27 3 0 40 raw 3.369519 0.000000\n", - "2 94.021258 15 3 0 27 raw 3.312799 0.000000\n", - "6 92.068047 17 3 0 26 raw 3.298997 0.000000\n", - "5 92.155700 28 2 0 16 raw 3.289403 0.000000\n", - ".. ... ... ... ... ... ... ... ...\n", - "190 4.059851 13 2 1 59 raw -2.185752 0.979798\n", - "186 6.425728 8 2 1 88 raw -2.287918 0.989899\n", - "195 2.260293 9 2 1 56 raw -2.467961 1.000000\n", - "197 1.738457 7 2 1 60 raw -2.588545 1.000000\n", - "99 0.617053 8 2 0 43 raw -2.603308 1.000000\n", - "\n", - "[200 rows x 8 columns]" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.DataFrame({\n", - " 'score': list(np.random.uniform(0,100,100))+list(np.random.uniform(0,50,100)),\n", - " 'nAA': list(np.random.randint(7,30,200)),\n", - " 'charge': list(np.random.randint(2,4,200)),\n", - " 'decoy': [0]*100+[1]*100,\n", - " 'spec_idx': np.repeat(np.arange(100),2),\n", - " 'raw_name': 'raw',\n", - "})\n", - "perc = SupervisedPercolator()\n", - "perc.min_training_sample = 10\n", - "df = perc.run_rescore_workflow(df)\n", - "print(np.sum(df.fdr<=0.01))\n", - "df" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/nbdev_nbs/sidebar.yml b/nbdev_nbs/sidebar.yml deleted file mode 100644 index 45020fc5..00000000 --- a/nbdev_nbs/sidebar.yml +++ /dev/null @@ -1,46 +0,0 @@ -website: - sidebar: - contents: - - index.ipynb - - utils.ipynb - - yaml_utils.ipynb - - section: constants - contents: - - constants/aa.ipynb - - constants/element.ipynb - - constants/isotope.ipynb - - constants/modification.ipynb - - section: io - contents: - - io/hdf.ipynb - - section: peptide - contents: - - peptide/fragment.ipynb - - peptide/mass_calc.ipynb - - peptide/mobility.ipynb - - peptide/precursor.ipynb - - section: protein - contents: - - protein/fasta.ipynb - - protein/test_fasta.ipynb - - section: psm_reader - contents: - - psm_reader/alphapept_reader.ipynb - - psm_reader/dia_psm_reader.ipynb - - psm_reader/maxquant_reader.ipynb - - psm_reader/msfragger_reader.ipynb - - psm_reader/pfind_reader.ipynb - - psm_reader/psm_reader.ipynb - - section: scoring - contents: - - scoring/fdr.ipynb - - scoring/feature_extraction_base.ipynb - - scoring/ml_scoring.ipynb - - section: spectral_library - contents: - - spectral_library/decoy_library.ipynb - - spectral_library/library_base.ipynb - - spectral_library/translate.ipynb - - section: statistics - contents: - - statistics/regression.ipynb \ No newline at end of file diff --git a/nbdev_nbs/statistics/regression.ipynb b/nbdev_nbs/statistics/regression.ipynb deleted file mode 100644 index b84d808b..00000000 --- a/nbdev_nbs/statistics/regression.ipynb +++ /dev/null @@ -1,231 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Regression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#---#| default_exp statistics.regression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from alphabase.statistics.regression import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Application example" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/georgwallmann/miniconda3/envs/alpha/lib/python3.9/site-packages/sklearn/utils/estimator_checks.py:291: SkipTestWarning: Can't test estimator LOESSRegression which requires input of type ['1darray']\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "#| hide\n", - "check_estimator(LOESSRegression())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "np.set_printoptions(formatter={'float': lambda x: \"{0:0.3f}\".format(x)})\n", - "def noisy_1d(x):\n", - " y = np.sin(x)\n", - " np.random.seed(42)\n", - " y_err = np.random.normal(y,0.5)\n", - " return y + y_err + 0.5 * x\n", - "\n", - "x_train = np.linspace(0,15,200)\n", - "y_train = noisy_1d(x_train)\n", - "\n", - "x_test = np.linspace(0,15,200)\n", - "y_test = LOESSRegression().fit(x_train, y_train).predict(x_test)\n", - "\n", - "plt.scatter(x_train,y_train)\n", - "plt.plot(x_test,y_test,c='r')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Weight function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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KmZQtbOzQ5cuXdpte25ubh16R63HcajDceAY1OM41OE4cAzqcRzqtMc4qNXqZvVr0bNiiYiIiMjyMNgRERER2QgGu99RKpV46aWXOvwcehyHOhwHjkE9jkMdjgPHoB7HoY4ljoNV3DxBRERERDfHI3ZERERENoLBjoiIiMhGMNgRERER2QgGOyIiIiIbwWBHREREZCMY7IiIiIhsBIMdERERkY1gsCMiIiKyEQx2RERERDaCwY6IiIjIRjDYEREREdkIBjsiIiIiG8FgR0RERGQjGOyIiIiIbASDHRHh5Zdfhkwma9G6GzduhEwmw+HDh2/ad82aNdi4cWOLtmMr/vGPf+Crr74ya536Mc7MzGyTmjIzMyGTybBixQrJayGiW8NgR0SYPXs20tLS2nw7DHYtC3YTJkxAWloa/P3926YoK62FiBpykLoAIpJWZWUlunTpgi5dukhdCv1BVVUVVCoVvL294e3tLXU5AGBRtRBRQzxiR9SB1J9y/fXXXzFt2jR06tQJXbt2bfRUrFarxTPPPAM/Pz84OTnh9ttvx5EjRxASEoKZM2c2+OyysjLMmzcPXl5e8PT0xJQpU5Cbm2t8PyQkBKdOnUJKSgpkMhlkMhlCQkKaXbvBYMDrr7+Onj17QqlUwsfHB48++iiuXLli0m/06NHo27cvDh48iKFDh8LR0RGdO3fGiy++iNraWpO+Op0Or776qvEzvb298dhjj6GwsNCkX0hICCZOnIi9e/di0KBBcHR0RM+ePfHBBx80u34AkMlkqKiowEcffWQcg9GjRwP43ynOffv24fHHH4e3tzecnJyg1WpvePpz7969GDt2LNRqNZycnNCrVy8kJiaajEX95//ezJkzGx17g8GA1157DUFBQVCpVIiKisL3339v0qeltRBR+2CwI+qApkyZgm7duuGLL77AunXrGu3z2GOPYdWqVXjsscfw9ddfY+rUqbj33ntRUlLSaP/Zs2dDLpfj008/xeuvv47k5GQ88sgjxvd37NiBsLAwREREIC0tDWlpadixY0eza543bx4WLVqEu+66Czt37sTf//537N27F8OGDUNRUZFJ3/z8fEyfPh0PP/wwvv76a0ybNg2vvvoqnn76aWMfg8GAyZMnY9myZXjooYewe/duLFu2DElJSRg9ejSqqqpMPvPYsWN45plnsHDhQnz99dfo378/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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(nrows=3,sharex=True)\n", - "\n", - "x = np.linspace(-2,2,200)\n", - "y = left_open_tricubic(x)\n", - "axs[0].plot(x,y)\n", - "axs[0].set_title('left_open_tricubic')\n", - "\n", - "x = np.linspace(-2,2,200)\n", - "y = tricubic(x)\n", - "axs[1].plot(x,y)\n", - "axs[1].set_title('tricubic')\n", - "\n", - "x = np.linspace(-2,2,200)\n", - "y = right_open_tricubic(x)\n", - "axs[2].plot(x,y)\n", - "axs[2].set_title('right_open_tricubic')\n", - "\n", - "fig.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#| hide\n", - "### Unit Tests for Edge Cases" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Curve fitting with 4 kernels and polynomials of 2 degree requires at least 12 datapoints.\n", - "Number of kernels will be reduced to 2 kernels.\n", - "Too few datapoints per kernel. Uniform kernels will be replaced by density kernels.\n", - "Curve fitting with 4 kernels and polynomials of 2 degree requires at least 12 datapoints.\n", - "Number of kernels will be reduced to 2 kernels.\n" - ] - } - ], - "source": [ - "#| hide\n", - "\n", - "def noisy_1d(x):\n", - " y = np.sin(x)\n", - " y_err = np.random.normal(y,0.5)\n", - " return y + y_err + 0.5 * x\n", - "\n", - "for uniform in [True, False]:\n", - "\n", - " # To few datapoints for choosen number of kernels\n", - "\n", - " x_train = np.linspace(0,15,6)\n", - " y_train = noisy_1d(x_train)\n", - " x_test = np.linspace(0,15,10)\n", - " y_test = LOESSRegression(n_kernels=4, polynomial_degree=2, uniform=uniform).fit(x_train, y_train).predict(x_test)\n", - "\n", - " # Extrapolation\n", - "\n", - " x_train = np.linspace(0,15,60)\n", - " y_train = noisy_1d(x_train)\n", - " x_test = np.linspace(-10,25,10)\n", - " y_test = LOESSRegression(n_kernels=4, polynomial_degree=2, uniform=uniform).fit(x_train, y_train).predict(x_test)\n", - "\n", - " # single datapoint inference\n", - "\n", - " x_train = np.linspace(0,15,100)\n", - " y_train = noisy_1d(x_train)\n", - " x_test = np.linspace(10,10,1)\n", - " y_test = LOESSRegression(n_kernels=4, polynomial_degree=2, uniform=uniform).fit(x_train, y_train).predict(x_test)\n", - "\n", - " # extrapolation when no other points are interpolated\n", - "\n", - " x_train = np.linspace(0,15,60)\n", - " y_train = y = np.sin(x_train)\n", - " x_test = np.linspace(-2,-1,1)\n", - " y_test = LOESSRegression(n_kernels=4, polynomial_degree=2, uniform=uniform).fit(x_train, y_train).predict(x_test)\n", - " assert (-2.604 - y_test) < 0.01\n", - "\n", - " # uniform kernels instead of density distribted\n", - " x_train = np.concatenate([np.linspace(0,2,30), np.linspace(8,10,30)])\n", - " y_train = y = np.sin(x_train)\n", - " y_test = LOESSRegression(n_kernels=6, polynomial_degree=3,uniform=uniform).fit(x_train, y_train).predict(x_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/nbdev_nbs/styles.css b/nbdev_nbs/styles.css deleted file mode 100644 index 66ccc49e..00000000 --- a/nbdev_nbs/styles.css +++ /dev/null @@ -1,37 +0,0 @@ -.cell { - margin-bottom: 1rem; -} - -.cell > .sourceCode { - margin-bottom: 0; -} - -.cell-output > pre { - margin-bottom: 0; -} - -.cell-output > pre, .cell-output > .sourceCode > pre, .cell-output-stdout > pre { - margin-left: 0.8rem; - margin-top: 0; - background: none; - border-left: 2px solid lightsalmon; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.cell-output > .sourceCode { - border: none; -} - -.cell-output > .sourceCode { - background: none; - margin-top: 0; -} - -div.description { - padding-left: 2px; - padding-top: 5px; - font-style: italic; - font-size: 135%; - opacity: 70%; -} diff --git a/nbs/README.md b/nbs/README.md deleted file mode 100644 index def5df56..00000000 --- a/nbs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Jupyter notebooks for AlphaBase - -Check [docs/nbs](../docs/nbs) for more tutorial notebooks. \ No newline at end of file diff --git a/nbdev_nbs/constants/aa.ipynb b/nbs_tests/constants/aa.ipynb similarity index 100% rename from nbdev_nbs/constants/aa.ipynb rename to nbs_tests/constants/aa.ipynb diff --git a/nbdev_nbs/constants/element.ipynb b/nbs_tests/constants/atom.ipynb similarity index 98% rename from nbdev_nbs/constants/element.ipynb rename to nbs_tests/constants/atom.ipynb index 4a26d3f9..24aedbe3 100644 --- a/nbdev_nbs/constants/element.ipynb +++ b/nbs_tests/constants/atom.ipynb @@ -62,7 +62,7 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.constants.element import *" + "from alphabase.constants.atom import *" ] }, { diff --git a/nbdev_nbs/constants/isotope.ipynb b/nbs_tests/constants/isotope.ipynb similarity index 99% rename from nbdev_nbs/constants/isotope.ipynb rename to nbs_tests/constants/isotope.ipynb index 0c056ac9..d49c0b76 100644 --- a/nbdev_nbs/constants/isotope.ipynb +++ b/nbs_tests/constants/isotope.ipynb @@ -45,7 +45,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.constants.isotope import *" + "from alphabase.constants.isotope import *\n", + "from alphabase.constants.atom import *" ] }, { diff --git a/nbdev_nbs/constants/modification.ipynb b/nbs_tests/constants/modification.ipynb similarity index 100% rename from nbdev_nbs/constants/modification.ipynb rename to nbs_tests/constants/modification.ipynb diff --git a/nbdev_nbs/io/hdf.ipynb b/nbs_tests/io/hdf.ipynb similarity index 100% rename from nbdev_nbs/io/hdf.ipynb rename to nbs_tests/io/hdf.ipynb diff --git a/nbdev_nbs/peptide/fragment.ipynb b/nbs_tests/peptide/fragment.ipynb similarity index 99% rename from nbdev_nbs/peptide/fragment.ipynb rename to nbs_tests/peptide/fragment.ipynb index cb469f1c..922a73ee 100644 --- a/nbdev_nbs/peptide/fragment.ipynb +++ b/nbs_tests/peptide/fragment.ipynb @@ -26,7 +26,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.peptide.fragment import *" + "from alphabase.peptide.fragment import *\n", + "from alphabase.peptide.precursor import *" ] }, { diff --git a/nbdev_nbs/peptide/mass_calc.ipynb b/nbs_tests/peptide/mass_calc.ipynb similarity index 100% rename from nbdev_nbs/peptide/mass_calc.ipynb rename to nbs_tests/peptide/mass_calc.ipynb diff --git a/nbdev_nbs/peptide/mobility.ipynb b/nbs_tests/peptide/mobility.ipynb similarity index 100% rename from nbdev_nbs/peptide/mobility.ipynb rename to nbs_tests/peptide/mobility.ipynb diff --git a/nbdev_nbs/peptide/precursor.ipynb b/nbs_tests/peptide/precursor.ipynb similarity index 100% rename from nbdev_nbs/peptide/precursor.ipynb rename to nbs_tests/peptide/precursor.ipynb diff --git a/nbdev_nbs/protein/annotate_fasta.ipynb b/nbs_tests/protein/annotate_fasta.ipynb similarity index 100% rename from nbdev_nbs/protein/annotate_fasta.ipynb rename to nbs_tests/protein/annotate_fasta.ipynb diff --git a/nbdev_nbs/protein/fasta.ipynb b/nbs_tests/protein/fasta.ipynb similarity index 89% rename from nbdev_nbs/protein/fasta.ipynb rename to nbs_tests/protein/fasta.ipynb index 5f6f8fa3..ba1f01c1 100644 --- a/nbdev_nbs/protein/fasta.ipynb +++ b/nbs_tests/protein/fasta.ipynb @@ -20,7 +20,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n" + ] + } + ], "source": [ "from alphabase.protein.fasta import *\n", "import alphabase.protein.fasta as fasta" @@ -2399,6 +2407,257 @@ "assert fasta_lib.precursor_df.mods.str.contains('Phospho@S').any()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sequenceprotein_idxesmiss_cleavageis_prot_ntermis_prot_ctermmodsmod_sitesnAAchargeprecursor_mz
0AFGHIJK0;10TrueTrueDimethyl@Any_N-term;Dimethyl@K0;7724.212684e+02
1LMNOPQR0;10FalseTrueOxidation@M;Dimethyl@Any_N-term2;0725.202895e+02
2LMNOPQR0;10FalseTrueDimethyl@Any_N-term0725.122920e+02
3ABCDESTK00TrueFalseDimethyl@Any_N-term;Dimethyl@K;Phospho@S0;8;6826.000445e+06
4ABCDESTK00TrueFalseDimethyl@Any_N-term;Dimethyl@K;Phospho@S0;8;6834.000297e+06
.................................
124MABCDESTKAFGHIJKLMNOPQR02TrueFalseDimethyl@Any_N-term;Dimethyl@K;Dimethyl@K;HexN...0;9;16;72334.000972e+06
125MABCDESTKAFGHIJKLMNOPQR02TrueFalseDimethyl@Any_N-term;Dimethyl@K;Dimethyl@K;HexN...0;9;16;72343.000729e+06
126MABCDESTKAFGHIJKLMNOPQR02TrueFalseDimethyl@Any_N-term;Dimethyl@K;Dimethyl@K0;9;162326.001356e+06
127MABCDESTKAFGHIJKLMNOPQR02TrueFalseDimethyl@Any_N-term;Dimethyl@K;Dimethyl@K0;9;162334.000904e+06
128MABCDESTKAFGHIJKLMNOPQR02TrueFalseDimethyl@Any_N-term;Dimethyl@K;Dimethyl@K0;9;162343.000679e+06
\n", + "

129 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " sequence protein_idxes miss_cleavage is_prot_nterm \\\n", + "0 AFGHIJK 0;1 0 True \n", + "1 LMNOPQR 0;1 0 False \n", + "2 LMNOPQR 0;1 0 False \n", + "3 ABCDESTK 0 0 True \n", + "4 ABCDESTK 0 0 True \n", + ".. ... ... ... ... \n", + "124 MABCDESTKAFGHIJKLMNOPQR 0 2 True \n", + "125 MABCDESTKAFGHIJKLMNOPQR 0 2 True \n", + "126 MABCDESTKAFGHIJKLMNOPQR 0 2 True \n", + "127 MABCDESTKAFGHIJKLMNOPQR 0 2 True \n", + "128 MABCDESTKAFGHIJKLMNOPQR 0 2 True \n", + "\n", + " is_prot_cterm mods \\\n", + "0 True Dimethyl@Any_N-term;Dimethyl@K \n", + "1 True Oxidation@M;Dimethyl@Any_N-term \n", + "2 True Dimethyl@Any_N-term \n", + "3 False Dimethyl@Any_N-term;Dimethyl@K;Phospho@S \n", + "4 False Dimethyl@Any_N-term;Dimethyl@K;Phospho@S \n", + ".. ... ... \n", + "124 False Dimethyl@Any_N-term;Dimethyl@K;Dimethyl@K;HexN... \n", + "125 False Dimethyl@Any_N-term;Dimethyl@K;Dimethyl@K;HexN... \n", + "126 False Dimethyl@Any_N-term;Dimethyl@K;Dimethyl@K \n", + "127 False Dimethyl@Any_N-term;Dimethyl@K;Dimethyl@K \n", + "128 False Dimethyl@Any_N-term;Dimethyl@K;Dimethyl@K \n", + "\n", + " mod_sites nAA charge precursor_mz \n", + "0 0;7 7 2 4.212684e+02 \n", + "1 2;0 7 2 5.202895e+02 \n", + "2 0 7 2 5.122920e+02 \n", + "3 0;8;6 8 2 6.000445e+06 \n", + "4 0;8;6 8 3 4.000297e+06 \n", + ".. ... ... ... ... \n", + "124 0;9;16;7 23 3 4.000972e+06 \n", + "125 0;9;16;7 23 4 3.000729e+06 \n", + "126 0;9;16 23 2 6.001356e+06 \n", + "127 0;9;16 23 3 4.000904e+06 \n", + "128 0;9;16 23 4 3.000679e+06 \n", + "\n", + "[129 rows x 10 columns]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fasta_lib = SpecLibFasta(\n", + " var_mods = [\"Oxidation@M\"], \n", + " fix_mods = [\"Dimethyl@K\", \"Dimethyl@Any_N-term\"],\n", + " special_mods=[\"Phospho@S\",\"HexNAc@S\"],\n", + " # labeling_channels={0:['Phospho@S']},\n", + " precursor_mz_max=1e100,\n", + ")\n", + "protein_dict = get_protein_dict()\n", + "fasta_lib.import_and_process_protein_dict(protein_dict)\n", + "assert fasta_lib.precursor_df.mods.str.contains('Dimethyl@Any_N-term').all()\n", + "assert fasta_lib.precursor_df.mods.str.contains('Oxidation@M').any()\n", + "assert fasta_lib.precursor_df.mods.str.contains('Phospho@S').any()\n", + "assert fasta_lib.precursor_df.mods.str.contains('HexNAc@S').any()" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/nbdev_nbs/protein/test_fasta.ipynb b/nbs_tests/protein/test_fasta.ipynb similarity index 100% rename from nbdev_nbs/protein/test_fasta.ipynb rename to nbs_tests/protein/test_fasta.ipynb diff --git a/nbdev_nbs/protein/test_lcp.ipynb b/nbs_tests/protein/test_lcp.ipynb similarity index 100% rename from nbdev_nbs/protein/test_lcp.ipynb rename to nbs_tests/protein/test_lcp.ipynb diff --git a/nbdev_nbs/psm_reader/alphapept_reader.ipynb b/nbs_tests/psm_reader/alphapept_reader.ipynb similarity index 97% rename from nbdev_nbs/psm_reader/alphapept_reader.ipynb rename to nbs_tests/psm_reader/alphapept_reader.ipynb index cae97351..f19aed9c 100644 --- a/nbdev_nbs/psm_reader/alphapept_reader.ipynb +++ b/nbs_tests/psm_reader/alphapept_reader.ipynb @@ -29,7 +29,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.psm_reader.alphapept_reader import *" + "from alphabase.psm_reader.alphapept_reader import *\n", + "register_readers()" ] }, { diff --git a/nbdev_nbs/psm_reader/dia_psm_reader.ipynb b/nbs_tests/psm_reader/dia_psm_reader.ipynb similarity index 99% rename from nbdev_nbs/psm_reader/dia_psm_reader.ipynb rename to nbs_tests/psm_reader/dia_psm_reader.ipynb index b25414b1..efe1ce54 100644 --- a/nbdev_nbs/psm_reader/dia_psm_reader.ipynb +++ b/nbs_tests/psm_reader/dia_psm_reader.ipynb @@ -36,7 +36,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.psm_reader.dia_psm_reader import *" + "from alphabase.psm_reader.dia_psm_reader import *\n", + "register_readers()" ] }, { diff --git a/nbdev_nbs/psm_reader/maxquant_reader.ipynb b/nbs_tests/psm_reader/maxquant_reader.ipynb similarity index 99% rename from nbdev_nbs/psm_reader/maxquant_reader.ipynb rename to nbs_tests/psm_reader/maxquant_reader.ipynb index 192dbd94..71826903 100644 --- a/nbdev_nbs/psm_reader/maxquant_reader.ipynb +++ b/nbs_tests/psm_reader/maxquant_reader.ipynb @@ -22,7 +22,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.psm_reader.maxquant_reader import *" + "from alphabase.psm_reader.maxquant_reader import *\n", + "register_readers()" ] }, { diff --git a/nbdev_nbs/psm_reader/msfragger_reader.ipynb b/nbs_tests/psm_reader/msfragger_reader.ipynb similarity index 99% rename from nbdev_nbs/psm_reader/msfragger_reader.ipynb rename to nbs_tests/psm_reader/msfragger_reader.ipynb index d5a773aa..b9551103 100644 --- a/nbdev_nbs/psm_reader/msfragger_reader.ipynb +++ b/nbs_tests/psm_reader/msfragger_reader.ipynb @@ -23,7 +23,8 @@ "outputs": [], "source": [ "from alphabase.psm_reader.msfragger_reader import *\n", - "from alphabase.peptide.fragment import create_fragment_mz_dataframe" + "from alphabase.peptide.fragment import create_fragment_mz_dataframe\n", + "register_readers()" ] }, { diff --git a/nbdev_nbs/psm_reader/pfind_reader.ipynb b/nbs_tests/psm_reader/pfind_reader.ipynb similarity index 99% rename from nbdev_nbs/psm_reader/pfind_reader.ipynb rename to nbs_tests/psm_reader/pfind_reader.ipynb index ca671cc1..743ab174 100644 --- a/nbdev_nbs/psm_reader/pfind_reader.ipynb +++ b/nbs_tests/psm_reader/pfind_reader.ipynb @@ -33,7 +33,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.psm_reader.pfind_reader import *" + "from alphabase.psm_reader.pfind_reader import *\n", + "register_readers()" ] }, { diff --git a/nbdev_nbs/psm_reader/psm_reader.ipynb b/nbs_tests/psm_reader/psm_reader.ipynb similarity index 100% rename from nbdev_nbs/psm_reader/psm_reader.ipynb rename to nbs_tests/psm_reader/psm_reader.ipynb diff --git a/nbdev_nbs/psm_reader/sage_reader.ipynb b/nbs_tests/psm_reader/sage_reader.ipynb similarity index 99% rename from nbdev_nbs/psm_reader/sage_reader.ipynb rename to nbs_tests/psm_reader/sage_reader.ipynb index 97e54cf3..cb1f90f5 100644 --- a/nbdev_nbs/psm_reader/sage_reader.ipynb +++ b/nbs_tests/psm_reader/sage_reader.ipynb @@ -26,7 +26,8 @@ "metadata": {}, "outputs": [], "source": [ - "from alphabase.psm_reader.sage_reader import *" + "from alphabase.psm_reader.sage_reader import *\n", + "register_readers()" ] }, { diff --git a/nbdev_nbs/psm_reader/speclib_tsv_reader.ipynb b/nbs_tests/psm_reader/speclib_tsv_reader.ipynb similarity index 100% rename from nbdev_nbs/psm_reader/speclib_tsv_reader.ipynb rename to nbs_tests/psm_reader/speclib_tsv_reader.ipynb diff --git a/nbdev_nbs/quantification/test_table_loading.ipynb b/nbs_tests/quantification/test_table_loading.ipynb similarity index 99% rename from nbdev_nbs/quantification/test_table_loading.ipynb rename to nbs_tests/quantification/test_table_loading.ipynb index ce7040c7..1060d7c7 100644 --- a/nbdev_nbs/quantification/test_table_loading.ipynb +++ b/nbs_tests/quantification/test_table_loading.ipynb @@ -236,10 +236,6 @@ "display_name": "python3", "language": "python", "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.8.16" } }, "nbformat": 4, diff --git a/nbdev_nbs/spectral_library/decoy_library.ipynb b/nbs_tests/spectral_library/decoy_library.ipynb similarity index 100% rename from nbdev_nbs/spectral_library/decoy_library.ipynb rename to nbs_tests/spectral_library/decoy_library.ipynb diff --git a/nbdev_nbs/spectral_library/flat_library.ipynb b/nbs_tests/spectral_library/flat_library.ipynb similarity index 53% rename from nbdev_nbs/spectral_library/flat_library.ipynb rename to nbs_tests/spectral_library/flat_library.ipynb index 328394d0..d371863e 100644 --- a/nbdev_nbs/spectral_library/flat_library.ipynb +++ b/nbs_tests/spectral_library/flat_library.ipynb @@ -13,7 +13,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n" + ] + } + ], "source": [ "from alphabase.spectral_library.flat import *" ] @@ -38,7 +46,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 6/6 [00:00<00:00, 2007.64it/s]\n" + "100%|██████████| 6/6 [00:00<00:00, 2663.05it/s]\n" ] }, { @@ -70,249 +78,249 @@ " \n", " \n", " 0\n", - " 686.275635\n", - " 0.103734\n", + " 609.300781\n", + " 0.450362\n", " 121\n", " \n", " \n", " 1\n", - " 588.298767\n", + " 511.323853\n", " 1.000000\n", " 121\n", " \n", " \n", " 2\n", - " 349.171783\n", - " 0.092058\n", + " 510.232330\n", + " 0.106543\n", " 121\n", " \n", " \n", " 3\n", - " 762.258301\n", - " 0.084908\n", + " 412.255432\n", + " 0.374123\n", " 121\n", " \n", " \n", " 4\n", - " 664.281433\n", - " 0.328738\n", + " 411.163940\n", + " 0.069116\n", " 121\n", " \n", " \n", " 5\n", - " 497.283051\n", - " 0.284129\n", + " 313.187042\n", + " 0.173858\n", " 121\n", " \n", " \n", " 6\n", - " 496.191528\n", - " 0.276969\n", + " 321.694702\n", + " 0.515072\n", " 121\n", " \n", " \n", " 7\n", - " 268.165558\n", - " 0.057554\n", - " 98\n", + " 545.329346\n", + " 0.745664\n", + " 121\n", " \n", " \n", " 8\n", - " 398.214630\n", - " 0.262853\n", - " 121\n", + " 326.171051\n", + " 0.143703\n", + " 98\n", " \n", " \n", " 9\n", - " 267.074036\n", - " 0.087439\n", - " 98\n", + " 432.245270\n", + " 1.000000\n", + " 121\n", " \n", " \n", " 10\n", - " 329.193176\n", - " 1.000000\n", - " 121\n", + " 397.208160\n", + " 0.094888\n", + " 98\n", " \n", " \n", " 11\n", - " 435.163940\n", - " 0.061627\n", - " 98\n", + " 361.208160\n", + " 0.377585\n", + " 121\n", " \n", " \n", " 12\n", - " 609.300781\n", - " 0.450362\n", - " 121\n", + " 496.276581\n", + " 0.054980\n", + " 98\n", " \n", " \n", " 13\n", - " 511.323853\n", - " 1.000000\n", + " 686.275635\n", + " 0.103734\n", " 121\n", " \n", " \n", " 14\n", - " 510.232330\n", - " 0.106543\n", + " 588.298767\n", + " 1.000000\n", " 121\n", " \n", " \n", " 15\n", - " 412.255432\n", - " 0.374123\n", + " 349.171783\n", + " 0.092058\n", " 121\n", " \n", " \n", " 16\n", - " 411.163940\n", - " 0.069116\n", + " 661.295654\n", + " 0.198974\n", " 121\n", " \n", " \n", " 17\n", - " 313.187042\n", - " 0.173858\n", + " 563.318787\n", + " 0.774316\n", " 121\n", " \n", " \n", " 18\n", - " 321.694702\n", - " 0.515072\n", + " 494.297302\n", + " 1.000000\n", " 121\n", " \n", " \n", " 19\n", - " 545.329346\n", - " 0.745664\n", - " 121\n", + " 256.129181\n", + " 0.649715\n", + " 98\n", " \n", " \n", " 20\n", - " 326.171051\n", - " 0.143703\n", - " 98\n", + " 347.228882\n", + " 0.882733\n", + " 121\n", " \n", " \n", " 21\n", - " 432.245270\n", - " 1.000000\n", - " 121\n", + " 403.197601\n", + " 0.351781\n", + " 98\n", " \n", " \n", " 22\n", - " 397.208160\n", - " 0.094888\n", + " 490.229614\n", + " 0.400474\n", " 98\n", " \n", " \n", " 23\n", - " 361.208160\n", - " 0.377585\n", - " 121\n", + " 701.290588\n", + " 0.244350\n", + " 98\n", " \n", " \n", " 24\n", - " 496.276581\n", - " 0.054980\n", + " 603.313660\n", + " 0.631000\n", " 98\n", " \n", " \n", " 25\n", - " 698.312073\n", - " 0.602346\n", + " 762.258301\n", + " 0.084908\n", " 121\n", " \n", " \n", " 26\n", - " 600.335144\n", - " 1.000000\n", + " 664.281433\n", + " 0.328738\n", " 121\n", " \n", " \n", " 27\n", - " 611.280029\n", - " 0.141106\n", + " 497.283051\n", + " 0.284129\n", " 121\n", " \n", " \n", " 28\n", - " 513.303101\n", - " 0.705295\n", + " 496.191528\n", + " 0.276969\n", " 121\n", " \n", " \n", " 29\n", - " 498.195953\n", - " 0.108914\n", - " 121\n", + " 268.165558\n", + " 0.057554\n", + " 98\n", " \n", " \n", " 30\n", - " 400.219055\n", - " 0.279959\n", + " 398.214630\n", + " 0.262853\n", " 121\n", " \n", " \n", " 31\n", - " 331.197601\n", - " 0.492018\n", - " 121\n", + " 267.074036\n", + " 0.087439\n", + " 98\n", " \n", " \n", " 32\n", - " 661.295654\n", - " 0.198974\n", + " 329.193176\n", + " 1.000000\n", " 121\n", " \n", " \n", " 33\n", - " 563.318787\n", - " 0.774316\n", - " 121\n", + " 435.163940\n", + " 0.061627\n", + " 98\n", " \n", " \n", " 34\n", - " 494.297302\n", - " 1.000000\n", + " 698.312073\n", + " 0.602346\n", " 121\n", " \n", " \n", " 35\n", - " 256.129181\n", - " 0.649715\n", - " 98\n", + " 600.335144\n", + " 1.000000\n", + " 121\n", " \n", " \n", " 36\n", - " 347.228882\n", - " 0.882733\n", + " 611.280029\n", + " 0.141106\n", " 121\n", " \n", " \n", " 37\n", - " 403.197601\n", - " 0.351781\n", - " 98\n", + " 513.303101\n", + " 0.705295\n", + " 121\n", " \n", " \n", " 38\n", - " 490.229614\n", - " 0.400474\n", - " 98\n", + " 498.195953\n", + " 0.108914\n", + " 121\n", " \n", " \n", " 39\n", - " 701.290588\n", - " 0.244350\n", - " 98\n", + " 400.219055\n", + " 0.279959\n", + " 121\n", " \n", " \n", " 40\n", - " 603.313660\n", - " 0.631000\n", - " 98\n", + " 331.197601\n", + " 0.492018\n", + " 121\n", " \n", " \n", "\n", @@ -320,47 +328,47 @@ ], "text/plain": [ " mz intensity type\n", - "0 686.275635 0.103734 121\n", - "1 588.298767 1.000000 121\n", - "2 349.171783 0.092058 121\n", - "3 762.258301 0.084908 121\n", - "4 664.281433 0.328738 121\n", - "5 497.283051 0.284129 121\n", - "6 496.191528 0.276969 121\n", - "7 268.165558 0.057554 98\n", - "8 398.214630 0.262853 121\n", - "9 267.074036 0.087439 98\n", - "10 329.193176 1.000000 121\n", - "11 435.163940 0.061627 98\n", - "12 609.300781 0.450362 121\n", - "13 511.323853 1.000000 121\n", - "14 510.232330 0.106543 121\n", - "15 412.255432 0.374123 121\n", - "16 411.163940 0.069116 121\n", - "17 313.187042 0.173858 121\n", - "18 321.694702 0.515072 121\n", - "19 545.329346 0.745664 121\n", - "20 326.171051 0.143703 98\n", - "21 432.245270 1.000000 121\n", - "22 397.208160 0.094888 98\n", - "23 361.208160 0.377585 121\n", - "24 496.276581 0.054980 98\n", - "25 698.312073 0.602346 121\n", - "26 600.335144 1.000000 121\n", - "27 611.280029 0.141106 121\n", - "28 513.303101 0.705295 121\n", - "29 498.195953 0.108914 121\n", - "30 400.219055 0.279959 121\n", - "31 331.197601 0.492018 121\n", - "32 661.295654 0.198974 121\n", - "33 563.318787 0.774316 121\n", - "34 494.297302 1.000000 121\n", - "35 256.129181 0.649715 98\n", - "36 347.228882 0.882733 121\n", - "37 403.197601 0.351781 98\n", - "38 490.229614 0.400474 98\n", - "39 701.290588 0.244350 98\n", - "40 603.313660 0.631000 98" + "0 609.300781 0.450362 121\n", + "1 511.323853 1.000000 121\n", + "2 510.232330 0.106543 121\n", + "3 412.255432 0.374123 121\n", + "4 411.163940 0.069116 121\n", + "5 313.187042 0.173858 121\n", + "6 321.694702 0.515072 121\n", + "7 545.329346 0.745664 121\n", + "8 326.171051 0.143703 98\n", + "9 432.245270 1.000000 121\n", + "10 397.208160 0.094888 98\n", + "11 361.208160 0.377585 121\n", + "12 496.276581 0.054980 98\n", + "13 686.275635 0.103734 121\n", + "14 588.298767 1.000000 121\n", + "15 349.171783 0.092058 121\n", + "16 661.295654 0.198974 121\n", + "17 563.318787 0.774316 121\n", + "18 494.297302 1.000000 121\n", + "19 256.129181 0.649715 98\n", + "20 347.228882 0.882733 121\n", + "21 403.197601 0.351781 98\n", + "22 490.229614 0.400474 98\n", + "23 701.290588 0.244350 98\n", + "24 603.313660 0.631000 98\n", + "25 762.258301 0.084908 121\n", + "26 664.281433 0.328738 121\n", + "27 497.283051 0.284129 121\n", + "28 496.191528 0.276969 121\n", + "29 268.165558 0.057554 98\n", + "30 398.214630 0.262853 121\n", + "31 267.074036 0.087439 98\n", + "32 329.193176 1.000000 121\n", + "33 435.163940 0.061627 98\n", + "34 698.312073 0.602346 121\n", + "35 600.335144 1.000000 121\n", + "36 611.280029 0.141106 121\n", + "37 513.303101 0.705295 121\n", + "38 498.195953 0.108914 121\n", + "39 400.219055 0.279959 121\n", + "40 331.197601 0.492018 121" ] }, "execution_count": null, @@ -453,14 +461,14 @@ " \n", " \n", " \n", - " rt\n", " nAA\n", + " sequence\n", " charge\n", - " precursor_mz\n", " mobility\n", - " mod_sites\n", - " sequence\n", + " precursor_mz\n", + " rt\n", " mods\n", + " mod_sites\n", " frag_start_idx\n", " frag_stop_idx\n", " rt_norm\n", @@ -472,134 +480,707 @@ " \n", " \n", " 0\n", - " -27.563500\n", " 7\n", + " AVVVSPK\n", " 2\n", - " 409.161712\n", " 0.9\n", - " 3\n", - " MGSLDSK\n", + " 390.206779\n", + " -22.849740\n", " Phospho@S\n", + " 5\n", " 0\n", " 6\n", - " 0.000000\n", - " 366.564438\n", + " 0.075327\n", + " 366.858877\n", " 0\n", - " 3\n", + " 6\n", " \n", " \n", " 1\n", - " -23.930850\n", " 7\n", + " DPLAVDK\n", " 2\n", - " 431.167001\n", " 0.9\n", - " 2;4\n", - " VSVSPGR\n", - " Phospho@S;Phospho@S\n", + " 379.208161\n", + " -15.087100\n", + " \n", + " \n", " 6\n", " 12\n", - " 0.058050\n", - " 366.254833\n", - " 3\n", - " 12\n", + " 0.199375\n", + " 367.043100\n", + " 6\n", + " 13\n", " \n", " \n", " 2\n", - " -22.849740\n", " 7\n", + " MGSLDSK\n", " 2\n", - " 390.206779\n", " 0.9\n", - " 5\n", - " AVVVSPK\n", + " 409.161712\n", + " -27.563500\n", " Phospho@S\n", + " 3\n", " 12\n", " 18\n", - " 0.075327\n", - " 366.858877\n", - " 12\n", + " 0.000000\n", + " 366.564438\n", + " 13\n", + " 16\n", + " \n", + " \n", + " 3\n", + " 7\n", + " SVSFSLK\n", + " 1\n", + " 0.9\n", + " 847.396112\n", + " 35.014110\n", + " Phospho@S\n", + " 3\n", " 18\n", + " 24\n", + " 1.000000\n", + " 183.178171\n", + " 16\n", + " 25\n", + " \n", + " \n", + " 4\n", + " 7\n", + " VSVSPGR\n", + " 2\n", + " 0.9\n", + " 431.167001\n", + " -23.930850\n", + " Phospho@S;Phospho@S\n", + " 2;4\n", + " 24\n", + " 30\n", + " 0.058050\n", + " 366.254833\n", + " 25\n", + " 34\n", + " \n", + " \n", + " 5\n", + " 7\n", + " YSLSPSK\n", + " 2\n", + " 0.9\n", + " 431.191326\n", + " -6.428198\n", + " Phospho@S\n", + " 4\n", + " 30\n", + " 36\n", + " 0.337745\n", + " 366.254509\n", + " 34\n", + " 41\n", + " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " nAA sequence charge mobility precursor_mz rt \\\n", + "0 7 AVVVSPK 2 0.9 390.206779 -22.849740 \n", + "1 7 DPLAVDK 2 0.9 379.208161 -15.087100 \n", + "2 7 MGSLDSK 2 0.9 409.161712 -27.563500 \n", + "3 7 SVSFSLK 1 0.9 847.396112 35.014110 \n", + "4 7 VSVSPGR 2 0.9 431.167001 -23.930850 \n", + "5 7 YSLSPSK 2 0.9 431.191326 -6.428198 \n", + "\n", + " mods mod_sites frag_start_idx frag_stop_idx rt_norm \\\n", + "0 Phospho@S 5 0 6 0.075327 \n", + "1 6 12 0.199375 \n", + "2 Phospho@S 3 12 18 0.000000 \n", + "3 Phospho@S 3 18 24 1.000000 \n", + "4 Phospho@S;Phospho@S 2;4 24 30 0.058050 \n", + "5 Phospho@S 4 30 36 0.337745 \n", + "\n", + " ccs flat_frag_start_idx flat_frag_stop_idx \n", + "0 366.858877 0 6 \n", + "1 367.043100 6 13 \n", + "2 366.564438 13 16 \n", + "3 183.178171 16 25 \n", + "4 366.254833 25 34 \n", + "5 366.254509 34 41 " + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| hide\n", + "flat_lib.precursor_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "flat_lib.save_hdf('test.hdf')\n", + "test_lib = SpecLibFlat()\n", + "test_lib.load_hdf('test.hdf')\n", + "os.remove('test.hdf')\n", + "assert len(test_lib.precursor_df.values) == len(flat_lib.precursor_df)\n", + "assert len(test_lib.protein_df.values) == len(flat_lib.protein_df)\n", + "assert len(test_lib.fragment_df.values) == len(flat_lib.fragment_df)\n", + "assert len(test_lib.fragment_mz_df.values) == len(flat_lib.fragment_mz_df)\n", + "assert len(test_lib.fragment_intensity_df.values) == len(flat_lib.fragment_intensity_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flat_lib._precursor_df = flat_lib.precursor_df.iloc[[2,4]]\n", + "flat_lib.remove_unused_fragments()\n", + "assert (\n", + " flat_lib.precursor_df.flat_frag_start_idx.values[1:]\n", + " ==flat_lib.precursor_df.flat_frag_stop_idx[:-1]\n", + ").all()\n", + "assert flat_lib.precursor_df.flat_frag_stop_idx.max() == len(flat_lib.fragment_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## FLatLib to SpecLibBAse" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 6/6 [00:00<00:00, 2457.12it/s]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
b_z1b_z2y_z1y_z2b_modloss_z1b_modloss_z2y_modloss_z1y_modloss_z2
00.0000000.0000000.0000000.0000000.0000000.00.0000000.0
10.0000000.0000000.4503620.0000000.0000000.01.0000000.0
20.0000000.0000000.1065430.0000000.0000000.00.3741230.0
30.0000000.0000000.0691160.0000000.0000000.00.1738580.0
40.0000000.0000000.0000000.0000000.0000000.00.0000000.0
50.0000000.0000000.0000000.0000000.0000000.00.0000000.0
60.0000000.0000000.0000000.5150720.0000000.00.0000000.0
70.0000000.0000000.7456640.0000000.0000000.00.0000000.0
80.1437030.0000001.0000000.0000000.0000000.00.0000000.0
90.0948880.0000000.3775850.0000000.0000000.00.0000000.0
100.0549800.0000000.0000000.0000000.0000000.00.0000000.0
110.0000000.0000000.0000000.0000000.0000000.00.0000000.0
120.0000000.0000000.1037340.0000000.0000000.01.0000000.0
130.0000000.0000000.0000000.0000000.0000000.00.0000000.0
140.0000000.0000000.0000000.0000000.0000000.00.0000000.0
150.0000000.0000000.0920580.0000000.0000000.00.0000000.0
160.0000000.0000000.0000000.0000000.0000000.00.0000000.0
170.0000000.0000000.0000000.0000000.0000000.00.0000000.0
180.0000000.0000000.0000000.0000000.0000000.00.0000000.0
190.0000000.0000000.1989740.0000000.0000000.00.7743160.0
200.0000000.0000001.0000000.0000000.6497150.00.0000000.0
210.0000000.0000000.8827330.0000000.3517810.00.0000000.0
220.0000000.0000000.0000000.0000000.4004740.00.0000000.0
230.2443500.0000000.0000000.0000000.6310000.00.0000000.0
240.0000000.0000000.0849080.0000000.0000000.00.3287380.0
250.0000000.0000000.0000000.0000000.0000000.00.2841290.0
3-15.08710072379.2081610.9DPLAVDK18240.199375367.0431001825260.0000000.0000000.2769690.0000000.0575540.00.2628530.0
4-6.42819872431.1913260.94YSLSPSKPhospho@S24300.337745366.2545092532270.0000000.0874391.0000000.0000000.0616270.00.0000000.0
535.01411071847.3961120.93SVSFSLKPhospho@S3036280.0000000.0000000.0000000.0000000.0000000.00.0000000.0
290.0000000.0000000.0000000.0000000.0000000.00.0000000.0
300.0000000.0000000.6023460.0000000.0000000.01.000000183.17817132410.0
310.0000000.0000000.1411060.0000000.0000000.00.7052950.0
320.0000000.0000000.1089140.0000000.0000000.00.2799590.0
330.0000000.0000000.4920180.0000000.0000000.00.0000000.0
340.0000000.0000000.0000000.0000000.0000000.00.0000000.0
350.0000000.0000000.0000000.0000000.0000000.00.0000000.0
\n", "
" ], "text/plain": [ - " rt nAA charge precursor_mz mobility mod_sites sequence \\\n", - "0 -27.563500 7 2 409.161712 0.9 3 MGSLDSK \n", - "1 -23.930850 7 2 431.167001 0.9 2;4 VSVSPGR \n", - "2 -22.849740 7 2 390.206779 0.9 5 AVVVSPK \n", - "3 -15.087100 7 2 379.208161 0.9 DPLAVDK \n", - "4 -6.428198 7 2 431.191326 0.9 4 YSLSPSK \n", - "5 35.014110 7 1 847.396112 0.9 3 SVSFSLK \n", - "\n", - " mods frag_start_idx frag_stop_idx rt_norm ccs \\\n", - "0 Phospho@S 0 6 0.000000 366.564438 \n", - "1 Phospho@S;Phospho@S 6 12 0.058050 366.254833 \n", - "2 Phospho@S 12 18 0.075327 366.858877 \n", - "3 18 24 0.199375 367.043100 \n", - "4 Phospho@S 24 30 0.337745 366.254509 \n", - "5 Phospho@S 30 36 1.000000 183.178171 \n", + " b_z1 b_z2 y_z1 y_z2 b_modloss_z1 b_modloss_z2 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "1 0.000000 0.000000 0.450362 0.000000 0.000000 0.0 \n", + "2 0.000000 0.000000 0.106543 0.000000 0.000000 0.0 \n", + "3 0.000000 0.000000 0.069116 0.000000 0.000000 0.0 \n", + "4 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "5 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "6 0.000000 0.000000 0.000000 0.515072 0.000000 0.0 \n", + "7 0.000000 0.000000 0.745664 0.000000 0.000000 0.0 \n", + "8 0.143703 0.000000 1.000000 0.000000 0.000000 0.0 \n", + "9 0.094888 0.000000 0.377585 0.000000 0.000000 0.0 \n", + "10 0.054980 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "11 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "12 0.000000 0.000000 0.103734 0.000000 0.000000 0.0 \n", + "13 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "14 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "15 0.000000 0.000000 0.092058 0.000000 0.000000 0.0 \n", + "16 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "17 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "18 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "19 0.000000 0.000000 0.198974 0.000000 0.000000 0.0 \n", + "20 0.000000 0.000000 1.000000 0.000000 0.649715 0.0 \n", + "21 0.000000 0.000000 0.882733 0.000000 0.351781 0.0 \n", + "22 0.000000 0.000000 0.000000 0.000000 0.400474 0.0 \n", + "23 0.244350 0.000000 0.000000 0.000000 0.631000 0.0 \n", + "24 0.000000 0.000000 0.084908 0.000000 0.000000 0.0 \n", + "25 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "26 0.000000 0.000000 0.276969 0.000000 0.057554 0.0 \n", + "27 0.000000 0.087439 1.000000 0.000000 0.061627 0.0 \n", + "28 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "29 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "30 0.000000 0.000000 0.602346 0.000000 0.000000 0.0 \n", + "31 0.000000 0.000000 0.141106 0.000000 0.000000 0.0 \n", + "32 0.000000 0.000000 0.108914 0.000000 0.000000 0.0 \n", + "33 0.000000 0.000000 0.492018 0.000000 0.000000 0.0 \n", + "34 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", + "35 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 \n", "\n", - " flat_frag_start_idx flat_frag_stop_idx \n", - "0 0 3 \n", - "1 3 12 \n", - "2 12 18 \n", - "3 18 25 \n", - "4 25 32 \n", - "5 32 41 " + " y_modloss_z1 y_modloss_z2 \n", + "0 0.000000 0.0 \n", + "1 1.000000 0.0 \n", + "2 0.374123 0.0 \n", + "3 0.173858 0.0 \n", + "4 0.000000 0.0 \n", + "5 0.000000 0.0 \n", + "6 0.000000 0.0 \n", + "7 0.000000 0.0 \n", + "8 0.000000 0.0 \n", + "9 0.000000 0.0 \n", + "10 0.000000 0.0 \n", + "11 0.000000 0.0 \n", + "12 1.000000 0.0 \n", + "13 0.000000 0.0 \n", + "14 0.000000 0.0 \n", + "15 0.000000 0.0 \n", + "16 0.000000 0.0 \n", + "17 0.000000 0.0 \n", + "18 0.000000 0.0 \n", + "19 0.774316 0.0 \n", + "20 0.000000 0.0 \n", + "21 0.000000 0.0 \n", + "22 0.000000 0.0 \n", + "23 0.000000 0.0 \n", + "24 0.328738 0.0 \n", + "25 0.284129 0.0 \n", + "26 0.262853 0.0 \n", + "27 0.000000 0.0 \n", + "28 0.000000 0.0 \n", + "29 0.000000 0.0 \n", + "30 1.000000 0.0 \n", + "31 0.705295 0.0 \n", + "32 0.279959 0.0 \n", + "33 0.000000 0.0 \n", + "34 0.000000 0.0 \n", + "35 0.000000 0.0 " ] }, "execution_count": null, @@ -607,42 +1188,6 @@ "output_type": "execute_result" } ], - "source": [ - "#| hide\n", - "flat_lib.precursor_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "flat_lib.save_hdf('test.hdf')\n", - "test_lib = SpecLibFlat()\n", - "test_lib.load_hdf('test.hdf')\n", - "os.remove('test.hdf')\n", - "assert len(test_lib.precursor_df.values) == len(flat_lib.precursor_df)\n", - "assert len(test_lib.protein_df.values) == len(flat_lib.protein_df)\n", - "assert len(test_lib.fragment_df.values) == len(flat_lib.fragment_df)\n", - "assert len(test_lib.fragment_mz_df.values) == len(flat_lib.fragment_mz_df)\n", - "assert len(test_lib.fragment_intensity_df.values) == len(flat_lib.fragment_intensity_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## FLatLib to SpecLibBAse" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "target = LibraryReaderBase()\n", "target.import_file(StringIO(tsv_str))\n", @@ -651,7 +1196,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -686,48 +1231,48 @@ " \n", " \n", " 0\n", - " 686.275635\n", - " 0.103734\n", + " 609.300781\n", + " 0.450362\n", " 121\n", " 0\n", " 1\n", - " 0\n", + " 1\n", " \n", " \n", " 1\n", - " 588.298767\n", + " 511.323853\n", " 1.000000\n", " 121\n", " 98\n", " 1\n", - " 0\n", + " 1\n", " \n", " \n", " 2\n", - " 349.171783\n", - " 0.092058\n", + " 510.232330\n", + " 0.106543\n", " 121\n", " 0\n", " 1\n", - " 3\n", + " 2\n", " \n", " \n", " 3\n", - " 762.258301\n", - " 0.084908\n", + " 412.255432\n", + " 0.374123\n", " 121\n", - " 0\n", + " 98\n", " 1\n", - " 0\n", + " 2\n", " \n", " \n", " 4\n", - " 664.281433\n", - " 0.328738\n", + " 411.163940\n", + " 0.069116\n", " 121\n", - " 98\n", - " 1\n", " 0\n", + " 1\n", + " 3\n", " \n", " \n", "\n", @@ -735,14 +1280,14 @@ ], "text/plain": [ " mz intensity type loss_type charge position\n", - "0 686.275635 0.103734 121 0 1 0\n", - "1 588.298767 1.000000 121 98 1 0\n", - "2 349.171783 0.092058 121 0 1 3\n", - "3 762.258301 0.084908 121 0 1 0\n", - "4 664.281433 0.328738 121 98 1 0" + "0 609.300781 0.450362 121 0 1 1\n", + "1 511.323853 1.000000 121 98 1 1\n", + "2 510.232330 0.106543 121 0 1 2\n", + "3 412.255432 0.374123 121 98 1 2\n", + "4 411.163940 0.069116 121 0 1 3" ] }, - "execution_count": 58, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -756,7 +1301,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -781,11 +1326,11 @@ " \n", " \n", " y_z2\n", - " b_z1\n", " b_z2\n", " y_modloss_z1\n", - " b_modloss_z1\n", + " b_z1\n", " y_z1\n", + " b_modloss_z1\n", " \n", " \n", " \n", @@ -793,61 +1338,61 @@ " 0\n", " 0.0\n", " 0.0\n", + " 0.000000\n", " 0.0\n", - " 1.0\n", + " 0.000000\n", " 0.0\n", - " 0.103734\n", " \n", " \n", " 1\n", " 0.0\n", " 0.0\n", + " 1.000000\n", " 0.0\n", + " 0.450362\n", " 0.0\n", - " 0.0\n", - " 0.000000\n", " \n", " \n", " 2\n", " 0.0\n", " 0.0\n", + " 0.374123\n", " 0.0\n", + " 0.106543\n", " 0.0\n", - " 0.0\n", - " 0.000000\n", " \n", " \n", " 3\n", " 0.0\n", " 0.0\n", + " 0.173858\n", " 0.0\n", + " 0.069116\n", " 0.0\n", - " 0.0\n", - " 0.092058\n", " \n", " \n", " 4\n", " 0.0\n", " 0.0\n", - " 0.0\n", - " 0.0\n", + " 0.000000\n", " 0.0\n", " 0.000000\n", + " 0.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " y_z2 b_z1 b_z2 y_modloss_z1 b_modloss_z1 y_z1\n", - "0 0.0 0.0 0.0 1.0 0.0 0.103734\n", - "1 0.0 0.0 0.0 0.0 0.0 0.000000\n", - "2 0.0 0.0 0.0 0.0 0.0 0.000000\n", - "3 0.0 0.0 0.0 0.0 0.0 0.092058\n", - "4 0.0 0.0 0.0 0.0 0.0 0.000000" + " y_z2 b_z2 y_modloss_z1 b_z1 y_z1 b_modloss_z1\n", + "0 0.0 0.0 0.000000 0.0 0.000000 0.0\n", + "1 0.0 0.0 1.000000 0.0 0.450362 0.0\n", + "2 0.0 0.0 0.374123 0.0 0.106543 0.0\n", + "3 0.0 0.0 0.173858 0.0 0.069116 0.0\n", + "4 0.0 0.0 0.000000 0.0 0.000000 0.0" ] }, - "execution_count": 59, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -859,7 +1404,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -868,7 +1413,7 @@ "['_fragment_intensity_df', '_fragment_mz_df']" ] }, - "execution_count": 60, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -879,7 +1424,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -894,7 +1439,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -905,7 +1450,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -913,6 +1458,13 @@ "back_to_base.calc_fragment_mz_df()\n", "pd.testing.assert_frame_equal(target.fragment_mz_df[non_zero_target_columns].sort_index(axis=1), back_to_base.fragment_mz_df.sort_index(axis=1), check_dtype=False)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/nbdev_nbs/spectral_library/library_base.ipynb b/nbs_tests/spectral_library/library_base.ipynb similarity index 100% rename from nbdev_nbs/spectral_library/library_base.ipynb rename to nbs_tests/spectral_library/library_base.ipynb diff --git a/nbdev_nbs/spectral_library/library_reader.ipynb b/nbs_tests/spectral_library/library_reader.ipynb similarity index 100% rename from nbdev_nbs/spectral_library/library_reader.ipynb rename to nbs_tests/spectral_library/library_reader.ipynb diff --git a/nbdev_nbs/spectral_library/raw_library_generator.ipynb b/nbs_tests/spectral_library/raw_library_generator.ipynb similarity index 100% rename from nbdev_nbs/spectral_library/raw_library_generator.ipynb rename to nbs_tests/spectral_library/raw_library_generator.ipynb diff --git a/nbdev_nbs/spectral_library/translate.ipynb b/nbs_tests/spectral_library/translate.ipynb similarity index 100% rename from nbdev_nbs/spectral_library/translate.ipynb rename to nbs_tests/spectral_library/translate.ipynb diff --git a/nbdev_nbs/spectral_library/validate.ipynb b/nbs_tests/spectral_library/validate.ipynb similarity index 100% rename from nbdev_nbs/spectral_library/validate.ipynb rename to nbs_tests/spectral_library/validate.ipynb diff --git a/nbs_tests/test_isotope_calc.ipynb b/nbs_tests/test_isotope_calc.ipynb index 8dc12724..c70d3a96 100644 --- a/nbs_tests/test_isotope_calc.ipynb +++ b/nbs_tests/test_isotope_calc.ipynb @@ -38,7 +38,7 @@ "import pandas as pd\n", "\n", "from alphabase.peptide.precursor import (\n", - " calc_precursor_isotope_intensity, calc_precursor_mz\n", + " calc_precursor_isotope_intensity, update_precursor_mz\n", ")\n", "from alphabase.constants.aa import reset_AA_atoms\n", "from alphabase.constants.atom import CHEM_INFO_DICT\n", @@ -54,7 +54,7 @@ " charge=3\n", "))\n", "precursor_df = calc_precursor_isotope_intensity(precursor_df)\n", - "precursor_df = calc_precursor_mz(precursor_df)\n", + "precursor_df = update_precursor_mz(precursor_df)\n", "mono_idx = precursor_df.mono_isotope_idx[0]\n", "\n", "masses = precursor_df.precursor_mz[0]+1.0033*np.arange(-mono_idx, 6-mono_idx)/precursor_df.charge[0]\n", diff --git a/nbs_tests/test_isotope_mp.ipynb b/nbs_tests/test_isotope_mp.ipynb index 92bfcf3d..63220373 100644 --- a/nbs_tests/test_isotope_mp.ipynb +++ b/nbs_tests/test_isotope_mp.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,645 +33,25 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sequencemodsmod_sitesnAAchargeprecursor_mzisotope_m1_intensityisotope_apex_intensityisotope_apex_indexisotope_right_most_intensityisotope_right_most_indexisotope_m1_mzisotope_apex_mzisotope_right_most_mz
100AGHCEWQMK92545.2338620.5766231.000.2775422545.735512545.233862546.237162
101AGHCEWQMK92545.2338620.5766231.000.2775422545.735512545.233862546.237162
102AGHCEWQMK92545.2338620.5766231.000.2775422545.735512545.233862546.237162
103AGHCEWQMK92545.2338620.5766231.000.2775422545.735512545.233862546.237162
104AGHCEWQMK92545.2338620.5766231.000.2775422545.735512545.233862546.237162
.............................................
95AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.000.2358893874.371421873.869771875.374721
96AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.000.2358893874.371421873.869771875.374721
97AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.000.2358893874.371421873.869771875.374721
98AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.000.2358893874.371421873.869771875.374721
99AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.000.2358893874.371421873.869771875.374721
\n", - "

200 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " sequence mods \\\n", - "100 AGHCEWQMK \n", - "101 AGHCEWQMK \n", - "102 AGHCEWQMK \n", - "103 AGHCEWQMK \n", - "104 AGHCEWQMK \n", - ".. ... ... \n", - "95 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "96 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "97 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "98 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "99 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "\n", - " mod_sites nAA charge precursor_mz isotope_m1_intensity \\\n", - "100 9 2 545.233862 0.576623 \n", - "101 9 2 545.233862 0.576623 \n", - "102 9 2 545.233862 0.576623 \n", - "103 9 2 545.233862 0.576623 \n", - "104 9 2 545.233862 0.576623 \n", - ".. ... ... ... ... ... \n", - "95 0;4;8 14 2 873.869771 0.888952 \n", - "96 0;4;8 14 2 873.869771 0.888952 \n", - "97 0;4;8 14 2 873.869771 0.888952 \n", - "98 0;4;8 14 2 873.869771 0.888952 \n", - "99 0;4;8 14 2 873.869771 0.888952 \n", - "\n", - " isotope_apex_intensity isotope_apex_index isotope_right_most_intensity \\\n", - "100 1.0 0 0.277542 \n", - "101 1.0 0 0.277542 \n", - "102 1.0 0 0.277542 \n", - "103 1.0 0 0.277542 \n", - "104 1.0 0 0.277542 \n", - ".. ... ... ... \n", - "95 1.0 0 0.235889 \n", - "96 1.0 0 0.235889 \n", - "97 1.0 0 0.235889 \n", - "98 1.0 0 0.235889 \n", - "99 1.0 0 0.235889 \n", - "\n", - " isotope_right_most_index isotope_m1_mz isotope_apex_mz \\\n", - "100 2 545.735512 545.233862 \n", - "101 2 545.735512 545.233862 \n", - "102 2 545.735512 545.233862 \n", - "103 2 545.735512 545.233862 \n", - "104 2 545.735512 545.233862 \n", - ".. ... ... ... \n", - "95 3 874.371421 873.869771 \n", - "96 3 874.371421 873.869771 \n", - "97 3 874.371421 873.869771 \n", - "98 3 874.371421 873.869771 \n", - "99 3 874.371421 873.869771 \n", - "\n", - " isotope_right_most_mz \n", - "100 546.237162 \n", - "101 546.237162 \n", - "102 546.237162 \n", - "103 546.237162 \n", - "104 546.237162 \n", - ".. ... \n", - "95 875.374721 \n", - "96 875.374721 \n", - "97 875.374721 \n", - "98 875.374721 \n", - "99 875.374721 \n", - "\n", - "[200 rows x 14 columns]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "from alphabase.peptide.precursor import calc_precursor_isotope_mp\n", + "from alphabase.peptide.precursor import calc_precursor_isotope_intensity_mp\n", "\n", - "precursor_df = calc_precursor_isotope_mp(precursor_df, processes=2, mp_batch_size=50)\n", + "precursor_df = calc_precursor_isotope_intensity_mp(precursor_df, mp_process_num=2, mp_batch_size=50)\n", "precursor_df" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", - "assert np.allclose((precursor_df.isotope_m1_mz-precursor_df.precursor_mz)*precursor_df.charge, 1.0033)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sequencemodsmod_sitesnAAchargeprecursor_mzisotope_m1_intensityisotope_apex_intensityisotope_apex_indexisotope_right_most_intensityisotope_right_most_indexisotope_m1_mzisotope_apex_mzisotope_right_most_mz
100AGHCEWQMK92545.2338620.5766231.001.00545.735512545.233862545.233862
101AGHCEWQMK92545.2338620.5766231.001.00545.735512545.233862545.233862
102AGHCEWQMK92545.2338620.5766231.001.00545.735512545.233862545.233862
103AGHCEWQMK92545.2338620.5766231.001.00545.735512545.233862545.233862
104AGHCEWQMK92545.2338620.5766231.001.00545.735512545.233862545.233862
.............................................
95AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.001.00874.371421873.869771873.869771
96AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.001.00874.371421873.869771873.869771
97AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.001.00874.371421873.869771873.869771
98AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.001.00874.371421873.869771873.869771
99AGHCEWQMKAADERAcetyl@Protein N-term;Carbamidomethyl@C;Oxidat...0;4;8142873.8697710.8889521.001.00874.371421873.869771873.869771
\n", - "

200 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " sequence mods \\\n", - "100 AGHCEWQMK \n", - "101 AGHCEWQMK \n", - "102 AGHCEWQMK \n", - "103 AGHCEWQMK \n", - "104 AGHCEWQMK \n", - ".. ... ... \n", - "95 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "96 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "97 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "98 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "99 AGHCEWQMKAADER Acetyl@Protein N-term;Carbamidomethyl@C;Oxidat... \n", - "\n", - " mod_sites nAA charge precursor_mz isotope_m1_intensity \\\n", - "100 9 2 545.233862 0.576623 \n", - "101 9 2 545.233862 0.576623 \n", - "102 9 2 545.233862 0.576623 \n", - "103 9 2 545.233862 0.576623 \n", - "104 9 2 545.233862 0.576623 \n", - ".. ... ... ... ... ... \n", - "95 0;4;8 14 2 873.869771 0.888952 \n", - "96 0;4;8 14 2 873.869771 0.888952 \n", - "97 0;4;8 14 2 873.869771 0.888952 \n", - "98 0;4;8 14 2 873.869771 0.888952 \n", - "99 0;4;8 14 2 873.869771 0.888952 \n", - "\n", - " isotope_apex_intensity isotope_apex_index isotope_right_most_intensity \\\n", - "100 1.0 0 1.0 \n", - "101 1.0 0 1.0 \n", - "102 1.0 0 1.0 \n", - "103 1.0 0 1.0 \n", - "104 1.0 0 1.0 \n", - ".. ... ... ... \n", - "95 1.0 0 1.0 \n", - "96 1.0 0 1.0 \n", - "97 1.0 0 1.0 \n", - "98 1.0 0 1.0 \n", - "99 1.0 0 1.0 \n", - "\n", - " isotope_right_most_index isotope_m1_mz isotope_apex_mz \\\n", - "100 0 545.735512 545.233862 \n", - "101 0 545.735512 545.233862 \n", - "102 0 545.735512 545.233862 \n", - "103 0 545.735512 545.233862 \n", - "104 0 545.735512 545.233862 \n", - ".. ... ... ... \n", - "95 0 874.371421 873.869771 \n", - "96 0 874.371421 873.869771 \n", - "97 0 874.371421 873.869771 \n", - "98 0 874.371421 873.869771 \n", - "99 0 874.371421 873.869771 \n", - "\n", - " isotope_right_most_mz \n", - "100 545.233862 \n", - "101 545.233862 \n", - "102 545.233862 \n", - "103 545.233862 \n", - "104 545.233862 \n", - ".. ... \n", - "95 873.869771 \n", - "96 873.869771 \n", - "97 873.869771 \n", - "98 873.869771 \n", - "99 873.869771 \n", - "\n", - "[200 rows x 14 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "precursor_df = calc_precursor_isotope_mp(\n", - " precursor_df, processes=2, mp_batch_size=50,\n", - " min_right_most_intensity=1\n", - ")\n", - "precursor_df" + "assert (precursor_df.mono_isotope_idx == 0).all()\n", + "assert np.allclose(precursor_df[[f\"i_{i}\" for i in range(6)]].sum(axis=1), 1)" ] }, { @@ -698,7 +78,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.3" + "version": "3.9.12" }, "vscode": { "interpreter": { diff --git a/nbs_tests/test_thread.ipynb b/nbs_tests/test_thread.ipynb index 5c8a7bda..0dc33fa1 100644 --- a/nbs_tests/test_thread.ipynb +++ b/nbs_tests/test_thread.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -23,19 +23,18 @@ " ret.append(fib(n))\n", " return ret\n", "\n", - "x = np.array(np.arange(1,150000))\n", + "x = np.array(np.arange(1,15000))\n", "\n", "ret = fib_array(x)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "from multiprocess.pool import ThreadPool\n", - "from functools import partial\n", + "from multiprocessing.pool import ThreadPool\n", "with ThreadPool(10) as p:\n", " p.map(lambda x: fib_array(*x), [(x,)]*20)" ] diff --git a/nbdev_nbs/utils.ipynb b/nbs_tests/utils.ipynb similarity index 100% rename from nbdev_nbs/utils.ipynb rename to nbs_tests/utils.ipynb diff --git a/nbdev_nbs/yaml_utils.ipynb b/nbs_tests/yaml_utils.ipynb similarity index 100% rename from nbdev_nbs/yaml_utils.ipynb rename to nbs_tests/yaml_utils.ipynb diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..7f5d25d4 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,6 @@ + +[tool.ruff.lint] +select = ["E", "F"] +ignore = [ + "E501" # Line too long (ruff wraps code, but not docstrings) +] diff --git a/release/one_click_linux_gui/control b/release/one_click_linux_gui/control index ce85681f..ee039cdc 100644 --- a/release/one_click_linux_gui/control +++ b/release/one_click_linux_gui/control @@ -1,5 +1,5 @@ Package: AlphaBase -Version: 1.2.3 +Version: 1.2.4 Architecture: all Maintainer: Mann Labs Description: AlphaBase diff --git a/release/one_click_linux_gui/create_installer_linux.sh b/release/one_click_linux_gui/create_installer_linux.sh index 6a1a11d3..f0418304 100644 --- a/release/one_click_linux_gui/create_installer_linux.sh +++ b/release/one_click_linux_gui/create_installer_linux.sh @@ -17,7 +17,7 @@ python setup.py sdist bdist_wheel # Setting up the local package cd release/one_click_linux_gui # Make sure you include the required extra packages and always use the stable or very-stable options! -pip install "../../dist/alphabase-1.2.3-py3-none-any.whl[stable]" +pip install "../../dist/alphabase-1.2.4-py3-none-any.whl[stable]" # Creating the stand-alone pyinstaller folder pip install pyinstaller diff --git a/release/one_click_macos_gui/Info.plist b/release/one_click_macos_gui/Info.plist index 6daf95d0..ab2af814 100644 --- a/release/one_click_macos_gui/Info.plist +++ b/release/one_click_macos_gui/Info.plist @@ -9,9 +9,9 @@ CFBundleIconFile alpha_logo.icns CFBundleIdentifier - alphabase.1.2.3 + alphabase.1.2.4 CFBundleShortVersionString - 1.2.3 + 1.2.4 CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/release/one_click_macos_gui/create_installer_macos.sh b/release/one_click_macos_gui/create_installer_macos.sh index 7e98f27a..4165b9c2 100644 --- a/release/one_click_macos_gui/create_installer_macos.sh +++ b/release/one_click_macos_gui/create_installer_macos.sh @@ -20,7 +20,7 @@ python setup.py sdist bdist_wheel # Setting up the local package cd release/one_click_macos_gui -pip install "../../dist/alphabase-1.2.3-py3-none-any.whl[stable]" +pip install "../../dist/alphabase-1.2.4-py3-none-any.whl[stable]" # Creating the stand-alone pyinstaller folder pip install pyinstaller @@ -40,5 +40,5 @@ cp ../../LICENSE.txt Resources/LICENSE.txt cp ../logos/alpha_logo.png Resources/alpha_logo.png chmod 777 scripts/* -pkgbuild --root dist/alphabase --identifier de.mpg.biochem.alphabase.app --version 1.2.3 --install-location /Applications/AlphaBase.app --scripts scripts AlphaBase.pkg +pkgbuild --root dist/alphabase --identifier de.mpg.biochem.alphabase.app --version 1.2.4 --install-location /Applications/AlphaBase.app --scripts scripts AlphaBase.pkg productbuild --distribution distribution.xml --resources Resources --package-path AlphaBase.pkg dist/alphabase_gui_installer_macos.pkg diff --git a/release/one_click_macos_gui/distribution.xml b/release/one_click_macos_gui/distribution.xml index 84b62a69..a129f66d 100644 --- a/release/one_click_macos_gui/distribution.xml +++ b/release/one_click_macos_gui/distribution.xml @@ -1,6 +1,6 @@ - AlphaBase 1.2.3 + AlphaBase 1.2.4 diff --git a/release/one_click_windows_gui/alphabase_innoinstaller.iss b/release/one_click_windows_gui/alphabase_innoinstaller.iss index d2aed090..542da524 100644 --- a/release/one_click_windows_gui/alphabase_innoinstaller.iss +++ b/release/one_click_windows_gui/alphabase_innoinstaller.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "AlphaBase" -#define MyAppVersion "1.2.3" +#define MyAppVersion "1.2.4" #define MyAppPublisher "Max Planck Institute of Biochemistry and the University of Copenhagen, Mann Labs" #define MyAppURL "https://github.com/MannLabs/alphabase" #define MyAppExeName "alphabase_gui.exe" diff --git a/release/one_click_windows_gui/create_installer_windows.sh b/release/one_click_windows_gui/create_installer_windows.sh index 5a0b0246..4734bd75 100644 --- a/release/one_click_windows_gui/create_installer_windows.sh +++ b/release/one_click_windows_gui/create_installer_windows.sh @@ -17,7 +17,7 @@ python setup.py sdist bdist_wheel # Setting up the local package cd release/one_click_windows_gui # Make sure you include the required extra packages and always use the stable or very-stable options! -pip install "../../dist/alphabase-1.2.3-py3-none-any.whl[stable]" +pip install "../../dist/alphabase-1.2.4-py3-none-any.whl[stable]" # Creating the stand-alone pyinstaller folder pip install pyinstaller diff --git a/release/pyinstaller/alphabase_pyinstaller.py b/release/pyinstaller/alphabase_pyinstaller.py index 9fa46024..f4d40f19 100644 --- a/release/pyinstaller/alphabase_pyinstaller.py +++ b/release/pyinstaller/alphabase_pyinstaller.py @@ -2,11 +2,13 @@ try: import alphabase.gui import multiprocessing + multiprocessing.freeze_support() alphabase.gui.run() - except e: + except Exception: import traceback import sys + exc_info = sys.exc_info() # Display the *original* exception traceback.print_exception(*exc_info) diff --git a/requirements.txt b/requirements.txt index 9c600b2e..8299761f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,6 @@ regex # pydivsufsort dask dask_expr -pyahocorasick \ No newline at end of file +pyahocorasick +pyteomics +lxml diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 00000000..8b9803de --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,3 @@ +# Jupyter notebooks for AlphaBase + +Check [docs/nbs](../docs/nbs) for more tutorial notebooks. diff --git a/nbs/emass_element.yaml b/scripts/emass_element.yaml similarity index 100% rename from nbs/emass_element.yaml rename to scripts/emass_element.yaml diff --git a/nbs/nist_chem_to_yaml.ipynb b/scripts/nist_chem_to_yaml.ipynb similarity index 99% rename from nbs/nist_chem_to_yaml.ipynb rename to scripts/nist_chem_to_yaml.ipynb index 804a4c83..8becc632 100644 --- a/nbs/nist_chem_to_yaml.ipynb +++ b/scripts/nist_chem_to_yaml.ipynb @@ -319,7 +319,7 @@ } ], "source": [ - "from alphabase.constants.element import CHEM_INFO_DICT\n", + "from alphabase.constants.atom import CHEM_INFO_DICT\n", "from alphabase.yaml_utils import load_yaml, save_yaml\n", "\n", "for name, val in CHEM_INFO_DICT.items():\n", diff --git a/nbs/nist_element.yaml b/scripts/nist_element.yaml similarity index 100% rename from nbs/nist_element.yaml rename to scripts/nist_element.yaml diff --git a/nbs/unimod.xml b/scripts/unimod.xml similarity index 99% rename from nbs/unimod.xml rename to scripts/unimod.xml index b905bdad..ae95358d 100644 --- a/nbs/unimod.xml +++ b/scripts/unimod.xml @@ -23128,7 +23128,7 @@ Szychowski J, Mahdavi A, Hodas JJ, Bagert JD, Ngo JT, Landgraf P, Dieterich DC, Chemistry and Biology -Volume 9, Issue 10, 1 October 2002, Pages 1149-1159 +Volume 9, Issue 10, 1 October 2002, Pages 1149-1159 Chemistry-based functional proteomics reveals novel members of the deubiquitinating enzyme family Journal @@ -23165,7 +23165,7 @@ Chemistry-based functional proteomics reveals novel members of the deubiquitinat Chemistry and Biology -Volume 9, Issue 10, 1 October 2002, Pages 1149-1159 +Volume 9, Issue 10, 1 October 2002, Pages 1149-1159 Chemistry-based functional proteomics reveals novel members of the deubiquitinating enzyme family Journal @@ -44509,4 +44509,4 @@ antiserum and mass spectrometric analysis - \ No newline at end of file + diff --git a/nbs/unimod_to_tsv.ipynb b/scripts/unimod_to_tsv.ipynb similarity index 100% rename from nbs/unimod_to_tsv.ipynb rename to scripts/unimod_to_tsv.ipynb diff --git a/settings.ini b/settings.ini deleted file mode 100644 index ef0648e2..00000000 --- a/settings.ini +++ /dev/null @@ -1,43 +0,0 @@ -[DEFAULT] -# Legacy. Used by nbdev_test. - -### Python library ### -repo = alphabase -lib_name = alphabase -version = 1.2.3 -min_python = 3.7 -license = apache2 - -### nbdev ### -doc_path = _docs -lib_path = %(lib_name)s -nbs_path = nbdev_nbs -recursive = True -tst_flags = notest -readme_nb = index.ipynb -jupyter_hooks = True -clear_ids = True - -### Docs ### -branch = main -doc_host = https://%(user)s.github.io -doc_baseurl = /%(repo)s -git_url = https://github.com/%(user)s/%(repo)s -title = %(repo)s -host = github - -### PyPI ### -audience = Developers -author = Wen-Feng Zeng, Sander Willems, Maximilian Strauss -author_email = wzeng@biochem.mpg.de, jalew188@gmail.com -copyright = MannLabs -description = Base functionalities for AlphaX Ecosystems -keywords = proteomics, mass spec, alphaX, infrastucture -language = English -status = 2 -user = MannLabs - -### Optional ### -# requirements = fastcore pandas -# dev_requirements = -# console_scripts = \ No newline at end of file diff --git a/setup.py b/setup.py index 664c3669..e2859fc3 100644 --- a/setup.py +++ b/setup.py @@ -3,15 +3,10 @@ # builtin import setuptools import re -import os + # local import alphabase as package2install -#nbdev2 -# from configparser import ConfigParser -# nbdev_config = ConfigParser(delimiters=['=']) -# nbdev_config.read('settings.ini') -# nbdev_cfg = nbdev_config['DEFAULT'] def get_long_description(): with open("README.md", "r") as readme_file: @@ -34,7 +29,7 @@ def get_requirements(): for line in requirements_file: extra_requirements[extra_stable].append(line) # conditional req like: "pywin32==xxx; sys_platform=='win32'" - line, *conditions = line.split(';') + line, *conditions = line.split(";") requirement, *comparison = re.split("[><=~!]", line) requirement = requirement.strip() requirement = ";".join([requirement] + conditions) @@ -62,9 +57,9 @@ def create_pip_wheel(): include_package_data=True, entry_points={ "console_scripts": package2install.__console_scripts__, - # 'nbdev': [f'{nbdev_cfg.get("lib_path")}={nbdev_cfg.get("lib_path")}._modidx:d'], }, - install_requires=requirements + [ + install_requires=requirements + + [ # TODO Remove hardcoded requirement? "pywin32; sys_platform=='win32'" ], diff --git a/test_data/unit_tests/input_table_formats/mq_evidence.txt b/test_data/unit_tests/input_table_formats/mq_evidence.txt index ec39ca8c..91acccce 100644 --- a/test_data/unit_tests/input_table_formats/mq_evidence.txt +++ b/test_data/unit_tests/input_table_formats/mq_evidence.txt @@ -1,199 +1,199 @@ Protein group IDs Sequence Length Modifications Modified sequence Oxidation (M) Probabilities Oxidation (M) Score Diffs Acetyl (Protein N-term) Oxidation (M) Missed cleavages Proteins Leading proteins Leading razor protein Gene names Protein names Type Raw file Experiment MS/MS m/z Charge m/z Mass Resolution Uncalibrated - Calibrated m/z [ppm] Uncalibrated - Calibrated m/z [Da] Mass error [ppm] Mass error [Da] Uncalibrated mass error [ppm] Uncalibrated mass error [Da] Max intensity m/z 0 Retention time Retention length Calibrated retention time Calibrated retention time start Calibrated retention time finish Retention time calibration Match time difference Match m/z difference Match q-value Match score Number of data points Number of scans Number of isotopic peaks PIF Fraction of total spectrum Base peak fraction PEP MS/MS count MS/MS scan number Score Delta score Combinatorics Intensity Reverse Potential contaminant id Peptide ID Mod. peptide ID MS/MS IDs Best MS/MS AIF MS/MS IDs Oxidation (M) site IDs -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 832.104125976563 3 832.101386 2493.28233 34113.9414962101 1.0762 0.00089553 2.0157 0.0016773 3.0919 0.0025728 832.437381247645 65.716 0.21199 64.563 64.47 64.682 -1.1529 37.0 13.0 4.0 0.0 0.0 0.0 3.1642e-14 1 58741.0 146.2 135.87 1 58372000.0 1157 95 98 596 596.0 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 832.102294921875 3 832.101386 2493.28233 33938.222692619 1.9066 0.0015865 0.99383 0.00082697 2.9004 0.0024134 832.437391814544 65.243 0.16621 64.742 64.644 64.81 -0.50114 36.0 12.0 4.0 0.0 0.0 0.0 1.2809e-13 1 58411.0 142.21 134.67 1 62069000.0 1158 95 98 597 597.0 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 832.102600097656 3 832.101386 2493.28233 31695.1780308319 2.2947 0.0019094 0.098794 8.2207e-05 2.3935 0.0019916 832.436310529244 64.951 0.18853 64.851 64.751 64.94 -0.09961 35.0 13.0 3.0 0.0 0.0 0.0 2.5952e-13 1 57754.0 136.77 123.04 1 47203000.0 1159 95 98 598 598.0 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 832.103149414063 3 832.101386 2493.28233 33113.9197842842 2.3828 0.0019827 0.28252 0.00023508 2.6653 0.0022178 832.436568953311 65.188 0.25444 64.737 64.608 64.863 -0.45108 43.0 17.0 4.0 0.0 0.0 0.0 1.7363e-15 1 58795.0 164.83 157.21 1 76357000.0 1160 95 98 599 599.0 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 832.439636230469 3 832.101386 2493.28233 31837.6762153815 2.368 0.0019704 0.99159 0.0008251 3.3596 0.0027955 832.436179292739 64.913 0.24827 64.763 64.643 64.891 -0.1504 43.0 16.0 4.0 0.0 0.0 0.0 1.2675e-22 1 58307.0 204.61 193.31 1 93874000.0 1161 95 98 600 600.0 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 832.101386 2493.28233 64179.5004019278 2.1443 0.0017843 -0.27519 -0.00022898 1.8691 0.0015553 832.43595960774 65.449 0.32221 64.597 64.461 64.784 -0.85214 -0.079066 -0.00083849 204.61 44.0 14.0 5.0 0 0 82284000.0 1162 95 98 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 832.101386 2493.28233 64078.4064893296 2.3096 0.0019218 -0.17345 -0.00014433 2.1361 0.0017775 832.435669718051 65.15 0.32261 64.749 64.586 64.908 -0.40082 0.073017 -0.00058454 204.61 40.0 14.0 4.0 0 0 61482000.0 1163 95 98 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 3 832.101386 2493.28233 32626.5375938731 2.0792 0.0017301 1.1983 0.00099708 3.2775 0.0027272 832.437460743079 65.49 0.23808 64.537 64.415 64.653 -0.95239 -0.13882 0.0028397 204.61 44.0 15.0 4.0 0 0 94975000.0 1164 95 98 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 832.101386 2493.28233 63288.782050298 2.4032 0.0019997 -0.78512 -0.0006533 1.6181 0.0013464 832.434772977945 65.458 0.34336 64.506 64.28 64.624 -0.95232 -0.17016 -0.0021114 204.61 42.0 15.0 5.0 0 0 53967000.0 1165 95 98 -5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 832.101386 2493.28233 65171.7882747183 1.8881 0.0015711 -0.40039 -0.00033317 1.4878 0.001238 832.435942378441 65.219 0.25883 64.717 64.631 64.889 -0.50119 0.041198 -0.001151 204.61 38.0 11.0 4.0 0 0 34262000.0 1166 95 98 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 756.051940917969 3 755.715927 2264.12595 65513.2805712099 2.4377 0.0018422 -0.57214 -0.00043238 1.8656 0.0014099 756.049885553357 76.287 2.47 76.287 75.816 78.286 0.0 344.0 112.0 7.0 0.0 0.0 0.0 3.6788e-20 1 31421.0 175.33 163.37 1 788830000.0 741 67 67 361 361.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 1133.57458496094 2 1133.07025 2264.12595 55344.4298325908 3.3103 0.0037508 -0.3211 -0.00036382 2.9892 0.003387 1133.57126587515 76.285 1.7246 76.285 76.033 77.757 -1.4211e-14 179.0 77.0 5.0 0.0 0.0 0.0 2.4653e-35 1 31431.0 297.16 243.71 1 162220000.0 742 67 67 362 362.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1133.57629394531 2 1133.07025 2264.12595 29060.8944024211 1.287 0.0014582 0.34247 0.00038804 1.6294 0.0018463 1133.57219206781 77.319 0.56936 76.166 76.038 76.607 -1.1529 120.0 37.0 6.0 0.0 0.0 0.0 1.2405e-10 1 70115.0 167.03 144.04 1 206480000.0 743 67 67 363 363.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 756.051025390625 3 755.715927 2264.12595 34720.8713593807 0.97434 0.00073632 -0.46309 -0.00034997 0.51125 0.00038636 756.049793172324 77.314 1.4291 76.161 75.988 77.417 -1.1529 249.0 93.0 6.0 0.0 0.0 0.0 9.0597e-18 2 70123.0 145.88 133.93 1 923660000.0 744 67 67 364;365 364.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 756.050048828125 3 755.715927 2264.12595 35059.3321433832 0.63175 0.00047742 -0.37617 -0.00028428 0.25558 0.00019315 756.050041211032 76.599 1.0812 76.198 76.064 77.145 -0.40089 222.0 72.0 7.0 0.0 0.0 0.0 1.0941e-10 2 69462.0 129.15 121.53 1 905360000.0 745 67 67 366;367 366.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 1133.57360839844 2 1133.07025 2264.12595 29009.0750010801 1.121 0.0012701 0.25183 0.00028534 1.3728 0.0015555 1133.57303690418 76.598 0.45421 76.197 76.111 76.566 -0.40089 111.0 29.0 6.0 0.0 0.0 0.0 4.400999999999999e-53 1 69478.0 284.24 238.96 1 222050000.0 746 67 67 368 368.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 755.701171875 3 755.715927 2264.12595 34405.532113147 0.61527 0.00046497 -3.7085 -0.0028026 -3.0932 -0.0023376 755.712804816084 75.142 0.41751 74.64 74.52 74.937 -0.50114 60.0 27.0 3.0 0.0 0.0 0.0 0.00012722 1 67979.0 54.223 42.6 1 26743000.0 747 67 67 369 369.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 756.050964355469 3 755.715927 2264.12595 34710.3755355807 1.5807 0.0011945 -0.69109 -0.00052227 0.88957 0.00067226 756.049734721206 76.344 1.3125 76.345 76.168 77.48 0.00063384 266.0 85.0 7.0 0.0 0.0 0.0 1.0941e-10 2 68835.0 129.15 121.35 1 1027900000.0 748 67 67 370;371 370.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1133.57800292969 2 1133.07025 2264.12595 28945.1179093552 2.1075 0.0023879 0.10695 0.00012118 2.2144 0.0025091 1133.57241837088 76.351 0.4224 76.351 76.249 76.672 0.00063384 96.0 26.0 5.0 0.0 0.0 0.0 1.4718e-17 1 68854.0 204.28 180.45 1 199330000.0 749 67 67 372 372.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 567.288269042969 4 567.038765 2264.12595 43219.6945382121 1.3447 0.00076252 -0.32021 -0.00018157 1.0245 0.00058095 567.289139099445 76.35 0.33643 76.351 76.265 76.601 0.00063384 31.0 20.0 3.0 0.0 0.0 0.0 5.066e-05 1 68922.0 60.938 53.578 1 15626000.0 750 67 67 373 373.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.712463378906 3 755.715927 2264.12595 80.3 1.0 80.3 79.8 80.8 0.00063384 0.0 0.0 0.0 0.0022704 1 72737.0 48.229 36.607 1 751 67 67 374 374.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.400939941406 3 755.715927 2264.12595 38778.4516948 1.2541 0.00094772 -3.0133 -0.0022772 -1.7592 -0.0013294 756.047760384695 77.806 0.28691 77.807 77.732 78.018 0.00063384 31.0 22.0 2.0 0.0 0.0 0.0 9.5869e-05 1 70363.0 52.509 43.577 1 17531000.0 752 67 67 375 375.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.376647949219 3 755.715927 2264.12595 36885.9825172435 1.3222 0.0009992 -2.267 -0.0017132 -0.94479 -0.00071399 756.048342561782 78.246 0.51802 78.247 77.999 78.517 0.00063384 47.0 39.0 2.0 0.0 0.0 0.0 0.00039972 1 70533.0 46.833 42.726 1 30120000.0 753 67 67 376 376.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.385437011719 3 755.715927 2264.12595 36938.3932509192 1.6223 0.001226 -2.3669 -0.0017887 -0.74457 -0.00056269 756.049433765574 81.225 0.28252 81.226 81.082 81.364 0.00063384 31.0 19.0 2.0 0.0 0.0 0.0 0.0037303 1 73613.0 44.415 39.888 1 14028000.0 754 67 67 377 377.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 756.051025390625 3 755.715927 2264.12595 65701.5871075922 2.1318 0.001611 -0.7156 -0.00054079 1.4162 0.0010702 756.049858234364 77.087 2.4486 76.235 75.937 78.385 -0.85214 390.0 112.0 7.0 0.0 0.0 0.0 2.4164e-35 1 31860.0 215.57 201.97 1 1267900000.0 755 67 67 378 378.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 1133.07275390625 2 1133.07025 2264.12595 54127.0711914884 3.0318 0.0034352 -0.53278 -0.00060368 2.499 0.0028315 1133.57136954704 77.09 1.666 76.238 75.959 77.625 -0.85214 216.0 72.0 5.0 0.0 0.0 0.0 1.0241e-34 1 31879.0 267.93 230.32 1 234640000.0 756 67 67 379 379.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 756.051696777344 3 755.715927 2264.12595 64419.8401453543 1.9578 0.0014796 -0.097364 -7.3579e-05 1.8605 0.001406 756.050318832149 76.717 2.1066 76.316 75.562 77.669 -0.40082 318.0 88.0 7.0 0.0 0.0 0.0 7.3006e-36 1 31660.0 225.11 209.95 1 788510000.0 757 67 67 380 380.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 1133.57531738281 2 1133.07025 2264.12595 54866.1851722427 2.8244 0.0032003 0.017308 1.9612e-05 2.8417 0.0032199 1133.57185901907 76.72 1.066 76.319 76.018 77.084 -0.40082 177.0 48.0 5.0 0.0 0.0 0.0 1.601e-34 1 31673.0 273.72 234.7 1 140570000.0 758 67 67 381 381.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 756.051391601563 3 755.715927 2264.12595 65660.4625375424 2.1166 0.0015995 -0.10671 -8.0641e-05 2.0099 0.0015189 756.050213346728 76.408 4.3935 76.408 76.155 80.548 -3.4809e-05 419.0 199.0 7.0 0.0 0.0 0.0 1.4716000000000001e-27 1 31536.0 204.23 192.98 1 817010000.0 759 67 67 382 382.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 1133.57470703125 2 1133.07025 2264.12595 55895.565815167 2.9995 0.0033986 -0.02618 -2.9664e-05 2.9733 0.003369 1133.57180881886 76.426 1.004 76.426 76.155 77.159 -3.4809e-05 203.0 45.0 8.0 0.0 0.0 0.0 3.7324000000000004e-45 1 31555.0 310.29 258.22 1 162990000.0 760 67 67 383 383.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 1133.07873535156 2 1133.07025 2264.12595 29081.6388018725 1.726 0.0019557 0.094461 0.00010703 1.8205 0.0020627 1133.57285525154 77.114 0.58461 76.161 76.07 76.655 -0.95239 139.0 38.0 6.0 0.0 0.0 0.0 5.0696e-24 1 70703.0 227.63 198.27 1 334900000.0 761 67 67 384 384.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.051391601563 3 755.715927 2264.12595 35103.3871737561 1.1251 0.00085022 -0.43703 -0.00033027 0.68802 0.00051995 756.049856857932 77.116 1.1302 76.163 76.016 77.146 -0.95239 231.0 75.0 7.0 0.0 0.0 0.0 3.735e-10 2 71522.0 117.74 105.44 1 1792200000.0 762 67 67 385;386 386.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 755.715454101563 3 755.715927 2264.12595 34973.4233590971 0.5989 0.0004526 -2.0093 -0.0015184 -1.4104 -0.0010658 755.714192535346 78.711 0.10071 77.759 77.719 77.82 -0.95239 15.0 9.0 2.0 0.0 0.0 0.0 6.8677e-06 1 72297.0 73.758 60.027 1 43275000.0 763 67 67 387 387.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.050537109375 3 755.715927 2264.12595 42452.4498971101 1.0555 0.00079762 -3.8161 -0.0028839 -2.7606 -0.0020862 756.048355180177 89.637 0.51472 88.785 88.473 88.988 -0.85214 56.0 36.0 2.0 0.0 0.0 0.0 0.053602 1 82857.0 20.891 12.072 1 10277000.0 764 67 67 388 388.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.341247558594 3 755.715927 2264.12595 33492.3530484451 1.3389 0.0010118 -2.7689 -0.0020925 -1.43 -0.0010807 756.048522986451 78.182 0.46708 77.23 77.146 77.613 -0.95239 44.0 31.0 2.0 0.0 0.0 0.0 0.00018803 1 72029.0 50.752 41.81 1 65530000.0 765 67 67 389 389.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.051147460938 3 755.715927 2264.12595 35706.3550790691 1.5393 0.0011633 -2.2645 -0.0017113 -0.72515 -0.00054801 755.714272936703 80.281 0.29095 79.329 79.223 79.514 -0.95239 31.0 20.0 2.0 0.0 0.0 0.0 8.5117e-07 1 73995.0 64.723 50.109 1 20455000.0 766 67 67 390 390.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1133.57238769531 2 1133.07025 2264.12595 29060.4357524589 1.6317 0.0018488 0.46867 0.00053104 2.1004 0.0023798 1133.57259349059 76.765 0.84702 76.314 76.187 77.034 -0.45108 152.0 54.0 6.0 0.0 0.0 0.0 1.0224e-17 1 70075.0 206.66 159.78 1 199580000.0 767 67 67 391 391.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 567.039489746094 4 567.038765 2264.12595 42452.3100385036 0.84707 0.00048032 -0.58109 -0.0003295 0.26598 0.00015082 567.03870292571 76.789 0.22681 76.338 76.187 76.414 -0.45108 36.0 13.0 4.0 0.0 0.0 0.0 0.015496 1 70130.0 28.505 19.342 1 12329000.0 768 67 67 392 392.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 755.716247558594 3 755.715927 2264.12595 35012.2117056103 1.2774 0.00096537 -0.49633 -0.00037509 0.78109 0.00059028 756.049815612068 76.772 1.587 76.321 76.107 77.694 -0.45108 269.0 99.0 6.0 0.0 0.0 0.0 4.5521e-13 1 70361.0 160.76 150.85 1 903700000.0 769 67 67 393 393.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 756.050903320313 3 755.715927 2264.12595 34856.7459236798 1.6464 0.0012442 -0.60722 -0.00045889 1.0392 0.0007853 756.049751781326 76.481 1.5743 76.33 76.1 77.674 -0.1504 307.0 106.0 7.0 0.0 0.0 0.0 2.9088e-09 2 69667.0 105.0 97.376 1 1310100000.0 770 67 67 394;395 394.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1133.57299804688 2 1133.07025 2264.12595 29407.6837870417 2.3669 0.0026818 -0.060905 -6.9009e-05 2.306 0.0026128 1133.57224607164 76.477 0.55287 76.327 76.195 76.748 -0.1504 153.0 39.0 6.0 0.0 0.0 0.0 6.9851e-24 1 69690.0 225.32 194.76 1 277140000.0 771 67 67 396 396.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 755.374572753906 3 755.715927 2264.12595 34929.522694086 1.1124 0.00084066 -2.6538 -0.0020055 -1.5414 -0.0011648 755.713191120897 77.917 0.31822 77.767 77.63 77.949 -0.1504 39.0 23.0 2.0 0.0 0.0 0.0 3.4317e-09 1 71183.0 80.752 69.293 1 38036000.0 772 67 67 397 397.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 755.383239746094 3 755.715927 2264.12595 35210.6019609379 1.6708 0.0012626 -1.6767 -0.0012671 -0.0058841 -4.4467e-06 755.714504849634 80.035 0.3427 79.985 79.808 80.151 -0.050152 39.0 25.0 2.0 0.0 0.0 0.0 1.1867e-06 1 73163.0 64.723 50.992 1 19286000.0 773 67 67 398 398.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1133.18713378906 2 1133.07025 2264.12595 30095.1494948993 2.6265 0.002976 1.7377 0.0019689 4.3642 0.0049449 1133.57381441263 76.97 0.27717 76.82 76.748 77.025 -0.1504 25.0 17.0 2.0 0.0 0.0 0.0 0.025033 1 70194.0 52.527 38.781 1 22342000.0 774 67 67 399 399.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 756.051574707031 3 755.715927 2264.12595 65437.5397975914 2.0481 0.0015478 -0.86289 -0.0006521 1.1852 0.00089566 756.049741743087 77.069 1.7109 76.116 75.842 77.553 -0.95232 278.0 78.0 6.0 0.0 0.0 0.0 2.5070000000000002e-20 1 31792.0 178.71 163.54 1 844620000.0 775 67 67 400 400.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 1133.57568359375 2 1133.07025 2264.12595 54254.4190730337 2.885 0.0032689 -0.52759 -0.00059779 2.3574 0.0026711 1133.57141176886 77.083 1.8423 76.131 75.776 77.618 -0.95232 239.0 84.0 5.0 0.0 0.0 0.0 1.1376e-55 1 31812.0 286.26 244.62 1 175500000.0 776 67 67 401 401.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 756.051391601563 3 755.715927 2264.12595 64895.830679865 1.8095 0.0013675 -0.58014 -0.00043842 1.2294 0.00092906 756.049957015847 76.677 0.75578 76.176 75.919 76.675 -0.50119 163.0 34.0 8.0 0.0 0.0 0.0 4.39e-28 1 31638.0 206.59 194.63 1 1048700000.0 777 67 67 402 402.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 1133.57580566406 2 1133.07025 2264.12595 53850.7015984902 2.6907 0.0030488 -0.59414 -0.00067321 2.0966 0.0023755 1133.57161617217 76.693 0.71254 76.192 75.919 76.631 -0.50119 151.0 32.0 7.0 0.0 0.0 0.0 1.1917e-55 1 31658.0 303.7 259.27 1 208970000.0 778 67 67 403 403.0 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 755.715927 2264.12595 63945.2814257222 2.4747 0.0018702 -3.8707 -0.0029251 -1.3959 -0.0010549 756.047629880197 81.165 0.39345 81.165 80.858 81.252 0.0 0.010568 -0.00022583 44.415 22.0 17.0 2.0 0 0 6664400.0 779 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 755.715927 2264.12595 64920.4585818806 2.4151 0.0018251 -2.1679 -0.0016383 0.24722 0.00018683 755.714094805267 78.44 1.6251 78.44 78.242 79.867 0.0 0.16347 -9.3531e-05 46.833 142.0 73.0 2.0 0 0 16679000.0 780 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 4 567.038765 2264.12595 76208.6248677155 2.0854 0.0011825 -0.49782 -0.00028228 1.5875 0.0009002 567.289329034319 76.27 0.50193 76.27 76.12 76.622 0.0 0.017576 -3.9628e-05 60.938 58.0 22.0 4.0 0 0 17755000.0 781 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 3 755.715927 2264.12595 41249.5006688416 0.80879 0.00061122 -2.3285 -0.0017597 -1.5197 -0.0011484 756.047280043364 89.743 0.053993 88.49 88.462 88.516 -1.2532 -0.086892 0.0036211 20.891 5.0 3.0 2.0 0 0 7065300.0 782 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 4 567.038765 2264.12595 42540.8942832065 0.64448 0.00036545 -0.1893 -0.00010734 0.45518 0.00025811 567.289635917023 77.323 0.21034 76.17 76.076 76.286 -1.1529 -0.081715 0.00066014 60.938 35.0 13.0 3.0 0 0 18719000.0 783 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 3 755.715927 2264.12595 36971.6256951944 1.2766 0.00096474 -5.4705 -0.0041341 -4.1939 -0.0031694 755.712010652023 89.219 0.50541 88.718 88.412 88.918 -0.50114 0.1413 -0.0035023 20.891 42.0 35.0 2.0 0 0 7572500.0 784 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 4 567.038765 2264.12595 42408.7207474673 0.096583 5.4766e-05 0.017296 9.8077e-06 0.11388 6.4574e-05 567.289621628227 76.597 0.41335 76.196 76.111 76.525 -0.40089 -0.056364 0.0011287 60.938 44.0 26.0 3.0 0 0 11756000.0 785 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 3 755.715927 2264.12595 34789.5061918898 1.705 0.0012885 -4.0229 -0.0030401 -2.3179 -0.0017517 755.713236214302 74.823 0.18311 74.724 74.673 74.856 -0.099617 -0.01604 0.00025603 62.19 19.0 11.0 2.0 0 0 28958000.0 786 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 755.715927 2264.12595 64613.8698125201 1.98 0.0014963 -4.1058 -0.0031028 -2.1258 -0.0016065 755.712359891019 75.585 1.5128 74.733 74.424 75.937 -0.85214 -0.0064274 6.7902e-05 62.19 133.0 69.0 4.0 0 0 30522000.0 787 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 4 567.038765 2264.12595 76247.795812793 1.8811 0.0010666 -0.83977 -0.00047618 1.0413 0.00059045 567.288728159504 77.099 0.38911 76.247 76.11 76.5 -0.85214 -0.0052276 -0.00081522 60.938 50.0 17.0 4.0 0 0 15001000.0 788 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 755.715927 2264.12595 64198.0403882096 1.9879 0.0015023 -2.1363 -0.0016144 -0.14839 -0.00011214 755.71369636613 80.228 0.9906 79.726 79.591 80.581 -0.50107 -0.18516 6.3364e-06 64.723 66.0 44.0 2.0 0 0 13060000.0 789 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 4 567.038765 2264.12595 76620.3949994964 1.6765 0.00095064 -0.41101 -0.00023306 1.2655 0.00071758 567.289298302724 76.754 0.65347 76.354 76.17 76.824 -0.40082 0.10135 0.00015727 60.938 72.0 29.0 4.0 0 0 19090000.0 790 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 755.715927 2264.12595 60570.0707850401 2.2323 0.001687 -4.2937 -0.0032448 -2.0614 -0.0015578 755.712891588082 74.861 1.4363 74.861 74.718 76.155 -3.4809e-05 0.12163 -0.00035797 62.19 132.0 65.0 4.0 0 0 24526000.0 791 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 755.715927 2264.12595 65229.6109091271 2.3262 0.0017579 -3.6469 -0.002756 -1.3207 -0.00099807 755.712371031173 81.046 0.42076 81.046 80.768 81.189 -3.4809e-05 -0.10836 0.00028148 44.415 26.0 18.0 2.0 0 0 10298000.0 792 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 4 567.038765 2264.12595 76254.7055067579 1.8601 0.0010548 -0.22727 -0.00012887 1.6329 0.0009259 567.038687806476 76.397 0.52296 76.397 76.287 76.81 -3.4809e-05 0.14477 0.00057402 60.938 67.0 23.0 5.0 0 0 11942000.0 793 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 4 567.038765 2264.12595 42198.4941569954 0.67149 0.00038076 1.1393 0.00064605 1.8108 0.0010268 567.289349588183 77.118 0.28979 76.165 76.103 76.393 -0.95239 -0.086845 0.0036737 60.938 37.0 18.0 4.0 0 0 23489000.0 794 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 755.715927 2264.12595 36316.1444229048 0.56897 0.00042998 -5.0961 -0.0038512 -4.5271 -0.0034212 755.712012119609 88.728 0.09761 88.377 88.343 88.44 -0.35083 -0.19963 -0.0026535 20.891 11.0 8.0 2.0 0 0 9076300.0 795 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 755.715927 2264.12595 35927.0762304016 1.594 0.0012046 -4.7422 -0.0035837 -3.1482 -0.0023791 755.713867367978 81.631 0.12304 81.18 81.087 81.21 -0.45108 0.025826 -0.0022017 44.415 20.0 9.0 3.0 0 0 7483900.0 796 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 755.715927 2264.12595 35777.0455760321 1.8982 0.0014345 -2.4475 -0.0018496 -0.54933 -0.00041514 755.7142320599 80.475 0.58796 80.024 79.643 80.231 -0.45108 0.11205 -0.00069935 64.723 48.0 37.0 2.0 0 0 16923000.0 797 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 755.715927 2264.12595 35243.862019048 1.1881 0.00089787 -1.7457 -0.0013193 -0.55763 -0.00042141 756.048972230589 78.293 0.43087 78.142 77.949 78.379 -0.1504 -0.13388 0.00086348 46.833 81.0 32.0 3.0 0 0 31885000.0 798 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 755.715927 2264.12595 62428.8786162376 1.6635 0.0012571 -2.9325 -0.0022161 -1.269 -0.000959 756.04952009872 89.467 0.99193 88.514 87.993 88.985 -0.95232 -0.062598 0.0022517 20.891 64.0 44.0 2.0 0 0 9380300.0 799 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 755.715927 2264.12595 65069.3179758825 1.8676 0.0014114 -1.8661 -0.0014102 0.0015033 1.136e-06 755.714392052662 78.589 0.87427 77.636 77.531 78.406 -0.95232 -0.10604 0.00048037 80.752 61.0 39.0 2.0 0 0 16078000.0 800 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 4 567.038765 2264.12595 77208.6289973408 1.7561 0.00099579 -0.92533 -0.0005247 0.83079 0.00047109 567.288861066024 77.068 0.47689 76.115 75.93 76.406 -0.95232 -0.13694 -0.0010093 60.938 71.0 21.0 5.0 0 0 18049000.0 801 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 1133.07025 2264.12595 53850.695073787 2.6541 0.0030073 -0.71531 -0.00081049 1.9388 0.0021968 1133.57179081764 77.288 0.53945 76.787 76.588 77.128 -0.50119 -0.016435 -0.00020852 52.527 67.0 24.0 3.0 0 0 11438000.0 802 67 67 -323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 4 567.038765 2264.12595 76587.4567539566 1.5241 0.00086423 -0.43396 -0.00024607 1.0901 0.00061815 567.289206462323 76.672 0.49646 76.17 76.027 76.523 -0.50119 -0.081727 0.00010521 60.938 53.0 22.0 5.0 0 0 16186000.0 803 67 67 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 423.209991455078 2 423.209224 844.403895 91022.1812979299 1.1216 0.00047465 -0.2002 -8.4728e-05 0.92135 0.00038993 423.209093215557 9.3681 0.34274 9.3681 9.2468 9.5896 1.7764e-15 39.0 15.0 5.0 0.0 0.0 0.0 0.0067218 1 3434.0 84.568 64.013 1 873860000.0 8028 653 689 3936 3936.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 423.208892822266 2 423.209224 844.403895 49565.8517585479 -0.049614 -2.0997e-05 -0.0017982 -7.6102e-07 -0.051412 -2.1758e-05 423.209514385727 9.3088 0.16793 8.9079 8.7897 8.9577 -0.40088 19.0 16.0 2.0 0.0 0.0 0.0 0.087066 1 4963.0 48.036 30.671 1 100660000.0 8029 653 689 3937 3937.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 423.209594726563 2 423.209224 844.403895 88907.2164267804 0.56777 0.00024029 -0.32204 -0.00013629 0.24573 0.00010399 423.209074611559 9.5731 0.23608 9.0217 8.9231 9.1592 -0.55139 28.0 10.0 4.0 0.0 0.0 0.0 0.00042545 1 3584.0 130.27 90.609 1 2708500000.0 8030 653 689 3938 3938.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 423.209808349609 2 423.209224 844.403895 89816.9054050152 0.74961 0.00031724 -0.20021 -8.473e-05 0.5494 0.00023251 423.20913400938 9.2604 0.34271 9.3606 9.132 9.4747 0.10022 51.0 15.0 5.0 0.0 0.0 0.0 0.001183 1 3465.0 113.5 70.457 1 1197700000.0 8031 653 689 3939 3939.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 423.209808349609 2 423.209224 844.403895 48634.3059999763 0.67607 0.00028612 0.36362 0.00015389 1.0397 0.00044001 423.209504620973 9.2967 0.14905 8.9459 8.8291 8.9782 -0.35083 20.0 12.0 2.0 0.0 0.0 0.0 0.079495 1 5010.0 49.423 21.169 1 112000000.0 8032 653 689 3940 3940.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 423.209320068359 2 423.209224 844.403895 91343.5144717181 0.60824 0.00025741 -0.88403 -0.00037413 -0.27578 -0.00011671 423.20884030726 9.655 0.19277 9.1037 9.0051 9.1979 -0.55132 14.0 8.0 2.0 0.0 0.0 0.0 0.00031392 1 3558.0 135.84 82.657 1 1930200000.0 8033 653 689 3941 3941.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 423.209564208984 2 423.209224 844.403895 89385.226813436 0.43046 0.00018218 0.26592 0.00011254 0.69639 0.00029472 423.209304219415 9.528 0.47126 9.1271 8.8567 9.328 -0.40093 41.0 21.0 5.0 0.0 0.0 0.0 0.0084713 1 3522.0 78.77 53.213 1 2052300000.0 8034 653 689 3942 3942.0 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 2 423.209224 844.403895 45520.4166346129 0.25962 0.00010987 -0.47972 -0.00020302 -0.2201 -9.3149e-05 423.209072372469 9.8055 0.14227 8.9533 8.8685 9.0107 -0.85216 -0.0069701 -0.00030558 130.27 39.0 14.0 5.0 0 0 2085000000.0 8035 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 423.209224 844.403895 47824.403265082 -0.20857 -8.827e-05 -0.31294 -0.00013244 -0.52151 -0.00022071 423.209156095054 9.5107 0.13485 9.1098 9.0338 9.1686 -0.40088 -0.098304 -0.0001324 135.84 57.0 15.0 5.0 0 0 2305400000.0 8036 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 423.209224 844.403895 46588.864549281 0.53349 0.00022578 -0.23271 -9.8485e-05 0.30078 0.00012729 423.209176359835 9.3394 0.11224 9.1396 9.0938 9.206 -0.19983 -0.068528 -6.4488e-05 135.84 37.0 9.0 5.0 0 0 1528000000.0 8037 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 423.209224 844.403895 48896.6381125382 0.3177 0.00013445 0.88981 0.00037658 1.2075 0.00051103 423.209691080437 9.1471 0.13156 8.9473 8.8475 8.9791 -0.19983 -0.013034 0.00085362 130.27 22.0 13.0 2.0 0 0 60213000.0 8038 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 423.209224 844.403895 88907.3158116521 0.57612 0.00024382 0.7958 0.00033679 1.3719 0.00058061 423.209545692676 9.7618 0.17181 9.2104 9.116 9.2878 -0.55139 0.0023316 0.00080607 135.84 12.0 7.0 3.0 0 0 21722000.0 8039 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 423.209224 844.403895 89031.4884373933 0.52895 0.00022386 0.22353 9.4599e-05 0.75248 0.00031846 423.209312240498 9.4534 0.2571 9.1528 8.9899 9.247 -0.30057 -0.055307 0.00032168 135.84 27.0 11.0 3.0 0 0 1106100000.0 8040 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 423.209224 844.403895 90775.1846832495 0.69055 0.00029225 0.24587 0.00010406 0.93643 0.0003963 423.209274878244 8.8948 0.14996 8.995 8.9178 9.0678 0.10022 0.034685 0.00030857 130.27 10.0 6.0 2.0 0 0 135410000.0 8041 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 423.209224 844.403895 48197.1689510863 0.79717 0.00033737 0.039496 1.6715e-05 0.83667 0.00035408 423.209010513045 9.3777 0.077036 8.9266 8.899 8.9761 -0.45114 -0.033691 0.00013389 130.27 12.0 7.0 2.0 0 0 142630000.0 8042 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 423.209224 844.403895 47942.434935782 0.63798 0.00027 -4.4319 -0.0018756 -3.7939 -0.0016056 423.208639564787 9.6578 0.15446 9.307 9.2036 9.358 -0.35083 0.098861 -0.0036188 135.84 33.0 20.0 2.0 0 0 62393000.0 8043 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 423.209224 844.403895 47905.4094498366 0.33597 0.00014218 -0.28984 -0.00012266 0.046122 1.9519e-05 423.209147753682 9.3524 0.24636 9.202 9.0584 9.3048 -0.1504 -0.0060961 -0.00011285 135.84 52.0 21.0 5.0 0 0 1668100000.0 8044 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 423.209224 844.403895 91019.9321008034 0.6004 0.00025409 0.03445 1.458e-05 0.63485 0.00026867 423.209196559424 9.458 0.17136 8.9066 8.7909 8.9623 -0.55132 -0.053646 0.00012962 130.27 10.0 7.0 2.0 0 0 92873000.0 8045 653 689 -994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 423.209224 844.403895 89366.7792241994 0.40146 0.0001699 1.3868 0.00058689 1.7882 0.00075679 423.209820653334 9.3389 0.2142 9.0382 8.9141 9.1283 -0.30068 0.077959 0.0012742 130.27 19.0 9.0 3.0 0 0 80497000.0 8046 653 689 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 873.392883300781 2 873.389904 1744.76526 34015.7625966347 2.1333 0.0018632 -0.17731 -0.00015486 1.956 0.0017084 873.389884094549 39.476 0.15456 39.025 38.932 39.087 -0.45108 19.0 12.0 2.0 0.0 0.0 0.0 0.0033684 1 33212.0 73.927 67.955 1 27695000.0 3333 275 289 1653 1653.0 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 873.389904 1744.76526 64387.4936932587 2.5794 0.0022528 0.54514 0.00047612 3.1246 0.002729 873.891472975946 39.134 0.28112 39.134 39.01 39.291 0.0 0.041768 -0.00050268 73.927 29.0 12.0 3.0 0 0 11573000.0 3334 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 2 873.389904 1744.76526 35239.9284154667 1.782 0.0015564 1.3368 0.0011676 3.1188 0.002724 873.390995387756 40.204 0.11702 39.051 38.978 39.095 -1.1529 -0.041577 0.00088023 73.927 16.0 10.0 2.0 0 0 21683000.0 3335 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 873.389904 1744.76526 34276.9528998907 2.0659 0.0018044 0.65262 0.00056999 2.7186 0.0023744 873.391306935841 39.636 0.14352 39.035 38.944 39.087 -0.60138 -0.057845 -0.00031493 73.927 30.0 14.0 3.0 0 0 17736000.0 3336 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 873.389904 1744.76526 35293.4382602559 2.1095 0.0018424 -0.51477 -0.00044959 1.5947 0.0013928 873.890316579152 39.246 0.11762 39.147 39.081 39.199 -0.09961 0.054092 -0.0023541 73.927 17.0 10.0 2.0 0 0 16932000.0 3337 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 873.389904 1744.76526 61916.6431710342 2.1129 0.0018454 1.6337 0.0014268 3.7465 0.0032722 873.390592407162 39.88 0.38711 39.128 38.987 39.374 -0.75189 0.035974 0.0013988 73.927 34.0 17.0 2.0 0 0 20908000.0 3338 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 873.389904 1744.76526 61998.0788069666 2.0672 0.0018055 1.1802 0.0010308 3.2475 0.0028363 873.39096602754 39.426 0.36795 39.126 38.89 39.258 -0.30057 0.033315 0.00060667 73.927 46.0 16.0 4.0 0 0 13051000.0 3339 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 873.389904 1744.76526 64201.9805285812 2.396 0.0020927 0.74484 0.00065054 3.1409 0.0027432 873.391064170532 38.921 0.38798 39.021 38.854 39.241 0.10022 -0.07101 -0.00015384 73.927 43.0 17.0 3.0 0 0 12893000.0 3340 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 873.389904 1744.76526 35514.1644359624 1.9025 0.0016616 0.49535 0.00043263 2.3978 0.0020942 873.891915170653 39.852 0.15613 39.0 38.903 39.059 -0.85214 -0.092365 -0.00058965 73.927 18.0 12.0 3.0 0 0 20683000.0 3341 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 873.389904 1744.76526 34637.9002197281 2.012 0.0017572 -0.21353 -0.0001865 1.7985 0.0015707 873.389738125143 39.052 0.16872 39.102 39.013 39.181 0.050098 0.0094426 -0.0018279 73.927 27.0 15.0 2.0 0 0 19915000.0 3342 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 873.389904 1744.76526 62464.9330072561 1.975 0.001725 1.3731 0.0011992 3.3481 0.0029242 873.390687000998 39.961 0.27894 39.109 38.983 39.262 -0.85207 0.016719 0.00094351 73.927 26.0 12.0 3.0 0 0 12805000.0 3343 275 289 -96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 873.389904 1744.76526 59987.5326707904 2.1737 0.0018985 0.26587 0.00023221 2.4396 0.0021307 873.390002477889 39.633 0.25973 39.232 39.11 39.369 -0.40094 0.13918 -0.0009905 73.927 35.0 11.0 4.0 0 0 15105000.0 3344 275 289 -96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 331.184906005859 2 331.18502 660.355488 99793.2416232791 0.21341 7.068e-05 0.5876 0.00019461 0.80102 0.00026528 331.18514552495 7.3305 0.38376 7.1302 6.808 7.1918 -0.20032 26.0 17.0 2.0 0.0 0.0 0.0 0.018234 1 2658.0 110.61 48.273 1 22292000.0 8960 702 741 4502 4502.0 -96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 331.186126708984 2 331.18502 660.355488 52873.52561111 -0.52264 -0.00017309 1.2324 0.00040815 0.70977 0.00023506 331.185358841333 6.4872 0.22038 6.3368 6.2034 6.4238 -0.1504 95.0 51.0 2.0 0.0 0.0 0.0 0.063441 1 3121.0 60.788 27.05 1 17979000.0 8961 702 741 4503 4503.0 -96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 331.18502 660.355488 52387.5684996575 -0.024257 -8.0337e-06 0.41425 0.00013719 0.38999 0.00012916 331.185160499906 7.6723 0.27649 7.2714 7.1455 7.422 -0.40088 0.042763 -0.000143 110.61 98.0 53.0 2.0 0 0 83624000.0 8962 702 741 -96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 331.18502 660.355488 102836.021501968 0.28508 9.4414e-05 0.46525 0.00015408 0.75032 0.0002485 331.185191865798 7.8027 0.59856 7.2514 7.0128 7.6114 -0.55139 0.022692 -0.00010922 110.61 55.0 26.0 5.0 0 0 89577000.0 8963 702 741 -96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 331.18502 660.355488 100791.354045444 0.21136 6.9999e-05 0.70796 0.00023447 0.91932 0.00030447 331.185231151538 6.6535 0.62308 6.4532 6.1436 6.7667 -0.20032 0.058229 -0.00015335 60.788 55.0 27.0 3.0 0 0 48865000.0 8964 702 741 -96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 331.18502 660.355488 52757.8933823085 0.066469 2.2013e-05 1.3911 0.00046072 1.4576 0.00048273 331.185407084328 7.6125 0.16468 7.2617 7.1683 7.333 -0.35083 0.033018 0.00050406 110.61 56.0 31.0 2.0 0 0 31768000.0 8965 702 741 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 337.2158203125 2 337.215789 672.417025 54608.6667267157 -0.1393 -4.6975e-05 -0.32398 -0.00010925 -0.46328 -0.00015623 337.215724397473 20.897 0.22262 19.945 19.862 20.085 -0.95241 47.0 28.0 2.0 0.0 0.0 0.0 0.062173 1 14933.0 61.561 31.116 1 41210000.0 1428 118 123 726 726.0 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 337.216033935547 2 337.215789 672.417025 55968.548724636 0.15454 5.2113e-05 -0.00086208 -2.9071e-07 0.15368 5.1822e-05 337.215746152774 19.841 0.20505 19.741 19.645 19.85 -0.099595 42.0 25.0 2.0 0.0 0.0 0.0 0.073645 1 13999.0 58.981 24.089 1 41668000.0 1429 118 123 727 727.0 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 337.215759277344 2 337.215789 672.417025 54709.8336924935 0.23614 7.9631e-05 -0.17747 -5.9845e-05 0.058672 1.9785e-05 337.215702094344 20.59 0.21745 19.838 19.736 19.954 -0.75189 54.0 28.0 3.0 0.0 0.0 0.0 0.073645 1 15094.0 58.981 13.231 1 58772000.0 1430 118 123 728 728.0 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 337.215454101563 2 337.215789 672.417025 54611.2835900477 0.23273 7.848e-05 -0.09045 -3.0501e-05 0.14228 4.7978e-05 337.215665510181 20.221 0.24188 19.87 19.766 20.008 -0.35083 48.0 27.0 3.0 0.0 0.0 0.0 0.062173 1 14731.0 61.561 16.95 1 53818000.0 1431 118 123 729 729.0 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 337.215789 672.417025 103970.923440202 0.97266 0.000328 -0.14357 -4.8414e-05 0.82909 0.00027958 337.215599419088 19.921 0.36421 19.921 19.8 20.164 0.0 0.024645 2.4916e-05 61.561 31.0 16.0 3.0 0 0 79085000.0 1432 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 337.215789 672.417025 54456.4054668177 0.17723 5.9763e-05 -0.43136 -0.00014546 -0.25413 -8.5698e-05 337.215637774345 20.363 0.22348 19.862 19.763 19.987 -0.50113 -0.034287 -0.00016918 61.561 44.0 25.0 2.0 0 0 37651000.0 1433 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 337.215789 672.417025 100195.862418847 0.90539 0.00030531 0.014037 4.7334e-06 0.91943 0.00031005 337.215719507259 20.576 0.29994 19.824 19.698 19.998 -0.75189 -0.071814 0.00013121 61.561 25.0 13.0 3.0 0 0 55033000.0 1434 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 337.215789 672.417025 103785.23670759 0.65545 0.00022103 -0.21869 -7.3745e-05 0.43677 0.00014729 337.215559090738 20.406 0.34286 20.005 19.906 20.249 -0.40082 0.10916 -2.5746e-05 61.561 34.0 15.0 3.0 0 0 98156000.0 1435 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 337.215789 672.417025 102062.845303498 1.0053 0.00033899 0.057821 1.9498e-05 1.0631 0.00035849 337.215628530437 19.874 0.25708 19.874 19.757 20.014 -3.4571e-05 -0.021949 0.00016074 61.561 28.0 11.0 3.0 0 0 92229000.0 1436 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 337.215789 672.417025 55788.5767487602 0.9392 0.00031671 -1.457 -0.00049133 -0.51781 -0.00017461 337.215343091539 19.988 0.22865 19.938 19.841 20.07 -0.050152 0.041919 -0.00086091 61.561 74.0 31.0 3.0 0 0 86918000.0 1437 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 337.215789 672.417025 100837.99104114 0.54218 0.00018283 -0.096046 -3.2388e-05 0.44613 0.00015044 337.215678984741 20.655 0.29987 19.904 19.777 20.077 -0.75182 0.0077053 5.6967e-05 61.561 24.0 13.0 3.0 0 0 49783000.0 1438 118 123 -1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 337.215789 672.417025 103028.252649315 0.85522 0.0002884 -0.40345 -0.00013605 0.45177 0.00015234 337.215507527794 20.531 0.34274 20.03 19.904 20.247 -0.50118 0.1339 -0.00015036 61.561 27.0 15.0 3.0 0 0 68849000.0 1439 118 123 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1283.58239746094 2 1283.07738 2564.1402 27992.5466007096 1.6226 0.002082 -0.15831 -0.00020312 1.4643 0.0018788 1283.57880344565 48.205 0.19945 47.052 46.939 47.138 -1.1529 55.0 17.0 4.0 0.0 0.0 0.0 3.6525e-24 1 41179.0 225.68 217.7 1 72948000.0 6157 499 529 3074 3074.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 1283.57824707031 2 1283.07738 2564.1402 28300.0946601743 1.4493 0.0018596 -0.80724 -0.0010358 0.64207 0.00082382 1283.57775177689 47.797 0.21745 47.296 47.184 47.402 -0.50114 47.0 16.0 4.0 0.0 0.0 0.0 4.5875e-32 1 41059.0 243.01 234.21 1 53749000.0 6158 499 529 3075 3075.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1283.58435058594 2 1283.07738 2564.1402 27500.1538659125 1.737 0.0022287 0.2087 0.00026778 1.9457 0.0024964 1283.58086487989 47.477 0.23657 47.377 47.266 47.502 -0.09961 64.0 22.0 4.0 0.0 0.0 0.0 2.1375e-17 1 40440.0 191.35 180.08 1 85106000.0 6159 499 529 3076 3076.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 856.053588867188 3 855.720677 2564.1402 34667.6956550751 0.99249 0.0008493 -0.074812 -6.4018e-05 0.91768 0.00078528 856.054114316741 47.472 0.12862 47.372 47.302 47.43 -0.09961 27.0 13.0 3.0 0.0 0.0 0.0 5.1033e-09 1 40495.0 93.255 89.528 1 48882000.0 6160 499 529 3077 3077.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 1283.58166503906 2 1283.07738 2564.1402 27716.7430301678 2.0897 0.0026812 -0.17666 -0.00022667 1.913 0.0024545 1283.57892529705 48.049 0.19432 47.196 47.109 47.303 -0.85214 51.0 16.0 4.0 0.0 0.0 0.0 1.6192000000000002e-54 1 41705.0 297.7 285.41 1 78521000.0 6161 499 529 3078 3078.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 856.053894042969 3 855.720677 2564.1402 33863.0786615119 1.6233 0.0013891 -1.0615 -0.00090832 0.5618 0.00048074 856.05328191912 48.047 0.14254 47.195 47.118 47.261 -0.85214 22.0 11.0 3.0 0.0 0.0 0.0 5.1757e-09 1 41756.0 84.03 81.229 1 40605000.0 6162 499 529 3079 3079.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1283.58154296875 2 1283.07738 2564.1402 27803.3452393597 1.2604 0.0016172 0.81939 0.0010513 2.0798 0.0026685 1283.58015290264 47.788 0.23843 47.337 47.219 47.457 -0.45108 77.0 24.0 4.0 0.0 0.0 0.0 7.5651e-10 1 41449.0 149.09 136.8 1 105280000.0 6163 499 529 3080 3080.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 855.72216796875 3 855.720677 2564.1402 47.773 1.0 47.322 46.822 47.822 -0.45108 0.0 0.0 0.0 2.0873e-07 1 41493.0 71.202 70.195 1 6164 499 529 3081 3081.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 856.390808105469 3 855.720677 2564.1402 33401.2373544199 1.3307 0.0011387 -0.63356 -0.00054215 0.69713 0.00059655 856.05392854242 47.482 0.15319 47.431 47.351 47.504 -0.050152 44.0 14.0 4.0 0.0 0.0 0.0 5.2955e-08 1 40936.0 79.942 72.911 1 39592000.0 6165 499 529 3082 3082.0 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 855.720677 2564.1402 63005.3786974404 2.372 0.0020298 0.23297 0.00019936 2.605 0.0022292 856.055218676151 47.427 0.30035 47.427 47.248 47.548 0.0 0.078701 -0.00045604 93.255 48.0 13.0 5.0 0 0 25692000.0 6166 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 1283.07738 2564.1402 53227.9707597629 3.112 0.0039929 -0.73195 -0.00093915 2.38 0.0030538 1283.07617752563 48.092 0.25718 47.24 47.099 47.356 -0.85214 -0.00094134 -0.001265 297.7 37.0 11.0 4.0 0 0 71056000.0 6167 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 855.720677 2564.1402 63560.6465059435 2.1952 0.0018785 0.51135 0.00043757 2.7065 0.002316 856.055021171333 48.083 0.36431 47.231 46.97 47.335 -0.85214 -0.11744 0.00025861 93.255 57.0 16.0 5.0 0 0 24719000.0 6168 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 855.720677 2564.1402 64656.523254455 1.6867 0.0014433 0.0045127 3.8616e-06 1.6912 0.0014472 856.054920133409 47.737 0.27965 47.336 47.2 47.479 -0.40082 -0.012126 -0.0010425 93.255 52.0 12.0 5.0 0 0 24130000.0 6169 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 855.720677 2564.1402 63104.1563488921 2.3755 0.0020327 0.94117 0.00080537 3.3166 0.0028381 856.055870292381 47.48 0.32246 47.48 47.293 47.615 -3.4809e-05 0.13136 0.001362 93.255 66.0 14.0 6.0 0 0 36486000.0 6170 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 1283.07738 2564.1402 53293.1199974165 3.0127 0.0038655 -0.34558 -0.0004434 2.6671 0.0034221 1283.57843479155 47.985 0.25715 47.133 47.0 47.257 -0.85207 -0.10791 -0.00027348 297.7 33.0 11.0 4.0 0 0 52002000.0 6171 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 1283.07738 2564.1402 51967.3791889806 2.9925 0.0038396 -0.42135 -0.00054062 2.5711 0.003299 1283.57993476613 47.795 0.32167 47.294 47.182 47.504 -0.50119 0.053164 -0.00046793 297.7 36.0 14.0 4.0 0 0 64853000.0 6172 499 529 -6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 855.720677 2564.1402 63486.6730884006 1.7963 0.0015371 0.25218 0.00021579 2.0485 0.0017529 856.055240792006 47.816 0.38597 47.315 47.139 47.525 -0.50119 -0.03334 -0.00040673 93.255 55.0 17.0 5.0 0 0 22974000.0 6173 499 529 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 526.728393554688 2 526.726923 1051.43929 44032.4522704044 0.94535 0.00049794 -0.25513 -0.00013438 0.69022 0.00036356 527.228161187795 11.932 0.19 11.08 10.973 11.163 -0.85216 76.0 31.0 4.0 0.0 0.0 0.0 0.0080065 1 7231.0 75.378 53.247 1 39161000.0 1533 128 134 764 764.0 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 526.726745605469 2 526.726923 1051.43929 43143.0660078593 0.38868 0.00020473 -0.064598 -3.4026e-05 0.32408 0.0001707 526.727216318821 11.423 0.20048 11.022 10.93 11.131 -0.40088 69.0 31.0 3.0 0.0 0.0 0.0 0.0068949 1 6802.0 76.827 67.964 1 39022000.0 1534 128 134 765 765.0 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 526.72802734375 2 526.726923 1051.43929 42084.6192343925 0.91358 0.00048121 0.501 0.00026389 1.4146 0.0007451 526.727517859095 11.117 0.13559 11.017 10.962 11.098 -0.099588 42.0 19.0 3.0 0.0 0.0 0.0 0.0017362 1 6573.0 92.439 65.837 1 41663000.0 1535 128 134 766 766.0 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 526.728271484375 2 526.726923 1051.43929 42857.1813581714 0.95002 0.0005004 0.8736 0.00046015 1.8236 0.00096055 526.727697627123 11.382 0.21592 11.031 10.968 11.184 -0.35083 47.0 29.0 3.0 0.0 0.0 0.0 0.0022672 1 6937.0 87.308 60.705 1 60799000.0 1536 128 134 767 767.0 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 526.726923 1051.43929 78426.6434804951 1.7589 0.00092648 0.14203 7.4811e-05 1.901 0.0010013 526.727130437839 11.066 0.27863 11.066 10.94 11.218 -1.7764e-15 0.037722 8.2526e-05 92.439 39.0 12.0 6.0 0 0 25128000.0 1537 128 134 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 526.726923 1051.43929 80050.8543578281 1.0839 0.00057094 0.069391 3.655e-05 1.1533 0.00060749 527.228272428511 11.541 0.36417 10.99 10.895 11.259 -0.55139 -0.038339 6.0048e-06 92.439 47.0 16.0 4.0 0 0 46581000.0 1538 128 134 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 526.726923 1051.43929 81527.9933349198 1.0534 0.00055483 0.20204 0.00010642 1.2554 0.00066125 526.727144742391 11.337 0.32144 11.036 10.875 11.197 -0.30057 0.0078297 0.00014574 92.439 38.0 14.0 5.0 0 0 45193000.0 1539 128 134 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 526.726923 1051.43929 77856.0294955625 1.4516 0.00076459 0.29586 0.00015584 1.7474 0.00092043 526.727276040021 10.895 0.25706 10.995 10.867 11.124 0.10022 -0.032731 0.00024457 92.439 33.0 11.0 5.0 0 0 31558000.0 1540 128 134 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 526.726923 1051.43929 42870.1112879989 1.4435 0.00076032 0.12231 6.4426e-05 1.5658 0.00082475 527.228056332767 11.547 0.23395 10.996 10.913 11.147 -0.55139 -0.032425 6.1757e-05 92.439 79.0 33.0 4.0 0 0 74219000.0 1541 128 134 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 526.726923 1051.43929 80280.9429479531 1.1548 0.00060825 0.028199 1.4853e-05 1.183 0.0006231 526.727099742928 11.672 0.47121 11.02 10.769 11.24 -0.65157 -0.008179 -3.739e-05 92.439 56.0 21.0 4.0 0 0 45000000.0 1542 128 134 -924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 526.726923 1051.43929 80363.5362513359 1.1791 0.00062104 -0.39495 -0.00020803 0.78411 0.00041301 526.726757820307 11.458 0.36433 11.057 10.913 11.278 -0.40093 0.028472 -0.00048316 92.439 47.0 15.0 5.0 0 0 36110000.0 1543 128 134 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 392.755767822266 2 392.755613 783.496673 49489.4861263324 0.13082 5.1379e-05 -0.073388 -2.8823e-05 0.057429 2.2556e-05 392.755531776106 49.555 0.35196 48.402 48.216 48.568 -1.1529 80.0 30.0 4.0 0.0 0.0 0.0 0.0061479 1 42472.0 103.29 23.832 1 211770000.0 4209 340 356 2098 2098.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 392.755706787109 2 392.755613 783.496673 50061.6462649096 0.24257 9.5271e-05 -0.021127 -8.2978e-06 0.22144 8.6973e-05 392.755571982849 48.734 0.32766 48.233 48.065 48.393 -0.50114 55.0 24.0 3.0 0.0 0.0 0.0 0.0015867 1 41885.0 146.21 28.156 1 143250000.0 4210 340 356 2099 2099.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 392.756011962891 2 392.755613 783.496673 49754.3614929264 0.82477 0.00032393 -0.33822 -0.00013284 0.48655 0.0001911 392.755486662089 48.176 0.30325 48.076 47.925 48.228 -0.09961 56.0 23.0 3.0 0.0 0.0 0.0 0.0046402 1 41090.0 114.54 25.805 1 126090000.0 4211 340 356 2100 2100.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 392.756042480469 2 392.755613 783.496673 92794.8666391363 0.90244 0.00035444 0.14185 5.5714e-05 1.0443 0.00041015 392.755566723013 49.126 0.40767 48.274 48.044 48.451 -0.85214 47.0 18.0 4.0 0.0 0.0 0.0 0.0035884 1 20181.0 129.96 26.981 1 178850000.0 4212 340 356 2101 2101.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 392.755828857422 2 392.755613 783.496673 94066.8158642021 0.54476 0.00021396 0.3319 0.00013036 0.87666 0.00034431 392.755592441327 48.526 0.40723 48.125 47.909 48.316 -0.40082 43.0 18.0 3.0 0.0 0.0 0.0 0.0031986 1 19907.0 132.94 26.18 1 143390000.0 4213 340 356 2102 2102.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 392.756072998047 2 392.755613 783.496673 91658.255265295 1.1121 0.00043678 0.6754 0.00026527 1.7875 0.00070205 392.755764434668 47.968 0.40738 47.968 47.765 48.173 -3.4809e-05 45.0 18.0 3.0 0.0 0.0 0.0 0.0054768 1 19700.0 117.7 25.006 1 168960000.0 4214 340 356 2103 2103.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 392.755981445313 2 392.755613 783.496673 49537.0642146884 0.36725 0.00014424 0.22397 8.7965e-05 0.59122 0.00023221 392.755671412355 49.156 0.32484 48.304 48.131 48.456 -0.85214 60.0 23.0 3.0 0.0 0.0 0.0 0.023311 1 42701.0 71.949 20.377 1 219940000.0 4215 340 356 2104 2104.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 392.755828857422 2 392.755613 783.496673 49463.205334259 0.92747 0.00036427 -0.14223 -5.5862e-05 0.78524 0.00030841 392.755531266648 48.61 0.35188 48.159 47.985 48.336 -0.45108 73.0 28.0 3.0 0.0 0.0 0.0 0.01973 1 42202.0 75.311 22.628 1 165170000.0 4216 340 356 2105 2105.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 392.755645751953 2 392.755613 783.496673 49717.560216645 0.63375 0.00024891 -0.05742 -2.2552e-05 0.57633 0.00022636 392.755568855994 48.048 0.35061 47.997 47.837 48.187 -0.050152 71.0 28.0 3.0 0.0 0.0 0.0 0.0029009 1 41441.0 129.96 38.867 1 166220000.0 4217 340 356 2106 2106.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 392.755889892578 2 392.755613 783.496673 92033.1657029471 0.74525 0.0002927 0.067161 2.6378e-05 0.81241 0.00031908 392.755485485728 49.236 0.60041 48.384 48.179 48.78 -0.85207 55.0 27.0 4.0 0.0 0.0 0.0 0.0054768 1 20194.0 117.7 25.006 1 154530000.0 4218 340 356 2107 2107.0 -2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 392.755737304688 2 392.755613 783.496673 90462.0978858877 0.71393 0.0002804 -0.059098 -2.3211e-05 0.65483 0.00025719 392.755485586831 48.699 0.34301 48.198 48.019 48.362 -0.50119 41.0 15.0 4.0 0.0 0.0 0.0 0.0054768 1 19950.0 117.7 25.006 1 135720000.0 4219 340 356 2108 2108.0 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 1149.62255859375 2 1149.11538 2296.21621 29228.1735658268 2.3283 0.0026755 0.50107 0.00057578 2.8294 0.0032513 1149.61761078377 76.252 0.12154 75.299 75.232 75.353 -0.95239 18.0 8.0 3.0 0.0 0.0 0.0 6.1507e-06 1 69865.0 101.2 89.763 1 14222000.0 8174 662 700 4014 4014.0 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1149.11755371094 2 1149.11538 2296.21621 30489.2720822834 1.9416 0.0022311 1.1621 0.0013353 3.1036 0.0035664 1149.61713992903 75.883 0.13953 75.432 75.373 75.512 -0.45108 18.0 9.0 3.0 0.0 0.0 0.0 1.3978e-05 1 69292.0 97.417 79.005 1 10928000.0 8175 662 700 4015 4015.0 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1149.61767578125 2 1149.11538 2296.21621 30613.840357268 2.6677 0.0030655 -0.010854 -1.2473e-05 2.6568 0.003053 1149.61513086489 75.603 0.11168 75.453 75.381 75.492 -0.1504 9.0 6.0 2.0 0.0 0.0 0.0 2.6109e-07 1 68935.0 118.52 97.859 1 23250000.0 8176 662 700 4016 4016.0 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 1149.11538 2296.21621 56516.059899694 3.4437 0.0039573 -1.0097 -0.0011602 2.4341 0.0027971 1149.61635027495 75.468 0.23927 75.468 75.338 75.577 0.0 0.082876 -0.0026395 118.52 34.0 10.0 4.0 0 0 6842900.0 8177 662 700 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 1149.11538 2296.21621 56932.4155682849 2.9932 0.0034396 0.63527 0.00073 3.6285 0.0041696 1149.61828389216 76.173 0.25947 75.32 75.224 75.484 -0.85214 -0.064857 0.0011409 118.52 32.0 11.0 4.0 0 0 9924400.0 8178 662 700 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 1149.11538 2296.21621 57211.5053779834 2.8675 0.003295 0.082085 9.4325e-05 2.9495 0.0033894 1149.61690065 75.852 0.21779 75.452 75.323 75.54 -0.40082 0.066318 -0.00013047 118.52 29.0 9.0 4.0 0 0 8792100.0 8179 662 700 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 1149.11538 2296.21621 57398.7849543716 3.1288 0.0035954 0.48285 0.00055485 3.6117 0.0041502 1149.61735999308 75.515 0.21606 75.515 75.394 75.61 -3.4809e-05 0.12985 0.00079058 118.52 30.0 9.0 4.0 0 0 11942000.0 8180 662 700 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 1149.11538 2296.21621 57990.4945343856 2.7807 0.0031954 0.18937 0.00021761 2.9701 0.003413 1149.11607402617 76.138 0.17249 75.185 75.086 75.258 -0.95232 -0.20007 0.00011609 118.52 20.0 7.0 3.0 0 0 12142000.0 8181 662 700 -5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 1149.11538 2296.21621 57974.5481235987 2.7728 0.0031863 0.45549 0.00052341 3.2283 0.0037097 1149.61769237747 75.844 0.21588 75.343 75.229 75.444 -0.50119 -0.042771 0.00072769 118.52 27.0 9.0 4.0 0 0 7977000.0 8182 662 700 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 866.950866699219 2 866.946858 1731.87916 32327.9128464234 1.0353 0.00089757 1.743 0.0015111 2.7783 0.0024087 867.450235183466 75.918 0.35695 74.664 74.505 74.862 -1.2532 44.0 22.0 3.0 0.0 0.0 0.0 2.0015e-05 1 68774.0 138.45 122.56 1 47690000.0 4877 396 412 2462 2462.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 866.949951171875 2 866.946858 1731.87916 32299.50711353 1.4443 0.0012522 1.3458 0.0011667 2.7901 0.0024189 866.948857270703 75.456 0.27552 74.955 74.807 75.083 -0.50114 41.0 16.0 3.0 0.0 0.0 0.0 1.9083e-06 1 68335.0 148.18 130.82 1 42068000.0 4878 396 412 2463 2463.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 867.449096679688 2 866.946858 1731.87916 32566.9939755213 2.3408 0.0020293 -0.44219 -0.00038336 1.8986 0.001646 866.94887243565 75.057 0.38191 74.958 74.823 75.205 -0.099617 59.0 24.0 4.0 0.0 0.0 0.0 6.3785e-06 1 67638.0 145.01 125.41 1 49227000.0 4879 396 412 2464 2464.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 867.451110839844 2 866.946858 1731.87916 31382.5900681373 2.4377 0.0021133 0.30414 0.00026367 2.7418 0.002377 867.449488778381 75.814 0.36876 74.862 74.668 75.037 -0.95239 58.0 24.0 4.0 0.0 0.0 0.0 1.4269e-06 1 69388.0 153.38 130.0 1 93175000.0 4880 396 412 2465 2465.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 578.30126953125 3 578.300331 1731.87916 44514.5080996521 1.6753 0.00096882 -0.13713 -7.9305e-05 1.5382 0.00088952 578.634008313487 75.801 0.22015 74.849 74.759 74.979 -0.95239 27.0 14.0 3.0 0.0 0.0 0.0 0.0001964 1 69409.0 70.529 65.962 1 19221000.0 4881 396 412 2466 2466.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 866.952514648438 2 866.946858 1731.87916 31782.0317903245 2.1785 0.0018887 0.77882 0.00067519 2.9574 0.0025639 866.949088376508 75.367 0.28395 74.916 74.779 75.063 -0.45108 62.0 19.0 4.0 0.0 0.0 0.0 4.6833e-05 1 68741.0 125.54 112.14 1 61684000.0 4882 396 412 2467 2467.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 867.451965332031 2 866.946858 1731.87916 32407.1389510915 2.2334 0.0019363 1.3759 0.0011929 3.6094 0.0031291 866.948581319041 75.017 0.33007 74.967 74.851 75.181 -0.050152 64.0 21.0 5.0 0.0 0.0 0.0 1.5967e-06 1 68281.0 151.55 136.67 1 67796000.0 4883 396 412 2468 2468.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 577.843322753906 3 578.300331 1731.87916 41150.7472482343 1.611 0.00093165 -0.37265 -0.00021551 1.2384 0.00071614 578.300118993697 74.98 0.24009 74.93 74.862 75.102 -0.050152 24.0 15.0 2.0 0.0 0.0 0.0 0.039141 1 68364.0 45.33 39.426 1 10650000.0 4884 396 412 2469 2469.0 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 578.300331 1731.87916 75183.6766894737 2.2556 0.0013044 -0.99328 -0.00057441 1.2623 0.00072998 578.633932727184 74.964 0.43715 74.964 74.813 75.25 0.0 0.052354 -0.0020869 70.529 27.0 19.0 2.0 0 0 7896900.0 4885 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 3 578.300331 1731.87916 45680.242785005 0.70221 0.00040609 -0.61327 -0.00035466 0.088938 5.1433e-05 578.299597184876 75.427 0.19379 74.926 74.84 75.033 -0.50114 0.014058 -0.0014276 70.529 19.0 11.0 3.0 0 0 11307000.0 4886 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 866.946858 1731.87916 61639.4914602681 2.3256 0.0020161 0.51765 0.00044877 2.8432 0.0024649 866.946436749454 75.737 0.51982 74.885 74.575 75.095 -0.85214 0.0068617 0.00020782 153.38 63.0 23.0 4.0 0 0 57268000.0 4887 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 578.300331 1731.87916 75605.0358796728 1.707 0.00098714 0.58401 0.00033773 2.291 0.0013249 578.300713892304 75.335 0.32584 74.934 74.758 75.084 -0.40082 0.022239 0.00064956 70.529 39.0 14.0 3.0 0 0 10629000.0 4888 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 578.300331 1731.87916 75158.9019038424 2.0148 0.0011651 0.27625 0.00015976 2.291 0.0013249 578.30084761028 74.928 0.4791 74.928 74.761 75.24 -3.4809e-05 0.01595 0.00011563 70.529 36.0 21.0 3.0 0 0 11656000.0 4889 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 578.300331 1731.87916 42651.3884683401 1.5732 0.00090979 -0.15804 -9.1394e-05 1.4152 0.00081839 578.299844107478 75.384 0.21966 74.933 74.795 75.015 -0.45108 0.021269 -0.00063782 70.529 30.0 15.0 3.0 0 0 10805000.0 4890 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 866.946858 1731.87916 61856.3770097439 2.1207 0.0018385 -0.17348 -0.0001504 1.9472 0.0016881 866.946431603301 75.769 0.45549 74.817 74.652 75.107 -0.95232 -0.06097 -0.00099052 153.38 45.0 20.0 3.0 0 0 37170000.0 4891 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 578.300331 1731.87916 79023.5531040152 1.5377 0.00088924 -0.46896 -0.0002712 1.0687 0.00061804 578.634686206678 75.781 0.25933 74.829 74.673 74.933 -0.95232 -0.082931 -0.0011772 70.529 20.0 11.0 3.0 0 0 13676000.0 4892 396 412 -3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 578.300331 1731.87916 76148.5177234205 1.5861 0.00091727 1.277 0.00073849 2.8631 0.0016558 578.300664336914 75.414 0.30336 74.913 74.752 75.055 -0.50119 0.0013958 0.0018518 70.529 35.0 13.0 4.0 0 0 9451900.0 4893 396 412 -5160 AALAPELALEIPSGSQADIPLPK 23 Unmodified _AALAPELALEIPSGSQADIPLPK_ 0 0 0 Q8IVF2;Q8IVF2-3 Q8IVF2 Q8IVF2 AHNAK2 Protein AHNAK2 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1151.13659667969 2 1151.13866 2300.26276 99.281 1.0 98.931 98.431 99.431 -0.35083 0.0 0.0 0.0 0.0030454 1 91612.0 67.115 60.638 1 4520 367 383 2265 2265.0 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 645.840698242188 2 645.839745 1289.66494 39183.7251512135 1.0203 0.00065898 0.73127 0.00047229 1.7516 0.0011313 645.840407680742 42.918 0.17167 42.066 41.998 42.17 -0.85214 34.0 12.0 4.0 0.0 0.0 0.0 0.0002631 1 36598.0 106.4 75.326 1 85143000.0 834 71 71 418 418.0 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 645.841552734375 2 645.839745 1289.66494 38970.9234786222 1.6193 0.0010458 0.65561 0.00042342 2.2749 0.0014692 645.840202781804 42.477 0.23804 42.026 41.952 42.19 -0.45108 39.0 18.0 3.0 0.0 0.0 0.0 0.00023631 1 36156.0 108.47 80.071 1 75968000.0 835 71 71 419 419.0 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 645.839745 1289.66494 73046.2009201794 1.602 0.0010346 0.3256 0.00021029 1.9276 0.0012449 645.840553977326 42.893 0.49302 42.141 42.011 42.504 -0.75189 0.061238 -2.9709e-05 108.47 46.0 22.0 4.0 0 0 64144000.0 836 71 71 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 645.839745 1289.66494 71612.7562178348 1.6042 0.0010361 0.037713 2.4356e-05 1.642 0.0010604 645.839890879695 42.441 0.30003 42.141 42.003 42.303 -0.30057 0.061162 -0.00040157 108.47 31.0 11.0 4.0 0 0 53433000.0 837 71 71 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 645.839745 1289.66494 72032.2222178963 1.8526 0.0011965 0.68265 0.00044089 2.5353 0.0016374 645.840206807123 41.985 0.27863 42.085 41.924 42.203 0.10022 0.0059934 0.00043149 108.47 34.0 12.0 4.0 0 0 47309000.0 838 71 71 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 645.839745 1289.66494 39041.587877041 1.4928 0.00096409 0.87215 0.00056327 2.3649 0.0015274 645.840501786455 42.081 0.21879 42.131 42.03 42.249 0.050098 0.051483 0.00067625 108.47 32.0 15.0 3.0 0 0 51830000.0 839 71 71 -5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 645.839745 1289.66494 73327.2623788934 1.5944 0.0010298 -0.66711 -0.00043085 0.92733 0.00059891 645.839765052438 42.819 0.23574 41.967 41.834 42.07 -0.85207 -0.11273 -0.001312 108.47 16.0 10.0 2.0 0 0 3605300.0 840 71 71 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 832.104125976563 3 832.101386 2493.28233 34113.9414962101 1.0762 0.00089553 2.0157 0.0016773 3.0919 0.0025728 832.437381247645 65.716 0.21199 64.563 64.47 64.682 -1.1529 37.0 13.0 4.0 0.0 0.0 0.0 3.1642e-14 1 58741.0 146.2 135.87 1 58372000.0 1157 95 98 596 596.0 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 832.102294921875 3 832.101386 2493.28233 33938.222692619 1.9066 0.0015865 0.99383 0.00082697 2.9004 0.0024134 832.437391814544 65.243 0.16621 64.742 64.644 64.81 -0.50114 36.0 12.0 4.0 0.0 0.0 0.0 1.2809e-13 1 58411.0 142.21 134.67 1 62069000.0 1158 95 98 597 597.0 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 832.102600097656 3 832.101386 2493.28233 31695.1780308319 2.2947 0.0019094 0.098794 8.2207e-05 2.3935 0.0019916 832.436310529244 64.951 0.18853 64.851 64.751 64.94 -0.09961 35.0 13.0 3.0 0.0 0.0 0.0 2.5952e-13 1 57754.0 136.77 123.04 1 47203000.0 1159 95 98 598 598.0 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 832.103149414063 3 832.101386 2493.28233 33113.9197842842 2.3828 0.0019827 0.28252 0.00023508 2.6653 0.0022178 832.436568953311 65.188 0.25444 64.737 64.608 64.863 -0.45108 43.0 17.0 4.0 0.0 0.0 0.0 1.7363e-15 1 58795.0 164.83 157.21 1 76357000.0 1160 95 98 599 599.0 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 832.439636230469 3 832.101386 2493.28233 31837.6762153815 2.368 0.0019704 0.99159 0.0008251 3.3596 0.0027955 832.436179292739 64.913 0.24827 64.763 64.643 64.891 -0.1504 43.0 16.0 4.0 0.0 0.0 0.0 1.2675e-22 1 58307.0 204.61 193.31 1 93874000.0 1161 95 98 600 600.0 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 832.101386 2493.28233 64179.5004019278 2.1443 0.0017843 -0.27519 -0.00022898 1.8691 0.0015553 832.43595960774 65.449 0.32221 64.597 64.461 64.784 -0.85214 -0.079066 -0.00083849 204.61 44.0 14.0 5.0 0 0 82284000.0 1162 95 98 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 832.101386 2493.28233 64078.4064893296 2.3096 0.0019218 -0.17345 -0.00014433 2.1361 0.0017775 832.435669718051 65.15 0.32261 64.749 64.586 64.908 -0.40082 0.073017 -0.00058454 204.61 40.0 14.0 4.0 0 0 61482000.0 1163 95 98 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 3 832.101386 2493.28233 32626.5375938731 2.0792 0.0017301 1.1983 0.00099708 3.2775 0.0027272 832.437460743079 65.49 0.23808 64.537 64.415 64.653 -0.95239 -0.13882 0.0028397 204.61 44.0 15.0 4.0 0 0 94975000.0 1164 95 98 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 832.101386 2493.28233 63288.782050298 2.4032 0.0019997 -0.78512 -0.0006533 1.6181 0.0013464 832.434772977945 65.458 0.34336 64.506 64.28 64.624 -0.95232 -0.17016 -0.0021114 204.61 42.0 15.0 5.0 0 0 53967000.0 1165 95 98 +5071 AAASLAAVSGTAAASLGSAQPTDLGAHK 28 Unmodified _AAASLAAVSGTAAASLGSAQPTDLGAHK_ 0 0 0 Q7Z5L9;Q7Z5L9-2 Q7Z5L9 Q7Z5L9 IRF2BP2 Interferon regulatory factor 2-binding protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 832.101386 2493.28233 65171.7882747183 1.8881 0.0015711 -0.40039 -0.00033317 1.4878 0.001238 832.435942378441 65.219 0.25883 64.717 64.631 64.889 -0.50119 0.041198 -0.001151 204.61 38.0 11.0 4.0 0 0 34262000.0 1166 95 98 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 756.051940917969 3 755.715927 2264.12595 65513.2805712099 2.4377 0.0018422 -0.57214 -0.00043238 1.8656 0.0014099 756.049885553357 76.287 2.47 76.287 75.816 78.286 0.0 344.0 112.0 7.0 0.0 0.0 0.0 3.6788e-20 1 31421.0 175.33 163.37 1 788830000.0 741 67 67 361 361.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 1133.57458496094 2 1133.07025 2264.12595 55344.4298325908 3.3103 0.0037508 -0.3211 -0.00036382 2.9892 0.003387 1133.57126587515 76.285 1.7246 76.285 76.033 77.757 -1.4211e-14 179.0 77.0 5.0 0.0 0.0 0.0 2.4653e-35 1 31431.0 297.16 243.71 1 162220000.0 742 67 67 362 362.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1133.57629394531 2 1133.07025 2264.12595 29060.8944024211 1.287 0.0014582 0.34247 0.00038804 1.6294 0.0018463 1133.57219206781 77.319 0.56936 76.166 76.038 76.607 -1.1529 120.0 37.0 6.0 0.0 0.0 0.0 1.2405e-10 1 70115.0 167.03 144.04 1 206480000.0 743 67 67 363 363.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 756.051025390625 3 755.715927 2264.12595 34720.8713593807 0.97434 0.00073632 -0.46309 -0.00034997 0.51125 0.00038636 756.049793172324 77.314 1.4291 76.161 75.988 77.417 -1.1529 249.0 93.0 6.0 0.0 0.0 0.0 9.0597e-18 2 70123.0 145.88 133.93 1 923660000.0 744 67 67 364;365 364.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 756.050048828125 3 755.715927 2264.12595 35059.3321433832 0.63175 0.00047742 -0.37617 -0.00028428 0.25558 0.00019315 756.050041211032 76.599 1.0812 76.198 76.064 77.145 -0.40089 222.0 72.0 7.0 0.0 0.0 0.0 1.0941e-10 2 69462.0 129.15 121.53 1 905360000.0 745 67 67 366;367 366.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 1133.57360839844 2 1133.07025 2264.12595 29009.0750010801 1.121 0.0012701 0.25183 0.00028534 1.3728 0.0015555 1133.57303690418 76.598 0.45421 76.197 76.111 76.566 -0.40089 111.0 29.0 6.0 0.0 0.0 0.0 4.400999999999999e-53 1 69478.0 284.24 238.96 1 222050000.0 746 67 67 368 368.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 755.701171875 3 755.715927 2264.12595 34405.532113147 0.61527 0.00046497 -3.7085 -0.0028026 -3.0932 -0.0023376 755.712804816084 75.142 0.41751 74.64 74.52 74.937 -0.50114 60.0 27.0 3.0 0.0 0.0 0.0 0.00012722 1 67979.0 54.223 42.6 1 26743000.0 747 67 67 369 369.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 756.050964355469 3 755.715927 2264.12595 34710.3755355807 1.5807 0.0011945 -0.69109 -0.00052227 0.88957 0.00067226 756.049734721206 76.344 1.3125 76.345 76.168 77.48 0.00063384 266.0 85.0 7.0 0.0 0.0 0.0 1.0941e-10 2 68835.0 129.15 121.35 1 1027900000.0 748 67 67 370;371 370.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1133.57800292969 2 1133.07025 2264.12595 28945.1179093552 2.1075 0.0023879 0.10695 0.00012118 2.2144 0.0025091 1133.57241837088 76.351 0.4224 76.351 76.249 76.672 0.00063384 96.0 26.0 5.0 0.0 0.0 0.0 1.4718e-17 1 68854.0 204.28 180.45 1 199330000.0 749 67 67 372 372.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 567.288269042969 4 567.038765 2264.12595 43219.6945382121 1.3447 0.00076252 -0.32021 -0.00018157 1.0245 0.00058095 567.289139099445 76.35 0.33643 76.351 76.265 76.601 0.00063384 31.0 20.0 3.0 0.0 0.0 0.0 5.066e-05 1 68922.0 60.938 53.578 1 15626000.0 750 67 67 373 373.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.712463378906 3 755.715927 2264.12595 80.3 1.0 80.3 79.8 80.8 0.00063384 0.0 0.0 0.0 0.0022704 1 72737.0 48.229 36.607 1 751 67 67 374 374.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.400939941406 3 755.715927 2264.12595 38778.4516948 1.2541 0.00094772 -3.0133 -0.0022772 -1.7592 -0.0013294 756.047760384695 77.806 0.28691 77.807 77.732 78.018 0.00063384 31.0 22.0 2.0 0.0 0.0 0.0 9.5869e-05 1 70363.0 52.509 43.577 1 17531000.0 752 67 67 375 375.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.376647949219 3 755.715927 2264.12595 36885.9825172435 1.3222 0.0009992 -2.267 -0.0017132 -0.94479 -0.00071399 756.048342561782 78.246 0.51802 78.247 77.999 78.517 0.00063384 47.0 39.0 2.0 0.0 0.0 0.0 0.00039972 1 70533.0 46.833 42.726 1 30120000.0 753 67 67 376 376.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 755.385437011719 3 755.715927 2264.12595 36938.3932509192 1.6223 0.001226 -2.3669 -0.0017887 -0.74457 -0.00056269 756.049433765574 81.225 0.28252 81.226 81.082 81.364 0.00063384 31.0 19.0 2.0 0.0 0.0 0.0 0.0037303 1 73613.0 44.415 39.888 1 14028000.0 754 67 67 377 377.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 756.051025390625 3 755.715927 2264.12595 65701.5871075922 2.1318 0.001611 -0.7156 -0.00054079 1.4162 0.0010702 756.049858234364 77.087 2.4486 76.235 75.937 78.385 -0.85214 390.0 112.0 7.0 0.0 0.0 0.0 2.4164e-35 1 31860.0 215.57 201.97 1 1267900000.0 755 67 67 378 378.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 1133.07275390625 2 1133.07025 2264.12595 54127.0711914884 3.0318 0.0034352 -0.53278 -0.00060368 2.499 0.0028315 1133.57136954704 77.09 1.666 76.238 75.959 77.625 -0.85214 216.0 72.0 5.0 0.0 0.0 0.0 1.0241e-34 1 31879.0 267.93 230.32 1 234640000.0 756 67 67 379 379.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 756.051696777344 3 755.715927 2264.12595 64419.8401453543 1.9578 0.0014796 -0.097364 -7.3579e-05 1.8605 0.001406 756.050318832149 76.717 2.1066 76.316 75.562 77.669 -0.40082 318.0 88.0 7.0 0.0 0.0 0.0 7.3006e-36 1 31660.0 225.11 209.95 1 788510000.0 757 67 67 380 380.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 1133.57531738281 2 1133.07025 2264.12595 54866.1851722427 2.8244 0.0032003 0.017308 1.9612e-05 2.8417 0.0032199 1133.57185901907 76.72 1.066 76.319 76.018 77.084 -0.40082 177.0 48.0 5.0 0.0 0.0 0.0 1.601e-34 1 31673.0 273.72 234.7 1 140570000.0 758 67 67 381 381.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 756.051391601563 3 755.715927 2264.12595 65660.4625375424 2.1166 0.0015995 -0.10671 -8.0641e-05 2.0099 0.0015189 756.050213346728 76.408 4.3935 76.408 76.155 80.548 -3.4809e-05 419.0 199.0 7.0 0.0 0.0 0.0 1.4716000000000001e-27 1 31536.0 204.23 192.98 1 817010000.0 759 67 67 382 382.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 1133.57470703125 2 1133.07025 2264.12595 55895.565815167 2.9995 0.0033986 -0.02618 -2.9664e-05 2.9733 0.003369 1133.57180881886 76.426 1.004 76.426 76.155 77.159 -3.4809e-05 203.0 45.0 8.0 0.0 0.0 0.0 3.7324000000000004e-45 1 31555.0 310.29 258.22 1 162990000.0 760 67 67 383 383.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 1133.07873535156 2 1133.07025 2264.12595 29081.6388018725 1.726 0.0019557 0.094461 0.00010703 1.8205 0.0020627 1133.57285525154 77.114 0.58461 76.161 76.07 76.655 -0.95239 139.0 38.0 6.0 0.0 0.0 0.0 5.0696e-24 1 70703.0 227.63 198.27 1 334900000.0 761 67 67 384 384.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.051391601563 3 755.715927 2264.12595 35103.3871737561 1.1251 0.00085022 -0.43703 -0.00033027 0.68802 0.00051995 756.049856857932 77.116 1.1302 76.163 76.016 77.146 -0.95239 231.0 75.0 7.0 0.0 0.0 0.0 3.735e-10 2 71522.0 117.74 105.44 1 1792200000.0 762 67 67 385;386 386.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 755.715454101563 3 755.715927 2264.12595 34973.4233590971 0.5989 0.0004526 -2.0093 -0.0015184 -1.4104 -0.0010658 755.714192535346 78.711 0.10071 77.759 77.719 77.82 -0.95239 15.0 9.0 2.0 0.0 0.0 0.0 6.8677e-06 1 72297.0 73.758 60.027 1 43275000.0 763 67 67 387 387.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.050537109375 3 755.715927 2264.12595 42452.4498971101 1.0555 0.00079762 -3.8161 -0.0028839 -2.7606 -0.0020862 756.048355180177 89.637 0.51472 88.785 88.473 88.988 -0.85214 56.0 36.0 2.0 0.0 0.0 0.0 0.053602 1 82857.0 20.891 12.072 1 10277000.0 764 67 67 388 388.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.341247558594 3 755.715927 2264.12595 33492.3530484451 1.3389 0.0010118 -2.7689 -0.0020925 -1.43 -0.0010807 756.048522986451 78.182 0.46708 77.23 77.146 77.613 -0.95239 44.0 31.0 2.0 0.0 0.0 0.0 0.00018803 1 72029.0 50.752 41.81 1 65530000.0 765 67 67 389 389.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 756.051147460938 3 755.715927 2264.12595 35706.3550790691 1.5393 0.0011633 -2.2645 -0.0017113 -0.72515 -0.00054801 755.714272936703 80.281 0.29095 79.329 79.223 79.514 -0.95239 31.0 20.0 2.0 0.0 0.0 0.0 8.5117e-07 1 73995.0 64.723 50.109 1 20455000.0 766 67 67 390 390.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1133.57238769531 2 1133.07025 2264.12595 29060.4357524589 1.6317 0.0018488 0.46867 0.00053104 2.1004 0.0023798 1133.57259349059 76.765 0.84702 76.314 76.187 77.034 -0.45108 152.0 54.0 6.0 0.0 0.0 0.0 1.0224e-17 1 70075.0 206.66 159.78 1 199580000.0 767 67 67 391 391.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 567.039489746094 4 567.038765 2264.12595 42452.3100385036 0.84707 0.00048032 -0.58109 -0.0003295 0.26598 0.00015082 567.03870292571 76.789 0.22681 76.338 76.187 76.414 -0.45108 36.0 13.0 4.0 0.0 0.0 0.0 0.015496 1 70130.0 28.505 19.342 1 12329000.0 768 67 67 392 392.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 755.716247558594 3 755.715927 2264.12595 35012.2117056103 1.2774 0.00096537 -0.49633 -0.00037509 0.78109 0.00059028 756.049815612068 76.772 1.587 76.321 76.107 77.694 -0.45108 269.0 99.0 6.0 0.0 0.0 0.0 4.5521e-13 1 70361.0 160.76 150.85 1 903700000.0 769 67 67 393 393.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 756.050903320313 3 755.715927 2264.12595 34856.7459236798 1.6464 0.0012442 -0.60722 -0.00045889 1.0392 0.0007853 756.049751781326 76.481 1.5743 76.33 76.1 77.674 -0.1504 307.0 106.0 7.0 0.0 0.0 0.0 2.9088e-09 2 69667.0 105.0 97.376 1 1310100000.0 770 67 67 394;395 394.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1133.57299804688 2 1133.07025 2264.12595 29407.6837870417 2.3669 0.0026818 -0.060905 -6.9009e-05 2.306 0.0026128 1133.57224607164 76.477 0.55287 76.327 76.195 76.748 -0.1504 153.0 39.0 6.0 0.0 0.0 0.0 6.9851e-24 1 69690.0 225.32 194.76 1 277140000.0 771 67 67 396 396.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 755.374572753906 3 755.715927 2264.12595 34929.522694086 1.1124 0.00084066 -2.6538 -0.0020055 -1.5414 -0.0011648 755.713191120897 77.917 0.31822 77.767 77.63 77.949 -0.1504 39.0 23.0 2.0 0.0 0.0 0.0 3.4317e-09 1 71183.0 80.752 69.293 1 38036000.0 772 67 67 397 397.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 755.383239746094 3 755.715927 2264.12595 35210.6019609379 1.6708 0.0012626 -1.6767 -0.0012671 -0.0058841 -4.4467e-06 755.714504849634 80.035 0.3427 79.985 79.808 80.151 -0.050152 39.0 25.0 2.0 0.0 0.0 0.0 1.1867e-06 1 73163.0 64.723 50.992 1 19286000.0 773 67 67 398 398.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1133.18713378906 2 1133.07025 2264.12595 30095.1494948993 2.6265 0.002976 1.7377 0.0019689 4.3642 0.0049449 1133.57381441263 76.97 0.27717 76.82 76.748 77.025 -0.1504 25.0 17.0 2.0 0.0 0.0 0.0 0.025033 1 70194.0 52.527 38.781 1 22342000.0 774 67 67 399 399.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 756.051574707031 3 755.715927 2264.12595 65437.5397975914 2.0481 0.0015478 -0.86289 -0.0006521 1.1852 0.00089566 756.049741743087 77.069 1.7109 76.116 75.842 77.553 -0.95232 278.0 78.0 6.0 0.0 0.0 0.0 2.5070000000000002e-20 1 31792.0 178.71 163.54 1 844620000.0 775 67 67 400 400.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 1133.57568359375 2 1133.07025 2264.12595 54254.4190730337 2.885 0.0032689 -0.52759 -0.00059779 2.3574 0.0026711 1133.57141176886 77.083 1.8423 76.131 75.776 77.618 -0.95232 239.0 84.0 5.0 0.0 0.0 0.0 1.1376e-55 1 31812.0 286.26 244.62 1 175500000.0 776 67 67 401 401.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 756.051391601563 3 755.715927 2264.12595 64895.830679865 1.8095 0.0013675 -0.58014 -0.00043842 1.2294 0.00092906 756.049957015847 76.677 0.75578 76.176 75.919 76.675 -0.50119 163.0 34.0 8.0 0.0 0.0 0.0 4.39e-28 1 31638.0 206.59 194.63 1 1048700000.0 777 67 67 402 402.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 1133.57580566406 2 1133.07025 2264.12595 53850.7015984902 2.6907 0.0030488 -0.59414 -0.00067321 2.0966 0.0023755 1133.57161617217 76.693 0.71254 76.192 75.919 76.631 -0.50119 151.0 32.0 7.0 0.0 0.0 0.0 1.1917e-55 1 31658.0 303.7 259.27 1 208970000.0 778 67 67 403 403.0 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 755.715927 2264.12595 63945.2814257222 2.4747 0.0018702 -3.8707 -0.0029251 -1.3959 -0.0010549 756.047629880197 81.165 0.39345 81.165 80.858 81.252 0.0 0.010568 -0.00022583 44.415 22.0 17.0 2.0 0 0 6664400.0 779 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 755.715927 2264.12595 64920.4585818806 2.4151 0.0018251 -2.1679 -0.0016383 0.24722 0.00018683 755.714094805267 78.44 1.6251 78.44 78.242 79.867 0.0 0.16347 -9.3531e-05 46.833 142.0 73.0 2.0 0 0 16679000.0 780 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 4 567.038765 2264.12595 76208.6248677155 2.0854 0.0011825 -0.49782 -0.00028228 1.5875 0.0009002 567.289329034319 76.27 0.50193 76.27 76.12 76.622 0.0 0.017576 -3.9628e-05 60.938 58.0 22.0 4.0 0 0 17755000.0 781 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 3 755.715927 2264.12595 41249.5006688416 0.80879 0.00061122 -2.3285 -0.0017597 -1.5197 -0.0011484 756.047280043364 89.743 0.053993 88.49 88.462 88.516 -1.2532 -0.086892 0.0036211 20.891 5.0 3.0 2.0 0 0 7065300.0 782 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 4 567.038765 2264.12595 42540.8942832065 0.64448 0.00036545 -0.1893 -0.00010734 0.45518 0.00025811 567.289635917023 77.323 0.21034 76.17 76.076 76.286 -1.1529 -0.081715 0.00066014 60.938 35.0 13.0 3.0 0 0 18719000.0 783 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 3 755.715927 2264.12595 36971.6256951944 1.2766 0.00096474 -5.4705 -0.0041341 -4.1939 -0.0031694 755.712010652023 89.219 0.50541 88.718 88.412 88.918 -0.50114 0.1413 -0.0035023 20.891 42.0 35.0 2.0 0 0 7572500.0 784 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 4 567.038765 2264.12595 42408.7207474673 0.096583 5.4766e-05 0.017296 9.8077e-06 0.11388 6.4574e-05 567.289621628227 76.597 0.41335 76.196 76.111 76.525 -0.40089 -0.056364 0.0011287 60.938 44.0 26.0 3.0 0 0 11756000.0 785 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 3 755.715927 2264.12595 34789.5061918898 1.705 0.0012885 -4.0229 -0.0030401 -2.3179 -0.0017517 755.713236214302 74.823 0.18311 74.724 74.673 74.856 -0.099617 -0.01604 0.00025603 62.19 19.0 11.0 2.0 0 0 28958000.0 786 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 755.715927 2264.12595 64613.8698125201 1.98 0.0014963 -4.1058 -0.0031028 -2.1258 -0.0016065 755.712359891019 75.585 1.5128 74.733 74.424 75.937 -0.85214 -0.0064274 6.7902e-05 62.19 133.0 69.0 4.0 0 0 30522000.0 787 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 4 567.038765 2264.12595 76247.795812793 1.8811 0.0010666 -0.83977 -0.00047618 1.0413 0.00059045 567.288728159504 77.099 0.38911 76.247 76.11 76.5 -0.85214 -0.0052276 -0.00081522 60.938 50.0 17.0 4.0 0 0 15001000.0 788 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 755.715927 2264.12595 64198.0403882096 1.9879 0.0015023 -2.1363 -0.0016144 -0.14839 -0.00011214 755.71369636613 80.228 0.9906 79.726 79.591 80.581 -0.50107 -0.18516 6.3364e-06 64.723 66.0 44.0 2.0 0 0 13060000.0 789 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 4 567.038765 2264.12595 76620.3949994964 1.6765 0.00095064 -0.41101 -0.00023306 1.2655 0.00071758 567.289298302724 76.754 0.65347 76.354 76.17 76.824 -0.40082 0.10135 0.00015727 60.938 72.0 29.0 4.0 0 0 19090000.0 790 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 755.715927 2264.12595 60570.0707850401 2.2323 0.001687 -4.2937 -0.0032448 -2.0614 -0.0015578 755.712891588082 74.861 1.4363 74.861 74.718 76.155 -3.4809e-05 0.12163 -0.00035797 62.19 132.0 65.0 4.0 0 0 24526000.0 791 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 755.715927 2264.12595 65229.6109091271 2.3262 0.0017579 -3.6469 -0.002756 -1.3207 -0.00099807 755.712371031173 81.046 0.42076 81.046 80.768 81.189 -3.4809e-05 -0.10836 0.00028148 44.415 26.0 18.0 2.0 0 0 10298000.0 792 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 4 567.038765 2264.12595 76254.7055067579 1.8601 0.0010548 -0.22727 -0.00012887 1.6329 0.0009259 567.038687806476 76.397 0.52296 76.397 76.287 76.81 -3.4809e-05 0.14477 0.00057402 60.938 67.0 23.0 5.0 0 0 11942000.0 793 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 4 567.038765 2264.12595 42198.4941569954 0.67149 0.00038076 1.1393 0.00064605 1.8108 0.0010268 567.289349588183 77.118 0.28979 76.165 76.103 76.393 -0.95239 -0.086845 0.0036737 60.938 37.0 18.0 4.0 0 0 23489000.0 794 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 755.715927 2264.12595 36316.1444229048 0.56897 0.00042998 -5.0961 -0.0038512 -4.5271 -0.0034212 755.712012119609 88.728 0.09761 88.377 88.343 88.44 -0.35083 -0.19963 -0.0026535 20.891 11.0 8.0 2.0 0 0 9076300.0 795 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 755.715927 2264.12595 35927.0762304016 1.594 0.0012046 -4.7422 -0.0035837 -3.1482 -0.0023791 755.713867367978 81.631 0.12304 81.18 81.087 81.21 -0.45108 0.025826 -0.0022017 44.415 20.0 9.0 3.0 0 0 7483900.0 796 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 755.715927 2264.12595 35777.0455760321 1.8982 0.0014345 -2.4475 -0.0018496 -0.54933 -0.00041514 755.7142320599 80.475 0.58796 80.024 79.643 80.231 -0.45108 0.11205 -0.00069935 64.723 48.0 37.0 2.0 0 0 16923000.0 797 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 755.715927 2264.12595 35243.862019048 1.1881 0.00089787 -1.7457 -0.0013193 -0.55763 -0.00042141 756.048972230589 78.293 0.43087 78.142 77.949 78.379 -0.1504 -0.13388 0.00086348 46.833 81.0 32.0 3.0 0 0 31885000.0 798 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 755.715927 2264.12595 62428.8786162376 1.6635 0.0012571 -2.9325 -0.0022161 -1.269 -0.000959 756.04952009872 89.467 0.99193 88.514 87.993 88.985 -0.95232 -0.062598 0.0022517 20.891 64.0 44.0 2.0 0 0 9380300.0 799 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 755.715927 2264.12595 65069.3179758825 1.8676 0.0014114 -1.8661 -0.0014102 0.0015033 1.136e-06 755.714392052662 78.589 0.87427 77.636 77.531 78.406 -0.95232 -0.10604 0.00048037 80.752 61.0 39.0 2.0 0 0 16078000.0 800 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 4 567.038765 2264.12595 77208.6289973408 1.7561 0.00099579 -0.92533 -0.0005247 0.83079 0.00047109 567.288861066024 77.068 0.47689 76.115 75.93 76.406 -0.95232 -0.13694 -0.0010093 60.938 71.0 21.0 5.0 0 0 18049000.0 801 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 1133.07025 2264.12595 53850.695073787 2.6541 0.0030073 -0.71531 -0.00081049 1.9388 0.0021968 1133.57179081764 77.288 0.53945 76.787 76.588 77.128 -0.50119 -0.016435 -0.00020852 52.527 67.0 24.0 3.0 0 0 11438000.0 802 67 67 +323 AAAIGIDLGTTYSCVGVFQHGK 22 Unmodified _AAAIGIDLGTTYSCVGVFQHGK_ 0 0 0 P0DMV8;A0A0G2JIW1;P0DMV9;P0DMV8-2;V9GZ37 P0DMV8 P0DMV8 HSPA1A;HSPA1B Heat shock 70 kDa protein 1A;Heat shock 70 kDa protein 1B MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 4 567.038765 2264.12595 76587.4567539566 1.5241 0.00086423 -0.43396 -0.00024607 1.0901 0.00061815 567.289206462323 76.672 0.49646 76.17 76.027 76.523 -0.50119 -0.081727 0.00010521 60.938 53.0 22.0 5.0 0 0 16186000.0 803 67 67 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 423.209991455078 2 423.209224 844.403895 91022.1812979299 1.1216 0.00047465 -0.2002 -8.4728e-05 0.92135 0.00038993 423.209093215557 9.3681 0.34274 9.3681 9.2468 9.5896 1.7764e-15 39.0 15.0 5.0 0.0 0.0 0.0 0.0067218 1 3434.0 84.568 64.013 1 873860000.0 8028 653 689 3936 3936.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 423.208892822266 2 423.209224 844.403895 49565.8517585479 -0.049614 -2.0997e-05 -0.0017982 -7.6102e-07 -0.051412 -2.1758e-05 423.209514385727 9.3088 0.16793 8.9079 8.7897 8.9577 -0.40088 19.0 16.0 2.0 0.0 0.0 0.0 0.087066 1 4963.0 48.036 30.671 1 100660000.0 8029 653 689 3937 3937.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 423.209594726563 2 423.209224 844.403895 88907.2164267804 0.56777 0.00024029 -0.32204 -0.00013629 0.24573 0.00010399 423.209074611559 9.5731 0.23608 9.0217 8.9231 9.1592 -0.55139 28.0 10.0 4.0 0.0 0.0 0.0 0.00042545 1 3584.0 130.27 90.609 1 2708500000.0 8030 653 689 3938 3938.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 423.209808349609 2 423.209224 844.403895 89816.9054050152 0.74961 0.00031724 -0.20021 -8.473e-05 0.5494 0.00023251 423.20913400938 9.2604 0.34271 9.3606 9.132 9.4747 0.10022 51.0 15.0 5.0 0.0 0.0 0.0 0.001183 1 3465.0 113.5 70.457 1 1197700000.0 8031 653 689 3939 3939.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 423.209808349609 2 423.209224 844.403895 48634.3059999763 0.67607 0.00028612 0.36362 0.00015389 1.0397 0.00044001 423.209504620973 9.2967 0.14905 8.9459 8.8291 8.9782 -0.35083 20.0 12.0 2.0 0.0 0.0 0.0 0.079495 1 5010.0 49.423 21.169 1 112000000.0 8032 653 689 3940 3940.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 423.209320068359 2 423.209224 844.403895 91343.5144717181 0.60824 0.00025741 -0.88403 -0.00037413 -0.27578 -0.00011671 423.20884030726 9.655 0.19277 9.1037 9.0051 9.1979 -0.55132 14.0 8.0 2.0 0.0 0.0 0.0 0.00031392 1 3558.0 135.84 82.657 1 1930200000.0 8033 653 689 3941 3941.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 423.209564208984 2 423.209224 844.403895 89385.226813436 0.43046 0.00018218 0.26592 0.00011254 0.69639 0.00029472 423.209304219415 9.528 0.47126 9.1271 8.8567 9.328 -0.40093 41.0 21.0 5.0 0.0 0.0 0.0 0.0084713 1 3522.0 78.77 53.213 1 2052300000.0 8034 653 689 3942 3942.0 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 2 423.209224 844.403895 45520.4166346129 0.25962 0.00010987 -0.47972 -0.00020302 -0.2201 -9.3149e-05 423.209072372469 9.8055 0.14227 8.9533 8.8685 9.0107 -0.85216 -0.0069701 -0.00030558 130.27 39.0 14.0 5.0 0 0 2085000000.0 8035 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 423.209224 844.403895 47824.403265082 -0.20857 -8.827e-05 -0.31294 -0.00013244 -0.52151 -0.00022071 423.209156095054 9.5107 0.13485 9.1098 9.0338 9.1686 -0.40088 -0.098304 -0.0001324 135.84 57.0 15.0 5.0 0 0 2305400000.0 8036 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 423.209224 844.403895 46588.864549281 0.53349 0.00022578 -0.23271 -9.8485e-05 0.30078 0.00012729 423.209176359835 9.3394 0.11224 9.1396 9.0938 9.206 -0.19983 -0.068528 -6.4488e-05 135.84 37.0 9.0 5.0 0 0 1528000000.0 8037 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 423.209224 844.403895 48896.6381125382 0.3177 0.00013445 0.88981 0.00037658 1.2075 0.00051103 423.209691080437 9.1471 0.13156 8.9473 8.8475 8.9791 -0.19983 -0.013034 0.00085362 130.27 22.0 13.0 2.0 0 0 60213000.0 8038 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 423.209224 844.403895 88907.3158116521 0.57612 0.00024382 0.7958 0.00033679 1.3719 0.00058061 423.209545692676 9.7618 0.17181 9.2104 9.116 9.2878 -0.55139 0.0023316 0.00080607 135.84 12.0 7.0 3.0 0 0 21722000.0 8039 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 423.209224 844.403895 89031.4884373933 0.52895 0.00022386 0.22353 9.4599e-05 0.75248 0.00031846 423.209312240498 9.4534 0.2571 9.1528 8.9899 9.247 -0.30057 -0.055307 0.00032168 135.84 27.0 11.0 3.0 0 0 1106100000.0 8040 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 423.209224 844.403895 90775.1846832495 0.69055 0.00029225 0.24587 0.00010406 0.93643 0.0003963 423.209274878244 8.8948 0.14996 8.995 8.9178 9.0678 0.10022 0.034685 0.00030857 130.27 10.0 6.0 2.0 0 0 135410000.0 8041 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 423.209224 844.403895 48197.1689510863 0.79717 0.00033737 0.039496 1.6715e-05 0.83667 0.00035408 423.209010513045 9.3777 0.077036 8.9266 8.899 8.9761 -0.45114 -0.033691 0.00013389 130.27 12.0 7.0 2.0 0 0 142630000.0 8042 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 423.209224 844.403895 47942.434935782 0.63798 0.00027 -4.4319 -0.0018756 -3.7939 -0.0016056 423.208639564787 9.6578 0.15446 9.307 9.2036 9.358 -0.35083 0.098861 -0.0036188 135.84 33.0 20.0 2.0 0 0 62393000.0 8043 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 423.209224 844.403895 47905.4094498366 0.33597 0.00014218 -0.28984 -0.00012266 0.046122 1.9519e-05 423.209147753682 9.3524 0.24636 9.202 9.0584 9.3048 -0.1504 -0.0060961 -0.00011285 135.84 52.0 21.0 5.0 0 0 1668100000.0 8044 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 423.209224 844.403895 91019.9321008034 0.6004 0.00025409 0.03445 1.458e-05 0.63485 0.00026867 423.209196559424 9.458 0.17136 8.9066 8.7909 8.9623 -0.55132 -0.053646 0.00012962 130.27 10.0 7.0 2.0 0 0 92873000.0 8045 653 689 +994;1001 AAVAGEDGR 9 Unmodified _AAVAGEDGR_ 0 0 0 P07910;G3V2Q1;G3V576;G3V555;G3V575;O60812;B7ZW38;B2RXH8;P0DMR1;B4DSU6;A0A0G2JPF8;A0A0G2JNQ3;P07910-2;G3V4C1;B2R5W2;P07910-4;G3V4W0;B4DY08;G3V5X6;G3V3K6;G3V251 P07910;P07910-2 P07910-2 HNRNPC;HNRNPCL1;HNRNPCL3;HNRNPCL2;HNRNPCL4 Heterogeneous nuclear ribonucleoproteins C1/C2;Heterogeneous nuclear ribonucleoprotein C-like 1;Heterogeneous nuclear ribonucleoprotein C-like 3;Heterogeneous nuclear ribonucleoprotein C-like 2;Heterogeneous nuclear ribonucleoprotein C-like 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 423.209224 844.403895 89366.7792241994 0.40146 0.0001699 1.3868 0.00058689 1.7882 0.00075679 423.209820653334 9.3389 0.2142 9.0382 8.9141 9.1283 -0.30068 0.077959 0.0012742 130.27 19.0 9.0 3.0 0 0 80497000.0 8046 653 689 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 873.392883300781 2 873.389904 1744.76526 34015.7625966347 2.1333 0.0018632 -0.17731 -0.00015486 1.956 0.0017084 873.389884094549 39.476 0.15456 39.025 38.932 39.087 -0.45108 19.0 12.0 2.0 0.0 0.0 0.0 0.0033684 1 33212.0 73.927 67.955 1 27695000.0 3333 275 289 1653 1653.0 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 873.389904 1744.76526 64387.4936932587 2.5794 0.0022528 0.54514 0.00047612 3.1246 0.002729 873.891472975946 39.134 0.28112 39.134 39.01 39.291 0.0 0.041768 -0.00050268 73.927 29.0 12.0 3.0 0 0 11573000.0 3334 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 2 873.389904 1744.76526 35239.9284154667 1.782 0.0015564 1.3368 0.0011676 3.1188 0.002724 873.390995387756 40.204 0.11702 39.051 38.978 39.095 -1.1529 -0.041577 0.00088023 73.927 16.0 10.0 2.0 0 0 21683000.0 3335 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 873.389904 1744.76526 34276.9528998907 2.0659 0.0018044 0.65262 0.00056999 2.7186 0.0023744 873.391306935841 39.636 0.14352 39.035 38.944 39.087 -0.60138 -0.057845 -0.00031493 73.927 30.0 14.0 3.0 0 0 17736000.0 3336 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 873.389904 1744.76526 35293.4382602559 2.1095 0.0018424 -0.51477 -0.00044959 1.5947 0.0013928 873.890316579152 39.246 0.11762 39.147 39.081 39.199 -0.09961 0.054092 -0.0023541 73.927 17.0 10.0 2.0 0 0 16932000.0 3337 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 873.389904 1744.76526 61916.6431710342 2.1129 0.0018454 1.6337 0.0014268 3.7465 0.0032722 873.390592407162 39.88 0.38711 39.128 38.987 39.374 -0.75189 0.035974 0.0013988 73.927 34.0 17.0 2.0 0 0 20908000.0 3338 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 873.389904 1744.76526 61998.0788069666 2.0672 0.0018055 1.1802 0.0010308 3.2475 0.0028363 873.39096602754 39.426 0.36795 39.126 38.89 39.258 -0.30057 0.033315 0.00060667 73.927 46.0 16.0 4.0 0 0 13051000.0 3339 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 873.389904 1744.76526 64201.9805285812 2.396 0.0020927 0.74484 0.00065054 3.1409 0.0027432 873.391064170532 38.921 0.38798 39.021 38.854 39.241 0.10022 -0.07101 -0.00015384 73.927 43.0 17.0 3.0 0 0 12893000.0 3340 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 873.389904 1744.76526 35514.1644359624 1.9025 0.0016616 0.49535 0.00043263 2.3978 0.0020942 873.891915170653 39.852 0.15613 39.0 38.903 39.059 -0.85214 -0.092365 -0.00058965 73.927 18.0 12.0 3.0 0 0 20683000.0 3341 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 873.389904 1744.76526 34637.9002197281 2.012 0.0017572 -0.21353 -0.0001865 1.7985 0.0015707 873.389738125143 39.052 0.16872 39.102 39.013 39.181 0.050098 0.0094426 -0.0018279 73.927 27.0 15.0 2.0 0 0 19915000.0 3342 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 873.389904 1744.76526 62464.9330072561 1.975 0.001725 1.3731 0.0011992 3.3481 0.0029242 873.390687000998 39.961 0.27894 39.109 38.983 39.262 -0.85207 0.016719 0.00094351 73.927 26.0 12.0 3.0 0 0 12805000.0 3343 275 289 +96 AAGFSSSTTSTSWEGNR 17 Unmodified _AAGFSSSTTSTSWEGNR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 873.389904 1744.76526 59987.5326707904 2.1737 0.0018985 0.26587 0.00023221 2.4396 0.0021307 873.390002477889 39.633 0.25973 39.232 39.11 39.369 -0.40094 0.13918 -0.0009905 73.927 35.0 11.0 4.0 0 0 15105000.0 3344 275 289 +96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 331.184906005859 2 331.18502 660.355488 99793.2416232791 0.21341 7.068e-05 0.5876 0.00019461 0.80102 0.00026528 331.18514552495 7.3305 0.38376 7.1302 6.808 7.1918 -0.20032 26.0 17.0 2.0 0.0 0.0 0.0 0.018234 1 2658.0 110.61 48.273 1 22292000.0 8960 702 741 4502 4502.0 +96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 331.186126708984 2 331.18502 660.355488 52873.52561111 -0.52264 -0.00017309 1.2324 0.00040815 0.70977 0.00023506 331.185358841333 6.4872 0.22038 6.3368 6.2034 6.4238 -0.1504 95.0 51.0 2.0 0.0 0.0 0.0 0.063441 1 3121.0 60.788 27.05 1 17979000.0 8961 702 741 4503 4503.0 +96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 331.18502 660.355488 52387.5684996575 -0.024257 -8.0337e-06 0.41425 0.00013719 0.38999 0.00012916 331.185160499906 7.6723 0.27649 7.2714 7.1455 7.422 -0.40088 0.042763 -0.000143 110.61 98.0 53.0 2.0 0 0 83624000.0 8962 702 741 +96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 331.18502 660.355488 102836.021501968 0.28508 9.4414e-05 0.46525 0.00015408 0.75032 0.0002485 331.185191865798 7.8027 0.59856 7.2514 7.0128 7.6114 -0.55139 0.022692 -0.00010922 110.61 55.0 26.0 5.0 0 0 89577000.0 8963 702 741 +96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 331.18502 660.355488 100791.354045444 0.21136 6.9999e-05 0.70796 0.00023447 0.91932 0.00030447 331.185231151538 6.6535 0.62308 6.4532 6.1436 6.7667 -0.20032 0.058229 -0.00015335 60.788 55.0 27.0 3.0 0 0 48865000.0 8964 702 741 +96 AAVSASR 7 Unmodified _AAVSASR_ 0 0 0 Q7Z478;A0A087WYN9 Q7Z478 Q7Z478 DHX29 ATP-dependent RNA helicase DHX29 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 331.18502 660.355488 52757.8933823085 0.066469 2.2013e-05 1.3911 0.00046072 1.4576 0.00048273 331.185407084328 7.6125 0.16468 7.2617 7.1683 7.333 -0.35083 0.033018 0.00050406 110.61 56.0 31.0 2.0 0 0 31768000.0 8965 702 741 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 337.2158203125 2 337.215789 672.417025 54608.6667267157 -0.1393 -4.6975e-05 -0.32398 -0.00010925 -0.46328 -0.00015623 337.215724397473 20.897 0.22262 19.945 19.862 20.085 -0.95241 47.0 28.0 2.0 0.0 0.0 0.0 0.062173 1 14933.0 61.561 31.116 1 41210000.0 1428 118 123 726 726.0 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 337.216033935547 2 337.215789 672.417025 55968.548724636 0.15454 5.2113e-05 -0.00086208 -2.9071e-07 0.15368 5.1822e-05 337.215746152774 19.841 0.20505 19.741 19.645 19.85 -0.099595 42.0 25.0 2.0 0.0 0.0 0.0 0.073645 1 13999.0 58.981 24.089 1 41668000.0 1429 118 123 727 727.0 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 337.215759277344 2 337.215789 672.417025 54709.8336924935 0.23614 7.9631e-05 -0.17747 -5.9845e-05 0.058672 1.9785e-05 337.215702094344 20.59 0.21745 19.838 19.736 19.954 -0.75189 54.0 28.0 3.0 0.0 0.0 0.0 0.073645 1 15094.0 58.981 13.231 1 58772000.0 1430 118 123 728 728.0 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 337.215454101563 2 337.215789 672.417025 54611.2835900477 0.23273 7.848e-05 -0.09045 -3.0501e-05 0.14228 4.7978e-05 337.215665510181 20.221 0.24188 19.87 19.766 20.008 -0.35083 48.0 27.0 3.0 0.0 0.0 0.0 0.062173 1 14731.0 61.561 16.95 1 53818000.0 1431 118 123 729 729.0 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 337.215789 672.417025 103970.923440202 0.97266 0.000328 -0.14357 -4.8414e-05 0.82909 0.00027958 337.215599419088 19.921 0.36421 19.921 19.8 20.164 0.0 0.024645 2.4916e-05 61.561 31.0 16.0 3.0 0 0 79085000.0 1432 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 337.215789 672.417025 54456.4054668177 0.17723 5.9763e-05 -0.43136 -0.00014546 -0.25413 -8.5698e-05 337.215637774345 20.363 0.22348 19.862 19.763 19.987 -0.50113 -0.034287 -0.00016918 61.561 44.0 25.0 2.0 0 0 37651000.0 1433 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 337.215789 672.417025 100195.862418847 0.90539 0.00030531 0.014037 4.7334e-06 0.91943 0.00031005 337.215719507259 20.576 0.29994 19.824 19.698 19.998 -0.75189 -0.071814 0.00013121 61.561 25.0 13.0 3.0 0 0 55033000.0 1434 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 337.215789 672.417025 103785.23670759 0.65545 0.00022103 -0.21869 -7.3745e-05 0.43677 0.00014729 337.215559090738 20.406 0.34286 20.005 19.906 20.249 -0.40082 0.10916 -2.5746e-05 61.561 34.0 15.0 3.0 0 0 98156000.0 1435 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 337.215789 672.417025 102062.845303498 1.0053 0.00033899 0.057821 1.9498e-05 1.0631 0.00035849 337.215628530437 19.874 0.25708 19.874 19.757 20.014 -3.4571e-05 -0.021949 0.00016074 61.561 28.0 11.0 3.0 0 0 92229000.0 1436 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 337.215789 672.417025 55788.5767487602 0.9392 0.00031671 -1.457 -0.00049133 -0.51781 -0.00017461 337.215343091539 19.988 0.22865 19.938 19.841 20.07 -0.050152 0.041919 -0.00086091 61.561 74.0 31.0 3.0 0 0 86918000.0 1437 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 337.215789 672.417025 100837.99104114 0.54218 0.00018283 -0.096046 -3.2388e-05 0.44613 0.00015044 337.215678984741 20.655 0.29987 19.904 19.777 20.077 -0.75182 0.0077053 5.6967e-05 61.561 24.0 13.0 3.0 0 0 49783000.0 1438 118 123 +1349 AAAVTLK 7 Unmodified _AAAVTLK_ 0 0 0 O00330;O00330-3;H0YD97 O00330 O00330 PDHX Pyruvate dehydrogenase protein X component, mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 337.215789 672.417025 103028.252649315 0.85522 0.0002884 -0.40345 -0.00013605 0.45177 0.00015234 337.215507527794 20.531 0.34274 20.03 19.904 20.247 -0.50118 0.1339 -0.00015036 61.561 27.0 15.0 3.0 0 0 68849000.0 1439 118 123 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1283.58239746094 2 1283.07738 2564.1402 27992.5466007096 1.6226 0.002082 -0.15831 -0.00020312 1.4643 0.0018788 1283.57880344565 48.205 0.19945 47.052 46.939 47.138 -1.1529 55.0 17.0 4.0 0.0 0.0 0.0 3.6525e-24 1 41179.0 225.68 217.7 1 72948000.0 6157 499 529 3074 3074.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 1283.57824707031 2 1283.07738 2564.1402 28300.0946601743 1.4493 0.0018596 -0.80724 -0.0010358 0.64207 0.00082382 1283.57775177689 47.797 0.21745 47.296 47.184 47.402 -0.50114 47.0 16.0 4.0 0.0 0.0 0.0 4.5875e-32 1 41059.0 243.01 234.21 1 53749000.0 6158 499 529 3075 3075.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1283.58435058594 2 1283.07738 2564.1402 27500.1538659125 1.737 0.0022287 0.2087 0.00026778 1.9457 0.0024964 1283.58086487989 47.477 0.23657 47.377 47.266 47.502 -0.09961 64.0 22.0 4.0 0.0 0.0 0.0 2.1375e-17 1 40440.0 191.35 180.08 1 85106000.0 6159 499 529 3076 3076.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 856.053588867188 3 855.720677 2564.1402 34667.6956550751 0.99249 0.0008493 -0.074812 -6.4018e-05 0.91768 0.00078528 856.054114316741 47.472 0.12862 47.372 47.302 47.43 -0.09961 27.0 13.0 3.0 0.0 0.0 0.0 5.1033e-09 1 40495.0 93.255 89.528 1 48882000.0 6160 499 529 3077 3077.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 1283.58166503906 2 1283.07738 2564.1402 27716.7430301678 2.0897 0.0026812 -0.17666 -0.00022667 1.913 0.0024545 1283.57892529705 48.049 0.19432 47.196 47.109 47.303 -0.85214 51.0 16.0 4.0 0.0 0.0 0.0 1.6192000000000002e-54 1 41705.0 297.7 285.41 1 78521000.0 6161 499 529 3078 3078.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 856.053894042969 3 855.720677 2564.1402 33863.0786615119 1.6233 0.0013891 -1.0615 -0.00090832 0.5618 0.00048074 856.05328191912 48.047 0.14254 47.195 47.118 47.261 -0.85214 22.0 11.0 3.0 0.0 0.0 0.0 5.1757e-09 1 41756.0 84.03 81.229 1 40605000.0 6162 499 529 3079 3079.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1283.58154296875 2 1283.07738 2564.1402 27803.3452393597 1.2604 0.0016172 0.81939 0.0010513 2.0798 0.0026685 1283.58015290264 47.788 0.23843 47.337 47.219 47.457 -0.45108 77.0 24.0 4.0 0.0 0.0 0.0 7.5651e-10 1 41449.0 149.09 136.8 1 105280000.0 6163 499 529 3080 3080.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 855.72216796875 3 855.720677 2564.1402 47.773 1.0 47.322 46.822 47.822 -0.45108 0.0 0.0 0.0 2.0873e-07 1 41493.0 71.202 70.195 1 6164 499 529 3081 3081.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 856.390808105469 3 855.720677 2564.1402 33401.2373544199 1.3307 0.0011387 -0.63356 -0.00054215 0.69713 0.00059655 856.05392854242 47.482 0.15319 47.431 47.351 47.504 -0.050152 44.0 14.0 4.0 0.0 0.0 0.0 5.2955e-08 1 40936.0 79.942 72.911 1 39592000.0 6165 499 529 3082 3082.0 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 855.720677 2564.1402 63005.3786974404 2.372 0.0020298 0.23297 0.00019936 2.605 0.0022292 856.055218676151 47.427 0.30035 47.427 47.248 47.548 0.0 0.078701 -0.00045604 93.255 48.0 13.0 5.0 0 0 25692000.0 6166 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 1283.07738 2564.1402 53227.9707597629 3.112 0.0039929 -0.73195 -0.00093915 2.38 0.0030538 1283.07617752563 48.092 0.25718 47.24 47.099 47.356 -0.85214 -0.00094134 -0.001265 297.7 37.0 11.0 4.0 0 0 71056000.0 6167 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 855.720677 2564.1402 63560.6465059435 2.1952 0.0018785 0.51135 0.00043757 2.7065 0.002316 856.055021171333 48.083 0.36431 47.231 46.97 47.335 -0.85214 -0.11744 0.00025861 93.255 57.0 16.0 5.0 0 0 24719000.0 6168 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 855.720677 2564.1402 64656.523254455 1.6867 0.0014433 0.0045127 3.8616e-06 1.6912 0.0014472 856.054920133409 47.737 0.27965 47.336 47.2 47.479 -0.40082 -0.012126 -0.0010425 93.255 52.0 12.0 5.0 0 0 24130000.0 6169 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 855.720677 2564.1402 63104.1563488921 2.3755 0.0020327 0.94117 0.00080537 3.3166 0.0028381 856.055870292381 47.48 0.32246 47.48 47.293 47.615 -3.4809e-05 0.13136 0.001362 93.255 66.0 14.0 6.0 0 0 36486000.0 6170 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 1283.07738 2564.1402 53293.1199974165 3.0127 0.0038655 -0.34558 -0.0004434 2.6671 0.0034221 1283.57843479155 47.985 0.25715 47.133 47.0 47.257 -0.85207 -0.10791 -0.00027348 297.7 33.0 11.0 4.0 0 0 52002000.0 6171 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 1283.07738 2564.1402 51967.3791889806 2.9925 0.0038396 -0.42135 -0.00054062 2.5711 0.003299 1283.57993476613 47.795 0.32167 47.294 47.182 47.504 -0.50119 0.053164 -0.00046793 297.7 36.0 14.0 4.0 0 0 64853000.0 6172 499 529 +6000 AAPEEHDSPTEASQPIVEEEETK 23 Acetyl (Protein N-term) _(ac)AAPEEHDSPTEASQPIVEEEETK_ 1 0 0 Q9H0S4;Q9H0S4-2;F5H1N9 Q9H0S4 Q9H0S4 DDX47 Probable ATP-dependent RNA helicase DDX47 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 855.720677 2564.1402 63486.6730884006 1.7963 0.0015371 0.25218 0.00021579 2.0485 0.0017529 856.055240792006 47.816 0.38597 47.315 47.139 47.525 -0.50119 -0.03334 -0.00040673 93.255 55.0 17.0 5.0 0 0 22974000.0 6173 499 529 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 526.728393554688 2 526.726923 1051.43929 44032.4522704044 0.94535 0.00049794 -0.25513 -0.00013438 0.69022 0.00036356 527.228161187795 11.932 0.19 11.08 10.973 11.163 -0.85216 76.0 31.0 4.0 0.0 0.0 0.0 0.0080065 1 7231.0 75.378 53.247 1 39161000.0 1533 128 134 764 764.0 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 526.726745605469 2 526.726923 1051.43929 43143.0660078593 0.38868 0.00020473 -0.064598 -3.4026e-05 0.32408 0.0001707 526.727216318821 11.423 0.20048 11.022 10.93 11.131 -0.40088 69.0 31.0 3.0 0.0 0.0 0.0 0.0068949 1 6802.0 76.827 67.964 1 39022000.0 1534 128 134 765 765.0 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 526.72802734375 2 526.726923 1051.43929 42084.6192343925 0.91358 0.00048121 0.501 0.00026389 1.4146 0.0007451 526.727517859095 11.117 0.13559 11.017 10.962 11.098 -0.099588 42.0 19.0 3.0 0.0 0.0 0.0 0.0017362 1 6573.0 92.439 65.837 1 41663000.0 1535 128 134 766 766.0 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 526.728271484375 2 526.726923 1051.43929 42857.1813581714 0.95002 0.0005004 0.8736 0.00046015 1.8236 0.00096055 526.727697627123 11.382 0.21592 11.031 10.968 11.184 -0.35083 47.0 29.0 3.0 0.0 0.0 0.0 0.0022672 1 6937.0 87.308 60.705 1 60799000.0 1536 128 134 767 767.0 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 526.726923 1051.43929 78426.6434804951 1.7589 0.00092648 0.14203 7.4811e-05 1.901 0.0010013 526.727130437839 11.066 0.27863 11.066 10.94 11.218 -1.7764e-15 0.037722 8.2526e-05 92.439 39.0 12.0 6.0 0 0 25128000.0 1537 128 134 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 526.726923 1051.43929 80050.8543578281 1.0839 0.00057094 0.069391 3.655e-05 1.1533 0.00060749 527.228272428511 11.541 0.36417 10.99 10.895 11.259 -0.55139 -0.038339 6.0048e-06 92.439 47.0 16.0 4.0 0 0 46581000.0 1538 128 134 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 526.726923 1051.43929 81527.9933349198 1.0534 0.00055483 0.20204 0.00010642 1.2554 0.00066125 526.727144742391 11.337 0.32144 11.036 10.875 11.197 -0.30057 0.0078297 0.00014574 92.439 38.0 14.0 5.0 0 0 45193000.0 1539 128 134 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 526.726923 1051.43929 77856.0294955625 1.4516 0.00076459 0.29586 0.00015584 1.7474 0.00092043 526.727276040021 10.895 0.25706 10.995 10.867 11.124 0.10022 -0.032731 0.00024457 92.439 33.0 11.0 5.0 0 0 31558000.0 1540 128 134 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 526.726923 1051.43929 42870.1112879989 1.4435 0.00076032 0.12231 6.4426e-05 1.5658 0.00082475 527.228056332767 11.547 0.23395 10.996 10.913 11.147 -0.55139 -0.032425 6.1757e-05 92.439 79.0 33.0 4.0 0 0 74219000.0 1541 128 134 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 526.726923 1051.43929 80280.9429479531 1.1548 0.00060825 0.028199 1.4853e-05 1.183 0.0006231 526.727099742928 11.672 0.47121 11.02 10.769 11.24 -0.65157 -0.008179 -3.739e-05 92.439 56.0 21.0 4.0 0 0 45000000.0 1542 128 134 +924 AACNGPYDGK 10 Unmodified _AACNGPYDGK_ 0 0 0 Q9HC38-2;F6TLX2;I3L3Q4;Q9HC38-3 Q9HC38-2 Q9HC38-2 GLOD4 Glyoxalase domain-containing protein 4 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 526.726923 1051.43929 80363.5362513359 1.1791 0.00062104 -0.39495 -0.00020803 0.78411 0.00041301 526.726757820307 11.458 0.36433 11.057 10.913 11.278 -0.40093 0.028472 -0.00048316 92.439 47.0 15.0 5.0 0 0 36110000.0 1543 128 134 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 392.755767822266 2 392.755613 783.496673 49489.4861263324 0.13082 5.1379e-05 -0.073388 -2.8823e-05 0.057429 2.2556e-05 392.755531776106 49.555 0.35196 48.402 48.216 48.568 -1.1529 80.0 30.0 4.0 0.0 0.0 0.0 0.0061479 1 42472.0 103.29 23.832 1 211770000.0 4209 340 356 2098 2098.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 392.755706787109 2 392.755613 783.496673 50061.6462649096 0.24257 9.5271e-05 -0.021127 -8.2978e-06 0.22144 8.6973e-05 392.755571982849 48.734 0.32766 48.233 48.065 48.393 -0.50114 55.0 24.0 3.0 0.0 0.0 0.0 0.0015867 1 41885.0 146.21 28.156 1 143250000.0 4210 340 356 2099 2099.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 392.756011962891 2 392.755613 783.496673 49754.3614929264 0.82477 0.00032393 -0.33822 -0.00013284 0.48655 0.0001911 392.755486662089 48.176 0.30325 48.076 47.925 48.228 -0.09961 56.0 23.0 3.0 0.0 0.0 0.0 0.0046402 1 41090.0 114.54 25.805 1 126090000.0 4211 340 356 2100 2100.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 392.756042480469 2 392.755613 783.496673 92794.8666391363 0.90244 0.00035444 0.14185 5.5714e-05 1.0443 0.00041015 392.755566723013 49.126 0.40767 48.274 48.044 48.451 -0.85214 47.0 18.0 4.0 0.0 0.0 0.0 0.0035884 1 20181.0 129.96 26.981 1 178850000.0 4212 340 356 2101 2101.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 392.755828857422 2 392.755613 783.496673 94066.8158642021 0.54476 0.00021396 0.3319 0.00013036 0.87666 0.00034431 392.755592441327 48.526 0.40723 48.125 47.909 48.316 -0.40082 43.0 18.0 3.0 0.0 0.0 0.0 0.0031986 1 19907.0 132.94 26.18 1 143390000.0 4213 340 356 2102 2102.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 392.756072998047 2 392.755613 783.496673 91658.255265295 1.1121 0.00043678 0.6754 0.00026527 1.7875 0.00070205 392.755764434668 47.968 0.40738 47.968 47.765 48.173 -3.4809e-05 45.0 18.0 3.0 0.0 0.0 0.0 0.0054768 1 19700.0 117.7 25.006 1 168960000.0 4214 340 356 2103 2103.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 392.755981445313 2 392.755613 783.496673 49537.0642146884 0.36725 0.00014424 0.22397 8.7965e-05 0.59122 0.00023221 392.755671412355 49.156 0.32484 48.304 48.131 48.456 -0.85214 60.0 23.0 3.0 0.0 0.0 0.0 0.023311 1 42701.0 71.949 20.377 1 219940000.0 4215 340 356 2104 2104.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 392.755828857422 2 392.755613 783.496673 49463.205334259 0.92747 0.00036427 -0.14223 -5.5862e-05 0.78524 0.00030841 392.755531266648 48.61 0.35188 48.159 47.985 48.336 -0.45108 73.0 28.0 3.0 0.0 0.0 0.0 0.01973 1 42202.0 75.311 22.628 1 165170000.0 4216 340 356 2105 2105.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 392.755645751953 2 392.755613 783.496673 49717.560216645 0.63375 0.00024891 -0.05742 -2.2552e-05 0.57633 0.00022636 392.755568855994 48.048 0.35061 47.997 47.837 48.187 -0.050152 71.0 28.0 3.0 0.0 0.0 0.0 0.0029009 1 41441.0 129.96 38.867 1 166220000.0 4217 340 356 2106 2106.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 392.755889892578 2 392.755613 783.496673 92033.1657029471 0.74525 0.0002927 0.067161 2.6378e-05 0.81241 0.00031908 392.755485485728 49.236 0.60041 48.384 48.179 48.78 -0.85207 55.0 27.0 4.0 0.0 0.0 0.0 0.0054768 1 20194.0 117.7 25.006 1 154530000.0 4218 340 356 2107 2107.0 +2022 AAIGLLAR 8 Unmodified _AAIGLLAR_ 0 0 0 P07741;H3BQF1;P07741-2;H3BQZ9;H3BQB1;H3BSW3 P07741 P07741 APRT Adenine phosphoribosyltransferase MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 392.755737304688 2 392.755613 783.496673 90462.0978858877 0.71393 0.0002804 -0.059098 -2.3211e-05 0.65483 0.00025719 392.755485586831 48.699 0.34301 48.198 48.019 48.362 -0.50119 41.0 15.0 4.0 0.0 0.0 0.0 0.0054768 1 19950.0 117.7 25.006 1 135720000.0 4219 340 356 2108 2108.0 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 1149.62255859375 2 1149.11538 2296.21621 29228.1735658268 2.3283 0.0026755 0.50107 0.00057578 2.8294 0.0032513 1149.61761078377 76.252 0.12154 75.299 75.232 75.353 -0.95239 18.0 8.0 3.0 0.0 0.0 0.0 6.1507e-06 1 69865.0 101.2 89.763 1 14222000.0 8174 662 700 4014 4014.0 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1149.11755371094 2 1149.11538 2296.21621 30489.2720822834 1.9416 0.0022311 1.1621 0.0013353 3.1036 0.0035664 1149.61713992903 75.883 0.13953 75.432 75.373 75.512 -0.45108 18.0 9.0 3.0 0.0 0.0 0.0 1.3978e-05 1 69292.0 97.417 79.005 1 10928000.0 8175 662 700 4015 4015.0 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1149.61767578125 2 1149.11538 2296.21621 30613.840357268 2.6677 0.0030655 -0.010854 -1.2473e-05 2.6568 0.003053 1149.61513086489 75.603 0.11168 75.453 75.381 75.492 -0.1504 9.0 6.0 2.0 0.0 0.0 0.0 2.6109e-07 1 68935.0 118.52 97.859 1 23250000.0 8176 662 700 4016 4016.0 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 1149.11538 2296.21621 56516.059899694 3.4437 0.0039573 -1.0097 -0.0011602 2.4341 0.0027971 1149.61635027495 75.468 0.23927 75.468 75.338 75.577 0.0 0.082876 -0.0026395 118.52 34.0 10.0 4.0 0 0 6842900.0 8177 662 700 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 1149.11538 2296.21621 56932.4155682849 2.9932 0.0034396 0.63527 0.00073 3.6285 0.0041696 1149.61828389216 76.173 0.25947 75.32 75.224 75.484 -0.85214 -0.064857 0.0011409 118.52 32.0 11.0 4.0 0 0 9924400.0 8178 662 700 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 1149.11538 2296.21621 57211.5053779834 2.8675 0.003295 0.082085 9.4325e-05 2.9495 0.0033894 1149.61690065 75.852 0.21779 75.452 75.323 75.54 -0.40082 0.066318 -0.00013047 118.52 29.0 9.0 4.0 0 0 8792100.0 8179 662 700 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 1149.11538 2296.21621 57398.7849543716 3.1288 0.0035954 0.48285 0.00055485 3.6117 0.0041502 1149.61735999308 75.515 0.21606 75.515 75.394 75.61 -3.4809e-05 0.12985 0.00079058 118.52 30.0 9.0 4.0 0 0 11942000.0 8180 662 700 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 1149.11538 2296.21621 57990.4945343856 2.7807 0.0031954 0.18937 0.00021761 2.9701 0.003413 1149.11607402617 76.138 0.17249 75.185 75.086 75.258 -0.95232 -0.20007 0.00011609 118.52 20.0 7.0 3.0 0 0 12142000.0 8181 662 700 +5350 AAVEDNTLTIEPVASQTLPTVK 22 Unmodified _AAVEDNTLTIEPVASQTLPTVK_ 0 0 0 Q8TBN0;Q8TBN0-2 Q8TBN0 Q8TBN0 RAB3IL1 Guanine nucleotide exchange factor for Rab-3A MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 1149.11538 2296.21621 57974.5481235987 2.7728 0.0031863 0.45549 0.00052341 3.2283 0.0037097 1149.61769237747 75.844 0.21588 75.343 75.229 75.444 -0.50119 -0.042771 0.00072769 118.52 27.0 9.0 4.0 0 0 7977000.0 8182 662 700 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 866.950866699219 2 866.946858 1731.87916 32327.9128464234 1.0353 0.00089757 1.743 0.0015111 2.7783 0.0024087 867.450235183466 75.918 0.35695 74.664 74.505 74.862 -1.2532 44.0 22.0 3.0 0.0 0.0 0.0 2.0015e-05 1 68774.0 138.45 122.56 1 47690000.0 4877 396 412 2462 2462.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 866.949951171875 2 866.946858 1731.87916 32299.50711353 1.4443 0.0012522 1.3458 0.0011667 2.7901 0.0024189 866.948857270703 75.456 0.27552 74.955 74.807 75.083 -0.50114 41.0 16.0 3.0 0.0 0.0 0.0 1.9083e-06 1 68335.0 148.18 130.82 1 42068000.0 4878 396 412 2463 2463.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 867.449096679688 2 866.946858 1731.87916 32566.9939755213 2.3408 0.0020293 -0.44219 -0.00038336 1.8986 0.001646 866.94887243565 75.057 0.38191 74.958 74.823 75.205 -0.099617 59.0 24.0 4.0 0.0 0.0 0.0 6.3785e-06 1 67638.0 145.01 125.41 1 49227000.0 4879 396 412 2464 2464.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 867.451110839844 2 866.946858 1731.87916 31382.5900681373 2.4377 0.0021133 0.30414 0.00026367 2.7418 0.002377 867.449488778381 75.814 0.36876 74.862 74.668 75.037 -0.95239 58.0 24.0 4.0 0.0 0.0 0.0 1.4269e-06 1 69388.0 153.38 130.0 1 93175000.0 4880 396 412 2465 2465.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 578.30126953125 3 578.300331 1731.87916 44514.5080996521 1.6753 0.00096882 -0.13713 -7.9305e-05 1.5382 0.00088952 578.634008313487 75.801 0.22015 74.849 74.759 74.979 -0.95239 27.0 14.0 3.0 0.0 0.0 0.0 0.0001964 1 69409.0 70.529 65.962 1 19221000.0 4881 396 412 2466 2466.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 866.952514648438 2 866.946858 1731.87916 31782.0317903245 2.1785 0.0018887 0.77882 0.00067519 2.9574 0.0025639 866.949088376508 75.367 0.28395 74.916 74.779 75.063 -0.45108 62.0 19.0 4.0 0.0 0.0 0.0 4.6833e-05 1 68741.0 125.54 112.14 1 61684000.0 4882 396 412 2467 2467.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 867.451965332031 2 866.946858 1731.87916 32407.1389510915 2.2334 0.0019363 1.3759 0.0011929 3.6094 0.0031291 866.948581319041 75.017 0.33007 74.967 74.851 75.181 -0.050152 64.0 21.0 5.0 0.0 0.0 0.0 1.5967e-06 1 68281.0 151.55 136.67 1 67796000.0 4883 396 412 2468 2468.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-SECPEP 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 577.843322753906 3 578.300331 1731.87916 41150.7472482343 1.611 0.00093165 -0.37265 -0.00021551 1.2384 0.00071614 578.300118993697 74.98 0.24009 74.93 74.862 75.102 -0.050152 24.0 15.0 2.0 0.0 0.0 0.0 0.039141 1 68364.0 45.33 39.426 1 10650000.0 4884 396 412 2469 2469.0 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 578.300331 1731.87916 75183.6766894737 2.2556 0.0013044 -0.99328 -0.00057441 1.2623 0.00072998 578.633932727184 74.964 0.43715 74.964 74.813 75.25 0.0 0.052354 -0.0020869 70.529 27.0 19.0 2.0 0 0 7896900.0 4885 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 3 578.300331 1731.87916 45680.242785005 0.70221 0.00040609 -0.61327 -0.00035466 0.088938 5.1433e-05 578.299597184876 75.427 0.19379 74.926 74.84 75.033 -0.50114 0.014058 -0.0014276 70.529 19.0 11.0 3.0 0 0 11307000.0 4886 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 866.946858 1731.87916 61639.4914602681 2.3256 0.0020161 0.51765 0.00044877 2.8432 0.0024649 866.946436749454 75.737 0.51982 74.885 74.575 75.095 -0.85214 0.0068617 0.00020782 153.38 63.0 23.0 4.0 0 0 57268000.0 4887 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 578.300331 1731.87916 75605.0358796728 1.707 0.00098714 0.58401 0.00033773 2.291 0.0013249 578.300713892304 75.335 0.32584 74.934 74.758 75.084 -0.40082 0.022239 0.00064956 70.529 39.0 14.0 3.0 0 0 10629000.0 4888 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 578.300331 1731.87916 75158.9019038424 2.0148 0.0011651 0.27625 0.00015976 2.291 0.0013249 578.30084761028 74.928 0.4791 74.928 74.761 75.24 -3.4809e-05 0.01595 0.00011563 70.529 36.0 21.0 3.0 0 0 11656000.0 4889 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 578.300331 1731.87916 42651.3884683401 1.5732 0.00090979 -0.15804 -9.1394e-05 1.4152 0.00081839 578.299844107478 75.384 0.21966 74.933 74.795 75.015 -0.45108 0.021269 -0.00063782 70.529 30.0 15.0 3.0 0 0 10805000.0 4890 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 866.946858 1731.87916 61856.3770097439 2.1207 0.0018385 -0.17348 -0.0001504 1.9472 0.0016881 866.946431603301 75.769 0.45549 74.817 74.652 75.107 -0.95232 -0.06097 -0.00099052 153.38 45.0 20.0 3.0 0 0 37170000.0 4891 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 578.300331 1731.87916 79023.5531040152 1.5377 0.00088924 -0.46896 -0.0002712 1.0687 0.00061804 578.634686206678 75.781 0.25933 74.829 74.673 74.933 -0.95232 -0.082931 -0.0011772 70.529 20.0 11.0 3.0 0 0 13676000.0 4892 396 412 +3348 AALGPSSQNVTEYVVR 16 Acetyl (Protein N-term) _(ac)AALGPSSQNVTEYVVR_ 1 0 0 P35269;M0R0Z3 P35269 P35269 GTF2F1 General transcription factor IIF subunit 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 578.300331 1731.87916 76148.5177234205 1.5861 0.00091727 1.277 0.00073849 2.8631 0.0016558 578.300664336914 75.414 0.30336 74.913 74.752 75.055 -0.50119 0.0013958 0.0018518 70.529 35.0 13.0 4.0 0 0 9451900.0 4893 396 412 +5160 AALAPELALEIPSGSQADIPLPK 23 Unmodified _AALAPELALEIPSGSQADIPLPK_ 0 0 0 Q8IVF2;Q8IVF2-3 Q8IVF2 Q8IVF2 AHNAK2 Protein AHNAK2 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1151.13659667969 2 1151.13866 2300.26276 99.281 1.0 98.931 98.431 99.431 -0.35083 0.0 0.0 0.0 0.0030454 1 91612.0 67.115 60.638 1 4520 367 383 2265 2265.0 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 645.840698242188 2 645.839745 1289.66494 39183.7251512135 1.0203 0.00065898 0.73127 0.00047229 1.7516 0.0011313 645.840407680742 42.918 0.17167 42.066 41.998 42.17 -0.85214 34.0 12.0 4.0 0.0 0.0 0.0 0.0002631 1 36598.0 106.4 75.326 1 85143000.0 834 71 71 418 418.0 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 645.841552734375 2 645.839745 1289.66494 38970.9234786222 1.6193 0.0010458 0.65561 0.00042342 2.2749 0.0014692 645.840202781804 42.477 0.23804 42.026 41.952 42.19 -0.45108 39.0 18.0 3.0 0.0 0.0 0.0 0.00023631 1 36156.0 108.47 80.071 1 75968000.0 835 71 71 419 419.0 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 645.839745 1289.66494 73046.2009201794 1.602 0.0010346 0.3256 0.00021029 1.9276 0.0012449 645.840553977326 42.893 0.49302 42.141 42.011 42.504 -0.75189 0.061238 -2.9709e-05 108.47 46.0 22.0 4.0 0 0 64144000.0 836 71 71 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 645.839745 1289.66494 71612.7562178348 1.6042 0.0010361 0.037713 2.4356e-05 1.642 0.0010604 645.839890879695 42.441 0.30003 42.141 42.003 42.303 -0.30057 0.061162 -0.00040157 108.47 31.0 11.0 4.0 0 0 53433000.0 837 71 71 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 645.839745 1289.66494 72032.2222178963 1.8526 0.0011965 0.68265 0.00044089 2.5353 0.0016374 645.840206807123 41.985 0.27863 42.085 41.924 42.203 0.10022 0.0059934 0.00043149 108.47 34.0 12.0 4.0 0 0 47309000.0 838 71 71 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 645.839745 1289.66494 39041.587877041 1.4928 0.00096409 0.87215 0.00056327 2.3649 0.0015274 645.840501786455 42.081 0.21879 42.131 42.03 42.249 0.050098 0.051483 0.00067625 108.47 32.0 15.0 3.0 0 0 51830000.0 839 71 71 +5198 AAALASGCTVEIK 13 Unmodified _AAALASGCTVEIK_ 0 0 0 Q8IYS1 Q8IYS1 Q8IYS1 PM20D2 Peptidase M20 domain-containing protein 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 645.839745 1289.66494 73327.2623788934 1.5944 0.0010298 -0.66711 -0.00043085 0.92733 0.00059891 645.839765052438 42.819 0.23574 41.967 41.834 42.07 -0.85207 -0.11273 -0.001312 108.47 16.0 10.0 2.0 0 0 3605300.0 840 71 71 3258 AADTIGYPVMIR 12 Oxidation (M) _AADTIGYPVM(ox)IR_ AADTIGYPVM(1)IR AADTIGYPVM(101.9)IR 0 1 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 661.843688964844 2 661.842287 1321.67002 71647.1804744484 1.88 0.0012442 0.24194 0.00016013 2.1219 0.0014044 661.84266881822 56.014 0.90149 56.014 55.774 56.675 0.0 112.0 40.0 5.0 0.0 0.0 0.0 0.00025844 1 22998.0 101.9 88.543 1 346810000.0 1962 165 173 967 967.0 2500 3258 AADTIGYPVMIR 12 Oxidation (M) _AADTIGYPVM(ox)IR_ AADTIGYPVM(1)IR AADTIGYPVM(143.7)IR 0 1 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 661.842956542969 2 661.842287 1321.67002 37818.2585446155 0.62076 0.00041085 0.41767 0.00027643 1.0384 0.00068728 661.842961794986 57.019 0.37335 55.866 55.734 56.107 -1.1529 82.0 26.0 4.0 0.0 0.0 0.0 2.0624e-06 1 50071.0 143.7 128.09 1 351210000.0 1963 165 173 968 968.0 2500 3258 AADTIGYPVMIR 12 Oxidation (M) _AADTIGYPVM(ox)IR_ AADTIGYPVM(1)IR AADTIGYPVM(72.23)IR 0 1 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 661.845153808594 2 661.842287 1321.67002 36840.5715529352 1.036 0.00068568 0.89874 0.00059482 1.9348 0.0012805 661.843470442215 56.133 0.47215 56.034 55.864 56.337 -0.09961 108.0 37.0 5.0 0.0 0.0 0.0 0.006717 1 49064.0 72.23 45.962 1 414870000.0 1964 165 173 969 969.0 2500 @@ -206,133 +206,133 @@ Protein group IDs Sequence Length Modifications Modified sequence Oxidation (M) 3258 AADTIGYPVMIR 12 Oxidation (M) _AADTIGYPVM(ox)IR_ 0 1 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 661.842287 1321.67002 70589.7899043283 1.8916 0.001252 0.90908 0.00060167 2.8007 0.0018536 661.843130479572 56.226 0.57936 56.125 55.897 56.476 -0.10029 0.082558 0.00067004 140.11 90.0 25.0 5.0 0 0 216790000.0 1971 165 173 2500 3258 AADTIGYPVMIR 12 Oxidation (M) _AADTIGYPVM(ox)IR_ 0 1 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 661.842287 1321.67002 37554.0744505667 1.476 0.00097688 0.87437 0.0005787 2.3504 0.0015556 661.843134094862 56.26 0.51763 56.109 55.868 56.385 -0.1504 0.066715 0.0006241 140.11 119.0 39.0 5.0 0 0 339670000.0 1972 165 173 2500 3258 AADTIGYPVMIR 12 Oxidation (M) _AADTIGYPVM(ox)IR_ 0 1 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 661.842287 1321.67002 71717.3187898746 1.5158 0.0010032 0.24298 0.00016081 1.7588 0.001164 661.842702156302 56.476 0.55832 56.075 55.868 56.426 -0.40094 0.032731 -0.00021166 140.11 87.0 25.0 5.0 0 0 346030000.0 1973 165 173 2500 -3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 654.347106933594 2 653.84483 1305.67511 71604.0495682683 1.6661 0.0010893 -0.25342 -0.0001657 1.4126 0.00092364 653.844914251396 65.307 0.69098 64.455 64.007 64.698 -0.85214 155.0 31.0 6.0 0.0 0.0 0.0 0.016523 1 26901.0 73.985 51.899 1 1067000000.0 1974 165 174 975 975.0 -3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 653.846252441406 2 653.84483 1305.67511 70996.1337540087 1.8055 0.0011805 0.098668 6.4514e-05 1.9042 0.001245 654.346277850415 64.757 0.80286 64.356 63.912 64.715 -0.40082 173.0 36.0 6.0 0.0 0.0 0.0 2.5596e-06 1 26629.0 140.14 121.36 1 475760000.0 1975 165 174 976 976.0 -3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 653.84619140625 2 653.84483 1305.67511 64.074 1.0 64.074 63.574 64.574 -3.4809e-05 0.0 0.0 0.0 9.8197e-10 1 26450.0 166.16 113.45 1 1976 165 174 977 977.0 -3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 653.846069335938 2 653.84483 1305.67511 38038.9958138234 1.9318 0.0012631 -0.41563 -0.00027176 1.5161 0.00099131 653.844734297032 65.376 0.68424 64.423 63.969 64.653 -0.95239 165.0 46.0 4.0 0.0 0.0 0.0 0.001219 1 59074.0 113.62 98.955 1 1248600000.0 1977 165 174 978 978.0 -3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 654.347473144531 2 653.84483 1305.67511 37876.2159917862 2.0766 0.0013578 -0.41787 -0.00027322 1.6587 0.0010845 654.345897401385 64.843 0.73341 64.292 63.93 64.664 -0.55133 182.0 47.0 5.0 0.0 0.0 0.0 0.00099279 1 58426.0 117.89 103.68 1 560470000.0 1978 165 174 979 979.0 -3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 653.845703125 2 653.84483 1305.67511 38078.757350447 1.5896 0.0010393 -0.060023 -3.9246e-05 1.5295 0.0010001 653.845037274822 64.222 0.82917 64.072 63.84 64.669 -0.1504 105.0 61.0 2.0 0.0 0.0 0.0 0.00025737 1 57587.0 138.4 116.31 1 732100000.0 1979 165 174 980 980.0 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 533.288696289063 2 533.288005 1064.56146 43246.8026351911 1.3869 0.00073964 0.39838 0.00021245 1.7853 0.00095209 533.288647787673 33.939 0.17665 33.839 33.762 33.939 -0.09961 25.0 14.0 2.0 0.0 0.0 0.0 0.014727 1 27148.0 66.621 47.527 1 58319000.0 6299 511 541 3149 3149.0 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 533.288005 1064.56146 79675.8568480884 1.7017 0.00090748 0.27391 0.00014607 1.9756 0.0010536 533.28813864444 33.874 0.32151 33.874 33.691 34.012 0.0 0.050914 -0.00028137 66.621 39.0 14.0 3.0 0 0 48737000.0 6300 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 2 533.288005 1064.56146 41943.9366359198 1.2599 0.00067189 -1.6506 -0.00088024 -0.39068 -0.00020835 533.286969475288 34.875 0.25422 33.722 33.554 33.808 -1.1529 -0.10079 -0.002334 66.621 48.0 20.0 3.0 0 0 48671000.0 6301 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 533.288005 1064.56146 42919.0518090496 0.88976 0.0004745 0.50225 0.00026785 1.392 0.00074235 533.288532533032 34.398 0.2118 33.797 33.651 33.863 -0.60138 -0.02633 -3.7829e-05 66.621 32.0 18.0 2.0 0 0 78597000.0 6302 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 533.288005 1064.56146 81688.8820323534 1.358 0.00072421 0.46794 0.00024955 1.8259 0.00097376 533.288163152752 34.194 0.40726 33.793 33.603 34.01 -0.40082 -0.029955 -7.4424e-05 66.621 45.0 18.0 3.0 0 0 66651000.0 6303 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 533.288005 1064.56146 80502.7238202131 1.6408 0.00087501 0.9217 0.00049153 2.5625 0.0013665 533.288482075029 33.864 0.34323 33.864 33.651 33.994 -3.4809e-05 0.041253 0.00040954 66.621 28.0 15.0 2.0 0 0 52102000.0 6304 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 533.288005 1064.56146 42725.0364878606 1.4016 0.00074748 0.62501 0.00033331 2.0267 0.0010808 533.288561410773 34.311 0.2818 33.859 33.664 33.945 -0.45108 0.036445 9.3103e-05 66.621 38.0 22.0 2.0 0 0 99404000.0 6305 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 533.288005 1064.56146 43252.2607086083 1.2727 0.00067873 2.162 0.001153 3.4347 0.0018317 533.289714566367 33.866 0.18479 33.917 33.833 34.018 0.050098 0.093556 0.0017324 66.621 29.0 13.0 3.0 0 0 65473000.0 6306 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 533.288005 1064.56146 78261.4076347003 1.1055 0.00058955 0.91513 0.00048803 2.0206 0.0010776 533.2885009967 34.605 0.27852 33.753 33.605 33.883 -0.85207 -0.070003 0.00040253 66.621 22.0 12.0 2.0 0 0 51057000.0 6307 511 541 -6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 533.288005 1064.56146 81299.3333144726 1.1916 0.00063545 0.12057 6.4298e-05 1.3121 0.00069975 533.288045348198 34.313 0.36427 33.812 33.585 33.949 -0.50119 -0.011154 -0.00044493 66.621 25.0 14.0 2.0 0 0 65256000.0 6308 511 541 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 978.477722167969 2 978.476511 1954.93847 30344.68959196 2.606 0.0025499 -0.41301 -0.00040412 2.193 0.0021458 978.476026821547 59.288 0.14635 58.336 58.244 58.39 -0.95239 16.0 9.0 2.0 0.0 0.0 0.0 0.0027107 1 52981.0 70.438 54.682 1 35849000.0 1460 120 126 733 733.0 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 978.979553222656 2 978.476511 1954.93847 30485.1826477089 2.3958 0.0023443 0.12726 0.00012452 2.5231 0.0024688 978.477736471666 59.008 0.15454 58.456 58.34 58.494 -0.55133 19.0 9.0 3.0 0.0 0.0 0.0 2.0522e-05 1 52686.0 122.42 100.55 1 29140000.0 1461 120 126 734 734.0 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 978.476511 1954.93847 59148.2388938415 2.1726 0.0021259 1.7047 0.001668 3.8773 0.0037939 978.478412664569 59.295 0.47284 58.342 58.057 58.529 -0.95239 -0.068792 0.0024057 122.42 41.0 21.0 3.0 0 0 19897000.0 1462 120 126 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 978.476511 1954.93847 59232.8182263945 2.5758 0.0025204 2.4895 0.0024359 5.0653 0.0049563 978.980127561935 58.916 0.30141 58.415 58.208 58.509 -0.50107 0.003668 0.0039414 122.42 24.0 13.0 2.0 0 0 18096000.0 1463 120 126 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 978.476511 1954.93847 58391.2772263761 2.6786 0.0026209 -4.3494 -0.0042558 -1.6708 -0.0016349 978.471067211782 58.689 0.85978 58.588 58.261 59.121 -0.10029 0.17698 -0.0094419 122.42 57.0 39.0 2.0 0 0 13129000.0 1464 120 126 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 978.476511 1954.93847 31071.2365730195 2.3179 0.002268 1.8119 0.0017729 4.1298 0.0040409 978.978086991555 58.626 0.14509 58.476 58.373 58.518 -0.1504 0.064309 0.0026154 122.42 21.0 11.0 2.0 0 0 24069000.0 1465 120 126 -4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 978.476511 1954.93847 58306.3036410272 2.078 0.0020332 4.6582 0.0045579 6.7361 0.0065912 978.485070733537 59.217 0.40783 58.265 57.974 58.382 -0.95232 -0.14615 0.0081855 122.42 44.0 18.0 5.0 0 0 14563000.0 1466 120 126 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 673.665283203125 3 673.664398 2017.97137 35855.7042161062 0.87037 0.00058634 0.38745 0.00026101 1.2578 0.00084735 673.664199596574 71.907 0.24459 71.405 71.258 71.502 -0.50114 25.0 15.0 2.0 0.0 0.0 0.0 0.00066423 1 64902.0 73.498 69.145 1 38939000.0 8714 690 729 4296 4296.0 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 674.001831054688 3 673.664398 2017.97137 34567.4074175151 1.5078 0.0010158 0.71638 0.0004826 2.2242 0.0014984 673.664777399718 71.567 0.34361 71.467 71.255 71.599 -0.099617 34.0 21.0 2.0 0.0 0.0 0.0 0.00026152 2 64179.0 79.837 76.499 1 28577000.0 8715 690 729 4297;4298 4297.0 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 673.664398 2017.97137 69801.3429057739 2.2662 0.0015267 1.7435 0.0011745 4.0097 0.0027012 674.335845684277 71.481 0.4786 71.481 71.235 71.714 0.0 0.062581 0.0028428 79.837 51.0 21.0 3.0 0 0 26989000.0 8716 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 3 673.664398 2017.97137 36825.0317251076 0.93365 0.00062897 0.060779 4.0944e-05 0.99443 0.00066991 673.664924025331 72.709 0.27633 71.456 71.39 71.667 -1.2532 0.03761 -0.000558 79.837 31.0 20.0 2.0 0 0 27007000.0 8717 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 673.664398 2017.97137 71824.5804962836 1.4389 0.00096933 -0.37077 -0.00024977 1.0681 0.00071956 673.998399610367 72.22 0.41058 71.368 71.183 71.593 -0.85214 -0.049618 -0.0014301 79.837 34.0 18.0 2.0 0 0 31024000.0 8718 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 673.664398 2017.97137 71020.6189246261 1.6774 0.00113 0.028394 1.9128e-05 1.7058 0.0011491 673.664508968915 71.769 0.41217 71.368 71.181 71.593 -0.40082 -0.049596 -0.00062345 79.837 32.0 18.0 2.0 0 0 50247000.0 8719 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 673.664398 2017.97137 71344.2233469571 1.9949 0.0013439 0.55244 0.00037216 2.5473 0.001716 673.999043163039 71.406 0.39085 71.406 71.219 71.61 -3.4809e-05 -0.011651 0.00043565 79.837 31.0 17.0 2.0 0 0 40441000.0 8720 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 673.664398 2017.97137 35424.5149225117 1.2969 0.00087368 0.44138 0.00029734 1.7383 0.001171 673.999269740016 71.817 0.31553 71.366 71.175 71.49 -0.45108 -0.052251 0.00021119 79.837 37.0 20.0 2.0 0 0 44577000.0 8721 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 673.664398 2017.97137 35949.2172827075 1.6999 0.0011451 0.37519 0.00025275 2.0751 0.0013979 673.998731278412 71.495 0.28679 71.445 71.261 71.548 -0.050152 0.027091 7.7415e-05 79.837 30.0 17.0 2.0 0 0 79838000.0 8722 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 673.664398 2017.97137 71121.2340446906 1.2861 0.0008664 0.54044 0.00036408 1.8265 0.0012305 673.998991054708 72.369 0.38925 71.417 71.284 71.673 -0.95232 -0.00086223 0.0004114 79.837 26.0 17.0 2.0 0 0 31807000.0 8723 690 729 -5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 673.664398 2017.97137 70908.8105404274 1.0711 0.00072159 0.85162 0.00057371 1.9228 0.0012953 673.999181361888 71.919 0.4109 71.418 71.251 71.662 -0.50119 -0.00017795 0.0010403 79.837 33.0 18.0 2.0 0 0 37114000.0 8724 690 729 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 436.711853027344 2 436.711068 871.407583 88440.8711482923 1.34 0.0005852 0.44191 0.00019299 1.7819 0.00077819 436.711139254687 34.133 0.27862 34.133 33.991 34.269 0.0 41.0 12.0 4.0 0.0 0.0 0.0 0.039905 1 13830.0 70.525 40.718 1 131510000.0 3078 255 267 1518 1518.0 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 436.711456298828 2 436.711068 871.407583 47971.740415912 0.5061 0.00022102 0.27364 0.0001195 0.77974 0.00034052 436.71107114353 35.407 0.24942 34.254 34.122 34.372 -1.1529 58.0 20.0 4.0 0.0 0.0 0.0 0.089415 1 28490.0 51.059 36.277 1 174880000.0 3079 255 267 1519 1519.0 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 436.711395263672 2 436.711068 871.407583 47916.8563667022 0.71696 0.00031311 0.12473 5.447e-05 0.84169 0.00036757 436.711067371645 34.838 0.28674 34.236 34.081 34.367 -0.60138 58.0 23.0 3.0 0.0 0.0 0.0 0.032975 1 28124.0 62.88 38.206 1 173940000.0 3080 255 267 1520 1520.0 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 436.711700439453 2 436.711068 871.407583 47622.8188354947 1.2005 0.00052425 0.73214 0.00031974 1.9326 0.00084399 436.71146904844 34.247 0.34765 34.147 34.004 34.352 -0.09961 65.0 26.0 3.0 0.0 0.0 0.0 0.087781 1 27417.0 51.346 23.092 1 169560000.0 3081 255 267 1521 1521.0 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 436.711761474609 2 436.711068 871.407583 87243.3352098452 0.82264 0.00035925 0.58818 0.00025687 1.4108 0.00061612 436.711137672383 34.72 0.4289 34.219 34.056 34.485 -0.50119 48.0 19.0 4.0 0.0 0.0 0.0 0.055838 1 14090.0 64.265 37.4 1 148070000.0 3082 255 267 1522 1522.0 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 436.711068 871.407583 48753.134170454 1.3948 0.00060911 -0.20362 -8.8923e-05 1.1911 0.00052019 436.710795957832 35.167 0.21358 34.314 34.174 34.388 -0.85214 0.085832 -0.00049455 62.88 31.0 16.0 2.0 0 0 37480000.0 3083 255 267 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 436.711068 871.407583 47867.005731057 0.7682 0.00033548 2.6607 0.001162 3.4289 0.0014974 436.712533470639 34.64 0.32997 34.189 34.081 34.411 -0.45108 -0.039536 0.0020072 62.88 29.0 22.0 2.0 0 0 44117000.0 3084 255 267 -2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 436.711068 871.407583 88643.1238954353 0.71806 0.00031359 1.1216 0.0004898 1.8396 0.00080338 436.71124429766 35.188 0.51423 34.335 33.969 34.483 -0.85207 0.1069 0.00066289 62.88 61.0 23.0 4.0 0 0 229730000.0 3085 255 267 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 607.352111816406 2 607.350606 1212.68666 76163.7422536706 2.1372 0.001298 -0.0085634 -5.201e-06 2.1286 0.0012928 607.350535682011 94.481 0.58376 94.481 94.244 94.828 0.0 86.0 25.0 5.0 0.0 0.0 0.0 0.0010768 1 38802.0 107.69 75.759 1 79171000.0 5011 407 424 2521 2521.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 607.852966308594 2 607.350606 1212.68666 40510.0980191529 0.77865 0.00047291 -0.097294 -5.9092e-05 0.68135 0.00041382 607.350550379193 96.288 0.35044 95.035 94.848 95.198 -1.2532 70.0 22.0 4.0 0.0 0.0 0.0 0.0030284 1 88191.0 92.062 72.791 1 83111000.0 5012 407 424 2522 2522.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 607.349365234375 2 607.350606 1212.68666 40131.581693828 0.47724 0.00028985 0.14226 8.6402e-05 0.6195 0.00037625 607.350610439902 95.149 0.43578 94.749 94.574 95.01 -0.4009 74.0 28.0 4.0 0.0 0.0 0.0 0.00034222 1 87115.0 130.75 98.813 1 76747000.0 5013 407 424 2523 2523.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 607.351318359375 2 607.350606 1212.68666 40529.4681394277 2.0511 0.0012457 -0.42968 -0.00026097 1.6214 0.00098478 607.350225101482 94.625 0.3881 94.525 94.362 94.75 -0.099617 69.0 24.0 4.0 0.0 0.0 0.0 0.0015441 1 86254.0 105.78 73.85 1 90824000.0 5014 407 424 2524 2524.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 607.3515625 2 607.350606 1212.68666 75903.6630580158 1.8257 0.0011088 -0.24661 -0.00014978 1.5791 0.00095906 607.350394475025 95.481 0.803 94.729 94.472 95.275 -0.75189 112.0 35.0 5.0 0.0 0.0 0.0 8.4982e-06 1 39393.0 164.57 122.17 1 138270000.0 5015 407 424 2525 2525.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 607.35205078125 2 607.350606 1212.68666 77192.1428654562 1.7295 0.0010504 0.39103 0.00023749 2.1206 0.0012879 607.350816700996 94.866 0.63015 94.565 94.298 94.928 -0.30057 94.0 27.0 5.0 0.0 0.0 0.0 0.0011915 1 39033.0 105.78 79.401 1 93508000.0 5016 407 424 2526 2526.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 607.351501464844 2 607.350606 1212.68666 75209.824609014 2.0271 0.0012312 0.26864 0.00016316 2.2958 0.0013943 607.350719471425 94.391 0.78375 94.491 94.121 94.905 0.10022 115.0 34.0 5.0 0.0 0.0 0.0 4.2258e-05 1 38825.0 144.09 108.79 1 127600000.0 5017 407 424 2527 2527.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 607.350036621094 2 607.350606 1212.68666 40188.8474833481 0.89979 0.00054648 -0.32731 -0.00019879 0.57248 0.00034769 607.350239389778 95.651 0.36294 94.799 94.615 94.978 -0.85214 77.0 23.0 4.0 0.0 0.0 0.0 0.00051292 1 88447.0 122.52 90.582 1 113150000.0 5018 407 424 2528 2528.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 607.852722167969 2 607.350606 1212.68666 40027.6659025767 1.4036 0.00085246 -0.15504 -9.4164e-05 1.2485 0.0007583 607.35044472747 94.431 0.40068 94.481 94.338 94.739 0.050098 78.0 26.0 4.0 0.0 0.0 0.0 0.0022682 1 86867.0 99.802 77.062 1 113200000.0 5019 407 424 2529 2529.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 607.351684570313 2 607.350606 1212.68666 76165.8078199884 1.4245 0.00086516 0.98202 0.00059643 2.4065 0.0014616 607.351150173145 95.842 0.58308 94.889 94.675 95.258 -0.95232 96.0 25.0 5.0 0.0 0.0 0.0 5.7156e-05 1 39478.0 141.48 115.1 1 96135000.0 5020 407 424 2530 2530.0 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 607.350606 1212.68666 79251.0112409959 2.0867 0.0012674 -0.56427 -0.00034271 1.5224 0.00092465 607.851880398387 95.035 0.31472 95.035 94.828 95.143 0.0 0.046083 -0.00098826 141.48 24.0 13.0 2.0 0 0 603880.0 5021 407 424 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 607.350606 1212.68666 80088.3981211459 2.0363 0.0012368 0.39305 0.00023872 2.4294 0.0014755 607.852230491827 94.895 0.28883 94.995 94.905 95.194 0.10022 0.0067641 0.0001746 141.48 20.0 12.0 2.0 0 0 902550.0 5022 407 424 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 607.350606 1212.68666 40189.1765666656 1.2576 0.00076381 -0.31778 -0.00019301 0.93982 0.0005708 607.350294802567 95.011 0.35839 94.661 94.503 94.862 -0.35083 0.044321 -0.00030212 164.57 70.0 22.0 4.0 0 0 121980000.0 5023 407 424 -4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 607.350606 1212.68666 75230.6778811113 1.3871 0.00084245 0.54026 0.00032813 1.9274 0.0011706 607.350869042637 95.083 0.9671 94.682 94.33 95.297 -0.40094 0.065605 0.00074015 164.57 103.0 42.0 5.0 0 0 69757000.0 5024 407 424 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1272.25671386719 3 1271.58965 3811.74713 28680.8284565586 1.4538 0.0018486 0.2893 0.00036787 1.7431 0.0022165 1271.92453807774 89.417 0.1257 88.164 88.123 88.249 -1.2532 16.0 8.0 3.0 0.0 0.0 0.0 2.3681e-14 1 81812.0 110.98 105.88 1 29761000.0 3387 280 294 1669 1669.0 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1272.25854492188 3 1271.58965 3811.74713 26581.2932550599 2.686 0.0034154 -0.098426 -0.00012516 2.5875 0.0032903 1272.2562395461 88.766 0.13122 88.666 88.589 88.721 -0.099617 24.0 7.0 5.0 0.0 0.0 0.0 3.0292e-14 1 80807.0 106.94 102.32 1 24532000.0 3388 280 294 1670 1670.0 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1272.25720214844 3 1271.58965 3811.74713 27747.1815887335 0.67567 0.00085917 -1.5208 -0.0019338 -0.84512 -0.0010747 1271.92097974597 88.946 0.30768 88.595 88.44 88.748 -0.35083 53.0 21.0 4.0 0.0 0.0 0.0 5.4326e-07 1 81860.0 76.519 71.897 1 26022000.0 3389 280 294 1671 1671.0 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 954.698425292969 4 953.944058 3811.74713 32433.0785065357 2.062 0.0019671 -1.5886 -0.0015155 0.4734 0.0004516 954.44387274299 88.783 0.28692 88.833 88.676 88.963 0.050098 49.0 17.0 4.0 0.0 0.0 0.0 0.0012265 1 81611.0 49.43 45.203 1 26869000.0 3390 280 294 1672 1672.0 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 1271.58965 3811.74713 53105.3208155611 3.7747 0.0047998 -0.24529 -0.00031191 3.5294 0.0044879 1272.25789483453 88.723 0.31251 88.723 88.566 88.878 0.0 0.0098282 -0.0020144 106.94 39.0 13.0 4.0 0 0 13087000.0 3391 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 4 953.944058 3811.74713 64575.9099551432 2.6857 0.002562 -1.6714 -0.0015945 1.0143 0.00096759 954.443584927148 89.193 0.37489 88.441 88.291 88.666 -0.75189 -0.25746 -0.0016321 49.43 56.0 16.0 5.0 0 0 15769000.0 3392 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 1271.58965 3811.74713 54538.8110310319 3.0347 0.0038589 0.5708 0.00072583 3.6055 0.0045847 1272.258096961 89.015 0.35619 88.714 88.539 88.895 -0.30057 0.0010967 0.0010988 106.94 48.0 15.0 5.0 0 0 20468000.0 3393 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 4 953.944058 3811.74713 61122.195628881 2.0534 0.0019588 -1.157 -0.0011037 0.89636 0.00085508 954.444054940805 89.076 0.55343 88.775 88.517 89.07 -0.30057 0.076428 0.0003308 49.43 103.0 24.0 6.0 0 0 12497000.0 3394 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 1271.58965 3811.74713 53300.8691777228 3.4876 0.0044348 0.70581 0.0008975 4.1934 0.0053323 1272.25903485488 88.764 0.28571 88.864 88.747 89.033 0.10022 0.15092 0.0016138 106.94 45.0 12.0 5.0 0 0 18574000.0 3395 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 4 953.944058 3811.74713 59890.7294289543 2.4977 0.0023827 -0.88988 -0.0008489 1.6079 0.0015338 954.444400517589 88.802 0.59604 88.902 88.68 89.276 0.10022 0.20367 0.0013501 49.43 89.0 26.0 6.0 0 0 20529000.0 3396 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 1271.58965 3811.74713 27607.106884234 2.095 0.002664 0.91534 0.0011639 3.0104 0.0038279 1271.92537286412 88.772 0.2596 88.822 88.703 88.963 0.050098 0.10903 0.0024131 106.94 31.0 15.0 4.0 0 0 32109000.0 3397 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 1271.58965 3811.74713 50714.7590942735 2.8406 0.0036121 -1.2311 -0.0015655 1.6095 0.0020467 1271.92058855069 89.009 0.26953 88.608 88.444 88.713 -0.40094 -0.10501 -0.0057751 106.94 28.0 11.0 3.0 0 0 21097000.0 3398 280 294 -4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 4 953.944058 3811.74713 60024.701328964 1.898 0.0018106 -1.5304 -0.0014599 0.36764 0.00035071 954.442701951363 88.997 0.33624 88.596 88.421 88.758 -0.40094 -0.10251 -0.0010939 49.43 58.0 14.0 6.0 0 0 10341000.0 3399 280 294 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 651.348999023438 2 651.347737 1300.68092 71577.1183555127 2.3498 0.0015305 -0.82824 -0.00053947 1.5216 0.00099107 651.347217027211 74.486 0.58807 74.486 74.334 74.922 0.0 97.0 26.0 5.0 0.0 0.0 0.0 8.3089e-15 1 30685.0 204.36 174.2 1 257820000.0 9812 775 816 4897 4897.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 651.353393554688 2 651.347737 1300.68092 36390.5300514746 0.76037 0.00049527 -0.095862 -6.2439e-05 0.66451 0.00043283 651.348215265627 75.579 0.53396 74.325 74.131 74.665 -1.2532 111.0 34.0 5.0 0.0 0.0 0.0 0.0019352 1 68332.0 81.915 61.501 1 405430000.0 9813 775 816 4898 4898.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 651.348571777344 2 651.347737 1300.68092 38041.7214983594 1.4282 0.00093026 -0.23011 -0.00014988 1.1981 0.00078038 651.347893607882 74.579 0.44004 74.479 74.351 74.791 -0.099617 90.0 29.0 4.0 0.0 0.0 0.0 5.718e-12 1 67133.0 172.25 147.33 1 252350000.0 9814 775 816 4899 4899.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 651.348693847656 2 651.347737 1300.68092 69930.9824085982 1.7458 0.0011372 -0.35995 -0.00023445 1.3859 0.0009027 651.347528611846 75.265 0.82161 74.412 73.969 74.791 -0.85214 116.0 37.0 5.0 0.0 0.0 0.0 6.6567e-12 1 31087.0 182.76 160.53 1 402270000.0 9815 775 816 4900 4900.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 651.348510742188 2 651.347737 1300.68092 70332.3818066221 1.7356 0.0011305 -0.48216 -0.00031405 1.2535 0.00081644 651.347574523531 74.803 0.62921 74.402 74.237 74.867 -0.40082 111.0 28.0 6.0 0.0 0.0 0.0 2.7087e-11 1 30904.0 172.94 151.43 1 318360000.0 9816 775 816 4901 4901.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 651.349304199219 2 651.347737 1300.68092 72310.2086014084 2.0776 0.0013532 -0.0031027 -2.0209e-06 2.0745 0.0013512 651.34777156654 74.405 0.7392 74.405 74.197 74.936 -3.4809e-05 116.0 33.0 5.0 0.0 0.0 0.0 4.5206e-14 1 30734.0 190.02 167.78 1 336610000.0 9817 775 816 4902 4902.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 651.348388671875 2 651.347737 1300.68092 38040.231872213 0.85306 0.00055564 -0.28516 -0.00018574 0.56789 0.00036989 651.347818869932 74.866 0.53862 74.415 74.24 74.779 -0.45108 126.0 35.0 6.0 0.0 0.0 0.0 1.8157e-08 1 68304.0 159.58 141.6 1 349470000.0 9818 775 816 4903 4903.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 651.349243164063 2 651.347737 1300.68092 38001.8920939265 1.2694 0.00082682 -0.14567 -9.4884e-05 1.1237 0.00073193 651.347796472094 74.488 0.49835 74.438 74.321 74.819 -0.050152 117.0 35.0 4.0 0.0 0.0 0.0 4.7542e-06 1 67760.0 140.83 124.63 1 467410000.0 9819 775 816 4904 4904.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 651.348693847656 2 651.347737 1300.68092 71864.6320683553 1.5194 0.00098968 -0.14186 -9.2402e-05 1.3776 0.00089728 651.347644309556 75.365 0.64746 74.413 74.134 74.782 -0.95232 101.0 29.0 5.0 0.0 0.0 0.0 6.4509e-08 1 31107.0 148.14 131.37 1 318760000.0 9820 775 816 4905 4905.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 651.348083496094 2 651.347737 1300.68092 71599.1024521462 1.5713 0.0010234 -0.34327 -0.00022359 1.228 0.00079984 651.347534081956 74.963 0.60556 74.462 74.233 74.838 -0.50119 94.0 27.0 5.0 0.0 0.0 0.0 4.4255e-11 1 30936.0 164.68 146.7 1 331970000.0 9821 775 816 4906 4906.0 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 651.347737 1300.68092 37269.8494082044 0.48422 0.0003154 -0.25178 -0.000164 0.23244 0.0001514 651.347696942722 74.976 0.59994 74.475 74.256 74.856 -0.50114 0.050455 5.5929e-05 204.36 111.0 39.0 4.0 0 0 297570000.0 9822 775 816 -2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 651.347737 1300.68092 37309.6250085398 0.9712 0.00063259 -0.26826 -0.00017473 0.70294 0.00045786 651.347652095735 75.33 0.57908 74.378 74.061 74.64 -0.95239 -0.046377 3.4462e-05 204.36 108.0 39.0 4.0 0 0 480050000.0 9823 775 816 -5847 AANYSSTSTR 10 Acetyl (Protein N-term) _(ac)AANYSSTSTR_ 1 0 0 Q9BTV4 Q9BTV4 Q9BTV4 TMEM43 Transmembrane protein 43 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 550.253479003906 2 550.25436 1098.49417 21.726 1.0 21.124 20.624 21.624 -0.60138 0.0 0.0 0.0 0.0014478 1 15739.0 87.308 69.272 1 5973 485 514 2988 2988.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1035.86755371094 3 1034.86449 3101.57165 30820.7490460009 1.6779 0.0017364 -0.15982 -0.00016539 1.5181 0.001571 1035.19789874747 96.194 0.18454 94.941 94.848 95.032 -1.2532 44.0 12.0 5.0 0.0 0.0 0.0 1.5244e-10 1 88195.0 104.83 98.539 1 41049000.0 1467 121 127 735 735.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 1035.20263671875 3 1034.86449 3101.57165 28925.4686534443 1.0994 0.0011378 -1.0177 -0.0010531 0.081757 8.4607e-05 1035.53135072089 95.297 0.19474 94.896 94.815 95.01 -0.4009 43.0 13.0 5.0 0.0 0.0 0.0 1.3312e-10 1 87320.0 107.45 101.15 1 27598000.0 1468 121 127 736 736.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1035.19763183594 3 1034.86449 3101.57165 28791.0502702371 1.6844 0.0017431 -0.79658 -0.00082436 0.8878 0.00091875 1035.19716080697 94.899 0.16943 94.8 94.717 94.886 -0.099617 29.0 10.0 4.0 0.0 0.0 0.0 6.9214e-06 1 86583.0 75.82 69.525 1 53742000.0 1469 121 127 737 737.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 1035.5390625 3 1034.86449 3101.57165 58445.3022210209 2.577 0.0026668 2.155 0.0022301 4.7319 0.0048969 1035.53505667885 95.108 0.6063 94.807 94.635 95.241 -0.30057 104.0 26.0 7.0 0.0 0.0 0.0 1.9343e-12 1 39151.0 117.52 99.572 1 35550000.0 1470 121 127 738 738.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 776.652587890625 4 776.400189 3101.57165 38296.9252394469 0.68073 0.00052852 -0.71493 -0.00055507 -0.034199 -2.6552e-05 776.649966429594 95.167 0.16626 94.816 94.733 94.9 -0.35083 23.0 11.0 3.0 0.0 0.0 0.0 0.033486 1 87733.0 31.923 26.263 1 9421100.0 1471 121 127 739 739.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 776.905090332031 4 776.400189 3101.57165 43476.7675306881 0.98769 0.00076684 -0.80515 -0.00062512 0.18253 0.00014172 776.649740210529 94.777 0.11217 94.827 94.739 94.851 0.050098 10.0 7.0 2.0 0.0 0.0 0.0 0.0050215 1 87240.0 43.256 36.607 1 12020000.0 1472 121 127 740 740.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1035.2001953125 3 1034.86449 3101.57165 27613.0579473613 1.5316 0.001585 -1.1733 -0.0012142 0.35833 0.00037083 1035.19549553454 94.732 0.18784 94.782 94.728 94.915 0.050098 27.0 13.0 3.0 0.0 0.0 0.0 1.0706e-07 1 87261.0 83.939 72.307 1 43760000.0 1473 121 127 741 741.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 1035.20288085938 3 1034.86449 3101.57165 57213.5588475098 2.2806 0.0023601 1.8208 0.0018843 4.1014 0.0042444 1035.53528440587 95.842 0.38224 94.89 94.742 95.124 -0.95232 82.0 16.0 7.0 0.0 0.0 0.0 7.8965e-12 1 39504.0 106.81 98.908 1 28234000.0 1474 121 127 742 742.0 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 1034.86449 3101.57165 59975.7402354825 2.9629 0.0030662 0.96365 0.00099725 3.9266 0.0040635 1035.20056253567 94.811 0.35944 94.811 94.649 95.008 1.4211e-14 -0.024842 -0.0020752 117.52 71.0 15.0 7.0 0 0 24614000.0 1475 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 4 776.400189 3101.57165 69429.7188820824 2.4641 0.0019132 -0.40281 -0.00031274 2.0613 0.0016004 776.650363123507 94.818 0.31453 94.818 94.626 94.941 1.4211e-14 -0.0012919 -0.0013249 43.256 33.0 13.0 3.0 0 0 6885700.0 1476 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 4 776.400189 3101.57165 38905.9945481921 1.2051 0.00093566 -0.59248 -0.00046 0.61264 0.00047565 776.650247322707 94.896 0.13635 94.796 94.733 94.87 -0.099617 -0.022814 -0.0019139 43.256 12.0 8.0 2.0 0 0 17475000.0 1477 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 1034.86449 3101.57165 57465.4167137514 2.5669 0.0026564 1.396 0.0014447 3.9629 0.0041011 1035.20033783276 95.527 0.49177 94.775 94.649 95.141 -0.75189 -0.060792 -0.00073279 117.52 86.0 21.0 6.0 0 0 38662000.0 1478 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 4 776.400189 3101.57165 66013.8668971188 2.1121 0.0016398 0.032575 2.5291e-05 2.1447 0.0016651 776.65026955828 95.562 0.31394 94.811 94.649 94.963 -0.75189 -0.0082499 2.7246e-05 43.256 31.0 13.0 4.0 0 0 9344300.0 1479 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 4 776.400189 3101.57165 65973.2439409622 2.0651 0.0016033 0.41557 0.00032265 2.4806 0.001926 776.902203943452 95.108 0.4289 94.807 94.545 94.973 -0.30057 -0.01183 0.0012167 43.256 43.0 18.0 4.0 0 0 13968000.0 1480 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 1034.86449 3101.57165 58570.136751731 2.7431 0.0028387 1.9123 0.001979 4.6554 0.0048177 1035.53417889661 94.702 0.53433 94.802 94.659 95.194 0.10022 -0.033462 0.00087012 117.52 81.0 23.0 7.0 0 0 32534000.0 1481 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 4 776.400189 3101.57165 66368.11449119 2.3312 0.00181 0.56017 0.00043492 2.8914 0.0022449 776.650611514844 94.718 0.46868 94.818 94.569 95.038 0.10022 -0.0007346 0.0016658 43.256 43.0 20.0 4.0 0 0 11747000.0 1482 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 1034.86449 3101.57165 57024.6205109036 2.1117 0.0021854 2.4486 0.002534 4.5603 0.0047193 1035.20100279573 95.256 0.539 94.855 94.623 95.162 -0.40094 0.019061 0.0025349 117.52 78.0 23.0 6.0 0 0 22519000.0 1483 121 127 -2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 4 776.400189 3101.57165 66547.314316663 1.6737 0.0012994 -0.033182 -2.5763e-05 1.6405 0.0012737 776.651469280463 95.259 0.27004 94.858 94.713 94.983 -0.40094 0.039267 -0.00017697 43.256 35.0 11.0 4.0 0 0 8977600.0 1484 121 127 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 509.274261474609 2 509.273509 1016.53247 80565.2225137516 1.6257 0.00082792 -0.021789 -1.1097e-05 1.6039 0.00081682 509.273525934328 47.239 0.4073 47.239 47.119 47.526 0.0 51.0 18.0 4.0 0.0 0.0 0.0 0.0087271 1 19344.0 77.923 40.829 1 226970000.0 9955 784 827 4962 4962.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 509.273590087891 2 509.273509 1016.53247 44694.4197515 0.49182 0.00025047 -1.1163 -0.00056852 -0.62451 -0.00031805 509.273301217601 48.438 0.28524 47.285 47.176 47.461 -1.1529 63.0 26.0 4.0 0.0 0.0 0.0 0.0030632 1 41510.0 98.299 60.061 1 419050000.0 9956 784 827 4963 4963.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 509.273651123047 2 509.273509 1016.53247 44464.732726654 0.42708 0.0002175 -0.77954 -0.000397 -0.35246 -0.0001795 509.273247782803 47.334 0.24518 47.234 47.129 47.374 -0.09961 61.0 21.0 4.0 0.0 0.0 0.0 0.0031438 1 40318.0 101.28 58.81 1 246710000.0 9957 784 827 4964 4964.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 509.2744140625 2 509.273509 1016.53247 79796.5985157249 1.451 0.00073897 0.03789 1.9297e-05 1.4889 0.00075827 509.273466894027 48.095 0.5368 47.243 47.056 47.593 -0.85214 56.0 24.0 4.0 0.0 0.0 0.0 0.0065721 1 19764.0 85.064 60.141 1 256300000.0 9958 784 827 4965 4965.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 509.274108886719 2 509.273509 1016.53247 81806.0154654015 0.97968 0.00049892 0.41127 0.00020945 1.3909 0.00070837 509.273695221316 47.565 0.57988 47.164 46.943 47.522 -0.40082 67.0 26.0 4.0 0.0 0.0 0.0 0.0023677 1 19521.0 98.997 67.707 1 283140000.0 9959 784 827 4966 4966.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 509.274566650391 2 509.273509 1016.53247 79596.0227272378 1.6011 0.00081537 0.61313 0.00031225 2.2142 0.0011276 509.273842601512 47.077 0.40838 47.077 46.927 47.336 -3.4809e-05 61.0 18.0 4.0 0.0 0.0 0.0 0.0065721 1 19341.0 85.064 53.128 1 327940000.0 9960 784 827 4967 4967.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 509.273773193359 2 509.273509 1016.53247 44496.9937256115 0.62736 0.0003195 -1.0494 -0.00053445 -0.42209 -0.00021496 509.273171808522 48.129 0.26108 47.277 47.143 47.404 -0.85214 67.0 22.0 4.0 0.0 0.0 0.0 0.0084953 1 41818.0 85.064 46.826 1 378300000.0 9961 784 827 4968 4968.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 509.273834228516 2 509.273509 1016.53247 44451.0549949483 0.44382 0.00022603 -0.63047 -0.00032108 -0.18664 -9.5053e-05 509.273291638707 47.65 0.23935 47.199 47.098 47.337 -0.45108 65.0 21.0 4.0 0.0 0.0 0.0 0.016485 1 41352.0 72.485 45.883 1 292540000.0 9962 784 827 4969 4969.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 509.27392578125 2 509.273509 1016.53247 43940.4979226396 0.68986 0.00035133 -0.96157 -0.0004897 -0.27171 -0.00013838 509.273233063021 47.152 0.26525 47.102 47.035 47.3 -0.050152 71.0 27.0 4.0 0.0 0.0 0.0 0.0084953 1 40664.0 85.064 46.826 1 306450000.0 9963 784 827 4970 4970.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 509.274047851563 2 509.273509 1016.53247 82440.6846792516 1.3491 0.00068704 -0.31183 -0.00015881 1.0372 0.00052824 509.273296156741 48.186 0.36481 47.334 47.193 47.557 -0.85207 32.0 16.0 2.0 0.0 0.0 0.0 0.0077409 1 19768.0 81.191 60.492 1 233710000.0 9964 784 827 4971 4971.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 509.274200439453 2 509.273509 1016.53247 79957.3317116338 1.0829 0.00055151 0.19683 0.00010024 1.2798 0.00065175 509.273632399123 47.76 0.47201 47.259 47.139 47.611 -0.50119 56.0 21.0 4.0 0.0 0.0 0.0 0.0043371 1 19573.0 92.47 58.955 1 201800000.0 9965 784 827 4972 4972.0 -3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 509.273509 1016.53247 45429.3328035947 0.036644 1.8662e-05 -1.2805 -0.00065214 -1.2439 -0.00063348 509.273162107891 47.822 0.26855 47.321 47.184 47.453 -0.50114 0.092718 -0.0012475 98.997 52.0 22.0 4.0 0 0 183440000.0 9966 784 827 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 375.218383789063 2 375.218863 748.423173 51966.3342839765 0.14536 5.4542e-05 0.11082 4.1582e-05 0.25618 9.6124e-05 375.218817619582 36.685 0.13246 35.532 35.47 35.602 -1.1529 17.0 12.0 2.0 0.0 0.0 0.0 0.011347 1 29774.0 118.01 88.673 1 28774000.0 5384 438 457 2716 2716.0 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 375.219207763672 2 375.218863 748.423173 51784.8131493548 -0.074497 -2.7953e-05 0.32669 0.00012258 0.2522 9.4628e-05 375.218852516155 36.02 0.20288 35.418 35.345 35.548 -0.60138 28.0 17.0 3.0 0.0 0.0 0.0 0.034196 1 29331.0 78.616 43.723 1 31503000.0 5385 438 457 2717 2717.0 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 375.219024658203 2 375.218863 748.423173 51646.5201852211 0.56563 0.00021223 1.6238 0.00060929 2.1895 0.00082153 375.218833673493 36.342 0.23821 35.49 35.389 35.627 -0.85214 41.0 18.0 3.0 0.0 0.0 0.0 0.08331 1 30036.0 57.463 42.242 1 37705000.0 5386 438 457 2718 2718.0 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 375.218811035156 2 375.218863 748.423173 35.93 1.0 35.479 34.979 35.979 -0.45108 0.0 0.0 0.0 0.033354 1 29676.0 86.866 47.648 1 5387 438 457 2719 2719.0 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 375.218863 748.423173 97212.8460311823 1.1211 0.00042067 0.35425 0.00013292 1.4754 0.00055359 375.218961088035 35.373 0.25724 35.373 35.192 35.449 0.0 -0.081664 0.00013249 118.01 20.0 11.0 2.0 0 0 23957000.0 5388 438 457 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 375.218863 748.423173 52901.4725718675 0.83856 0.00031464 -1.023 -0.00038384 -0.18443 -6.92e-05 375.218391606138 35.478 0.23488 35.378 35.279 35.514 -0.09961 -0.076123 -0.00090104 118.01 27.0 20.0 2.0 0 0 21034000.0 5389 438 457 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 375.218863 748.423173 98632.8585373007 0.73669 0.00027642 2.5095 0.00094161 3.2462 0.001218 375.218742890523 36.301 0.32148 35.449 35.285 35.607 -0.85214 -0.0054741 0.0017499 118.01 36.0 14.0 3.0 0 0 25432000.0 5390 438 457 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 375.218863 748.423173 52091.6264566419 0.4733 0.00017759 -0.1711 -6.4201e-05 0.3022 0.00011339 375.21888355855 35.405 0.23283 35.456 35.304 35.537 0.050098 0.0013686 -0.00026176 118.01 29.0 16.0 3.0 0 0 18480000.0 5391 438 457 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 375.218863 748.423173 96728.9113640727 0.42459 0.00015931 0.44347 0.0001664 0.86806 0.00032571 375.218949415621 36.399 0.25714 35.547 35.383 35.64 -0.85207 0.092455 0.00019944 118.01 18.0 11.0 3.0 0 0 43498000.0 5392 438 457 -3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 375.218863 748.423173 96813.7349047251 0.65784 0.00024684 -0.0051346 -1.9266e-06 0.65271 0.00024491 375.218864957 35.947 0.2787 35.446 35.257 35.536 -0.50119 -0.0079592 -0.00013721 118.01 20.0 12.0 2.0 0 0 19522000.0 5393 438 457 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 951.109069824219 3 950.438977 2848.2951 34052.1120518873 1.3811 0.0013126 -0.21299 -0.00020243 1.1681 0.0011102 950.771947341938 92.612 0.18615 91.359 91.309 91.495 -1.2532 17.0 11.0 2.0 0.0 0.0 0.0 0.00013421 1 84839.0 62.237 59.729 1 19003000.0 9836 777 818 4914 4914.0 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 950.438977 2848.2951 61602.1895061156 2.7867 0.0026486 -0.66993 -0.00063673 2.1168 0.0020119 951.106412535965 91.167 0.35828 91.167 90.983 91.341 1.4211e-14 -0.2298 -0.00047036 62.237 28.0 15.0 2.0 0 0 6730200.0 9837 777 818 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 950.438977 2848.2951 59542.7805719319 2.2637 0.0021515 -0.38366 -0.00036464 1.88 0.0017869 950.773446313041 92.179 0.31156 91.427 91.262 91.573 -0.75189 0.030262 0.00034589 62.237 51.0 13.0 6.0 0 0 38030000.0 9838 777 818 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 950.438977 2848.2951 59130.9766035208 2.6557 0.0025241 -0.50299 -0.00047806 2.1527 0.002046 951.106629113899 91.383 0.42603 91.483 91.313 91.739 0.10022 0.086848 5.6503e-06 62.237 27.0 18.0 2.0 0 0 19641000.0 9839 777 818 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 3 950.438977 2848.2951 32082.7871413956 0.84493 0.00080305 -0.74188 -0.00070511 0.10304 9.7937e-05 950.772250155452 92.304 0.22525 91.452 91.348 91.574 -0.85214 0.055017 -0.00067552 62.237 40.0 13.0 5.0 0 0 25129000.0 9840 777 818 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 950.438977 2848.2951 31990.5251336278 2.0357 0.0019348 -1.8957 -0.0018017 0.14004 0.0001331 951.438297891526 91.802 0.21975 91.451 91.386 91.606 -0.35083 0.054246 -0.0039653 62.237 54.0 14.0 5.0 0 0 21432000.0 9841 777 818 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 950.438977 2848.2951 32088.9281944303 1.7137 0.0016288 -1.6698 -0.0015871 0.043877 4.1703e-05 951.103163478456 91.422 0.20354 91.472 91.378 91.582 0.050098 0.075469 -0.0033214 62.237 28.0 14.0 3.0 0 0 26099000.0 9842 777 818 -3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 950.438977 2848.2951 62629.9464775178 2.1719 0.0020643 0.74788 0.00071082 2.9198 0.0027751 951.107859112539 92.315 0.46847 91.362 91.138 91.606 -0.95232 -0.034174 0.0035723 62.237 56.0 20.0 5.0 0 0 14201000.0 9843 777 818 +3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 654.347106933594 2 653.84483 1305.67511 71604.0495682683 1.6661 0.0010893 -0.25342 -0.0001657 1.4126 0.00092364 653.844914251396 65.307 0.69098 64.455 64.007 64.698 -0.85214 155.0 31.0 6.0 0.0 0.0 0.0 0.016523 1 26901.0 73.985 51.899 1 1067000000.0 1974 165 174 975 975.0 +3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 653.846252441406 2 653.84483 1305.67511 70996.1337540087 1.8055 0.0011805 0.098668 6.4514e-05 1.9042 0.001245 654.346277850415 64.757 0.80286 64.356 63.912 64.715 -0.40082 173.0 36.0 6.0 0.0 0.0 0.0 2.5596e-06 1 26629.0 140.14 121.36 1 475760000.0 1975 165 174 976 976.0 +3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 653.84619140625 2 653.84483 1305.67511 64.074 1.0 64.074 63.574 64.574 -3.4809e-05 0.0 0.0 0.0 9.8197e-10 1 26450.0 166.16 113.45 1 1976 165 174 977 977.0 +3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 653.846069335938 2 653.84483 1305.67511 38038.9958138234 1.9318 0.0012631 -0.41563 -0.00027176 1.5161 0.00099131 653.844734297032 65.376 0.68424 64.423 63.969 64.653 -0.95239 165.0 46.0 4.0 0.0 0.0 0.0 0.001219 1 59074.0 113.62 98.955 1 1248600000.0 1977 165 174 978 978.0 +3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 654.347473144531 2 653.84483 1305.67511 37876.2159917862 2.0766 0.0013578 -0.41787 -0.00027322 1.6587 0.0010845 654.345897401385 64.843 0.73341 64.292 63.93 64.664 -0.55133 182.0 47.0 5.0 0.0 0.0 0.0 0.00099279 1 58426.0 117.89 103.68 1 560470000.0 1978 165 174 979 979.0 +3258 AADTIGYPVMIR 12 Unmodified _AADTIGYPVMIR_ 0 0 0 P31327;P31327-3;P31327-2 P31327 P31327 CPS1 Carbamoyl-phosphate synthase [ammonia], mitochondrial MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 653.845703125 2 653.84483 1305.67511 38078.757350447 1.5896 0.0010393 -0.060023 -3.9246e-05 1.5295 0.0010001 653.845037274822 64.222 0.82917 64.072 63.84 64.669 -0.1504 105.0 61.0 2.0 0.0 0.0 0.0 0.00025737 1 57587.0 138.4 116.31 1 732100000.0 1979 165 174 980 980.0 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 533.288696289063 2 533.288005 1064.56146 43246.8026351911 1.3869 0.00073964 0.39838 0.00021245 1.7853 0.00095209 533.288647787673 33.939 0.17665 33.839 33.762 33.939 -0.09961 25.0 14.0 2.0 0.0 0.0 0.0 0.014727 1 27148.0 66.621 47.527 1 58319000.0 6299 511 541 3149 3149.0 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 533.288005 1064.56146 79675.8568480884 1.7017 0.00090748 0.27391 0.00014607 1.9756 0.0010536 533.28813864444 33.874 0.32151 33.874 33.691 34.012 0.0 0.050914 -0.00028137 66.621 39.0 14.0 3.0 0 0 48737000.0 6300 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 2 533.288005 1064.56146 41943.9366359198 1.2599 0.00067189 -1.6506 -0.00088024 -0.39068 -0.00020835 533.286969475288 34.875 0.25422 33.722 33.554 33.808 -1.1529 -0.10079 -0.002334 66.621 48.0 20.0 3.0 0 0 48671000.0 6301 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 533.288005 1064.56146 42919.0518090496 0.88976 0.0004745 0.50225 0.00026785 1.392 0.00074235 533.288532533032 34.398 0.2118 33.797 33.651 33.863 -0.60138 -0.02633 -3.7829e-05 66.621 32.0 18.0 2.0 0 0 78597000.0 6302 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 533.288005 1064.56146 81688.8820323534 1.358 0.00072421 0.46794 0.00024955 1.8259 0.00097376 533.288163152752 34.194 0.40726 33.793 33.603 34.01 -0.40082 -0.029955 -7.4424e-05 66.621 45.0 18.0 3.0 0 0 66651000.0 6303 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 533.288005 1064.56146 80502.7238202131 1.6408 0.00087501 0.9217 0.00049153 2.5625 0.0013665 533.288482075029 33.864 0.34323 33.864 33.651 33.994 -3.4809e-05 0.041253 0.00040954 66.621 28.0 15.0 2.0 0 0 52102000.0 6304 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 533.288005 1064.56146 42725.0364878606 1.4016 0.00074748 0.62501 0.00033331 2.0267 0.0010808 533.288561410773 34.311 0.2818 33.859 33.664 33.945 -0.45108 0.036445 9.3103e-05 66.621 38.0 22.0 2.0 0 0 99404000.0 6305 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 533.288005 1064.56146 43252.2607086083 1.2727 0.00067873 2.162 0.001153 3.4347 0.0018317 533.289714566367 33.866 0.18479 33.917 33.833 34.018 0.050098 0.093556 0.0017324 66.621 29.0 13.0 3.0 0 0 65473000.0 6306 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 533.288005 1064.56146 78261.4076347003 1.1055 0.00058955 0.91513 0.00048803 2.0206 0.0010776 533.2885009967 34.605 0.27852 33.753 33.605 33.883 -0.85207 -0.070003 0.00040253 66.621 22.0 12.0 2.0 0 0 51057000.0 6307 511 541 +6114 AAPPQIPDTR 10 Unmodified _AAPPQIPDTR_ 0 0 0 Q9HAF1;Q9HAF1-2;Q9HAF1-4;Q9HAF1-3 Q9HAF1 Q9HAF1 MEAF6 Chromatin modification-related protein MEAF6 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 533.288005 1064.56146 81299.3333144726 1.1916 0.00063545 0.12057 6.4298e-05 1.3121 0.00069975 533.288045348198 34.313 0.36427 33.812 33.585 33.949 -0.50119 -0.011154 -0.00044493 66.621 25.0 14.0 2.0 0 0 65256000.0 6308 511 541 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 978.477722167969 2 978.476511 1954.93847 30344.68959196 2.606 0.0025499 -0.41301 -0.00040412 2.193 0.0021458 978.476026821547 59.288 0.14635 58.336 58.244 58.39 -0.95239 16.0 9.0 2.0 0.0 0.0 0.0 0.0027107 1 52981.0 70.438 54.682 1 35849000.0 1460 120 126 733 733.0 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 978.979553222656 2 978.476511 1954.93847 30485.1826477089 2.3958 0.0023443 0.12726 0.00012452 2.5231 0.0024688 978.477736471666 59.008 0.15454 58.456 58.34 58.494 -0.55133 19.0 9.0 3.0 0.0 0.0 0.0 2.0522e-05 1 52686.0 122.42 100.55 1 29140000.0 1461 120 126 734 734.0 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 978.476511 1954.93847 59148.2388938415 2.1726 0.0021259 1.7047 0.001668 3.8773 0.0037939 978.478412664569 59.295 0.47284 58.342 58.057 58.529 -0.95239 -0.068792 0.0024057 122.42 41.0 21.0 3.0 0 0 19897000.0 1462 120 126 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 2 978.476511 1954.93847 59232.8182263945 2.5758 0.0025204 2.4895 0.0024359 5.0653 0.0049563 978.980127561935 58.916 0.30141 58.415 58.208 58.509 -0.50107 0.003668 0.0039414 122.42 24.0 13.0 2.0 0 0 18096000.0 1463 120 126 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 978.476511 1954.93847 58391.2772263761 2.6786 0.0026209 -4.3494 -0.0042558 -1.6708 -0.0016349 978.471067211782 58.689 0.85978 58.588 58.261 59.121 -0.10029 0.17698 -0.0094419 122.42 57.0 39.0 2.0 0 0 13129000.0 1464 120 126 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 978.476511 1954.93847 31071.2365730195 2.3179 0.002268 1.8119 0.0017729 4.1298 0.0040409 978.978086991555 58.626 0.14509 58.476 58.373 58.518 -0.1504 0.064309 0.0026154 122.42 21.0 11.0 2.0 0 0 24069000.0 1465 120 126 +4264 AAAYLDPNLNHTPNSSTK 18 Acetyl (Protein N-term) _(ac)AAAYLDPNLNHTPNSSTK_ 1 0 0 Q05397;Q05397-5;Q05397-7;E5RH08;E5RIK4;E5RG54;E5RH48;E5RH01;E5RG66;E5RI72;E5RFW9;E5RJP0;E5RGA6 Q05397 Q05397 PTK2 Focal adhesion kinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 978.476511 1954.93847 58306.3036410272 2.078 0.0020332 4.6582 0.0045579 6.7361 0.0065912 978.485070733537 59.217 0.40783 58.265 57.974 58.382 -0.95232 -0.14615 0.0081855 122.42 44.0 18.0 5.0 0 0 14563000.0 1466 120 126 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 673.665283203125 3 673.664398 2017.97137 35855.7042161062 0.87037 0.00058634 0.38745 0.00026101 1.2578 0.00084735 673.664199596574 71.907 0.24459 71.405 71.258 71.502 -0.50114 25.0 15.0 2.0 0.0 0.0 0.0 0.00066423 1 64902.0 73.498 69.145 1 38939000.0 8714 690 729 4296 4296.0 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 674.001831054688 3 673.664398 2017.97137 34567.4074175151 1.5078 0.0010158 0.71638 0.0004826 2.2242 0.0014984 673.664777399718 71.567 0.34361 71.467 71.255 71.599 -0.099617 34.0 21.0 2.0 0.0 0.0 0.0 0.00026152 2 64179.0 79.837 76.499 1 28577000.0 8715 690 729 4297;4298 4297.0 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 673.664398 2017.97137 69801.3429057739 2.2662 0.0015267 1.7435 0.0011745 4.0097 0.0027012 674.335845684277 71.481 0.4786 71.481 71.235 71.714 0.0 0.062581 0.0028428 79.837 51.0 21.0 3.0 0 0 26989000.0 8716 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 3 673.664398 2017.97137 36825.0317251076 0.93365 0.00062897 0.060779 4.0944e-05 0.99443 0.00066991 673.664924025331 72.709 0.27633 71.456 71.39 71.667 -1.2532 0.03761 -0.000558 79.837 31.0 20.0 2.0 0 0 27007000.0 8717 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 673.664398 2017.97137 71824.5804962836 1.4389 0.00096933 -0.37077 -0.00024977 1.0681 0.00071956 673.998399610367 72.22 0.41058 71.368 71.183 71.593 -0.85214 -0.049618 -0.0014301 79.837 34.0 18.0 2.0 0 0 31024000.0 8718 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 673.664398 2017.97137 71020.6189246261 1.6774 0.00113 0.028394 1.9128e-05 1.7058 0.0011491 673.664508968915 71.769 0.41217 71.368 71.181 71.593 -0.40082 -0.049596 -0.00062345 79.837 32.0 18.0 2.0 0 0 50247000.0 8719 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 673.664398 2017.97137 71344.2233469571 1.9949 0.0013439 0.55244 0.00037216 2.5473 0.001716 673.999043163039 71.406 0.39085 71.406 71.219 71.61 -3.4809e-05 -0.011651 0.00043565 79.837 31.0 17.0 2.0 0 0 40441000.0 8720 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 673.664398 2017.97137 35424.5149225117 1.2969 0.00087368 0.44138 0.00029734 1.7383 0.001171 673.999269740016 71.817 0.31553 71.366 71.175 71.49 -0.45108 -0.052251 0.00021119 79.837 37.0 20.0 2.0 0 0 44577000.0 8721 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 673.664398 2017.97137 35949.2172827075 1.6999 0.0011451 0.37519 0.00025275 2.0751 0.0013979 673.998731278412 71.495 0.28679 71.445 71.261 71.548 -0.050152 0.027091 7.7415e-05 79.837 30.0 17.0 2.0 0 0 79838000.0 8722 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 673.664398 2017.97137 71121.2340446906 1.2861 0.0008664 0.54044 0.00036408 1.8265 0.0012305 673.998991054708 72.369 0.38925 71.417 71.284 71.673 -0.95232 -0.00086223 0.0004114 79.837 26.0 17.0 2.0 0 0 31807000.0 8723 690 729 +5947 AAVLYVMDLSEQCGHGLR 18 Unmodified _AAVLYVMDLSEQCGHGLR_ 0 0 0 Q9BZE4;Q9BZE4-2;Q9BZE4-3 Q9BZE4 Q9BZE4 GTPBP4 Nucleolar GTP-binding protein 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 673.664398 2017.97137 70908.8105404274 1.0711 0.00072159 0.85162 0.00057371 1.9228 0.0012953 673.999181361888 71.919 0.4109 71.418 71.251 71.662 -0.50119 -0.00017795 0.0010403 79.837 33.0 18.0 2.0 0 0 37114000.0 8724 690 729 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 436.711853027344 2 436.711068 871.407583 88440.8711482923 1.34 0.0005852 0.44191 0.00019299 1.7819 0.00077819 436.711139254687 34.133 0.27862 34.133 33.991 34.269 0.0 41.0 12.0 4.0 0.0 0.0 0.0 0.039905 1 13830.0 70.525 40.718 1 131510000.0 3078 255 267 1518 1518.0 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 436.711456298828 2 436.711068 871.407583 47971.740415912 0.5061 0.00022102 0.27364 0.0001195 0.77974 0.00034052 436.71107114353 35.407 0.24942 34.254 34.122 34.372 -1.1529 58.0 20.0 4.0 0.0 0.0 0.0 0.089415 1 28490.0 51.059 36.277 1 174880000.0 3079 255 267 1519 1519.0 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 436.711395263672 2 436.711068 871.407583 47916.8563667022 0.71696 0.00031311 0.12473 5.447e-05 0.84169 0.00036757 436.711067371645 34.838 0.28674 34.236 34.081 34.367 -0.60138 58.0 23.0 3.0 0.0 0.0 0.0 0.032975 1 28124.0 62.88 38.206 1 173940000.0 3080 255 267 1520 1520.0 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 436.711700439453 2 436.711068 871.407583 47622.8188354947 1.2005 0.00052425 0.73214 0.00031974 1.9326 0.00084399 436.71146904844 34.247 0.34765 34.147 34.004 34.352 -0.09961 65.0 26.0 3.0 0.0 0.0 0.0 0.087781 1 27417.0 51.346 23.092 1 169560000.0 3081 255 267 1521 1521.0 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 436.711761474609 2 436.711068 871.407583 87243.3352098452 0.82264 0.00035925 0.58818 0.00025687 1.4108 0.00061612 436.711137672383 34.72 0.4289 34.219 34.056 34.485 -0.50119 48.0 19.0 4.0 0.0 0.0 0.0 0.055838 1 14090.0 64.265 37.4 1 148070000.0 3082 255 267 1522 1522.0 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 436.711068 871.407583 48753.134170454 1.3948 0.00060911 -0.20362 -8.8923e-05 1.1911 0.00052019 436.710795957832 35.167 0.21358 34.314 34.174 34.388 -0.85214 0.085832 -0.00049455 62.88 31.0 16.0 2.0 0 0 37480000.0 3083 255 267 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 436.711068 871.407583 47867.005731057 0.7682 0.00033548 2.6607 0.001162 3.4289 0.0014974 436.712533470639 34.64 0.32997 34.189 34.081 34.411 -0.45108 -0.039536 0.0020072 62.88 29.0 22.0 2.0 0 0 44117000.0 3084 255 267 +2474 AAFSDFSK 8 Unmodified _AAFSDFSK_ 0 0 0 P0AC02 P0AC02 P0AC02 bamD Outer membrane protein assembly factor BamD MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 436.711068 871.407583 88643.1238954353 0.71806 0.00031359 1.1216 0.0004898 1.8396 0.00080338 436.71124429766 35.188 0.51423 34.335 33.969 34.483 -0.85207 0.1069 0.00066289 62.88 61.0 23.0 4.0 0 0 229730000.0 3085 255 267 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 607.352111816406 2 607.350606 1212.68666 76163.7422536706 2.1372 0.001298 -0.0085634 -5.201e-06 2.1286 0.0012928 607.350535682011 94.481 0.58376 94.481 94.244 94.828 0.0 86.0 25.0 5.0 0.0 0.0 0.0 0.0010768 1 38802.0 107.69 75.759 1 79171000.0 5011 407 424 2521 2521.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 607.852966308594 2 607.350606 1212.68666 40510.0980191529 0.77865 0.00047291 -0.097294 -5.9092e-05 0.68135 0.00041382 607.350550379193 96.288 0.35044 95.035 94.848 95.198 -1.2532 70.0 22.0 4.0 0.0 0.0 0.0 0.0030284 1 88191.0 92.062 72.791 1 83111000.0 5012 407 424 2522 2522.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 607.349365234375 2 607.350606 1212.68666 40131.581693828 0.47724 0.00028985 0.14226 8.6402e-05 0.6195 0.00037625 607.350610439902 95.149 0.43578 94.749 94.574 95.01 -0.4009 74.0 28.0 4.0 0.0 0.0 0.0 0.00034222 1 87115.0 130.75 98.813 1 76747000.0 5013 407 424 2523 2523.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 607.351318359375 2 607.350606 1212.68666 40529.4681394277 2.0511 0.0012457 -0.42968 -0.00026097 1.6214 0.00098478 607.350225101482 94.625 0.3881 94.525 94.362 94.75 -0.099617 69.0 24.0 4.0 0.0 0.0 0.0 0.0015441 1 86254.0 105.78 73.85 1 90824000.0 5014 407 424 2524 2524.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 607.3515625 2 607.350606 1212.68666 75903.6630580158 1.8257 0.0011088 -0.24661 -0.00014978 1.5791 0.00095906 607.350394475025 95.481 0.803 94.729 94.472 95.275 -0.75189 112.0 35.0 5.0 0.0 0.0 0.0 8.4982e-06 1 39393.0 164.57 122.17 1 138270000.0 5015 407 424 2525 2525.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 607.35205078125 2 607.350606 1212.68666 77192.1428654562 1.7295 0.0010504 0.39103 0.00023749 2.1206 0.0012879 607.350816700996 94.866 0.63015 94.565 94.298 94.928 -0.30057 94.0 27.0 5.0 0.0 0.0 0.0 0.0011915 1 39033.0 105.78 79.401 1 93508000.0 5016 407 424 2526 2526.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 607.351501464844 2 607.350606 1212.68666 75209.824609014 2.0271 0.0012312 0.26864 0.00016316 2.2958 0.0013943 607.350719471425 94.391 0.78375 94.491 94.121 94.905 0.10022 115.0 34.0 5.0 0.0 0.0 0.0 4.2258e-05 1 38825.0 144.09 108.79 1 127600000.0 5017 407 424 2527 2527.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 607.350036621094 2 607.350606 1212.68666 40188.8474833481 0.89979 0.00054648 -0.32731 -0.00019879 0.57248 0.00034769 607.350239389778 95.651 0.36294 94.799 94.615 94.978 -0.85214 77.0 23.0 4.0 0.0 0.0 0.0 0.00051292 1 88447.0 122.52 90.582 1 113150000.0 5018 407 424 2528 2528.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 607.852722167969 2 607.350606 1212.68666 40027.6659025767 1.4036 0.00085246 -0.15504 -9.4164e-05 1.2485 0.0007583 607.35044472747 94.431 0.40068 94.481 94.338 94.739 0.050098 78.0 26.0 4.0 0.0 0.0 0.0 0.0022682 1 86867.0 99.802 77.062 1 113200000.0 5019 407 424 2529 2529.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 607.351684570313 2 607.350606 1212.68666 76165.8078199884 1.4245 0.00086516 0.98202 0.00059643 2.4065 0.0014616 607.351150173145 95.842 0.58308 94.889 94.675 95.258 -0.95232 96.0 25.0 5.0 0.0 0.0 0.0 5.7156e-05 1 39478.0 141.48 115.1 1 96135000.0 5020 407 424 2530 2530.0 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 607.350606 1212.68666 79251.0112409959 2.0867 0.0012674 -0.56427 -0.00034271 1.5224 0.00092465 607.851880398387 95.035 0.31472 95.035 94.828 95.143 0.0 0.046083 -0.00098826 141.48 24.0 13.0 2.0 0 0 603880.0 5021 407 424 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 2 607.350606 1212.68666 80088.3981211459 2.0363 0.0012368 0.39305 0.00023872 2.4294 0.0014755 607.852230491827 94.895 0.28883 94.995 94.905 95.194 0.10022 0.0067641 0.0001746 141.48 20.0 12.0 2.0 0 0 902550.0 5022 407 424 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 2 607.350606 1212.68666 40189.1765666656 1.2576 0.00076381 -0.31778 -0.00019301 0.93982 0.0005708 607.350294802567 95.011 0.35839 94.661 94.503 94.862 -0.35083 0.044321 -0.00030212 164.57 70.0 22.0 4.0 0 0 121980000.0 5023 407 424 +4440 AALLELWELR 10 Unmodified _AALLELWELR_ 0 0 0 Q13813;Q13813-2;A0A0D9SGF6;Q13813-3;A0A0D9SF54 Q13813 Q13813 SPTAN1 Spectrin alpha chain, non-erythrocytic 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 607.350606 1212.68666 75230.6778811113 1.3871 0.00084245 0.54026 0.00032813 1.9274 0.0011706 607.350869042637 95.083 0.9671 94.682 94.33 95.297 -0.40094 0.065605 0.00074015 164.57 103.0 42.0 5.0 0 0 69757000.0 5024 407 424 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1272.25671386719 3 1271.58965 3811.74713 28680.8284565586 1.4538 0.0018486 0.2893 0.00036787 1.7431 0.0022165 1271.92453807774 89.417 0.1257 88.164 88.123 88.249 -1.2532 16.0 8.0 3.0 0.0 0.0 0.0 2.3681e-14 1 81812.0 110.98 105.88 1 29761000.0 3387 280 294 1669 1669.0 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1272.25854492188 3 1271.58965 3811.74713 26581.2932550599 2.686 0.0034154 -0.098426 -0.00012516 2.5875 0.0032903 1272.2562395461 88.766 0.13122 88.666 88.589 88.721 -0.099617 24.0 7.0 5.0 0.0 0.0 0.0 3.0292e-14 1 80807.0 106.94 102.32 1 24532000.0 3388 280 294 1670 1670.0 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 1272.25720214844 3 1271.58965 3811.74713 27747.1815887335 0.67567 0.00085917 -1.5208 -0.0019338 -0.84512 -0.0010747 1271.92097974597 88.946 0.30768 88.595 88.44 88.748 -0.35083 53.0 21.0 4.0 0.0 0.0 0.0 5.4326e-07 1 81860.0 76.519 71.897 1 26022000.0 3389 280 294 1671 1671.0 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 954.698425292969 4 953.944058 3811.74713 32433.0785065357 2.062 0.0019671 -1.5886 -0.0015155 0.4734 0.0004516 954.44387274299 88.783 0.28692 88.833 88.676 88.963 0.050098 49.0 17.0 4.0 0.0 0.0 0.0 0.0012265 1 81611.0 49.43 45.203 1 26869000.0 3390 280 294 1672 1672.0 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 1271.58965 3811.74713 53105.3208155611 3.7747 0.0047998 -0.24529 -0.00031191 3.5294 0.0044879 1272.25789483453 88.723 0.31251 88.723 88.566 88.878 0.0 0.0098282 -0.0020144 106.94 39.0 13.0 4.0 0 0 13087000.0 3391 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 4 953.944058 3811.74713 64575.9099551432 2.6857 0.002562 -1.6714 -0.0015945 1.0143 0.00096759 954.443584927148 89.193 0.37489 88.441 88.291 88.666 -0.75189 -0.25746 -0.0016321 49.43 56.0 16.0 5.0 0 0 15769000.0 3392 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 3 1271.58965 3811.74713 54538.8110310319 3.0347 0.0038589 0.5708 0.00072583 3.6055 0.0045847 1272.258096961 89.015 0.35619 88.714 88.539 88.895 -0.30057 0.0010967 0.0010988 106.94 48.0 15.0 5.0 0 0 20468000.0 3393 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 4 953.944058 3811.74713 61122.195628881 2.0534 0.0019588 -1.157 -0.0011037 0.89636 0.00085508 954.444054940805 89.076 0.55343 88.775 88.517 89.07 -0.30057 0.076428 0.0003308 49.43 103.0 24.0 6.0 0 0 12497000.0 3394 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 1271.58965 3811.74713 53300.8691777228 3.4876 0.0044348 0.70581 0.0008975 4.1934 0.0053323 1272.25903485488 88.764 0.28571 88.864 88.747 89.033 0.10022 0.15092 0.0016138 106.94 45.0 12.0 5.0 0 0 18574000.0 3395 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 4 953.944058 3811.74713 59890.7294289543 2.4977 0.0023827 -0.88988 -0.0008489 1.6079 0.0015338 954.444400517589 88.802 0.59604 88.902 88.68 89.276 0.10022 0.20367 0.0013501 49.43 89.0 26.0 6.0 0 0 20529000.0 3396 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 1271.58965 3811.74713 27607.106884234 2.095 0.002664 0.91534 0.0011639 3.0104 0.0038279 1271.92537286412 88.772 0.2596 88.822 88.703 88.963 0.050098 0.10903 0.0024131 106.94 31.0 15.0 4.0 0 0 32109000.0 3397 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 1271.58965 3811.74713 50714.7590942735 2.8406 0.0036121 -1.2311 -0.0015655 1.6095 0.0020467 1271.92058855069 89.009 0.26953 88.608 88.444 88.713 -0.40094 -0.10501 -0.0057751 106.94 28.0 11.0 3.0 0 0 21097000.0 3398 280 294 +4553 AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR 38 Acetyl (Protein N-term) _(ac)AAGGGGSCDPLAPAGVPCAFSPHSQAYFALASTDGHLR_ 1 0 0 Q15061 Q15061 Q15061 WDR43 WD repeat-containing protein 43 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 4 953.944058 3811.74713 60024.701328964 1.898 0.0018106 -1.5304 -0.0014599 0.36764 0.00035071 954.442701951363 88.997 0.33624 88.596 88.421 88.758 -0.40094 -0.10251 -0.0010939 49.43 58.0 14.0 6.0 0 0 10341000.0 3399 280 294 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 651.348999023438 2 651.347737 1300.68092 71577.1183555127 2.3498 0.0015305 -0.82824 -0.00053947 1.5216 0.00099107 651.347217027211 74.486 0.58807 74.486 74.334 74.922 0.0 97.0 26.0 5.0 0.0 0.0 0.0 8.3089e-15 1 30685.0 204.36 174.2 1 257820000.0 9812 775 816 4897 4897.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 651.353393554688 2 651.347737 1300.68092 36390.5300514746 0.76037 0.00049527 -0.095862 -6.2439e-05 0.66451 0.00043283 651.348215265627 75.579 0.53396 74.325 74.131 74.665 -1.2532 111.0 34.0 5.0 0.0 0.0 0.0 0.0019352 1 68332.0 81.915 61.501 1 405430000.0 9813 775 816 4898 4898.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 651.348571777344 2 651.347737 1300.68092 38041.7214983594 1.4282 0.00093026 -0.23011 -0.00014988 1.1981 0.00078038 651.347893607882 74.579 0.44004 74.479 74.351 74.791 -0.099617 90.0 29.0 4.0 0.0 0.0 0.0 5.718e-12 1 67133.0 172.25 147.33 1 252350000.0 9814 775 816 4899 4899.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 651.348693847656 2 651.347737 1300.68092 69930.9824085982 1.7458 0.0011372 -0.35995 -0.00023445 1.3859 0.0009027 651.347528611846 75.265 0.82161 74.412 73.969 74.791 -0.85214 116.0 37.0 5.0 0.0 0.0 0.0 6.6567e-12 1 31087.0 182.76 160.53 1 402270000.0 9815 775 816 4900 4900.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 651.348510742188 2 651.347737 1300.68092 70332.3818066221 1.7356 0.0011305 -0.48216 -0.00031405 1.2535 0.00081644 651.347574523531 74.803 0.62921 74.402 74.237 74.867 -0.40082 111.0 28.0 6.0 0.0 0.0 0.0 2.7087e-11 1 30904.0 172.94 151.43 1 318360000.0 9816 775 816 4901 4901.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 651.349304199219 2 651.347737 1300.68092 72310.2086014084 2.0776 0.0013532 -0.0031027 -2.0209e-06 2.0745 0.0013512 651.34777156654 74.405 0.7392 74.405 74.197 74.936 -3.4809e-05 116.0 33.0 5.0 0.0 0.0 0.0 4.5206e-14 1 30734.0 190.02 167.78 1 336610000.0 9817 775 816 4902 4902.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 651.348388671875 2 651.347737 1300.68092 38040.231872213 0.85306 0.00055564 -0.28516 -0.00018574 0.56789 0.00036989 651.347818869932 74.866 0.53862 74.415 74.24 74.779 -0.45108 126.0 35.0 6.0 0.0 0.0 0.0 1.8157e-08 1 68304.0 159.58 141.6 1 349470000.0 9818 775 816 4903 4903.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 651.349243164063 2 651.347737 1300.68092 38001.8920939265 1.2694 0.00082682 -0.14567 -9.4884e-05 1.1237 0.00073193 651.347796472094 74.488 0.49835 74.438 74.321 74.819 -0.050152 117.0 35.0 4.0 0.0 0.0 0.0 4.7542e-06 1 67760.0 140.83 124.63 1 467410000.0 9819 775 816 4904 4904.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 651.348693847656 2 651.347737 1300.68092 71864.6320683553 1.5194 0.00098968 -0.14186 -9.2402e-05 1.3776 0.00089728 651.347644309556 75.365 0.64746 74.413 74.134 74.782 -0.95232 101.0 29.0 5.0 0.0 0.0 0.0 6.4509e-08 1 31107.0 148.14 131.37 1 318760000.0 9820 775 816 4905 4905.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 651.348083496094 2 651.347737 1300.68092 71599.1024521462 1.5713 0.0010234 -0.34327 -0.00022359 1.228 0.00079984 651.347534081956 74.963 0.60556 74.462 74.233 74.838 -0.50119 94.0 27.0 5.0 0.0 0.0 0.0 4.4255e-11 1 30936.0 164.68 146.7 1 331970000.0 9821 775 816 4906 4906.0 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 651.347737 1300.68092 37269.8494082044 0.48422 0.0003154 -0.25178 -0.000164 0.23244 0.0001514 651.347696942722 74.976 0.59994 74.475 74.256 74.856 -0.50114 0.050455 5.5929e-05 204.36 111.0 39.0 4.0 0 0 297570000.0 9822 775 816 +2084 ACGLVASNLNLK 12 Acetyl (Protein N-term) _(ac)ACGLVASNLNLK_ 1 0 0 P09382;F8WEI7 P09382 P09382 LGALS1 Galectin-1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 2 651.347737 1300.68092 37309.6250085398 0.9712 0.00063259 -0.26826 -0.00017473 0.70294 0.00045786 651.347652095735 75.33 0.57908 74.378 74.061 74.64 -0.95239 -0.046377 3.4462e-05 204.36 108.0 39.0 4.0 0 0 480050000.0 9823 775 816 +5847 AANYSSTSTR 10 Acetyl (Protein N-term) _(ac)AANYSSTSTR_ 1 0 0 Q9BTV4 Q9BTV4 Q9BTV4 TMEM43 Transmembrane protein 43 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 550.253479003906 2 550.25436 1098.49417 21.726 1.0 21.124 20.624 21.624 -0.60138 0.0 0.0 0.0 0.0014478 1 15739.0 87.308 69.272 1 5973 485 514 2988 2988.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 1035.86755371094 3 1034.86449 3101.57165 30820.7490460009 1.6779 0.0017364 -0.15982 -0.00016539 1.5181 0.001571 1035.19789874747 96.194 0.18454 94.941 94.848 95.032 -1.2532 44.0 12.0 5.0 0.0 0.0 0.0 1.5244e-10 1 88195.0 104.83 98.539 1 41049000.0 1467 121 127 735 735.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 1035.20263671875 3 1034.86449 3101.57165 28925.4686534443 1.0994 0.0011378 -1.0177 -0.0010531 0.081757 8.4607e-05 1035.53135072089 95.297 0.19474 94.896 94.815 95.01 -0.4009 43.0 13.0 5.0 0.0 0.0 0.0 1.3312e-10 1 87320.0 107.45 101.15 1 27598000.0 1468 121 127 736 736.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 1035.19763183594 3 1034.86449 3101.57165 28791.0502702371 1.6844 0.0017431 -0.79658 -0.00082436 0.8878 0.00091875 1035.19716080697 94.899 0.16943 94.8 94.717 94.886 -0.099617 29.0 10.0 4.0 0.0 0.0 0.0 6.9214e-06 1 86583.0 75.82 69.525 1 53742000.0 1469 121 127 737 737.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 1035.5390625 3 1034.86449 3101.57165 58445.3022210209 2.577 0.0026668 2.155 0.0022301 4.7319 0.0048969 1035.53505667885 95.108 0.6063 94.807 94.635 95.241 -0.30057 104.0 26.0 7.0 0.0 0.0 0.0 1.9343e-12 1 39151.0 117.52 99.572 1 35550000.0 1470 121 127 738 738.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 776.652587890625 4 776.400189 3101.57165 38296.9252394469 0.68073 0.00052852 -0.71493 -0.00055507 -0.034199 -2.6552e-05 776.649966429594 95.167 0.16626 94.816 94.733 94.9 -0.35083 23.0 11.0 3.0 0.0 0.0 0.0 0.033486 1 87733.0 31.923 26.263 1 9421100.0 1471 121 127 739 739.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 776.905090332031 4 776.400189 3101.57165 43476.7675306881 0.98769 0.00076684 -0.80515 -0.00062512 0.18253 0.00014172 776.649740210529 94.777 0.11217 94.827 94.739 94.851 0.050098 10.0 7.0 2.0 0.0 0.0 0.0 0.0050215 1 87240.0 43.256 36.607 1 12020000.0 1472 121 127 740 740.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 1035.2001953125 3 1034.86449 3101.57165 27613.0579473613 1.5316 0.001585 -1.1733 -0.0012142 0.35833 0.00037083 1035.19549553454 94.732 0.18784 94.782 94.728 94.915 0.050098 27.0 13.0 3.0 0.0 0.0 0.0 1.0706e-07 1 87261.0 83.939 72.307 1 43760000.0 1473 121 127 741 741.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 1035.20288085938 3 1034.86449 3101.57165 57213.5588475098 2.2806 0.0023601 1.8208 0.0018843 4.1014 0.0042444 1035.53528440587 95.842 0.38224 94.89 94.742 95.124 -0.95232 82.0 16.0 7.0 0.0 0.0 0.0 7.8965e-12 1 39504.0 106.81 98.908 1 28234000.0 1474 121 127 742 742.0 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 1034.86449 3101.57165 59975.7402354825 2.9629 0.0030662 0.96365 0.00099725 3.9266 0.0040635 1035.20056253567 94.811 0.35944 94.811 94.649 95.008 1.4211e-14 -0.024842 -0.0020752 117.52 71.0 15.0 7.0 0 0 24614000.0 1475 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 4 776.400189 3101.57165 69429.7188820824 2.4641 0.0019132 -0.40281 -0.00031274 2.0613 0.0016004 776.650363123507 94.818 0.31453 94.818 94.626 94.941 1.4211e-14 -0.0012919 -0.0013249 43.256 33.0 13.0 3.0 0 0 6885700.0 1476 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 4 776.400189 3101.57165 38905.9945481921 1.2051 0.00093566 -0.59248 -0.00046 0.61264 0.00047565 776.650247322707 94.896 0.13635 94.796 94.733 94.87 -0.099617 -0.022814 -0.0019139 43.256 12.0 8.0 2.0 0 0 17475000.0 1477 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 1034.86449 3101.57165 57465.4167137514 2.5669 0.0026564 1.396 0.0014447 3.9629 0.0041011 1035.20033783276 95.527 0.49177 94.775 94.649 95.141 -0.75189 -0.060792 -0.00073279 117.52 86.0 21.0 6.0 0 0 38662000.0 1478 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 4 776.400189 3101.57165 66013.8668971188 2.1121 0.0016398 0.032575 2.5291e-05 2.1447 0.0016651 776.65026955828 95.562 0.31394 94.811 94.649 94.963 -0.75189 -0.0082499 2.7246e-05 43.256 31.0 13.0 4.0 0 0 9344300.0 1479 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 4 776.400189 3101.57165 65973.2439409622 2.0651 0.0016033 0.41557 0.00032265 2.4806 0.001926 776.902203943452 95.108 0.4289 94.807 94.545 94.973 -0.30057 -0.01183 0.0012167 43.256 43.0 18.0 4.0 0 0 13968000.0 1480 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 1034.86449 3101.57165 58570.136751731 2.7431 0.0028387 1.9123 0.001979 4.6554 0.0048177 1035.53417889661 94.702 0.53433 94.802 94.659 95.194 0.10022 -0.033462 0.00087012 117.52 81.0 23.0 7.0 0 0 32534000.0 1481 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 4 776.400189 3101.57165 66368.11449119 2.3312 0.00181 0.56017 0.00043492 2.8914 0.0022449 776.650611514844 94.718 0.46868 94.818 94.569 95.038 0.10022 -0.0007346 0.0016658 43.256 43.0 20.0 4.0 0 0 11747000.0 1482 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 3 1034.86449 3101.57165 57024.6205109036 2.1117 0.0021854 2.4486 0.002534 4.5603 0.0047193 1035.20100279573 95.256 0.539 94.855 94.623 95.162 -0.40094 0.019061 0.0025349 117.52 78.0 23.0 6.0 0 0 22519000.0 1483 121 127 +2925 AAAYNLVQHGITNLCVIGGDGSLTGANIFR 30 Unmodified _AAAYNLVQHGITNLCVIGGDGSLTGANIFR_ 0 0 0 P17858;P17858-2 P17858 P17858 PFKL ATP-dependent 6-phosphofructokinase, liver type MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 4 776.400189 3101.57165 66547.314316663 1.6737 0.0012994 -0.033182 -2.5763e-05 1.6405 0.0012737 776.651469280463 95.259 0.27004 94.858 94.713 94.983 -0.40094 0.039267 -0.00017697 43.256 35.0 11.0 4.0 0 0 8977600.0 1484 121 127 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 509.274261474609 2 509.273509 1016.53247 80565.2225137516 1.6257 0.00082792 -0.021789 -1.1097e-05 1.6039 0.00081682 509.273525934328 47.239 0.4073 47.239 47.119 47.526 0.0 51.0 18.0 4.0 0.0 0.0 0.0 0.0087271 1 19344.0 77.923 40.829 1 226970000.0 9955 784 827 4962 4962.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 509.273590087891 2 509.273509 1016.53247 44694.4197515 0.49182 0.00025047 -1.1163 -0.00056852 -0.62451 -0.00031805 509.273301217601 48.438 0.28524 47.285 47.176 47.461 -1.1529 63.0 26.0 4.0 0.0 0.0 0.0 0.0030632 1 41510.0 98.299 60.061 1 419050000.0 9956 784 827 4963 4963.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 509.273651123047 2 509.273509 1016.53247 44464.732726654 0.42708 0.0002175 -0.77954 -0.000397 -0.35246 -0.0001795 509.273247782803 47.334 0.24518 47.234 47.129 47.374 -0.09961 61.0 21.0 4.0 0.0 0.0 0.0 0.0031438 1 40318.0 101.28 58.81 1 246710000.0 9957 784 827 4964 4964.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 509.2744140625 2 509.273509 1016.53247 79796.5985157249 1.451 0.00073897 0.03789 1.9297e-05 1.4889 0.00075827 509.273466894027 48.095 0.5368 47.243 47.056 47.593 -0.85214 56.0 24.0 4.0 0.0 0.0 0.0 0.0065721 1 19764.0 85.064 60.141 1 256300000.0 9958 784 827 4965 4965.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519074004 BoxCar_12-01_2 509.274108886719 2 509.273509 1016.53247 81806.0154654015 0.97968 0.00049892 0.41127 0.00020945 1.3909 0.00070837 509.273695221316 47.565 0.57988 47.164 46.943 47.522 -0.40082 67.0 26.0 4.0 0.0 0.0 0.0 0.0023677 1 19521.0 98.997 67.707 1 283140000.0 9959 784 827 4966 4966.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 509.274566650391 2 509.273509 1016.53247 79596.0227272378 1.6011 0.00081537 0.61313 0.00031225 2.2142 0.0011276 509.273842601512 47.077 0.40838 47.077 46.927 47.336 -3.4809e-05 61.0 18.0 4.0 0.0 0.0 0.0 0.0065721 1 19341.0 85.064 53.128 1 327940000.0 9960 784 827 4967 4967.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 509.273773193359 2 509.273509 1016.53247 44496.9937256115 0.62736 0.0003195 -1.0494 -0.00053445 -0.42209 -0.00021496 509.273171808522 48.129 0.26108 47.277 47.143 47.404 -0.85214 67.0 22.0 4.0 0.0 0.0 0.0 0.0084953 1 41818.0 85.064 46.826 1 378300000.0 9961 784 827 4968 4968.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 509.273834228516 2 509.273509 1016.53247 44451.0549949483 0.44382 0.00022603 -0.63047 -0.00032108 -0.18664 -9.5053e-05 509.273291638707 47.65 0.23935 47.199 47.098 47.337 -0.45108 65.0 21.0 4.0 0.0 0.0 0.0 0.016485 1 41352.0 72.485 45.883 1 292540000.0 9962 784 827 4969 4969.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 509.27392578125 2 509.273509 1016.53247 43940.4979226396 0.68986 0.00035133 -0.96157 -0.0004897 -0.27171 -0.00013838 509.273233063021 47.152 0.26525 47.102 47.035 47.3 -0.050152 71.0 27.0 4.0 0.0 0.0 0.0 0.0084953 1 40664.0 85.064 46.826 1 306450000.0 9963 784 827 4970 4970.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 509.274047851563 2 509.273509 1016.53247 82440.6846792516 1.3491 0.00068704 -0.31183 -0.00015881 1.0372 0.00052824 509.273296156741 48.186 0.36481 47.334 47.193 47.557 -0.85207 32.0 16.0 2.0 0.0 0.0 0.0 0.0077409 1 19768.0 81.191 60.492 1 233710000.0 9964 784 827 4971 4971.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 509.274200439453 2 509.273509 1016.53247 79957.3317116338 1.0829 0.00055151 0.19683 0.00010024 1.2798 0.00065175 509.273632399123 47.76 0.47201 47.259 47.139 47.611 -0.50119 56.0 21.0 4.0 0.0 0.0 0.0 0.0043371 1 19573.0 92.47 58.955 1 201800000.0 9965 784 827 4972 4972.0 +3390 ACLENLGLK 9 Unmodified _ACLENLGLK_ 0 0 0 P36952 P36952 P36952 SERPINB5 Serpin B5 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 2 509.273509 1016.53247 45429.3328035947 0.036644 1.8662e-05 -1.2805 -0.00065214 -1.2439 -0.00063348 509.273162107891 47.822 0.26855 47.321 47.184 47.453 -0.50114 0.092718 -0.0012475 98.997 52.0 22.0 4.0 0 0 183440000.0 9966 784 827 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 375.218383789063 2 375.218863 748.423173 51966.3342839765 0.14536 5.4542e-05 0.11082 4.1582e-05 0.25618 9.6124e-05 375.218817619582 36.685 0.13246 35.532 35.47 35.602 -1.1529 17.0 12.0 2.0 0.0 0.0 0.0 0.011347 1 29774.0 118.01 88.673 1 28774000.0 5384 438 457 2716 2716.0 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519010518 Shotgun_02-01_2 375.219207763672 2 375.218863 748.423173 51784.8131493548 -0.074497 -2.7953e-05 0.32669 0.00012258 0.2522 9.4628e-05 375.218852516155 36.02 0.20288 35.418 35.345 35.548 -0.60138 28.0 17.0 3.0 0.0 0.0 0.0 0.034196 1 29331.0 78.616 43.723 1 31503000.0 5385 438 457 2717 2717.0 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 375.219024658203 2 375.218863 748.423173 51646.5201852211 0.56563 0.00021223 1.6238 0.00060929 2.1895 0.00082153 375.218833673493 36.342 0.23821 35.49 35.389 35.627 -0.85214 41.0 18.0 3.0 0.0 0.0 0.0 0.08331 1 30036.0 57.463 42.242 1 37705000.0 5386 438 457 2718 2718.0 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 375.218811035156 2 375.218863 748.423173 35.93 1.0 35.479 34.979 35.979 -0.45108 0.0 0.0 0.0 0.033354 1 29676.0 86.866 47.648 1 5387 438 457 2719 2719.0 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 2 375.218863 748.423173 97212.8460311823 1.1211 0.00042067 0.35425 0.00013292 1.4754 0.00055359 375.218961088035 35.373 0.25724 35.373 35.192 35.449 0.0 -0.081664 0.00013249 118.01 20.0 11.0 2.0 0 0 23957000.0 5388 438 457 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun_170519095157 Shotgun_02-01_3 2 375.218863 748.423173 52901.4725718675 0.83856 0.00031464 -1.023 -0.00038384 -0.18443 -6.92e-05 375.218391606138 35.478 0.23488 35.378 35.279 35.514 -0.09961 -0.076123 -0.00090104 118.01 27.0 20.0 2.0 0 0 21034000.0 5389 438 457 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 2 375.218863 748.423173 98632.8585373007 0.73669 0.00027642 2.5095 0.00094161 3.2462 0.001218 375.218742890523 36.301 0.32148 35.449 35.285 35.607 -0.85214 -0.0054741 0.0017499 118.01 36.0 14.0 3.0 0 0 25432000.0 5390 438 457 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 2 375.218863 748.423173 52091.6264566419 0.4733 0.00017759 -0.1711 -6.4201e-05 0.3022 0.00011339 375.21888355855 35.405 0.23283 35.456 35.304 35.537 0.050098 0.0013686 -0.00026176 118.01 29.0 16.0 3.0 0 0 18480000.0 5391 438 457 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 2 375.218863 748.423173 96728.9113640727 0.42459 0.00015931 0.44347 0.0001664 0.86806 0.00032571 375.218949415621 36.399 0.25714 35.547 35.383 35.64 -0.85207 0.092455 0.00019944 118.01 18.0 11.0 3.0 0 0 43498000.0 5392 438 457 +3718 AALTFAR 7 Unmodified _AALTFAR_ 0 0 0 P52569;P52569-3;P52569-2 P52569 P52569 SLC7A2 Cationic amino acid transporter 2 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519031647 BoxCar_02-01_2 2 375.218863 748.423173 96813.7349047251 0.65784 0.00024684 -0.0051346 -1.9266e-06 0.65271 0.00024491 375.218864957 35.947 0.2787 35.446 35.257 35.536 -0.50119 -0.0079592 -0.00013721 118.01 20.0 12.0 2.0 0 0 19522000.0 5393 438 457 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MSMS 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_Shotgun Shotgun_02-01_1 951.109069824219 3 950.438977 2848.2951 34052.1120518873 1.3811 0.0013126 -0.21299 -0.00020243 1.1681 0.0011102 950.771947341938 92.612 0.18615 91.359 91.309 91.495 -1.2532 17.0 11.0 2.0 0.0 0.0 0.0 0.00013421 1 84839.0 62.237 59.729 1 19003000.0 9836 777 818 4914 4914.0 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar_170519120350 BoxCar_02-01_3 3 950.438977 2848.2951 61602.1895061156 2.7867 0.0026486 -0.66993 -0.00063673 2.1168 0.0020119 951.106412535965 91.167 0.35828 91.167 90.983 91.341 1.4211e-14 -0.2298 -0.00047036 62.237 28.0 15.0 2.0 0 0 6730200.0 9837 777 818 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar BoxCar_12-01_1 3 950.438977 2848.2951 59542.7805719319 2.2637 0.0021515 -0.38366 -0.00036464 1.88 0.0017869 950.773446313041 92.179 0.31156 91.427 91.262 91.573 -0.75189 0.030262 0.00034589 62.237 51.0 13.0 6.0 0 0 38030000.0 9838 777 818 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_BoxCar_170519162801 BoxCar_12-01_3 3 950.438977 2848.2951 59130.9766035208 2.6557 0.0025241 -0.50299 -0.00047806 2.1527 0.002046 951.106629113899 91.383 0.42603 91.483 91.313 91.739 0.10022 0.086848 5.6503e-06 62.237 27.0 18.0 2.0 0 0 19641000.0 9839 777 818 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun Shotgun_12-01_1 3 950.438977 2848.2951 32082.7871413956 0.84493 0.00080305 -0.74188 -0.00070511 0.10304 9.7937e-05 950.772250155452 92.304 0.22525 91.452 91.348 91.574 -0.85214 0.055017 -0.00067552 62.237 40.0 13.0 5.0 0 0 25129000.0 9840 777 818 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519052823 Shotgun_12-01_2 3 950.438977 2848.2951 31990.5251336278 2.0357 0.0019348 -1.8957 -0.0018017 0.14004 0.0001331 951.438297891526 91.802 0.21975 91.451 91.386 91.606 -0.35083 0.054246 -0.0039653 62.237 54.0 14.0 5.0 0 0 21432000.0 9841 777 818 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa12_Ecoli1_Shotgun_170519141553 Shotgun_12-01_3 3 950.438977 2848.2951 32088.9281944303 1.7137 0.0016288 -1.6698 -0.0015871 0.043877 4.1703e-05 951.103163478456 91.422 0.20354 91.472 91.378 91.582 0.050098 0.075469 -0.0033214 62.237 28.0 14.0 3.0 0 0 26099000.0 9842 777 818 +3652 ACGNMFGLMHGTCPETSGGLLICLPR 26 Unmodified _ACGNMFGLMHGTCPETSGGLLICLPR_ 0 0 0 P49903;P49903-3 P49903 P49903 SEPHS1 Selenide, water dikinase 1 MULTI-MATCH 20170518_QEp1_FlMe_SA_BOX0_HeLa2_Ecoli1_BoxCar BoxCar_02-01_1 3 950.438977 2848.2951 62629.9464775178 2.1719 0.0020643 0.74788 0.00071082 2.9198 0.0027751 951.107859112539 92.315 0.46847 91.362 91.138 91.606 -0.95232 -0.034174 0.0035723 62.237 56.0 20.0 5.0 0 0 14201000.0 9843 777 818 diff --git a/tests/run_tests.sh b/tests/run_tests.sh index e69de29b..36c9eec2 100644 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -0,0 +1,11 @@ +# TODO make tutorial_dev_spectral_libraries.ipynb work +INCLUDED_NBS=$(find ../docs/nbs -name "*.ipynb" | grep -v tutorial_dev_spectral_libraries.ipynb) +python -m pytest --nbmake $(echo $INCLUDED_NBS) + +# TODO make test_isotope_mp.ipynb work +# Note: multiprocessing in ipynb sometimes suspended on some versions of Windows, ignore the +# corresponding notebook(s) if this occurs again +# INCLUDED_NBS=$(find ../nbs_tests -name "*.ipynb" | grep -v test_isotope_mp.ipynb) + +INCLUDED_NBS=$(find ../nbs_tests -name "*.ipynb") +python -m pytest --nbmake $(echo $INCLUDED_NBS)