# tutorials

topic: community
tutorial: community_content
title: Creating community content
difficulty: intermediate
time_estimation: 30M
tools_json: []
requirements_json: []
tags_json: []
content_hash: d02a7ca543a3ce31516a329a1209b534
last_modified: 2026-05-15T22:28:10.715240
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/community_content/tutorial.html

content:
Galaxy *[Special Interest Group](https://galaxyproject.org/community/sig)* (**SIG**)s work hard to build and maintain training resources. The GTN has worked hard to acknowledge this and offer nice impact pages to communities.

Here is a list of resources that you can use!

> <comment-title></comment-title>
> - We want this material to grow (similar to the 'Creating content in markdown' tutorial) so please do add further resources that can help communities!
{: .comment}

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Maintainer Home

Maintaining resources is **fundamental** to the quality and usefulness of any software resource. We do *not* throw code over the wall!

To help topic maintainers to quickly recognise what materials need updating and fixing, topic **Maintainer Homes** were built.

> <hands-on-title>Go to your topic Maintainer Home</hands-on-title>
>
> 1. Go to any GTN training topic of interest.
> 2. Scroll down past the tutorials, and click on the "Maintainer Home" button
>
>    {% snippet topics/community/faqs/maintainer_home.md %}
>
> 3. Explore the Maintainer Home!
>    - For example, the [Single Cell Maintainer Home]({% link topics/single-cell/maintainer.md %})
>
{: .hands_on}

You may instantly see some key information missing from tutorials, or how long its been since someone checked it! Time to update some materials!

You can see an example from the Single-cell topic below:

<iframe
    src="/training-material/topics/single-cell/maintainer.html"
    width="100%"
    height="400"
    style="border: 2px solid #00008B;"
    title="Single-Cell Topic Maintainer Home">
</iframe>

# Community Home

Where the **Maintainer Home** helps you sustain your community, the **Community Home** helps you show off your community. An end-of-year gift in 2024, this page will sift through news, events, and GTN contributions for your community tag of interest (example: single-cell) and provide a beautiful visualization of your efforts.

> <hands-on-title>Go to your topic Community Home</hands-on-title>
>
> 1. Go to any GTN training topic of interest.
> 2. Scroll down past the tutorials, and click on the "Community Home" button
>
>    {% snippet topics/community/faqs/community_home.md %}
>
> 3. Explore the **Community Home**!
>    - For example, the [Single Cell Community Home]({% link topics/single-cell/community.md %})
>
{: .hands_on}

You can see an example from the Single-cell topic below:

<iframe
    src="/training-material/topics/single-cell/community.html"
    width="100%"
    height="400"
    style="border: 2px solid #00008B;"
    title="Single-Cell Topic Community Home">
</iframe>

# Topic usage statistics

Next up, you might want to know how many people are actually using your materials? Welcome to your **Topic usage statistics**! You may have already found this, actually, as it's (currently) at the bottom of the Maintainer Home.

> <hands-on-title>Go to your topic usage statistics</hands-on-title>
>
> 1. Go to any GTN training topic of interest.
> 2. Scroll down past the tutorials, and click on the "Maintainer Home" button
>
>    {% snippet topics/community/faqs/maintainer_home.md %}
>
> 3. Scroll down to the section "Statistics For Your Materials"
> 4. Explore the usage statistics!
>    - For example, the [Single Cell Usage Statistics]({% link topics/single-cell/maintainer.md %}#statistics-for-your-materials)
>
{: .hands_on}

You can see an example from the Single-cell topic below.

<iframe
    src="/training-material/topics/single-cell/maintainer.html#statistics-for-your-materials"
    width="100%"
    height="400"
    style="border: 2px solid #00008B;"
    title="Single-Cell Topic Usage Statistics">
</iframe>

# News widgets

You can also embed news into your pages, subdomains/ Galaxy Labs, or even your Matrix channels.

Follow this documentation to learn how:

1. [GTN Feeds]( {% link feeds/index.md %} )
2. Bot integration into matrix

{% snippet topics/community/faqs/matrix_news_bot.md %}

You can see an example from the Single-cell topic below.

<h3 class="mb-3">News and Events</h3>
<iframe width="100%" height="300px" src="/training-material/feeds/single-cell-month.w.html"></iframe>

# Workflow search

Want to see all the workflows tagged with your community tag across public servers? Look no further!

Follow this documentation to learn how:

1. [Galaxy Pan-Galactic Workflow Search]( {% link workflows/list.md %} )
2. [Workflow Search Querying]( {% link news/2023/11/20/workflow-search.md %} )

You can see an example from the Single-cell topic below.

<h3 class="mb-3">Public workflows</h3>
<iframe src="/training-material/workflows/embed.html?query=single-cell" height="400px" width="100%" class="gtn-embed" frameborder="1"></iframe>

# Galaxy Community Activities calendar

We host a GoogleCalendar on the [Galaxy Special Interest Group Hub page](https://galaxyproject.org/community/sig/).

{% snippet topics/community/faqs/community_activites_calendar.md %}

# Conclusion

{% icon congratulations %} Congratulations! You've made it to the end! Hopefully you think these resources are brilliant, and are making sure to tag everything (news, events, training materials, workflows, FAQs, you name it, you should tag it!) with your community tag!


topic: community
tutorial: sig_define
title: What's a Special Interest Group?
difficulty: intermediate
time_estimation: 15m
tools_json: []
requirements_json: []
tags_json: []
content_hash: f4ad4b1e76dcbab7547758037e460914
last_modified: 2026-05-15T22:28:10.715838
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/sig_define/tutorial.html

content:
In Galaxy, the term *[Special Interest Group](https://galaxyproject.org/community/sig)* (**SIG**) refers to a dedicated scientific community that crosses individual lab boundaries and wants to collaborate, share resources, support each other, and/or collectively advocate on a given theme. We have **SIGs** based on [**region**](https://galaxyproject.org/community/sig/#regional-communities), [**domain of science**](https://galaxyproject.org/community/sig/#communities-of-practice), and more. You might consider that a **SIG** covers any group of like-minded Galaxy enthusiasts not currently combined into a [**Working Group**](https://galaxyproject.org/community/wg/).

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

<div class='right'><img src="../../images/mind_map.svg" alt="Person looking at a diagram with a central rectangle connected to many other nodes representing people and connections" width="25" /></div>

You can find a directory of current [**SIGs** below](https://galaxyproject.org/community/sig/).

<iframe src="https://galaxyproject.org/community/sig/" height="400px" width="800px"></iframe>

## Characteristics of SIGs

**SIGs** vary hugely. Some **SIGs** meet and collaborate frequently, while others use their **SIG** to simply provide a key contact individual to represent their group in the Galaxy community. The following list, therefore, does not necessary apply to every SIG, but can give you a general idea of what **SIGs** can get up to.

**SIGs** can be:
* Focused on user community development
* Self-regulated, which includes organising meetings, developing training material and tools, maintaining the Hub and training pages, and choosing a representative for the [Galaxy Community Board](https://galaxyproject.org/community/governance/gcb/)
* Long-term or transient
* Supported with administrative infrastructure provided by the Galaxy Project and the [GCB](https://galaxyproject.org/community/governance/gcb/), including:
  * mailing list
  * website infrastructure and a place on the Galaxy hub to present the Community
  * presentation slot at the annual GCC conference
  * Chat channel/room
* Set up to gather input from members
* Represented in the [Galaxy Community Board](https://galaxyproject.org/community/governance/gcb/) which articulates needs to the Galaxy community to influence the next innovations (known to software developers as a Roadmap process: the selection of priorities for the coming years)

# Purpose of a SIG

Taking into account the wide variety of **SIGs**, the following are often priorities for **SIGs**.

## Prevent work duplication

It’s surprisingly easy for individuals halfway across the world to need the same tool and build the same tool.
What a waste of time when there are so many cool things to do!

## Highlight new resources

If you’re working in the same research area, for instance, it can be exciting when someone builds something new that could help your research. With so many things getting added daily, it’s easy to miss this news. SIGs can point out such highlights and give you new ideas for your research or work.

## Peer review

Need someone to look at an issue? Want some feedback on a tutorial or tool? Your fellow SIG members are a lot more likely to help you if you help them, and, more importantly, if they know who you are. Cut through the 1.8k of issues on Github by making some work friends in your field.

## Build community

The bigger the community you have, the more power in developing further resources (or grant proposals!), finding collaborators, co-authoring papers, etc. Higher user counts give you more sway in decision-making and building up Galaxy further, advancing your own work. It’s a lot easier to say you need something and 100 users agree, than to ask on behalf of yourself alone.

## Many hands make light work

Users want tools, workflows, training, and events. When delivering training (like [Smorgasbord](https://gallantries.github.io/posts/2021/03/01/smörgåsbord/) global training events) or projects, explaining who you are to a grant board, or recruiting individuals to your SIG, it’s rather important that the website you point to, quite frankly, looks nice. Building tools, preparing training material, delivering events, and updating web pages takes time. If you can share these tasks amongst a **SIG**, you ensure sustainability and increase impact.

# How do Working Groups & Special Interest Groups differ?

[Working Groups **(WGs)**](https://galaxyproject.org/community/wg/) are distinct from **SIGs**.

**WGs** are:

* Focused on technical issues
* Managing important project infrastructure assets, including source code, for the long term
* Represented in the [Galaxy Technical Board](https://galaxyproject.org/community/governance/gtb/), which contributes to the roadmap (prioritisation of innovation goals in Galaxy) by providing technical input and requesting resources for technical and development activities

You can find a directory of current [**WGs** below](https://galaxyproject.org/community/wg/).

<iframe src="https://galaxyproject.org/community/wg/" height="400px" width="800px"></iframe>

# Representation in Galaxy Governance

SIGs send (at least one) representative to the [Galaxy Community Board (GCB)](https://galaxyproject.org/community/governance/gcb/), which meets throughout the year to share useful tips and practices, as well as collects ideas for promoting via the Galaxy Governance structure to enact global change across numerous groups of individuals. Global software development is tricky, and effective communication and representation is key for making things happen to benefit our SIGs.

{% snippet topics/community/faqs/governance_structure.md %}

# How to join a SIG

You can find out how to join any given SIG by going to their SIG page, which you can peruse from the [SIG directory](https://galaxyproject.org/community/sig/).

> <comment-title></comment-title>
> Being part of a **SIG** is awesome! You find people from different institutes, disciplines or regions who are all excited about the same thing. It's one of the best bits of the Galaxy Community more broadly - it's a welcoming and energetic bunch!
{: .comment}

If you do not find a SIG that represents your interest, you may want to make one!

# Conclusion

{% icon congratulations %} Congratulations! You've made it to the end! Hopefully you think **SIGs** are brilliant and maybe you have joined one, or want to start one!


topic: community
tutorial: community-lab
title: Creation of the labs in the different Galaxy instances for your community
difficulty: introductory
time_estimation: 1H
tools_json: []
requirements_json: []
tags_json: ["Community", "SIG", "CoDex"]
content_hash: eeaac9f3246c805deb6e5417ab1fd964
last_modified: 2026-05-27T09:01:47.879593
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/community-lab/tutorial.html

content:
The **Community lab**, a centralised webpage that enables communities to rapidly aggregate, curate, integrate, display, and launch relevant tools, workflows, and training on different Galaxy servers. This user-friendly interface, built on the Galaxy framework, provides community members with data analysis capacity without requiring programming expertise. Users can run individual tools or create complex workflows, with full provenance tracking to ensure reproducibility, designed specifically for the community research (Nasr et al., 2024).
  *For example, [the microgalaxy lab (Europe)](https://microbiology.usegalaxy.eu).*


The aim of this tutorial is to create the files necessary to display the labs in each Galaxy instance.

You can also use the [Galaxy Labs engine](https://labs.usegalaxy.org.au).

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Create the lab specific files (automatic)

The labs are composed of various files, some that are specific to your community and some that are common between all the labs.
To automatically create the necessary files from a set of templates, a script is provided (`sources/bin/populate_labs.sh`).

This script will create the following structure and files:
```
communities/
└── <your community>/
    └── lab/
        ├── CONTRIBUTORS
        ├── README.md
        ├── base.yml
        ├── conclusion.html
        ├── intro.html
        ├── usegalaxy.eu.yml
        ├── usegalaxy.fr.yml
        ├── usegalaxy.org.yml
        └── sections_templates/
            ├── 1_data_import_and_preparation.yml
            ├── 2_tools.yml
            ├── 3_workflows.yml
            ├── 4_tutorials.yml
            ├── 5_support_and_help.yml
            └── 6_community.yml
```


The files are created and updated automatically using GitHub actions, you just need to add a bit of code to point to your community folder.

> <hands-on-title>Generate the files using GitHub Actions</hands-on-title>
>
> 1. Go to the [Galaxy Codex repo](https://github.com/galaxyproject/galaxy_codex)
> 2. Go to the file `.github/workflows/fetch_filter_resources.yaml`
> 3. On the right, click on the pen to "Edit this file"
> 4. Scroll down
> 5. Duplicate the section called "Populate <community-name> Lab"
>
>    ```
>      - name: Populate <community-name> Lab
>        run: |
>          bash sources/bin/populate_labs.sh
>        env: 
>          COMMUNITY: <community-name>
>    ```
> 6. Replace `<community-name>` by the name of your community
> 7. Commit changes the changes to a new branch that you name "new lab for [Community-name]"
>
{: .hands_on}

After that, your commit will be reviewed (and approved) by admins.
On the following Sunday (or upon request), this action will be launched and will create the new files in the appropriate community folder (`communities/<your community>/lab/`).

# Modify the generated files to personalize your community lab

Once the files are created, you should update them as some contain template text that are not community specific. 

Files to update :

| File | Action |
|------|--------|
| `communities/<your community>/lab/CONTRIBUTORS` | Add the handles of all contributors |
| `communities/<your community>/lab/README.md` | Replace all `<your-community>` with your community name |
| `communities/<your community>/lab/base.yml` | Replace all `<your-community>` with your community name |
| `communities/<your community>/lab/intro.html` | Add a description of your community |

The following files require no changes:

| File | Note |
|------|------|
| `communities/<your community>/lab/conclusion.html` | Pre-filled, no edit needed |
| `communities/<your community>/lab/sections_templates/*` | Pre-filled, no edit needed |

The files in the section folders contain the code for each table visible in the lab.
You can check different labs for inspiration, such as the [microgalaxy lab](https://microbiology.usegalaxy.eu).

# Create community specific sections to personalize your community lab

If you want additional sections, for example, the "Microbial isolates" and "Microbiome" sections in the [microgalaxy lab](https://microbiology.usegalaxy.eu/).

> <hands-on-title>Add community specific sections</hands-on-title>
> 1. Find an appropriate template. You can use other files in your section folder, or browse other labs, such as [microgalaxy lab code](https://github.com/galaxyproject/galaxy_codex/tree/main/communities/microgalaxy/lab), and copy the raw code as a template.
> 2. Create the file in your section folder. Name it with a digit (numerical order) and a descriptive name (i.e. "7_microbial_isolate").
> 3. Copy the raw code in this newly created file.
> 4. Update the code to display what you want.
> 5. Save the file.
> 6. Open `communities/<your community>/lab/base.yml`
> 7. Add the previously created file to the sections (see [microgalaxy base file](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/biodiversity/lab/base.yml) for example)
> 8. Save `communities/<your community>/lab/base.yml`
> 9. Pre-visualize the rendering of the community lab using the following path (make sure to change the variables indicated with <> in the path) : `https://labs.usegalaxy.org.au/?content_root=https://<your-repo>/galaxy_codex/blob/<your-branch>/communities/<community-name>/lab/base.yml`
> 10. Update the files until you obtain the lab you want.
> 11. Commit the changes, create the pull request (if not done previously)
{: .hands_on}

The Pull Request will be reviewed. Make sure to respond to any feedback.

# Include the labs in the different instances

For the lab to be accessible from the different instances, you need to add files in each instance independently.

For the French instance (https://usegalaxy.fr), all the steps are described in [Issue 297](https://gitlab.com/ifb-elixirfr/usegalaxy-fr/infrastructure/-/issues/297).
You can use the [merge request made for the biodiversity lab](https://gitlab.com/ifb-elixirfr/usegalaxy-fr/infrastructure/-/merge_requests/1302) as a reference.

For the European instance (https://usegalaxy.eu), this tutorial will be updated later.
You can use the [pull request made for the biodiversity lab](https://github.com/usegalaxy-eu/infrastructure-playbook/pull/1629) as a reference.

For the American instance (https://usegalaxy.org), this tutorial will be updated later.
You can use the [pull request made for the biodiversity lab](https://github.com/galaxyproject/usegalaxy-playbook/pull/427) as a reference.

For the Australian instance (https://usegalaxy.org.au), this tutorial will be updated later.
You can use the [pull request made for the biodiversity lab](https://github.com/usegalaxy-au/infrastructure/issues/2786#issuecomment-3330995427) as a reference.

# Conclusion

You now have all the files necessary to display your lab in several instances and they should soon be available to your users.


topic: community
tutorial: community-tutorial-table
title: Creation of a Galaxy tutorial table for your community
difficulty: introductory
time_estimation: 1H
tools_json: []
requirements_json: []
tags_json: ["Community", "SIG"]
content_hash: 0d874d32bb2949a0231f4391f4382c1d
last_modified: 2026-05-27T09:01:47.880422
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/community-tutorial-table/tutorial.html

content:
Similarly to the numerous tools available on Galaxy, the [Galaxy Training Network](https://training.galaxyproject.org/) includes numerous tutorials. This tutorial will take you through the steps to generate resources listing all the relevant tutorials and display the tutorial table on your community codex page.

The pipeline creates a table with all the tutorials. This table can be **filtered to only include tutorials that are relevant to a specific research community**.

The generated community-specific table can be used as is (e.g. downloadable tsv file) and/or embedded (e.g. into a Galaxy Hub page or Galaxy subdomain). 

The pipeline is **fully automated** and executed on a **weekly** basis. Any research community can apply the pipeline to create a table specific to their community.

The aim of this tutorial is to create a tutorial table for a community.

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Add your community to the Galaxy CoDex

You first need to check if your Community is in the [Galaxy CoDex](https://github.com/galaxyproject/galaxy_codex/tree/main/communities), a central resource for Galaxy communities.
If the community is already there, you can move to the next step of this tutorial.

If you community is not already included, follow this step :
> <hands-on-title>Add your community to the Galaxy CoDex</hands-on-title>
>
> You need to create a new folder in the data/community folder within Galaxy CoDex code source.
> 1. If not already done, fork the [Galaxy Codex repository](https://github.com/galaxyproject/galaxy_codex)
> 2. Go to the `communities` folder
> 3. Click on **Add file** in the drop-down menu at the top
> 4. Select **Create a new file**
> 5. Fill in the `Name of your file` field with:  name of your community + `/metadata/tutorial_tags`
>    This will create a folder for your community, a new folder for your community called metadata and a file called tutorial_tags.
> 6. Click on **Commit changes**
> 7. Fill in the commit message with something like `Add X community`
> 8. Click on `Create a new branch for this commit and start a pull request`
> 9. Create the pull request by following the instructions
>
{: .hands_on}

# Pull list of tags relevant to your community

To add tutorials in your community tutorial table, you will need to indicate a list of tags relevant to your community, and tutorials associated with this tag will be automatically pulled from the [Galaxy Training Network](https://training.galaxyproject.org/) one a week. Only tutorials with the selected tags will be added to the filtered table.
You will then be able to remove tutorials that are not relevant to your community or deprecated.

> <hands-on-title>Select tutorials tags from the Galaxy Training Network</hands-on-title>
>
> 1. Go to the [Galaxy Training Network]({% link index.md %})
> 2. Browse for tutorials that are relevant to your community
> 3. Note the tags that are associated with tutorials of interest
{: .hands_on}
> <comment-title>Tips</comment-title>
> You can also create a tag (for example, your community name) and tag all relevant tutorials with it. Then, you only need to use this tag to pull all the relevant tutorials.
{: .comment}

# Add the list relevant tags for your community in the `tutorial_tags` file

> <hands-on-title>Add the relevant tags to the tutorial_tags file</hands-on-title>
> 1. Open or create a file named `tutorial_tags` in your community metadata folder (`communities/<your community>/metadata/tutorial_tags`)
> 2. Add the name of the tags relevant to your community in the `tutorial_tags` file, with 1 tag per row
> (See above for how to identify the appropriate tags)
>
>    For example:
>    ```
>    Assembly
>    Metagenomics
>    ```
{: .hands_on}

Once you have a list of the tags that you wish to keep, you can submit this to Galaxy CoDex.

> <hands-on-title>Submit the new list of tags to Galaxy CoDex</hands-on-title>
>
> 1. Click on **Commit changes** at the top
> 2. Fill in the commit message with something like `Add tutorials tags for my community`
> 3. Click on `Create a new branch for this commit and start a pull request`
> 4. Create the pull request by following the instructions
{: .hands_on}

The Pull Request will be reviewed. Make sure to respond to any feedback.

On the sunday following the Pull Request merge, a table with all tutorial will be created in `communities/<your community>/resources/tutorials.tsv`

Here is an overview of the files :

| Filename | Location | Generation | Function | Format | Example (microgalaxy) |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| tutorial_tags | communities/<your_community>/metadata/ | Manual | Name of the tags relevant to your community, with 1 tag per row | NA | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/metadata/tutorial_tags) |
| tutorials.tsv | communities/<your community>/resources/ | Automatic | Table with all the tutorials relevant to your community | TSV | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/metadata/tutorials.tsv) |
| tutorials.html | communities/<your_community>/resources/ | Automatic | A list of the tutorials in html format to include in a website | HTML | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/resources/tutorials.html) |

![Flowchart illustrating the steps to generate the tutorials resources for your community.](./images/codex_tuto_flowchart.png "Flowchart illustrating the steps to generate the tutorials resources for your community.")


# Embed the table in your community page on the Hub

The table you have created can be embedded in your community page on the Hub, e.g. [microGalaxy](https://galaxyproject.org/community/sig/microbial/#workflows-and-tutorials).

> <hands-on-title>Embed your table</hands-on-title>
>
> 1.  If not already done, fork the repository [Galaxy Hub](https://github.com/galaxyproject/galaxy-hub)
> 2. Open or create your community page: `content/community/sig/<your community>/index.md`
> 3. TO DO : We Will soon update this section to explain how to include the table, sorry for the inconvenience. 
> 4. Submit the changes
> 5. Wait for the Pull Request to be merged
{: .hands_on}

# Conclusion

You now have a table with tutorials available for your community, and this table is embedded in a community page.


topic: community
tutorial: tools_subdomains
title: Make your tools available on your subdomain
difficulty: intermediate
time_estimation: 30m
tools_json: []
requirements_json: []
tags_json: ["subdomain", "earth-system", "interactive-tools"]
content_hash: 1b657263996de202e31fdf46b2130ebf
last_modified: 2026-05-15T22:28:10.716109
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/tools_subdomains/tutorial.html

content:
This tutorial explains how to make your brand new tools, once they're published through a Pull Request ([check this tutorial]({%link topics/dev/tutorials/tool-from-scratch/tutorial.md %}) on how to build your tool from scracth), visible on your subdomain. Here we'll follow the example on how to make the tools visible on [Galaxy for earth System](https://earth-system.usegalaxy.eu/). You can also find the explanations on how to add your tools on this [Github page](https://usegalaxy-eu.github.io/operations/subdomains.html).

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Add your batch tool to the right section

> <hands-on-title>Tool sections (for batch tools) </hands-on-title>
>    - Clone the Github repository of the Galaxy server (of where your subdomain to be attached)
>    - For Galaxy Europe, fork the [usegalaxy-eu-tools repo](https://github.com/usegalaxy-eu/usegalaxy-eu-tools)
>    - Create a branch on your fork
>    - Browse through the different yaml files and select the one that correspond to your subdomain for earth system everything is made under the ecology owner.  The name of the files corresponds to a toolshed owner or community and a few of those communities with a review system and CI integration gets special trust and auto-updates.
>    - Once in the yaml you can add the section for your tool (you want to know what are the existing tool sections ? Go check the [categories defined here](https://github.com/usegalaxy-eu/infrastructure-playbook/blob/master/templates/galaxy/config/tool_conf.xml.j2))
>
> An example on how to fill in the yaml file
> ```
> - name: id_of_your_tool
>   owner: choose_the_owner_relative_to_a_github_repo
>   tool_panel_section_label: 'Choose the section where your tool belongs'
> ```
>
> ![Image of the modification to make in the ecology.yaml file](../../images/tool_subdomain/ecology_yml_tool.png)
>
>   - Then commit your changes and write a nice message for the admin when you open your Pull Request.
{: .hands_on}

This part is only to make batch tool visible in your subdomain.

# Add a section of tools to your subdomain
> <hands-on-title>Sections for your subdomain</hands-on-title>
>    - If not already done clone the Galaxy Europe [Infrastructure-playbook repo](https://github.com/usegalaxy-eu/infrastructure-playbook/tree/master)
>    - Create a branch on your fork
>    - Go to the file **global_host_filters.py.j2** in **templates/galaxy/config/**
>    - Open it and edit it the "DOMAIN_SECTIONS" part go to your subdomain line and in the list of section add the one you need for instance `"climate_analysis"`
>
> ![Image of the modification to make in the global_host_filters.py.j2 file](../../images/tool_subdomain/add_section.png)
>
>   - Then commit your changes and write a nice message for the admin when you open your Pull Request.
{: .hands_on}


# Add you interactive tool to the right section
> <hands-on-title>Interactive tool sections</hands-on-title>
>    - If not already done clone the Galaxy Europe [Infrastructure-playbook repo](https://github.com/usegalaxy-eu/infrastructure-playbook/tree/master)
>    - Create a branch on your fork
>    - Go to the file **tool_conf.xml.j2** in **templates/galaxy/config/**
>    - Open it and edit it by adding the xml file of the interactive tool to the section interactive tool or any other interactive tool section (to know more on how to create your interactive tool section folow [this tutorial]({%link topics/admin/tutorials/subdomain/tutorial.md %}))
>    - Below an example of how to add the interactive tool panoply to the earth system subdomain.
>
> ![Image of the modification to make in the tool_conf.xml.j2 file](../../images/tool_subdomain/add_interactive_tool.png)
>
>   - Then, commit your changes and write a nice message for the admin when you open your Pull Request.
{: .hands_on}

If you choose to create a new section for your interactive tool don't forget add this section to your subdomain !

# Conclusion

You can now start to build your workflow on your subdomain !


topic: community
tutorial: sig_create
title: Creating a Special Interest Group
difficulty: intermediate
time_estimation: 30m
tools_json: []
requirements_json: []
tags_json: []
content_hash: 1f1c45a2a50688d0b9bf21e2a11e3d0f
last_modified: 2026-05-15T22:28:10.715531
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/sig_create/tutorial.html

content:
So you have decided to create a new Special Interest Group (**SIG**)!

# Do you need to make a SIG?

Before you make a SIG, make sure that you have learned the basics about Galaxy. Start with our dedicated [**Get Started**](https://galaxyproject.org/get-started/) page to get a head-start of what Galaxy is about.

> <comment-title></comment-title>
> You'll find all the necessary resources and you could even participate in the [**Galaxy Mentorship Network**](https://galaxy-mentor-network.netlify.app/) to get started with the help of a Galaxy Mentor.
{: .comment}

Starting and running a **SIG** takes time and effort, so it's a good idea to make sure that:

 1. **You have a buddy** Do you already have someone who wants to join this community and help build it with you? There's no sense in starting a **SIG** of one!
 2. **You are committed** We have resources to help you and are constantly trying to make running a **SIG** easier, but it nevertheless takes time. You don't want to start a **SIG** and then fail to maintain it.

 > <warning-title>Do not contribute to software smog!</warning-title>
 > Do not create a SIG that you cannot sustain! Do not create a SIG that already exists!
 {: .warning}

Saying that, running a **SIG** can be deeply rewarding when you see people coming together across disciplines, institutes, and more to find synergy and make cool things happen together.

Let's walk you through making a new Galaxy **SIG**.

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Requirements of a Special Interest Group (SIG)

Before starting a **SIG**, it's important to be aware of the (rather low) requirements for being a **SIG**:

* Must have 2 or more members
* Must maintain a page on the Community Hub with at least:
  * A description of the purpose of the SIG.
  * A clear explanation of how individuals can join and maintain membership.
  * Details of access to the SIG’s communication channels.
  * The current contact/email address for the nominated [Galaxy Community Board](https://galaxyproject.org/community/governance/gcb/) representative
* Must manage membership and internal communication for itself.
* Must use at least one public Matrix channel under the Galaxy Matrix space.
* Must allow participation across different timezones (with the exception of **Regional Communities**).

{% snippet topics/community/faqs/meeting_times.md %}

{% snippet topics/community/faqs/governance_structure.md %}

# Creating a new SIG

> <hands-on-title>Create a SIG</hands-on-title>
>
> 1. **Copy an updated SIG page** (there's a Template in that folder, work in progress!) [from the Galaxy Community Hub github folder](https://github.com/galaxyproject/galaxy-hub/blob/master/content/community/sig/). We suggest looking through the different SIG pages to see which one has the type of content you would like and copying that one.
> 2. **Update the text** to suit your new SIG
> 3. **Create a Matrix group** within the Galaxy Matrix chat forum space.
>   - Consider making a bridge to a Slack chat if you want to talk with users!
> 4. (Optional): **Create a mailing list** for your SIG: https://lists.galaxyproject.org/lists/
> 5. **Add your SIG** & any relevant links to the [SIG directory](https://github.com/galaxyproject/galaxy-hub/blob/master/content/community/sig/index.md)
> 6. Send someone to **join the Galaxy Community Board**, which has tons of resources to support you and also a chat forum on Matrix.
>
>    {% snippet topics/community/faqs/governance_gcb.md %}
>
>    {% snippet topics/community/faqs/governance_gcb_join.md %}
>
{: .hands_on}

Remember that **SIGs** vary hugely. Some **SIGs** meet and collaborate frequently, while others use their **SIG** to simply provide a key contact individual to represent their group in the Galaxy community. You don't need every link, widget or calendar we create to run a good **SIG**. Just make what fits your group's needs. Above all, think sustainably - someone has to keep things updated, and that someone likely starts with you!

# Sustainability

Remember that if you make a **SIG**, you are responsible for *maintaining* that **SIG**.

This at a minimum includes:

1. A section on the [SIG Directory on the Hub](https://galaxyproject.org/community/sig/)
2. Your individual SIG page from the Hub that is linked from that directory

This may also include:
1. Your SIG Training page
2. Mailing list

## Ending a SIG

If you collectively decide that the **SIG** is no more, please end your SIG.

> <hands-on-title>End a SIG</hands-on-title>
>
> 1. Update the [SIG Directory on the Hub](https://galaxyproject.org/community/sig/)
> 2. Remove your individual SIG page from the Hub
> 3. Notify the [Galaxy Community Board](https://galaxyproject.org/community/governance/gcb/), ideally via their chat channel
>
{: .hands_on}

# Conclusion

Did you make a SIG? {% icon congratulations %} Congratulations! Being a part of a **SIG** is one of the best bits of working with Galaxy, so well done you for enabling that for like-minded scientists!

Or did you realise that you didn't need to make a **SIG**? {% icon congratulations %} Congratulations to you as well, for preventing the software smog of creating unneeded webpages.


topic: community
tutorial: community-workflow-table
title: Creation of resources listing Galaxy workflow for your community
difficulty: introductory
time_estimation: 1H
tools_json: []
requirements_json: []
tags_json: ["Community", "SIG"]
content_hash: 2f71d26fe9b642f38211d789c8ee0ceb
last_modified: 2026-05-27T09:01:47.880663
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/community/tutorials/community-workflow-table/tutorial.html

content:
Similarly to the numerous tools available on Galaxy, numerous workflow are available on public Galaxy instances and in [Workflow Hub](https://workflowhub.eu/). This tutorail will take you through the steps to generate resources listing the relevant workflows and how to display them on your community codex page.

The pipeline creates a table with all the workflows associated to selected tags. This table can be **filtered to only include workflows that are relevant to a specific research community**.

The generated community-specific table can be used as it and/or embedded, e.g. into the respective Galaxy Hub page or Galaxy subdomain.

The pipeline is **fully automated** and executed on a **weekly** basis. Any research community can apply the pipeline to create a table specific to their community.

The aim of this tutorial is to create a workflow table for a community.

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Add your community to the Galaxy CoDex

You first need to check if your Community is in the [Galaxy CoDex](https://github.com/galaxyproject/galaxy_codex/tree/main/communities), a central resource for Galaxy communities.
If the community is already there, you can move to the next step of this tutorial.

If you community is not already included, follow this step :
> <hands-on-title>Add your community to the Galaxy CoDex</hands-on-title>
>
> You need to create a new folder in the data/community folder within Galaxy CoDex code source.
> 1. If not already done, fork the [Galaxy Codex repository](https://github.com/galaxyproject/galaxy_codex)
> 2. Go to the `communities` folder
> 3. Click on **Add file** in the drop-down menu at the top
> 4. Select **Create a new file**
> 5. Fill in the `Name of your file` field with:  name of your community + `/metadata/workflow_tags`
>    This will create a folder for your community, a new folder for your community called metadata and a file called workflow_tags.
> 6. Click on **Commit changes**
> 7. Fill in the commit message with something like `Add X community`
> 8. Click on `Create a new branch for this commit and start a pull request`
> 9. Create the pull request by following the instructions
>
{: .hands_on}

# Pull list of tags relevant to your community

To add workflows in your community workflow table, you will need to indicate a list of tags relevant to your community, and workflows associated with these tags will be automatically pulled from public Galaxy instances and [Workflow Hub](https://workflowhub.eu/). Only workflows with the selected tags will be added to the table.
You will then be able to remove workflows that are not relevant to your community or deprecated.

> <hands-on-title>Select workflows tags from the Galaxy instances</hands-on-title>
>
> 1. Go to your favorite public Galaxy instance.
> 2. Go to the `Workflow` section
> 3. Select `Public workflows` (for example: [Public workflows on the French instance](https://usegalaxy.fr/workflows/list_published))
> 4. Browse for workflows that are relevant to your community
> 5. Note the tags that are associated with workflows of interest
{: .hands_on}

> <hands-on-title>Select workflows tags from the Workflow Hub</hands-on-title>
>
> 1. Go to [Workflow Hub](https://workflowhub.eu/)
> 2. Browse for workflows that are relevant to your community
> 3. Note the tags that are associated with workflows of interest (in the `tag` section on the left of the workflow page)
{: .hands_on}

# Add the list relevant tags for your community in the workflow_tags file

> <hands-on-title>Add the relevant tags to the workflow_tags file</hands-on-title>
> 1. Open or create a file named `workflow_tags` in your comunity metadata folder (`communities/<your community>/metadata/workflow_tags`)
> 2. Add the name of the tags relevant to your community in the `workflow_tags` file you started above. The file is split in two sections : `Public`, which should inidcate the tags used on public Galaxy instances; and `workflowhub`, which indicates the tags to use to select workflow on [Workflow Hub](https://workflowhub.eu/).
>
>    For example:
>    ```
>    public:
>    - name:microgalaxy
>    - microgalaxy
>    workflowhub:
>    - abromics
>    - amr
>    - amplicon
>    ```
>
{: .hands_on}

It is currently mandatory to have tags under both sections (public and workflowhub) or the codex script will crash and you will not get the files mentionned below.
Once you have a list of the tags that you wish to keep, you can submit this to Galaxy CoDex.

> <hands-on-title>Submit the new list of tags to Galaxy Codex</hands-on-title>
>
> 1. Click on **Commit changes** at the top
> 2. Fill in the commit message with something like `Add workflows tags for my community`
> 3. Click on `Create a new branch for this commit and start a pull request`
> 4. Create the pull request by following the instructions
>
{: .hands_on}

The Pull Request will be reviewed. Make sure to respond to any feedback.

On the sunday following merging of the pull request, a few files will be created :
- `communities/<your community>/metadata/workflow_status.tsv` : A table with all the workflows extracted with the tags mentionned above.
- `communities/<your community>/resources/curated_workflows.tsv` : A table with the same workflows as in the metadata file and additional information.
- `communities/<your community>/resources/curated_workflows.json` : A json file with the same info as the correponding table.
- `communities/<your community>/resources/tag_filtered_workflows.tsv` : At this stage, the same table as `curated_workflows.tsv`.
- `communities/<your community>/resources/tag_filtered_workflows.json` : At this stage, the same json as `curated_workflows.json`.


# Review the generated table to curate workflows

The generated table in the metadata folder (`communities/<your community>/metadata/workflow_status.tsv`) contains all the workflows associated with the tags that you selected. However, not all of these workflows might be interesting for your community.

Galaxy CoDex allows for an additional optional filter for workflows, that can be defined by the community curator (maybe that is you!).

To filter the workflows, you will update the values in the last two columns of the `communities/<your community>/metadata/workflow_status.tsv` file
- `To keep` indicating whether the tool should be included in the final table (TRUE/FALSE).
- `Deprecated` indicating whether the tool is deprecated (TRUE/FALSE).

You can modify the file directly in GitHub or download it to create a spreadsheet, easier to edit as a community.

> <hands-on-title>Modify workflows using spreadsheets</hands-on-title>
>
> 1. Download the `workflow_status.tsv` file in `communities/<your community>/metadata/`.
> 2. Open `workflow_status.tsv` with a Spreadsheet Software.
> 3. Review each line corresponding to a workflow.
>     1. Add `TRUE` to the `To keep` column if the tool should be kept, and `FALSE` if not.
>     2. Add `TRUE` or `FALSE` also to the `Deprecated` column.
> 5. Export the new table as TSV.
> 6. Submit the TSV as `workflow_status.tsv` in your `communities/<your community>/metadata/` folder.
> 7. Wait for the Pull Request to be merged
>
{: .hands_on}

On the sunday following merging of the pull request, the following files, reflecting the Galaxy tool landscape for your community, will be updated :
- `communities/<your community>/resources/curated_workflows.tsv`
- `communities/<your community>/resources/curated_workflows.json` 
- `communities/<your community>/resources/tag_filtered_workflows.tsv`
- `communities/<your community>/resources/tag_filtered_workflows.json`

You can step-by-step review all workflows in your community and update the `workflow_status.tsv` file. You could also share this file with your community members and discuss weather the workflow should be kept or not. Collaborative work could be established using google spreadsheet.


Here is an overview of the files (the top three files in the table are the most important):

| Filename | Location | Generation | Function | Format | Example (microgalaxy) |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| workflow_tags | communities/<your_community>/metadata/ | Manual | Name of the tags relevant to your community | NA | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/metadata/workflow_tags) |
| workflow_status.tsv | communities/<your community>/metadata/ | Automatic (To update manually) |  Table with all the workflows extracted with the tags mentioned above | TSV | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/metadata/tool_status.tsv) |
| curated_workflows.tsv | communities/<your_community>/resources/ | Automatic | Table containing only the curated workflows| TSV | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/resources/curated_workflows.tsv) |
| curated_workflows.json | communities/<your_community>/resources/ | Automatic | File containing only the curated workflows| JSON | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/resources/curated_workflows.json) |
| tag_filtered_workflows.tsv | communities/<your_community>/resources/ | Automatic | Table with all the workflows extracted with the tags mentioned above | TSV | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/resources/tag_filtered_workflows.tsv) |
| tag_filtered_workflows.json | communities/<your_community>/resources/ | Automatic | JSON file with all the workflows extracted with the tags mentioned above | JSON | [Example](https://github.com/galaxyproject/galaxy_codex/blob/main/communities/microgalaxy/resources/tag_filtered_workflows.json) |

![Flowchart illustrating the steps to generate the workflow resources for your community.](./images/codex_workflows_flowchart.png "Flowchart illustrating the steps to generate the workflow resources for your community.")


# Embed the table in your community page on the Hub

The table you have created can be embedded in your community page on the Hub, e.g. [microGalaxy](https://galaxyproject.org/community/sig/microbial/#workflows-and-tutorials).

> <hands-on-title>Embed your table</hands-on-title>
>
> 1.  If not already done, fork the repository [Galaxy Hub](https://github.com/galaxyproject/galaxy-hub)
> 2. Open or create your community page: `content/community/sig/<your community>/index.md`
> 3. TO DO : We Will soon update this section to explain how to include the table, sorry for the inconvenience. 
> 4. Submit the changes
> 5. Wait for the Pull Request to be merged
>
{: .hands_on}

# Conclusion

You now have a table with workflows available for your community, and this table is embedded in a community page.


topic: proteomics
tutorial: proteogenomics-novel-peptide-analysis
title: Proteogenomics 3: Novel peptide analysis
difficulty: intermediate
time_estimation: 30m
requirements_json: []
tags_json: ["[proteogenomics]"]
content_hash: 610adb788a6e7881fdcbae4f0b1d0531
last_modified: 2026-05-27T09:01:49.463491
zenodo_link: https://doi.org/10.5281/zenodo.1489208
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/proteogenomics-novel-peptide-analysis/tutorial.html

content:
The third and the last workflow in the proteogenomics tutorial is to identifying the "**Novel peptides**" using BlastP and to localize the peptides to its genomic coordinates. Inputs from both workflow 1 and 2 will be used in this workflow.
Please look at the following tutorials in this proteogenomics series before starting this tutorial:
1. [Proteogenomics database creation]({% link topics/proteomics/tutorials/proteogenomics-dbcreation/tutorial.md %})
2. [Proteogenomics database search]({% link topics/proteomics/tutorials/proteogenomics-dbsearch/tutorial.md %})

![Workflow](../../images/Third_workflow.png)

> <agenda-title></agenda-title>
>
> In this tutorial, we will deal with:
> 1. TOC
> {:toc}
>
{: .agenda}

# Pretreatments

All the files to run this workflow can be obtained from the [second tutorial]({% link topics/proteomics/tutorials/proteogenomics-dbsearch/tutorial.md %}) output. Once the tabular output is generated, we convert this tabular report into a FASTA file. This can be achieved by using the Tabular to FASTA convertion tool.

> <hands-on-title>data organization</hands-on-title>
>
> 1. The inputs for this workflow are:
>    - **Fasta file** – “**Peptides for BlastP analysis**” From (Proteogenomics 2: Database Search)
>    - **Tabular file** – “**PeptideShaker_PSM**” From (Proteogenomics 2: Database Search)
>    - **Mz to sqlite** From (Proteogenomics 2: Database Search)
>    - **Genomic mapping sqlite** From (Proteogenomics 1: Database Creation)
>    - **Reference Annotation File**  From (Proteogenomics 1: Database Creation)
>
>    If you do not have these files from the previous tutorials in this series, you can import them from [Zenodo](https://doi.org/10.5281/zenodo.13270741)
>    ```
>    https://zenodo.org/records/15391695/files/Peptides_for_Blast-P_analysis.fasta
>    https://zenodo.org/records/15390920/files/PeptideShaker_PSM.tabular
>    https://zenodo.org/record/1489208/files/mz_to_sqlite.mz.sqlite
>    https://zenodo.org/record/1489208/files/genomic_mapping_sqlite.sqlite
>    https://zenodo.org/records/1489208/files/Mus_musculus.GRCm38.86.gtf
>    ```
>
> 2. Verify that the mz_to_sqlite file has the format `mz.sqlite`
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="mz.sqlite" %}
>
{: .hands_on}



# Peptide Selection

[BLAST](https://blast.ncbi.nlm.nih.gov/Blast.cgi) is a web-based tool used to compare biological sequences. BlastP, matches protein sequences against a protein database. More specifically, it looks at the amino acid sequence of proteins and can detect and evaluate the amount of differences between say, an experimentally derived sequence and all known amino acid sequences from a database. It can then find the most similar sequences and allow for the identification of known proteins or for the identification of potential peptides associated with novel proteoforms.

The first step in this tutorial is to perform BLAST-P analysis using the NCBI-NR database. The output from BLASTP will determine the identification of the novel peptides. The result is a tabular file with 25 columns containing all the information regarding the alignment of these peptides with the sequences in the NCBI-NR database.

> <hands-on-title>NCBI BLAST+ blastp</hands-on-title>
>
> 1. {% tool [NCBI BLAST+ blastp](toolshed.g2.bx.psu.edu/repos/devteam/ncbi_blast_plus/ncbi_blastp_wrapper/2.16.0+galaxy0) %} with the following parameters:
>    - {% icon param-file %} **Protein query sequence(s)** - `Peptides for Blast-P analysis.fasta`
>    - **Subject database/sequences** - `Locally installed BLAST database`
>      - **Protein BLAST database** - `NCBI-NR(dated)`
>    - **Type of BLAST** - `blast-p short`
>    - **Set expectation value cutoff** - `200000.0`
>    - **Output format** - `Tabular (extended 25 columns)`
>    - **Advanced Options** - `show advanced options`
>      - **Scoring matrix and gap costs** - `PAM30`
>         - **Gap Costs** - `Existence:9 Extension:1`
>      - **Maximum hits to consider/show** - `1`
>      - **Maximum number of HSPs (alignments) to keep for any single query-subject pair** - `1`
>      - **Word size for wordfinder algorithm** - `2`
>      - **Multiple hits window size: use 0 to specify 1-hit algorithm, leave blank for default** - `40`
>      - **Minimum score to add a word to the BLAST lookup table** - `11`
>      - **Composition-based statistics** - `0: no composition-based statistics`
>
>  2. Click **Run Tool** and inspect the query results file after it turned green.
>
{: .hands_on}

Once Blast-P search is performed, it provides a tabular output containing “**Novel peptides**”. Now this output is further processed by comparing the Novel Peptide output with the PSM report for selecting only distinct peptides which meet the criteria.


> <hands-on-title>Query Tabular</hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.2) %} with the following parameters:
>    - {% icon param-repeat %} **Insert Database Table**
>      - *"Tabular Dataset for Table"* : Result of `blastp`
>      - Section **Table Options**
>        - *"Specify Name for Table"*: `blast`
>        - *"Use first line as column names"* : `No`
>        - *"Specify Column Names (comma-separated list)"*:
>`qseqid,sseqid,pident,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles`
>        - *"Only load the columns you have named into database"*: `Yes`
>        - {% icon param-repeat %} **Insert Table Index**
>          - *"This is a unique index"*: `No`
>          - *"Index on Columns"*: `qseqid`
>
>    - {% icon param-repeat %} **Insert Database Table**
>      - *"Tabular Dataset for Table"* : `PeptideShaker_PSM`
>      - Section **Filter Dataset Input**
>        - {% icon param-repeat %} **Filter Tabular Input Lines**
>          - *"Filter by"*:  `skip leading lines`
>          - *"Skip lines"*: `1`
>      - Section **Table Options**
>        - *"Specify Name for Table"*: `psm`
>        - *"Use first line as column names"* : `No`
>        - *"Specify Column Names (comma-separated list)"*: `ID,Proteins,Sequence,AAs_Before,AAs_After,Position,Modified_Sequence,Variable_Modifications,Fixed_Modifications,Spectrum_File,Spectrum_Title,Spectrum_Scan_Number,RT,mz,Measured_Charge,Identification_Charge,Theoretical_Mass,Isotope_Number,Precursor_mz_Error_ppm,Localization_Confidence,Probabilistic_PTM_score,Dscore,Confidence,Validation`
>        - *"Only load the columns you have named into database"*: `Yes`
>
>
>    - *"Save the sqlite database in your history"*: `No`
>
>       > <comment-title>Querying an SQLite Database</comment-title>
>       >
>       > **Query Tabular** can also use an existing SQLite database. Activating `Save the sqlite database in your history`
>       > will store the created database in the history, allowing to reuse it directly.
>       >
>       {: .comment}
>
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT distinct psm.*
>      FROM psm join blast ON psm.Sequence = blast.qseqid
>      WHERE blast.pident < 100 OR blast.gapopen >= 1 OR blast.length < blast.qlen
>      ORDER BY psm.Sequence, psm.ID
>      ```
>
>       > <comment-title>Query information</comment-title>
>       >
>       > The query wants a tabular list of peptides in which the lenght of the PSM sequence is equal to the length of the Blast sequence, where in the pident (percentage identity) is less that 100 i.e. Peptide cannot be a 100% identical to the NCBI-nr reference database. Or it should fulfill the criteria that there should be atleast 1 gap present (blast.gapopen >= 1) or the length of the peptide in NCBI-nr should be less than the length of the query length. If the peptide follows all this then it is accepted as a "Novel" proteoform.
>       >
>       {: .comment}
>    - *"Include query result column headers"*: `Yes`
>
>  2. Click **Run Tool** and inspect the query results file after it turned green.
>
>  3. Rename the output as `PSM_Novel_Peptides`
>
{: .hands_on}

Once this step is completed, a tabular output containing novel proteoforms are displayed. These novel proteforms fulfill our criteria of not being present in the existing NCBI repository. The next step is to remove any duplicate sequences. For this, we use the Query tabular tool again to select distinct sequences from the tabular output.

> <hands-on-title>Query Tabular</hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.2) %}
>    - {% icon param-repeat %} **Insert Database Table**
>      - *"Tabular Dataset for Table"* : Result of `Query Tabular`
>      - Section **Filter Dataset Input**
>        - {% icon param-repeat %} **Insert Filter Tabular Input Lines**
>          - *"Filter by"*:  `skip leading lines`
>          - *"Skip lines"*: `1`
>      - Section **Table Options**
>        - *"Specify Name for Table"*: `psm`
>        - *"Use first line as column names"* : `No`
>        - *"Specify Column Names (comma-separated list)"*:`ID,Proteins,Sequence`
>        - *"Only load the columns you have named into database"*: `Yes`
>
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT distinct Sequence from psm
>      ```
>    - *"include query result column headers"*: `Yes`
>
> 2. Click **Run Tool** and inspect the query results file after it turned green.
>
> 3. Rename the output as `Novel Peptides`
>
{: .hands_on}


The next tool in the workflow is the Peptide genomic coordinate tool which takes the "novel peptides" as the input along with the mztosqlite file and the genomic mapping sqlite file (obtained during creation of the database). This tool helps create a bed file with the genomic coordinate information of the peptides based on the sqlite files.



# Obtain Peptide genomic Coordinates

Gets genomic coordinate of peptides based on the information in mzsqlite and genomic mapping sqlite files. This program
loads two sqlite databases (mzsqlite and genomic mapping sqlite files) and calculates the genomic coordinates of the
peptides provided as input. This outputs bed file for peptides.

> <hands-on-title>Peptide genomic Coordinate</hands-on-title>
>
> 1. Run {% tool [Peptide genomic Coordinate](toolshed.g2.bx.psu.edu/repos/galaxyp/peptide_genomic_coordinate/peptide_genomic_coordinate/1.0.0) %} with the following parameters:
>    - *"Input"*: `Novel Peptides`, `mzsqlite sqlite DB file`, and `genomic mapping sqlite DB file`
>
>      ![Output PGC](../../images/Output_PGC.png){:width="50%"}
>
>
> 2. Click **Run Tool** and inspect the resulting files
>
{: .hands_on}

# Multiomics Visualization Platform (MVP)

The Multiomics Visualization Platform is a Galaxy visualization plugin that allows the user to browse the selected proteomics data. It uses the SQlite database which allows the data to be filtered and aggregated in a user-defined manner. It allows various features such as; the PSM can be displayed with a lorikeet spectral view, the selected peptide can be displayed in a protein view and an IGV browser is also available for the selected protein. The step-by-step guide shown below will provide a walkthrough on how to use this plugin (NOTE: the example shown below is a representative peptide that is subjected to change, so while you are running this tool please take a look at the "Novel Peptide" output from the previous steps).


> <hands-on-title>Guide to MVP</hands-on-title>
>
> The spectra belonging to these "Novel peptides" can be viewed using MVP, this can be achieved by selecting the output from the `mz to sqlite tool` (Generated in the second workflow). **Make sure the database associated with the dataset is `mm10`**
>
> Here is a step-by-step guide to obtain the proteogenomic view of the "Novel peptides".
>
> 1. Click on the **Visualize in MVP application**, it will open up options for visualization application in the center pane, Select **MVP Application** from the options (or Right-click to open in a new window).
>
>    ![mz to sqlite](../../images/Visualize.png){:width="20%"}
>    This will open in the Center Pane. Select the MVP application.
>
>    ![MVP](../../images/Open_MVP.png){:width="20%"}
>
>    This is how it will look.
>
>    ![Overview](../../images/Peptide_overview.png){:width="60%"}
>
> 2. Click on **Load from Galaxy** to open the list of peptides you would like to view.
>
>    ![load from galaxy](../../images/load_from_Galaxy.png){:width="80%"}
>
>    This will open a dropdown list. Select the novel peptides from there.
>
>
>    ![dropdown](../../images/DropDown_novel.png){:width="50%"}
>
> 3. Select **Novel Peptides** from the right hand side.
>
>    ![novel peptides view](../../images/novel_peptides_view.png){:width="70%"}
>
> 4. Select any peptide, For eg: `DGDLENPVLYSGAV`, and then click on **PSMs for Selected Peptide**.
>
>    ![select_pep](../../images/Filtering_novelpeptides.png){:width="70%"}
>
> 5. If you scroll down, the PSM associated with the peptide will be displayed. By clicking on the PSM, the *Lorikeet*
> values will be shown. The Lorikeet visualization is interactive, i.e the user can change the values or select any
> parameter and click on Update button to view these changes.
>
>    ![PSM](../../images/Peptide-Protein_Viewer.png){:width="90%"}
>
>    ![lorikeet](../../images/Lorikeet_Viewer.png){:width="70%"}
>
>
> 6. For a Protein centric view, click on **View in Protein** , it will open up all the proteins associate with the
> peptides. For eg: Select the `DGDLENPVLYSGAV` peptide and click on the first protein. The chromosome location
> of the peptide will be displayed.
>
>    ![view in protein](../../images/Selecting_peptide.png){:width="70%"}
>
>    Once you click on protein it will show the list of proteins the belongs to the peptides.
>
>    ![select protein](../../images/opening_IGV.png){:width="60%"}
>
>    Once you select the protein that you want to visualize you can click on the protein view.
>
>    ![protein view](../../images/ProteinViewer.png){:width="80%"}
>
> 7. Clicking on the arrow marks will open up the IGV(js) visualization tool, where-in the genomic localization of the
> peptide will be displayed.
>
>    ![IGV](../../images/IGV_1.png){:width="90%"}
>
>
> 8. To add tracks to your IGV viewer, click on **Add Track**. This will open up a list of tracks that are compatible
> to view in your IGV viewer. For eg. Select the `Pep_gen_coordinate.bed` file and then click on **Load Track**.
> This will open up the bed will below the nucleotide sequence.
>
>    ![tracks align](../../images/Options_for_Track.png){:width="90%"}
>
> 9. By clicking the wheel, you can select the **three frame translate** which will show the three frame translated
> region of your sequence.
>
>    ![IGV viewer](../../images/IGV_viewer.png){:width="90%"}
>
> 10. The IGV is inbuilt in the MVP viewer and is very interactive, you could also load more tracks such as the aligned
> proBAM file (from HISAT) or the identified probam file (one of the input file).
> MVP has many useful features beyond those covered in this workshop and is under active development.
>
>     ![IGV2](../../images/IGV_2.png){:width="60%"}
>
>
{: .hands_on}



# Classify Peptides

Given chromosomal locations of peptides in a BED file, PepPointer classifies them as CDS, UTR, exon, intron, or intergene.

> <hands-on-title>Peppointer</hands-on-title>
>
> 1. {% tool [Peppointer](toolshed.g2.bx.psu.edu/repos/galaxyp/pep_pointer/pep_pointer/0.1.3) %} with the following parameters:
>   - {% icon param-select %} *"Choose the source of the GTF file"* - `From History`
>   - {% icon param-file %} *"GTF file with the genome of interest"* - `Mus_musculus.GRCm38.86.gtf`
>   - {% icon param-file %} *"BED file with chromosomal coordinates of peptides"*: `Bed file from Peptide genomic coordinate tool`
>
> 2. Click **Run Tool** and inspect the query results file after it turned green.
>
> This tool provides a bed output with the classification of the genomic location of the peptides.The Mus-musculus GTF file will be in your history if you have completed the proteogenomics 1 tutorial.
>
> ![Output PP](../../images/Output_PP.png){:width="50%"}
>
{: .hands_on}

The final tool for this workflow generates a tabular output that summarizes the information after running these workflows. The final summary output consists of the Peptide sequence, the spectra associated with the peptides, the protein accession number, the chromosome number, Start and Stop of the genomic coordinate, the annotation, the genomic coordinate entry for viewing in Integrative Genomics Viewer (IGV), MVP or UCSC genome browser and the URL for viewing it on UCSC genome browser. This summary is created with the help of the query tabular tool.


# Final Summary Output

> <hands-on-title>Query Tabular</hands-on-title>
>
>  1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.2) %}
>     - {% icon param-repeat %}  **Insert Database Table**
>       - Section **Table Options**:
>         - *"Specify Name for Table"*: `bed_pep_pointer`
>         - *"Use first line as column names"* : `No`
>         - *"Specify Column Names (comma-separated list)"*:`chrom,start,end,peptide,score,strand,annot`
>         - *"Only load the columns you have named into database"*: `No`
>
>     - {% icon param-repeat %} **Insert Database Table**
>       - Section **Filter Dataset Input**
>         - {% icon param-repeat %} **Insert Filter Tabular Input Lines**
>           - *"Filter by"*:  `skip leading lines`
>           - *"Skip lines"*: `1`
>       - Section **Table Options**
>         - *"Specify Name for Table"*: `psm`
>         - *"Use first line as column names"* : `No`
>         - *"Specify Column Names (comma-separated list)"*: `ID,Proteins,Sequence,AAs_Before,AAs_After,Position,Modified_Sequence,Variable_Modifications,Fixed_Modifications,Spectrum_File,Spectrum_Title,Spectrum_Scan_Number,RT,mz,Measured_Charge,Identification_Charge,Theoretical_Mass,Isotope_Number,Precursor_mz_Error_ppm,Localization_Confidence,Probabilistic_PTM_score,Dscore,Confidence,Validation`
>         - *"Only load the columns you have named into database"*: `No`
>     - *"SQL Query to generate tabular output"*:
>       ```
>       SELECT psm.Sequence AS PeptideSequence,
>       count(psm.Sequence) AS SpectralCount,
>       psm.Proteins AS Proteins,
>       bed_pep_pointer.chrom AS Chromosome,
>       bed_pep_pointer.start AS Start,
>       bed_pep_pointer.end AS End,
>       bed_pep_pointer.strand AS Strand,
>       bed_pep_pointer.annot AS Annotation,
>       bed_pep_pointer.chrom||':'||bed_pep_pointer.start||'-'||bed_pep_pointer.end AS GenomeCoordinate,
>       'https://genome.ucsc.edu/cgi-bin/hgTracks?db=mm10&position='||bed_pep_pointer.chrom||'%3A'||bed_pep_pointer.start||'-'||bed_pep_pointer.end AS UCSC_Genome_Browser
>       FROM psm
>       INNER JOIN bed_pep_pointer on bed_pep_pointer.peptide = psm.Sequence
>       GROUP BY psm.Sequence
>       ```
>
>     - *"include query result column headers"*: `Yes`
>
> 2. Click **Run Tool** and inspect the query results file after it turns green. If everything goes well, it should look similar:
>
> 3. Rename output as `Final_Summary_Novel_Peptides`
>
>    ![Final Summary](../../images/final_summary.png){:width="100%"}
>
> The Final summary displays a tabular output containing the list of novel peptides and its corresponding protein. It also provides the users with the chromosomal location of the novel proteoform along with the peptide's start and end position.	The output also features the strand information, gene	annotation and the genomic coordinates in a specific format that could be used on IGV or UCSC browser. It also provides the user with a	UCSC Genome Browser link, which the user can directly copy and paste it on a web browser to learn more about the novel proteoform. Here we are demonstrating the use of proteogenomics workflow on an example trimmed mouse dataset. This study explores the possibilities for downstream biological /functional analysis of peptides corresponding to novel proteoforms.
>
{: .hands_on}

## Conclusion

This completes the proteogenomics workflow analysis. This training workflow uses mouse data. For any other organism, the data, tool parameters and workflow will need to be modified accordingly. This workflow is also available at [usegalaxy.eu](https://usegalaxy.eu/). All the tools are in the most stable version here (published in 2018), the tools are subject to changes and upgrades, hence there could be minor formatting that would be required.

This workflow was developed by the Galaxy-P team at the University of Minnesota.
For more information about Galaxy-P or our ongoing work, please visit us at [galaxyp.org](http://galaxyp.org)

tools_json:
["NCBI BLAST+ blastp", "toolshed.g2.bx.psu.edu/repos/devteam/ncbi_blast_plus/ncbi_blastp_wrapper/2.16.0+galaxy0", "Query Tabular", "toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.2", "Peptide genomic Coordinate", "toolshed.g2.bx.psu.edu/repos/galaxyp/peptide_genomic_coordinate/peptide_genomic_coordinate/1.0.0", "Peppointer", "toolshed.g2.bx.psu.edu/repos/galaxyp/pep_pointer/pep_pointer/0.1.3"]


topic: proteomics
tutorial: maxquant-label-free
title: Label-free data analysis using MaxQuant
difficulty: introductory
time_estimation: 1H
requirements_json: []
tags_json: ["[DDA, label-free]"]
content_hash: ee966a46b0bbf95b5319abedcfbbce9a
last_modified: 2026-05-27T09:01:49.455663
zenodo_link: https://zenodo.org/record/3774452
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/maxquant-label-free/tutorial.html

content:
The proteome refers to the entirety of proteins in a biological system (e.g cell, tissue, organism). Proteomics is the large-scale experimental analysis of proteins and proteomes, most often performed by mass spectrometry which enables great sensitivity and throughput. Especially for complex protein mixtures, bottom-up mass spectrometry is the standard approach. In bottom-up proteomics, proteins are digested with a specific protease into peptides and the measured peptides are *in silico* reassembled into the corresponding proteins. Inside the mass spectrometer, not only are the peptides measured (MS1 level), but the peptides are also fragmented into smaller peptides, which are measured again (MS2 level). This is referred to as tandem-mass spectrometry (MS/MS). Identification of peptides is performed by peptide spectrum matching of the theoretical spectra generated from the input protein database (fasta file) with the measured spectra. Peptide quantification is most often performed by measuring the area under the curve of the MS1 level peptide peaks, but special techniques such as TMT (Tandem Mass Tag) allow for the quantification of peptides on the MS2 level. Nowadays, bottom-up tandem-mass spectrometry approaches allow for the identification and quantification of several thousand proteins.

![MQ_lcmsms](../../images/maxquant_lfq_lcmsms.png "Proteomics using liquid chromatography tandem-mass spectrometry (LC-MS/MS). Adapted from <a href="https://en.wikipedia.org/wiki/Tandem_mass_spectrometry#/media/File:MS_MS.png">wikipedia</a>.")


A plethora of software solutions were developed for the analysis of proteomics data. MaxQuant is one of the most popular proteomics software because it is an easy-to-use and free software that offers functionalities for nearly all kinds of proteomics data analysis challenges {% cite Cox2008 %}. Mass spectrometry raw data is normally obtained in a vendor-specific, proprietary file format. MaxQuant can directly take those raw files as input. For peptide identification,n MaxQuant uses a search engine called "Andromeda". MaxQuant offers highly accurate functionalities for many different proteomics quantification strategies, e.g., label-free, SILAC,and  TMT.

Blood is a commonly used biofluid for diagnostic procedures. The cell-free liquid blood portion is called plasma, and after coagulation serum. Plasma and serum proteomics are frequently performed to find new biomarkers, e.g., for diagnostic purposes and personalized medicine ({% cite Geyer2017 %}). Serum and Plasma proteomics are particularly challenging due to protein concentration differences in the order of ten magnitudes. Therefore, most sample preparation protocols include a depletion step in which the most abundant proteins are (partially) depleted from the sample,e e.g., via columns with immobilized antibodies.

This stand-alone tutorial introduces the data analysis from raw data files to protein identification and quantification of two label-free human serum samples with the MaxQuant software. One sample is a pure serum sample, while the other sample has been depleted of several abundant blood proteins. One of the questions in this tutorial is to find out which sample was depleted and which was not.

For more advanced proteomics workflows, please consult the OpenMS [identification]({{site.baseurl}}/topics/proteomics/tutorials/protein-id-oms/tutorial.html), [quantification]({{site.baseurl}}/topics/proteomics/tutorials/protein-quant-sil/tutorial.html), as well as [SearchGUI/PeptideShaker]({{site.baseurl}}/topics/proteomics/tutorials/protein-id-sg-ps/tutorial.html) tutorials.


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Get data

The serum proteomic samples and the fasta file for this training were deposited at [Zenodo](https://zenodo.org/record/3774452). It is of course, possible to use other fasta files that contain human proteome sequences, but to ensure that the results are compatible, we recommend using the provided fasta file. MaxQuant not only adds known contaminants to the fasta file, but also generates the "decoy" hits for false discovery rate estimation itself, therefore, the fasta file is not allowed to have decoy entries. To learn more about fasta files, have a look at [Protein FASTA Database Handling]({{site.baseurl}}/topics/proteomics/tutorials/database-handling/tutorial.html).


> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this tutorial and give it a meaningful name
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. Import the fasta and raw files from [Zenodo](https://zenodo.org/record/3774452)
>
>    ```
>    https://zenodo.org/record/4274987/files/Protein_database.fasta
>    https://zenodo.org/record/4274987/files/Sample1.raw
>    https://zenodo.org/record/4274987/files/Sample2.raw
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
> 3. Once the files are green, rename the raw datasets into 'sample1' and 'sample2' and the fasta file into 'protein database'
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
> 4. Set the data type to thermo.raw for 'sample1' and 'sample2'
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="thermo.raw" %}
>
{: .hands_on}

# MaxQuant Analysis

The MaxQuant Galaxy implementation contains the most important MaxQuant parameters. As an alternative, **MaxQuant (using mqpar.xml)** {% icon tool %} can be used with a preconfigured mqpar.xml file. We will explain the parameters after starting the MaxQuant run which takes some time to finish.


> <hands-on-title>MaxQuant analysis</hands-on-title>
>
> 1. {% tool [MaxQuant](toolshed.g2.bx.psu.edu/repos/galaxyp/maxquant/maxquant/1.6.10.43+galaxy3) %} with the following parameters
>    - In *"Input Options"*:
>        - {% icon param-file %} *"FASTA files"*: `protein database`
>        - *"Identifier parse rule"*: `>.*\|(.*)\|`
>        - *"Description parse rule"*: `>(.*) OS`
>    - In *"Search Options"*:
>        - *"minimum unique peptides"*: `1`
>    - In *"Parameter Group"*:
>        - {% icon param-files %} *"Infiles"*: `sample1`, `sample2`
>        - *"missed cleavages"*: `1`
>        - *"enzyme"*: `Trypsin/P`
>        - *"Quantitation Methods"*: `label free quantification`
>    - *"Generate PTXQC (proteomics quality control pipeline) report? (experimental setting)"*: `True`
>    - In *"Output Options"*:
>        - *"Select the desired outputs."*: `Protein Groups` `Peptides` `mqpar.xml`
>
>    > <comment-title>Protein Groups</comment-title>
>    > Proteins that share all their peptides with other proteins cannot be unambiguously identified. Therefore, MaxQuant groups such proteins into one protein group and only one common quantification will be calculated. The different protein properties are separated by a semicolon.
>    {: .comment}
{: .hands_on}

## More details on MaxQuant Parameters

The *"parse rules"* in the input section are applied to the fasta sequence headers. Regular expressions can be adjusted to keep different information from the fasta file header. Examples are given in the MaxQuant help section at the bottom of the tool. The fasta file for this training comes from Uniprot, therefore, the parse rules are adjusted accordingly.
Consider the FASTA header like this :

```>sp|P02768|ALBU_HUMAN Serum albumin OS=Homo sapiens GN=ALB PE=1 SV=1

    1) Identifier parse rule  >.*\|(.*)\| 
      > FASTA headers always start with this symbol. Matches with the initial >
      .* matches sp
      \| matches the first |
      (.*) matches P02768
      \| matches the second |

    2) Description parse rule >(.*) OS
       > matches with the initial >
       (.*) matches everything it can. It matches  sp|P02768|ALBU_HUMAN Serum albumin
       OS matches OS
```

The *"minimum peptide length"* defines the minimum number of amino acids a peptide should have to be included for protein identification and quantification. Below 7 amino acids a peptide cannot be unique and is therefore not informative, thus typical values are in the range 7-9.

Several, even longer peptides are not unique, meaning that they are shared by several proteins e.g. when they are part of a common protein domain. During protein inference, the peptides are statistically assembled into the corresponding proteins and the decision should be mainly based on the unique peptides. Therefore, we set *"min unique peptides"* to `1` - only proteins that have at least one unique peptide are reported in the output table.

In most bottom-up proteomics experiments, Trypsin is used as a protease because it has many advantages, such as its accurate cleavage specificity. Trypsin cleaves peptides C-terminal of Arginine (R) and Lysine (K), except when those are followed by Proline (P). Therefore, in MaxQuant, the default *"enzyme"* is set to `Trypsin/P`. This trypsin-specific cleavage rule is used by MaxQuant to perform an *in silico* digestion of the protein database that was provided in the fasta file.

Protease digestion is not always complete, therefore, we set the *"number of missed cleavages"* to `1`, meaning that the *in silico* digestion also includes peptides that have an additional Arginine or Lysine in their sequence.

![MQ_param_missed](../../images/maxquant_param_missedcl.png "Trypsin specificity and missed cleavages. With one missed cleavage all three peptides will be part of the *in silico* peptide database")

From the *in silico* generated peptide database the masses of the peptides are calculated and matched to the measured masses in order to identify them. A peptide's mass will change due to peptide modifications such as chemical labelling, for example, applied in different quantitation strategies or biological post-translational modifications. Therefore, it is also important to include possible peptide modifications in the *in silico* generated peptide mass list. *"Fixed modifications"* are modifications that occur on every occurrence of the specific amino acid. Those are often artificially introduced modifications such as Carbamidomethylation of cysteins (C) to prevent re-formation of the disulfide bridges. This is a common procedure in proteomics sample preparation and, therefore also the default option in MaxQuant: `Carbamidomethyl (C)`. *"Variable modifications"* are modifications that do not occur on every amino acid, such as the  Oxidation of Methionine might only occur on some Methionines and not all, but only a few peptide N-termini are acetylated. Variable modifications increase the *in silico* peptide database because each peptide's mass is calculated once with and once without the additional modification. To keep computation times as short as possible, we did not use any variable modification in this training, despite the MaxQuant default, the Oxidation of Methionine and Acetylation of N-termini would have been completely valid to use.

MaxQuant supports different *"Quantitation Methods"*. The three main categories are `label-free quantification`, `label-based quantification` and `reporter ion MS2` quantification. In this tutorial, we have chosen `label-free` because we did not apply any specific labeling/quantitation strategy to the samples.

![MQ_quant_methods](../../images/maxquant_lfq_quant_methods.png "Overview of MaxQuant quantification methods")

The PTXQC software was built to enable direct proteomics quality control from MaxQuant result files. This quality control can be directly used in the Galaxy MaxQuant wrapper by setting *"Generate PTXQC"* to `yes`. This will generate a pdf file with multiple quality control plots. Be aware that the cutoffs set in PTXQC might not apply to your experiment and mass spectrometer type, and therefore, "underperforming" and "fail" do not necessarily mean that the quality is poor.

![PTXQC_overview](../../images/maxquant_ptxqc_overview.png "Overview of PTXQC quality measures for sample1 and sample2")


MaxQuant automatically generates several output files. In the *"Output Options"* all or some of the output files can be selected. The protein information can be obtained by selecting `Protein Groups`, while the peptide information is obtained by choosing `Peptides`. The applied MaxQuant parameters are stored in the `mqpar.xml`. This file can be reused as an input file in the **MaxQuant (using mqpar.xml)** {% icon tool %}.


> <details-title>More MaxQuant parameters</details-title>
> - For pre-fractionated data an *"experimental design template"* has to be used. This has to be a tab-separated text file with a column for the fractions (e.g., 1-10) and a column for the experiment (sample1, sample2, sample3) and a column for post-translational modifications (PTM). Examples are given in the help section of the MaxQuant tool.
>
> - *"Match between runs"* allows to transfer of identifications (peptide sequences) from one run to another. If the MS1 (full-length peptide) signal is present in both runs, but was only selected for fragmentation in one of them, MaxQuant can transfer the resulting peptide sequence to the run where the MS1 peptide was not fragmented. The Information if a peptide was identified via fragmentation (MS/MS) or match between runs (matching) can be found in the evidence output.
>
> - MaxQuant allows processing different raw files with different parameters. In this tutorial, we have loaded both files into the same *"parameter group"* in order to process them with the same parameters. To apply different parameters, new parameter groups can be added by clicking on the {% icon param-repeat %} *"insert parameter group"* button. In each *"parameter group"* one or several raw files can be specified, and for them only the parameters specified within this parameter group section are applied.
{: .details}

> <tip-title>Continue with results from Zenodo</tip-title>
>
> In case the MaxQuant run is not yet finished, the results can be downloaded from Zenodo to be able to continue the tutorial
> 1. Import the files from [Zenodo](https://zenodo.org/record/3774452)
>
>    ```
>    https://zenodo.org/record/4274987/files/PTXQC_report.pdf
>    https://zenodo.org/record/4274987/files/MaxQuant_Protein_Groups.tabular
>    https://zenodo.org/record/4274987/files/MaxQuant_Peptides.tabular
>    https://zenodo.org/record/4274987/files/MaxQuant_mqpar.xml
>    ```
{: .tip}

> <question-title></question-title>
>
> 1. How many proteins were found in total?
> 2. How many peptides were found in total?
> 3. How many proteins identified and quantified? (Tip: There is a tool called "filter data on any column", select the LFQ (Label free quantification) column for both files and remove rows containing "0")
>
>
> > <solution-title></solution-title>
> >
> > 1. 271 proteins (groups) were found in total.
> > 2. 2410 peptides were found in total.
> > 3. Sample1: 237, Sample2: 123 (**filter data on any column** {% icon tool %} on the `protein groups` file *"with following condition"* `c32!=0` or `c33!=0` and *"Number of header lines to skip" `1`)
> >
> {: .solution}
>
{: .question}


# Quality control results

To get a first overview of the MaxQuant results, the PTXQC report is helpful. Click on the {% icon galaxy-eye %} eye of the PTXQC pdf file to open it in Galaxy. Screening through the different plots might already give you a hint which of the samples was pure and which was depleted of abundant proteins. Both samples failed in some categories (see Figure 4 above), especially due to low peptide and protein numbers, which is expected in serum samples and therefore not a quality problem.

> <question-title></question-title>
>
> 1. In which sample were more contaminantes quantified?
> 2. How good was the tryptic digestion (percentage of zero missed cleavages)?
> 3. Which sample yielded more protein identifications?
> 4. Do you already have a guess on which sample was depleted?
>
>
> > <solution-title></solution-title>
> >
> > 1. Sample 2 has more contaminants, especially serum albumin is high abundant. ![PTXQC_contaminants](../../images/maxquant_lfq_contaminants.png)
> > 2. The digestion was not ideal, but good enough to work with. The proportion of zero missed cleavages was 75% for sample1 and around 85% for sample2. ![PTXQC_missed](../../images/maxquant_lfq_missedcleavages.png)
> > 3. Sample 1 yielded more protein identifications ![PTXQC_ids](../../images/maxquant_lfq_proteinid.png)
> > 4. Sample 1, more information can be found in the next section.
> >
> {: .solution}
{: .question}


# Serum composition

To explore the proteomic composition of the two serum samples, some postprocessing steps on the Protein Groups file are necessary. The Protein Groups file contains all relevant information on the protein level. The best way to explore this vast table is by clicking on the  scratch book {% icon galaxy-scratchbook %} on the top menu. Clicking on the {% icon galaxy-eye %} eye icon opens the Protein Groups file. Galaxy does not work with the names of the columns but instead with their number. Find the column numbers for: Fasta headers (includes protein ID + name + species), LFQ intensities for each sample and reverse proteins. First we remove "decoy" proteins, which are named "reverse" in MaxQuant. Next, we remove contaminants. For non-human samples, we could just remove all proteins that are marked with a "+" in the "potential contaminant" column. We have seen before that many human proteins were marked as contaminant and as we study a human sample we don't want to remove them. Therefore, we only remove non-human contaminant proteins. Then, we shrink the file to keep only columns that are interesting in the next steps: the fasta header and the columns with LFQ intensities for both files. To find the most abundant proteins per sample, the LFQ intensities can be sorted. On this sorted dataset, we will explore the composition of the serum proteins within both samples using an interactive pie charts diagram.

> <hands-on-title>Exploring serum composition</hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `proteinGroups` (output of **MaxQuant** {% icon tool %})
>    - *"With following condition"*: `c38!="+"`
>    - *"Number of header lines to skip"*: `1`
>
> 2. {% tool [Select](Grep1) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `filter_file` (output of **Filter** {% icon tool %})
>    - *"the pattern"*: `(HUMAN)|(Majority)`
>
> 3. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c8,c32,c33`
>    - {% icon param-file %} *"From"*: `select_file` (output of **Select** {% icon tool %})
>
> 4. {% tool [Sort](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_sort_header_tool/1.1.1) %} with the following parameters:
>    - {% icon param-file %} *"Sort Query"*: `cut_file` (output of **Cut** {% icon tool %})
>    - *"Number of header lines"*: `1`
>    - In *"Column selections"*:
>        - *"on column"*: `c2`
>        - *"in"*: `Descending order`
>        - *"Flavor"*: `General numeric sort ( scientific notation -g)`
>
> 5. {% tool [Sort](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_sort_header_tool/1.1.1) %} with the following parameters:
>    - {% icon param-file %} *"Sort Query"*: `cut_file` (output of **Cut** {% icon tool %})
>    - *"Number of header lines"*: `1`
>    - In *"Column selections"*:
>        - *"on column"*: `c3`
>        - *"in"*: `Descending order`
>        - *"Flavor"*: `General numeric sort ( scientific notation -g)`
> 6. Click {% icon galaxy-barchart %} “Visualize this data” on the last **Sort** {% icon tool %} result.
>   - Select `Pie chart (NVD3)`
>   - *"Provide a title"*: `Serum compositions`
>   - Click `Select data` {% icon galaxy-chart-select-data %}
>   - *"Provide a label"*: `sample1`
>   - *"Labels"*: `Column: 1`
>   - *"Values"*: `Column: 2`
>   - Click `Insert data series`
>   - *"Provide a label"*: `sample2`
>   - *"Labels"*: `Column: 1`
>   - *"Values"*: `Column: 3`
>   - Save   {% icon galaxy-save %} (file is saved under "User" --> "Visualizations")
{: .hands_on}


![serum_composition](../../images/maxquant_lfq_serum_composition.png "Quantitative serum composition. In Galaxy one can hover over the graph to see the protein names")


> <question-title></question-title>
>
> 1. How many decoy proteins were removed?
> 2. What are the top 5 most abundant proteins in both files? Do they reflect typical serum proteins?
> 3. Which sample was depleted for the top serum proteins?
> 4. How much did the serum albumin abundance percentage decrease? Was the depletion overall succesful?
>
> > <solution-title></solution-title>
> >
> > 1. 2 (272 lines (Protein Groups) minus 270 lines (Filter))
> > 2. Sample1: Complement C4-A, Ceruloplasmin, Hemopexin, Serum albumin, Complement factor B. Sample2: Serum albumin, Immunoglobulin heavy constant gamma 1, Serotransferrin, Immunoglobulin kappa constant, Haptoglobin. All of those proteins are typical (high abundant) serum proteins ([plasma proteins found by MS](https://www.proteinatlas.org/humanproteome/blood/proteins+detected+in+ms)).
> > 3. Sample1 was depleted, sample2 was pure serum.
> > 4. In the depleted sample1, there is a depletion in some of the most abundant proteins, especially Albumin, which proportion of the total sample intensities decreased by 58 percentage. Compared to the pure serum the depleted sample showed a duplication of identified and quantified proteins rendering it quite successful. However, there is still room for improvement as some of the most abundant proteins which should have been depleted did not change their abundance compared to the overall protein abundance.
> >
> {: .solution}
>
{: .question}


# Quantitative Assessment

After analyzing the composition of each sample separately, the intensities between both samples are compared. For this, the intensity values are log2-transform and the normal distribution is visualized as boxplots, this requires cutting only the relevant columns before visualization. Next the log2 fold change is calculated and its distribution visualized as histogram. The log2 fold change helps to find proteins with abundances changes between the samples.

> <hands-on-title>Quantitative Assessment</hands-on-title>
>
> 1. {% tool [Compute](toolshed.g2.bx.psu.edu/repos/devteam/column_maker/Add_a_column1/1.3.0) %} with the following parameters:
>    - *"Add expression"*: `log(c2,2)`
>    - {% icon param-file %} *"as a new column to"*: `cut_file` (output of **Cut** {% icon tool %})
>    - *"Skip a header line"*: `yes`
>        - *"The new column name"*: `log2 intensity sample1`
> 2. {% tool [Compute](toolshed.g2.bx.psu.edu/repos/devteam/column_maker/Add_a_column1/1.3.0) %} with the following parameters:
>    - *"Add expression"*: `log(c3,2)`
>    - {% icon param-file %} *"as a new column to"*: `compute_file` (output of **Compute** {% icon tool %})
>    - *"Skip a header line"*: `yes`
>        - *"The new column name"*: `log2 intensity sample2`
> 3. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c4,c5`
>    - {% icon param-file %} *"From"*: `compute_file` (output of the last **Compute** {% icon tool %})
> 4. Click {% icon galaxy-barchart %} “Visualize this data” on the **cut** {% icon tool %} result.
>   - Select `box plot(jqPlot)`
>   - *"Use multi-panels"*: `No`
>   - Click `Select data` {% icon galaxy-chart-select-data %}
>   - *"Provide a label"*: `log2 sample1`
>   - *"Observations"*: `Column: 1`
>   - Click `Insert data series`
>   - *"Provide a label"*: `log sample2`
>   - *"Observations"*: `Column: 2`
>   - Confirm and save {% icon galaxy-save %} (file is saved under "User" --> "Visualizations")
> 5. {% tool [Compute](toolshed.g2.bx.psu.edu/repos/devteam/column_maker/Add_a_column1/1.3.0) %} with the following parameters:
>    - *"Add expression"*: `c4-c5`
>    - {% icon param-file %} *"as a new column to"*: `compute_file` (output of the last **Compute** {% icon tool %})
>    - *"Skip a header line"*: `yes`
>        - *"The new column name"*: `log2 Fold Change (sample1/sample2)`
> 6. {% tool [Histogram](toolshed.g2.bx.psu.edu/repos/devteam/histogram/histogram_rpy/1.0.4) %} with the following parameters:
>    - {% icon param-file %} *"Dataset"*: `compute_file` (output of the previous **Compute** {% icon tool %})
>    - *"Numerical column for x axis"*: `c6`
>    - *"Label for x axis"*: `log2 Fold Change`
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Describe the distribution of the log2 intensities in the box plots.
> 2. How much is the log2 fold change of serum albumin and what does it mean?
> 3. What does the distribution of the log2 fold changes mean?
>
> > <solution-title></solution-title>
> >
> > 1. The log2 transformation leads to a close to normal intensity distribution for both samples. Intensities in the depleted sample are shifted towards higher values compared to the non-depleted samples. The big difference comes from artificially depleting (changing) protein intensities. ![boxplots](../../images/maxquant_lfq_boxplots.png)
> > 2. The log2 fold change (depleted vs. not depleted samples) is about -2.91. This means that the abundance in the not depleted sample is about 2^2.91 = 7.52 times higher than in the depleted sample, showing again that a large proportion of serum albumin was successfully removed by the antibody columns.
> > 3. Most of the log2 fold changes are larger than zero. This means that many proteins have higher intensities in the depleted sample compared to the non-depleted sample. These are the proteins that benefited from the depletion of serum albumin and other highly abundant serum proteins. There is also a maximum around zero, meaning that a substantial amount of proteins had a similar abundance in both samples. The negative log2 fold changes derive from the proteins that were depleted, e.g., serum albumin. ![histogram](../../images/maxquant_lfq_fc_histogram.png)
> >
> {: .solution}
>
{: .question}


> <tip-title>Analyzing your own data</tip-title>
>
> For this training, we have chosen two small example files to keep analysis time minimal. Real proteomic projects comprise more samples, leading to longer MaxQuant run times from many hours to several days (depending on input file size, number of input files, and parameters). Real projects also require different follow-up analyses. Here are some things to consider for your proteomic project:
> 1. The columns in the MaxQuant output file change with the number of input files. Before using the cut tool, open the output file and check which columns contain the LFQ intensities - then adjust the cut tool to cut all those columns from the file.
> 2. A necessary first step is to log2-transform the LFQ intensities.
> 3. Even though LFQ intensities are already normalized, before statistical analysis, it is recommended to median normalize the LFQ intensities for each sample. Control the intensity distribution with histograms or boxplots. Even before normalization, the boxplots should already be more similar in their intensity range if a normal biological replicate was analyzed (and not a different sample preparation protocol as in the training dataset). After normalization, box plot medians should be very similar.
> 4. Often, proteomic projects aim to find differentially regulated proteins across conditions. Classical statistical methods like t-test and ANOVA are not ideal options but ok when multiple testing correction (e.g. Benjamini-Hochberg) is performed afterwards. The better options are algorithms tailored for the analysis of omics intensity data such as LIMMA ({% cite Ritchie2015 %}), SAM ({% cite Tusher2001 %}) and MSstats ({% cite Choi2014 %}) {% tool [MSstats](toolshed.g2.bx.psu.edu/repos/galaxyp/msstats/msstats/3.20.1.0) %}. Do not apply statistical methods designed for count data (e.g. RNA-seq) such as Limma-voom or DESq2 - those are not applicable for proteomics intensity data.
>
{: .tip}

tools_json:
["MaxQuant", "toolshed.g2.bx.psu.edu/repos/galaxyp/maxquant/maxquant/1.6.10.43+galaxy3", "Filter", "Filter1", "Select", "Grep1", "Cut", "Cut1", "Sort", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_sort_header_tool/1.1.1", "Compute", "toolshed.g2.bx.psu.edu/repos/devteam/column_maker/Add_a_column1/1.3.0", "Histogram", "toolshed.g2.bx.psu.edu/repos/devteam/histogram/histogram_rpy/1.0.4", "MSstats", "toolshed.g2.bx.psu.edu/repos/galaxyp/msstats/msstats/3.20.1.0"]


topic: proteomics
tutorial: DIA_Analysis_OSW
title: DIA Analysis using OpenSwathWorkflow
difficulty: intermediate
time_estimation: 2H
requirements_json: []
tags_json: ["[DIA]"]
content_hash: f6b735dd4bad363b7568e45adbf22e97
last_modified: 2026-05-27T09:01:49.453368
zenodo_link: https://zenodo.org/record/4307762
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/DIA_Analysis_OSW/tutorial.html

content:
This training covers data independent acquisition (DIA) mass spectrometry (MS) applying spectral libraries for peptide identification and quantification.
You can learn how to prepare and optimize a spectral library for the analysis of DIA data in the[DIA library generation tutorial]({{site.baseurl}}/topics/proteomics/tutorials/DIA_lib_OSW/tutorial.html).

The proteome refers to the entirety of proteins in a biological system (e.g cell, tissue, organism). Proteomics is the large-scale experimental analysis of proteins and proteomes, most often performed by mass spectrometry that enables great sensitivity and throughput. Especially for complex protein mixtures, bottom-up mass spectrometry is the standard approach. In bottom-up proteomics, proteins are digested with a specific protease into peptides and the measured peptides are in silico reassembled into the corresponding proteins. Inside the mass spectrometer, not only the peptides are measured (MS1 level), but the peptides are also fragmented into smaller peptides which are measured again (MS2 level). This is referred to as tandem-mass spectrometry (MS/MS). Identification of peptides is performed by peptide spectrum matching of the theoretical spectra generated from the input protein database (fasta file) with the measured MS2 spectra. Peptide quantification is most often performed by measuring the area under the curve of the MS1 level peptide peaks, but special techniques such as TMT allow to quantify peptides on MS2 level. Nowadays, bottom-up tandem-mass spectrometry approaches allow for the identification and quantification of several thousand proteins.

In clinical proteomic studies often two or more conditions should be compared against each other, thus focusing on the proteins which were found in all conditions. Using the data dependent acquisition (DDA) approach could lead to limited numbers of cumulative proteins, due to method instrinsic dependencies (e.g. if the same peptides is selected for fragmentation in all measurements).
Over the last decade another acquisition method has been developed addressing the urgent need for increased cumulatively identified and quantified peptides and proteins across multiple measurements ({% cite Ludwig2018 %}). The so called data independent acquisition (DIA) circumvents the time and abundance dependent selection for fragmentation by using predefined fragmentation windows (m/z windows) going through the whole m/z range of the previous MS1 scan.
![DIA_window_schema](../../images/DIA_analysis_window.png "Measurement principles of DIA and m/z window schema of staggered DIA windows.")


Therefore, all peptides which are present in the same m/z window at the same time are fragmented simultaneously and a MS2 spectra containing fragments from multiple peptides is acquired. Using the same m/z windows for all measurements, results in more reproducible fragmentation and potential identification across multiple measurements.
However, the resulting MS2 spectra contain fragments from multiple peptides and are often more complex and do not allow to directly link a specific (m/z) mass from the MS1 to a single MS2 fragment spectra.
![DIA_vs_DDA](../../images/DIA_analysis_MS2.png "The MS2 scans in the DIA approach contain fragment ions from multiple precursors and are therefore more complex than the precursor-specific MS2 scans in DDA.")

To allow for the identification of peptides in those ambiguous MS2 spectra, a spectral library can be used. The spectral library contains experimentally measured  MS2 spectra, which are specific for one precursor (from previous DDA measurements). In more recent approaches the MS2 spectra can be predicted based on theoretical peptide sequences (e.g. from a protein database).
![DIA_basics](../../images/DIA_analysis_basic.png "Spectral libraries are necesseary for the identification of peptides in DIA MS2 scans. In this example the spectral library is generated based on DDA data from the same samples.")

One of the open-source software options for DIA data analysis is *OpenSwath* ({% cite Rost2014 %}), which requires a spectral library, retention time alignment peptides as well as the DIA MS data.

The dataset in this tutorial consists of two different Spike-in mixtures of human and Ecoli peptides, with an increase of the Ecoli peptides in one of the Spike-ins. For each Spike-in there a four replicate measurements to allow for statistical analysis later on. Here we will go through the data analysis of DIA mass spectrometry data and will get first impressions on which of the Spike-ins might contain higher amounts of Ecoli peptides.


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

## Get data

> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this tutorial and give it a meaningful name
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. Import the fasta and raw files as well as the sample annotation and the iRT Transition file from [Zenodo](https://zenodo.org/record/4307762) iRT Transition file contains information about the transitions of the Indexed Retention Time (iRT) standard peptides. These peptides are a set of synthetic peptides with well-defined and stable retention times across different liquid chromatography-mass spectrometry (LC-MS) systems.
>    ```
>    https://zenodo.org/record/4307762/files/HEK_Ecoli_lib.pqp
>    https://zenodo.org/record/4307762/files/iRTassays.tsv
>    https://zenodo.org/record/4307762/files/Sample_annotation.txt
>    https://zenodo.org/record/4307762/files/Sample1.raw
>    https://zenodo.org/record/4307762/files/Sample2.raw
>    https://zenodo.org/record/4307762/files/Sample3.raw
>    https://zenodo.org/record/4307762/files/Sample4.raw
>    https://zenodo.org/record/4307762/files/Sample5.raw
>    https://zenodo.org/record/4307762/files/Sample6.raw
>    https://zenodo.org/record/4307762/files/Sample7.raw
>    https://zenodo.org/record/4307762/files/Sample8.raw
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
> 3. Once the files are green, rename the sample annotation file in 'Sample_annotation', the spectral library in 'HEK_Ecoli_lib', the iRT transition file in 'iRTassays' and the raw files in 'Sample1.raw', 'Sample2.raw', 'Sample3.raw', 'Sample4.raw', 'Sample5.raw', 'Sample6.raw', 'Sample7.raw' and 'Sample8.raw'
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
> 4. Generate a collection for all .raw files (and name it DIA_data)
>
>    {% snippet faqs/galaxy/collections_build_list.md %}
>
{: .hands_on}

# raw File conversion with **msconvert**

> <hands-on-title>Converting vendor specific raw to open mzML format</hands-on-title>
>
> 1. {% tool [msconvert Convert and/or filter mass spectrometry files](toolshed.g2.bx.psu.edu/repos/galaxyp/msconvert/msconvert/3.0.20287.6) %}
>    - {% icon param-collection %} *"Input unrefined MS data"*: `DIA_data`
>    - *"Do you agree to the vendor licenses?"*: `Yes`
>    - *"Output Type"*: `mzML`
>    - In *"Data Processing Filters"*:
>        - *"Apply peak picking?"*: `Yes`
>        - *"Demultiplex overlapping or MSX spectra"*: `Yes`
>            - *"Optimization"*: `Overlap only`
>    - In *"General Options"*:
>        - *"SIM as Spectra"*: `Yes`
>        - *"Ignore unknown instrument error"*: `Yes`
>    - In *"Output Encoding Settings"*:
>        - *"Intensity Encoding Precision"*: `64`
>
>
>    > <comment-title>Demultiplexing</comment-title>
>    >Demultiplexing is needed when the MS2 m/z windows of consecutive scan cycles are overlapping e.g. for the staggered approach (50% shift between the cycles).
>    {: .comment}
>
{: .hands_on}


# DIA analysis using **OpenSwathWorkflow**

> <hands-on-title>DIA analysis using OpenSwathWorkflow</hands-on-title>
>
> 1. {% tool [OpenSwathWorkflow Complete workflow to run OpenSWATH](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_openswathworkflow/OpenSwathWorkflow/3.1+galaxy0) %}
>    - {% icon param-collection %} *"Input files separated by blank"*: `DIA_data` (output of **msconvert** {% icon tool %})
>    - {% icon param-file %} *"transition file ('TraML','tsv','pqp')"*: `HEK_Ecoli_lib`
>    - {% icon param-file %} *"transition file ('TraML')"*: `iRTassays`
>    - *"Extraction window in Thomson or ppm (see mz_extraction_window_unit)"*: `10.0`
>    - *"Extraction window used in MS1 in Thomson or ppm (see mz_extraction_window_ms1_unit)"*: `10.0`
>    - In *"Parameters for the RTNormalization for iRT petides"*:
>        - *"Which outlier detection method to use (valid: 'iter_residual', 'iter_jackknife', 'ransac', 'none')"*: `none`
>        - *"Whether the algorithms should try to choose the best peptides based on their peak shape for normalization"*: `Yes`
>        - *"Minimal number of bins required to be covered"*: `7`
>    - In *"Scoring parameters section"*:
>        - In *"TransitionGroupPicker"*:
>            - *"Minimal peak width (s), discard all peaks below this value (-1 means no action)"*: `5.0`
>            - *"Tries to compute a quality value for each peakgroup and detect outlier transitions"*: `Yes`
>        - In *"Scores"*:
>            - *"Use the MI (mutual information) score"*: `No`
>    - *"Advanced Options"*: `Show Advanced Options`
>        - *"Output an XIC with a RT-window by this much large"*: `100.0`
>        - *"Extraction window used for iRT and m/z correction in Thomson or ppm (see irt_mz_extraction_window_unit)"*: `10.0`
>        - *"Whether to run OpenSWATH directly on the input data, cache data to disk first or to perform a datareduction step first"*: `cacheWorkingInMemory`
>        - *"Use the retention time normalization peptide MS2 masses to perform a mass correction (linear, weighted by intensity linear or quadratic) of all spectra"*: `regression_delta_ppm`
>    - *"Optional outputs"*: `out_osw`
>
>    > <comment-title>Mass tolerances and "Minimal number of bins required to be covered"</comment-title>
>    >Here we analyze data acquired on a QExactive Plus MS instrument which uses an Orbitrap and generates high resolution data. Therefore, we allow for 10 ppm mass tolerance for both the MS1 and the MS2 level. If larger mass deviation are expected the mass tolerances can be adjusted. Other instrumentation (such as TOF devices) might require larger mass tolerances for improved peptide identification. Furthermore, here we require at least 7 of the iRT peptides to be found in each of the DIA measurements. This number can be set to lower values if for some reasons fewer iRT peptides were found in some of the measurements. In case only a few iRT peptides are identified in the DIA measurements, the mass tolerance for the iRT extraction can be increased to 20 ppm. We then recommend to increase the extraction window for the MS2 level to 20 ppm. For more information see also [OpenSwathWorkflow](http://openswath.org/en/latest/docs/openswath.html).
>    {: .comment}
>
{: .hands_on}


## Combining osw results using **PyProphet merge**

> <hands-on-title>Combining the individual osw results with pyprophet merge</hands-on-title>
>
> 1. {% tool [PyProphet merge Merge multiple osw files](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_merge/pyprophet_merge/2.1.4.0) %} 
>    - {% icon param-collection %} *"Input file"*: `out_osw` (output of **OpenSwathWorkflow** {% icon tool %})
>    - {% icon param-file %} *"Template osw file"*: `HEK_Ecoli_lib`
>
{: .hands_on}


# FDR estimation using **PyProphet score**

> <hands-on-title>Semi-supervised learning and scoring of OpenSwathWorkflow results</hands-on-title>
>
> 1. {% tool [PyProphet score Error-rate estimation for MS1, MS2 and transition-level data](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_score/pyprophet_score/2.1.4.2) %} 
>    - {% icon param-file %} *"Input file"*: `merged.osw` (output of **PyProphet merge** {% icon tool %})
>    - *"Either a 'LDA' or 'XGBoost' classifier is used for semi-supervised learning"*: `XGBoost`
>
>    > <comment-title>FDR scoring using pyprophet score</comment-title>
>    >During this step q-values corresponding to the FDR of peak identification is estimated with pyprophet. Typically this is the most time consuming step due to the involved machine learning processes. To decrease the input size one can use **PyProphet subsample** to randomly select subsets of the identifications from each run in the merged.osw (**PyProphet merge** output). In this case, the FDR estimation needs to be applied on the full merged.osw afterwards using the scored subsample.osw in the *"Apply PyProphet score weights file (osw format) instead of semi-supervised learning."* section of **PyProphet score**. The generated report.pdf is helpful to identify potential errors as well as get first insights on the quality of the identifications.
>    {: .comment}
>
{: .hands_on}

> <tip-title>Continue with results from Zenodo</tip-title>
>
> In case the pyprophet score run is not yet finished, the results can be downloaded from Zenodo to be able to continue the tutorial
> 1. Import the files from [Zenodo](https://zenodo.org/record/4307762)
>    ```
>    https://zenodo.org/record/4307762/files/PyProphet_score_report.pdf
>    https://zenodo.org/record/4307762/files/PyProphet_score.osw
>    ```
{: .tip}

> <question-title></question-title>
>
> 1. Does the distribution of target identifications differ from the decoy distribution?
> 2. Is the observed distribution of decoy and target identifications expected?
>
> > <solution-title></solution-title>
> >
> > 1. Yes, we can see a clearly different distribution of the target identification and the decoys. Both, target and decoy distribution were highest around 0. However, the target distribution shows a second peak at positive d-score values.
> > 2. The decoy identifications show a Gaussian distribution around 0 which could be explained by the fact that the decoy sequences were randomly generated alterations from the target sequences in the spectral library (see [DIA library generation tutorial]({{site.baseurl}}/topics/proteomics/tutorials/DIA_lib_OSW/tutorial.html)). Most target identifications show also d-scores around 0, thus reflect potential false positive identifications. Only the distribution of target identifications shows a second increase in higher d-score values, representing more confident identifications.
> >
> {: .solution}
>
{: .question}


## Apply scores with **PyProphet peptide**

> <hands-on-title>Conduct peptide inference in experiment-wide and global context</hands-on-title>
>
> 1. {% tool [PyProphet peptide Peptide error-rate estimation](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_peptide/pyprophet_peptide/2.1.4.0) %} 
>    - {% icon param-file %} *"Input file"*: `score.osw` (output of **PyProphet score** {% icon tool %})
>    - *"Context to estimate protein-level FDR control"*: `experiment-wide`
>
> 2. {% tool [PyProphet peptide Peptide error-rate estimation](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_peptide/pyprophet_peptide/2.1.4.0) %} 
>    - {% icon param-file %} *"Input file"*: `peptide.osw` (output of **PyProphet peptide** {% icon tool %})
>    - *"Context to estimate protein-level FDR control"*: `global`
>
>
{: .hands_on}


## Apply scores with **PyProphet protein**

> <hands-on-title>Conduct protein inference in experiment-wide and global context</hands-on-title>
>
> 1. {% tool [PyProphet protein Protein error-rate estimation](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_protein/pyprophet_protein/2.1.4.0) %}
>    - {% icon param-file %} *"Input file"*: `peptide.osw` (output of the second **PyProphet peptide** {% icon tool %})
>    - *"Context to estimate protein-level FDR control"*: `experiment-wide`
>
> 2. {% tool [PyProphet protein Protein error-rate estimation](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_protein/pyprophet_protein/2.1.4.0) %} 
>    - {% icon param-file %} *"Input file"*: `protein.osw` (output of **PyProphet protein** {% icon tool %})
>    - *"Context to estimate protein-level FDR control"*: `global`
>
{: .hands_on}

> <question-title></question-title>
>
> 1. How does the score distribution differ between the peptide and the protein inference (in global context)?
> 2. What could be the reason for this difference?
>
> > <solution-title></solution-title>
> >
> > 1. The d-score distribution and the ROC curve for the protein inference shows better target decoy discriminatory ability than for the peptide inference.
> > 2. The probabilty of multiple decoy peptides from the same protein having a high score is lower than for multiple target peptides from the same protein. Thus, the discriminatory scores on protein level are higher.
> >
> {: .solution}
>
{: .question}


## Exporting the results with **PyProphet export**

> <hands-on-title>Exporting pyprophet scored OSW results</hands-on-title>
>
> 1. {% tool [PyProphet export Export tabular files, optional swath2stats export](toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_export/pyprophet_export/2.1.4.1) %} 
>    - {% icon param-file %} *"Input file"*: `protein.osw` (output of the second **PyProphet protein** {% icon tool %})
>    - *"Export format, either matrix, legacy_split, legacy_merged (mProphet/PyProphet) or score_plots format"*: `legacy_merged`
>    - *"Use swath2stats to export file for statsics"*: `yes`
>        - {% icon param-file %} *"Study design tabular file"*: `Sample_annotation`
>
>    > <comment-title>PyProphet export and the swath2stats functionality</comment-title>
>    >All previous FDR scoring steps using **PyProphet peptide** and **PyProphet protein** are integrated in the respective `.osw` output. Therefore, the latest `protein.osw` can be used for the export step. If peptide and protein FDR scoring was performed in the global context, the exported results will be filtered to 1% FDR by default. For more information see also [PyProphet](http://openswath.org/en/latest/docs/pyprophet.html). Utilizing the swath2stats functionality generates a summary as well as a peptide and protein expression matrix. In addition to the non-processed pyprophet tabular output a refined tabular is generated using the specified criteria. The refined tabular `msstats_input.tabular` is dircetly compatable with **MSstats** for statistical analysis. The integration of swath2stats also allows to adjust the processing by applying different FFT and FDR settings as well as specifying a minimum number of peptides per protein. For more information see also [Swath2stats](https://bioconductor.org/packages/release/bioc/html/SWATH2stats.html).
>    {: .comment}
>
{: .hands_on}

> <question-title></question-title>
>
> 1. How many different peptides and proteins were identified and quantified?
> 2. Could you already tell from the summary which Spike-in contained higher amounts of Ecoli peptides?
>
> > <solution-title></solution-title>
> >
> > 1. In total, over 28,041 peptides and over 5,056 proteins were identified and quantified in the DIA measurements.
> > 2. No, the summary mainly provides an overview of the identifications in each individual DIA measurement as well as some descriptive statistics such as CVs and correlations.
> >
> {: .solution}
>
{: .question}

> <hands-on-title>Analysis of Ecoli Spike-in</hands-on-title>
>
> 1. {% tool [Select lines that match an expression ](Grep1) %} 
>    - {% icon param-file %} *"Select lines from"*: `protein_signal.tabular` (output of **PyProphet export** {% icon tool %})
>    - *"that"*: `Matching`
>    - *"the pattern"*: `(ECOLI)|(Spike_in)`
>
{: .hands_on}

> <question-title></question-title>
> 1. How many Ecoli proteins were identified and quantified in the six DIA measurements?
> 2. Can you guess which Spike-in contains higher amounts of Ecoli peptides?
>
> > <solution-title></solution-title>
> > 1. Over 817 Ecoli proteins were identified and quantified in the six DIA measurements.
> > 2. It seems that the samples in Spike_in_2 contained higher amounts of Ecoli peptides than the samples in Spike_in_1.
> {: .solution }
{: .question}


# Conclusion


![DIA_analysis_pipe](../../images/DIA_analysis_sum.png "All-in one workflow for DIA analysis in Galaxy. The DIA data analysis using OpenSwathWorkflow is highlighted in yellow.")

Using **OpenSwathWorkflow** and a spectral library (from DDA data) we were able to analyze data independent acquisition (DIA) data. Furthermore, we were able to process the FDR scored results and take a guess on which Spike-in contained higher amounts of Ecoli. To further investigate the two different Spike-in amounts as well as getting a significant result we would need to perform statistical analysis e.g. using **MSstats**.

![DIA_OSW_galaxy](../../images/DIA_analysis_workflow.png "Galaxy worfklow containing all necessary steps for the analysis of DIA data using a spectral library and OpenSwathWorkflow")

tools_json:
["msconvert Convert and/or filter mass spectrometry files", "toolshed.g2.bx.psu.edu/repos/galaxyp/msconvert/msconvert/3.0.20287.6", "OpenSwathWorkflow Complete workflow to run OpenSWATH", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_openswathworkflow/OpenSwathWorkflow/3.1+galaxy0", "PyProphet merge Merge multiple osw files", "toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_merge/pyprophet_merge/2.1.4.0", "PyProphet score Error-rate estimation for MS1, MS2 and transition-level data", "toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_score/pyprophet_score/2.1.4.2", "PyProphet peptide Peptide error-rate estimation", "toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_peptide/pyprophet_peptide/2.1.4.0", "PyProphet protein Protein error-rate estimation", "toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_protein/pyprophet_protein/2.1.4.0", "PyProphet export Export tabular files, optional swath2stats export", "toolshed.g2.bx.psu.edu/repos/galaxyp/pyprophet_export/pyprophet_export/2.1.4.1", "Select lines that match an expression", "Grep1"]


topic: proteomics
tutorial: metaquantome-function
title: metaQuantome 2: Function
difficulty: intermediate
time_estimation: 1h
requirements_json: []
tags_json: ["[microgalaxy]"]
content_hash: b69edb6284d8af75119c7600c886aacc
last_modified: 2026-05-15T22:28:14.462965
zenodo_link: https://doi.org/10.5281/zenodo.4110725
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/metaquantome-function/tutorial.html

content:
metaQuantome software suite {% cite Easterly2019 %} was developed by the {% cite Galaxy-P %} for quantitative and statistical analysis of metaproteomics data. For taxonomic and functional expression analysis within the microbial community, metaQuantome leverages peptide-level quantitative information to generate visual outputs for data interpretation. It also generates outputs that help in understanding the taxonomic contribution to a selected function as well as functions expressed by selected taxonomic group.

In this tutorial, we will learn specifically about the metaQuantome Function workflow. In particular, we will learn about how peptide-level quantitation and associated functional information can be used to generate bar plots (for functional information such as molecular function, cellular components and biological processes), volcano plots (to detect differentially expressed function) and heatmap cluster analysis. To demonstrate the use of this workflow, we have used a thermophilic biogas reactor dataset wherein municipal food waste and manure is digested to generate methane gas ({% cite Delogu2020 %}). After one round in the reactor, the microbial community was simplified and enriched via serial dilution. This inoculum was then transferred to a solution of cellulose from Norwegian Spruce and incubated at 65°C. Triplicate samples were taken in a time series from 0 to 43 hours after inoculation and mass spectrometry data was acquired on a Q-Exactive (Thermo) mass spectrometer. For this training, we have chosen three time points (8 hours, 18 hours and 33 hours) from this dataset.

![MetaQuantome-function-workflow](../../images/mQ-function-workflow.jpg "MetaQuantome workflow showing steps to generate visualisations and analysis results from input data."){: width="100%"}


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}


# Pretreatments

The first step in this tutorial is to get the data from the Zenodo link provided and make sure that it is in the correct format.


## Get data

> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this tutorial and give it a meaningful name
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
>    {% snippet faqs/galaxy/histories_rename.md %}
>
> 2. Import the files from [Zenodo]({{ page.zenodo_link }}): a Functional File and an Intensity file.
>
>
>    ```
>    https://zenodo.org/record/4110725/files/Function-File.tabular
>    https://zenodo.org/record/4110725/files/Intensity-File.tabular
>
>    ```
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    Alternatively, import the files from the shared data library (`GTN - Material` -> `{{ page.topic_name }}` -> `{{ page.title }}`)
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
>
>
{: .hands_on}

# Download metaQuantome Databases

> <hands-on-title>Run metaQuantome databases</hands-on-title>
>
> 1. {% tool [metaQuantome: databases](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_db/metaquantome_db/2.0.0-0) %} with the following parameters:
>    - {% icon param-select %} *"Databases to Download"*: `Select All` (NCBI Taxonomy Database, Gene Ontology Database and Enzyme Commission (EC) database)
>
>
>    > <comment-title></comment-title>
>    >
>    > metaQuantome uses freely available bioinformatic databases to expand your set of direct annotations.
>    >
>    >
>    > The databases are:
>    >
>    > 1. NCBI taxonomy database. consists of a list of all currently identified taxa and the relationships between them.
>    >
>    > 2. Gene Ontology (GO) term database. metaQuantome uses the go-basic.obo file and the metagenomics slim GO (subset of the full GO). More details are
>    > available at http://geneontology.org/docs/download-ontology/
>    >
>    > 3. ENZYME database with Enzyme Classification (EC) numbers. This database classifies enzymes and organizes the relationships between them.
>    >
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Why is it necessary to download metaQuantome databases?
> 2. Can these databases be downloaded from other sources?
>
> > <solution-title></solution-title>
> >
> > 1. metaQuantome databases help the metaQuantome:expand tool to co-relate information your have provided in your input files according to the GO term, taxa or EC databases and its relationship .
> > 2. For metaQuantome, we use freely available databases. This module downloads the most recent releases of the specified databases and stores them in a single file, which can then be accessed by the rest of the metaQuantome modules. For reference, the taxonomy database is the largest (~500 Mb), while the GO and EC databases are smaller: ~34 Mb and ~10Mb, respectively. Also, note that the databases will be stored in the history so that the date of download can be referenced later. Thus, the databases will not be modified, except for the NCBI database.
> >
> {: .solution}
>
{: .question}

# Create metaQuantome sample file

The create samples file module is used to generate the samples file input file for the metaQuantome workflow. This input file is used to specify the column names used for each experimental group. These column names are referenced when handling the input data and performing statistical analysis.

> <hands-on-title>Create an experimental Design file for sorting samples</hands-on-title>
>
> 1. {% tool [metaQuantome: create samples file](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_sample/metaquantome_sample/2.0.0-0) %} with the following parameters:
>    - {% icon param-select %} *"Sample file creation method"*: `Manually specify experimental conditions and samples`
>    - In *"Insert Samples"*:
>        - *"1.Samples"*:
>            - *"Group Name"*: `T2`
>               - *"Column"*: `T2_A1,T2_B1`
>        - *"2.Samples"*:
>            - *"Group Name"*: `T4`
>               - *"Column"*: `T4A_1,T4B_1`
>        - *"3.Samples"*:
>            - *"Group Name"*: `T7`
>               - *"Column"*: `T7A_1,T7B_1`
>
>
{: .hands_on}


# Run metaQuantome


## metaQuantome: expand

The expand module is the first analysis step in the metaQuantome analysis workflow, and can be run to analyze differently expressed functions in the samples.
In function mode, the following information is required apart from metaQuantome databases and samples file:
- The name of the peptide column in the functional annotation file (`peptide`)
- The name of the functional annotation column in the functional annotation file (`go_term`)
- The name of the peptide column in the Intensity file (`peptide`)

> <hands-on-title>Run metaQuantome expand</hands-on-title>
>
> 1. {% tool [metaQuantome: expand](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_expand/metaquantome_expand/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Database Archive File"*: `metaQuantome databases` (output of **metaQuantome: database** {% icon tool %})
>    - {% icon param-file %} *"Samples file"*: `metaQuantome: create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - {% icon param-file %} *"Functional file"*: `Function File` (Input dataset)
>        - *"Functional file: peptide column name"*: `peptide`
>        - *"Ontology"*: `Gene Ontology (GO terms)`
>        - *"Functional column name"*: `go_term`
>    - {% icon param-file %} *"Intensity file"*: `Intensity File` (Input dataset)
>        - *"Intensity file: peptide column name"*: `peptide`
>
> 2. **Rename** {% icon galaxy-pencil %} the output file to `metaQuantome expand`.
>
>
>
>
>    > <comment-title></comment-title>
>    > The structure of the output file depends on the analysis mode and the experimental design, but the columns generally look like this, with one row for each term:
>    >
>    > | term id | info about term. (one or more columns) | mean term intensity (by sample group)            | term intensity (by sample)                                                      | number of unique peptides (by sample) | number of sample children in each sample |
>    > |---------|----------------------------------------|--------------------------------------------------|---------------------------------------------------------------------------------|---------------------------------------|------------------------------------------|
>    > | term1   | name, rank, etc.                       | note that this is the log2 of the mean intensity | this is the log2 of term intensity in each sample. Missing data is coded as NA. | integer. 0 is coded as NA             | integer. 0 is coded as NA                |
>    > |         |                                        |                                                  |                                                                                 |                                       |                                          |
>    {: .comment}
>
{: .hands_on}


##  metaQuantome: filter

The filter module is the second step in the metaQuantome workflow. The filter module filters the expanded terms to those that are representative of the data according to the sample parameters the user has specified.

> <hands-on-title>Filtering the expanded data</hands-on-title>
>
> 1. {% tool [metaQuantome: filter](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_filter/metaquantome_filter/2.0.0-0) %} with the following parameters:
>    - *"Mode"*: `Functional analysis`
>        - *"Ontology"*: `Gene Ontology (GO terms)`
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - {% icon param-file %} *"metaquantome expand file"*: `metaQuantome:expand` (output of **metaQuantome: expand** {% icon tool %})
>    - *"min_peptides"*: `1`
>    - *"min_pep_nsamp"*: `1`
>    - *"min_children_non_leaf"*: `2`
>    - *"min_child_nsamp"*: `1`
>    - *"qthreshold"*: `2`
>
>
> 2. **Rename** {% icon galaxy-pencil %} the output file to `metaQuantome:Filter`.
>
>
>    > <comment-title></comment-title>
>    >
>    > To learn more about the filter module please read the metaQuantome paper published by Galaxy-P {% cite Easterly2019 %}.
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Can we change the filter parameters?
>
> > <solution-title></solution-title>
> >
> > 1. The parameters can be changed according to the experimental design or depending on the data.
> >
> {: .solution}
>
{: .question}

##  metaQuantome: stat

> <hands-on-title>Statistical analysis of the filtered data on multiple conditions.</hands-on-title>
>
> 1. {% tool [metaQuantome: stat](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_stat/metaquantome_stat/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - {% icon param-file %} *"metaquantome expanded or filtered file"*: `metaQuantome:Filter` (output of **metaQuantome: filter** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - *"Ontology"*: `Gene Ontology (GO terms)`
>    - *"Name of the control sample group of control (used as denominator for fold change evaluation)."*: `T2`
>    - *"Statistical test to perform"*: `standard t-test (parametric)`
>    - *"Perform paired tests"*: `Yes`
>
>
> 2. **Rename** {% icon galaxy-pencil %} the output file to `metaQuantome:stat`.
>
>    > <comment-title></comment-title>
>    >
>    > In this tutorial, we have used the sample T2 as the control group for fold change evaluation. The users have the ability to choose their own control sample group. The initial version of the metaQuantome stat module could only process 2 conditions at a time. However, the new update of metaQuantome has the ability to perform statistical analysis across multiple conditions.
>    {: .comment}
>
{: .hands_on}

# Visualize your Data

The  outputs of the visualization module of metaQuantome are high-quality, publication-ready visualizations: barplots for the analysis of a single sample or experimental condition and differential abundance analysis, volcano plots, heatmaps, and principal components analysis for comparisons between two or more experimental conditions.
Here were are showing 2 visualizations: **Barplot and Volcano Plot**. The Heatmap and PCA plot for multiple conditions are under development.
There are two outputs of the visualization tool : an **HTML file (figure) and a tabular output containing the plot data**.

## metaQuantome: visualize Bar Chart

> <hands-on-title>Bar chart visualization of Functions in T2 sample.</hands-on-title>
>
> 1. {% tool [metaQuantome: visualize](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_viz/metaquantome_viz/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Tabular file from metaQuantome stats or metaQuantome filter"*: `metaQuantome:stat` (output of **metaQuantome: stat** {% icon tool %})
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: stat** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - *"Plot type"*: `Bar Chart (bar)`
>            - *"Mean intensity column name"*: `T2_mean`
>            - *"GO category to restrict to"*: `Molecular Function`
>            - *"Color for the bar fill"*: `Orange`
>
>    > <comment-title></comment-title>
>    > The user has a choice to run Bar plot for T2, T4 and T7 to know the top 5 or 10 most differently expressed functions. Here we have restricted the GO category to Molecular Function but the user can choose Biological Processes or Cellular component as their category.
>    >
>    {: .comment}
>
{: .hands_on}

![T2_MF](../../images/T2-mf.png "Top five differentially expressed Molecular Function GO terms for sample T2."){: width="85%"}

> <question-title></question-title>
>
> 1. Can we select any color for the bar chart?
> 2. Can we increase the number of terms to display?
>
> > <solution-title></solution-title>
> >
> > 1. Yes, the available colors are blue, orange, yellow, violet, black and red.
> > 2. Yes, the user can choose their own number, however, the larger the display numbers are the dimensions of the image has to be adjusted accordingly.
> >
> {: .solution}
>
{: .question}



> <hands-on-title>Bar chart visualization of Functions in T4 sample.</hands-on-title>
>
> 1. {% tool [metaQuantome: visualize](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_viz/metaquantome_viz/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Tabular file from metaQuantome stats or metaQuantome filter"*: `metaQuantome:stat` (output of **metaQuantome: stat** {% icon tool %})
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - *"Plot type"*: `Bar Chart (bar)`
>            - *"Mean intensity column name"*: `T4_mean`
>            - *"GO category to restrict to"*: `Molecular Function`
>            - *"Color for the bar fill"*: `Orange`
>
{: .hands_on}
![T4_MF](../../images/T4-mf.png "Top five differentially expressed Molecular Function GO terms for sample T4."){: width="85%"}



> <hands-on-title>Bar chart visualization of Functions in T7 sample.</hands-on-title>
>
> 1. {% tool [metaQuantome: visualize](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_viz/metaquantome_viz/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Tabular file from metaQuantome stats or metaQuantome filter"*: `metaQuantome:stat` (output of **metaQuantome: stat** {% icon tool %})
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - *"Plot type"*: `Bar Chart (bar)`
>            - *"Mean intensity column name"*: `T7_mean`
>            - *"GO category to restrict to"*: `Molecular Function`
>            - *"Color for the bar fill"*: `Orange`
>
>
{: .hands_on}
![T7_MF](../../images/T7-mf.png "Top five differentially expressed Molecular Function GO terms for sample T7."){: width="85%"}

## metaQuantome: visualize Volcano Plots

> <hands-on-title>Volcano Plot visualization of the data T7 and T2.</hands-on-title>
>
> 1. {% tool [metaQuantome: visualize](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_viz/metaquantome_viz/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Tabular file from metaQuantome stats or metaQuantome filter"*: `metaQuantome:stat` (output of **metaQuantome: stat** {% icon tool %})
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - *"Plot type"*: `Volcano Plot (volcano)`
>            - *"Name of the fold change column in the stat dataframe"*: `log2fc_T7_over_T2`
>            - *"Name of the Corrected p-value column in the stat dataframe"*: `corrected_p_T7_over_T2`
>            - *"Name of the annotation column"*: `id`
>        - {% icon param-select %} *"Flip the fold change (i.e., multiply log fold change by -1)"*: `No`
>        - {% icon param-select %} *"Make one plot for each of BiologicalProcess, CellularComponent, and MolecularFunction GO term categories"*: `Yes`
>
>    > <comment-title></comment-title>
>    >
>    > Here, we show metaQuantome's Functional differential abundance volcano plot. The user may select the significance threshold (0.05 by default), and terms with statistically significant fold changes are colored green and labeled. However, we can currently only compare two conditions at a time. Here we have compared T7 and T2 time points.
>    {: .comment}
>
{: .hands_on}
![T2-T7-volcano](../../images/T2-T7-volcano.png "Volcano Plot of differentially expressed Go-term in T2 and T7."){: width="100%"}


> <question-title></question-title>
>
> 1. Can we choose to Flip the fold change?
> 2. Could we create a single volcano plot for all the functions than splitting into different categories?
>
> > <solution-title></solution-title>
> >
> > 1. Certainly, the user has the ability to flip the fold changes.
> > 2. Yes, the Go term that passes the threshold value will be represented in green. The user can then find out from the tabular output which category the GO term belonged to.
> >
> {: .solution}
>
{: .question}



> <hands-on-title>Volcano Plot visualization of the data T4 and T2.</hands-on-title>
>
> 1. {% tool [metaQuantome: visualize](toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_viz/metaquantome_viz/2.0.0-0) %} with the following parameters:
>    - {% icon param-file %} *"Tabular file from metaQuantome stats or metaQuantome filter"*: `metaQuantome:stat` (output of **metaQuantome: stat** {% icon tool %})
>    - {% icon param-file %} *"Samples file"*: `metaQuantome:create samples_file` (output of **metaQuantome: create samples file** {% icon tool %})
>    - *"Mode"*: `Functional analysis`
>        - *"Plot type"*: `Volcano Plot (volcano)`
>            - *"Name of the fold change column in the stat dataframe"*: `log2fc_T4_over_T2`
>            - *"Name of the Corrected p-value column in the stat dataframe"*: `corrected_p_T4_over_T2`
>            - *"Name of the annotation column"*: `id`
>        - {% icon param-select %} *"Flip the fold change (i.e., multiply log fold change by -1)"*: `No`
>        - {% icon param-select %} *"Make one plot for each of BiologicalProcess, CellularComponent, and MolecularFunction GO term categories"*: `Yes`
>
{: .hands_on}
![T2-T4-volcano](../../images/T2-T4-volcano.png "Volcano Plot of differentially expressed Go-term in T2 and T4."){: width="100%"}

# Conclusion


This completes the walkthrough of the metaQuantome function workflow. This tutorial is a guide to run the metaQuantome modules and can be used for metaproteomics research. Here, we have incorporated only two visualization modules in this workflow but we will make the heatmap and PCA plot also available. Researchers can use this workflow with their data also, please note that the tool parameters and the workflow will be needed to be modified accordingly. Also, refer to the metaQuantome data creation workflow to understand how to make files metaQuantome compatible.

This workflow was developed by the Galaxy-P team at the University of Minnesota. For more information about Galaxy-P or our ongoing work, please visit us at [galaxyp.org](https://galaxyp.org)

{: .comment}

tools_json:
["metaQuantome: databases", "toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_db/metaquantome_db/2.0.0-0", "metaQuantome: create samples file", "toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_sample/metaquantome_sample/2.0.0-0", "metaQuantome: expand", "toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_expand/metaquantome_expand/2.0.0-0", "metaQuantome: filter", "toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_filter/metaquantome_filter/2.0.0-0", "metaQuantome: stat", "toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_stat/metaquantome_stat/2.0.0-0", "metaQuantome: visualize", "toolshed.g2.bx.psu.edu/repos/galaxyp/metaquantome_viz/metaquantome_viz/2.0.0-0"]


topic: proteomics
tutorial: clinical-mp-3-verification
title: Clinical Metaproteomics 3: Verification
difficulty: intermediate
time_estimation: 3H
requirements_json: []
tags_json: ["[label-TMT11]"]
content_hash: 57dfeaab22bca56c0134b9ccb961a7f3
last_modified: 2026-05-27T09:01:49.453901
zenodo_link: https://doi.org/10.5281/zenodo.10105821
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/clinical-mp-3-verification/tutorial.html

content:
In proteomic research, the primary goal is to obtain accurate and meaningful insights into the proteome of a biological system. Verifying the presence of peptides or proteins is a critical step in achieving this goal, ensuring the quality and reliability of the data and the biological relevance of the findings. This tutorial is a sequel to the clinical metaproteomics discovery workflow. Once you have identified microbial peptides, the next step is to verify these peptides, for which we use PepQuery.

The PepQuery tool is used to validate the identified microbial peptides from SearchGUI/PeptideShaker and MaxQuant, to ensure that they are indeed of microbial origin and that human peptides were not misassigned. To do this, all confident microbial peptides from the two database search algorithms were merged and searched against the Human UniProt Reference proteome (with Isoforms) and cRAP databases.

Interestingly, the PepQuery tool does not rely on searching peptides against a reference protein sequence database as “traditional” shotgun proteomics does, which enables it to identify novel, disease-specific sequences with sensitivity and specificity in its protein validation (Figure A). Then we extract microbial protein sequences that are assigned to the PepQuery verified peptides. To this, we again add the Human UniProt Reference proteome (with Isoforms) and cRAP databases for creating a database for quantitation purposes (Figure B).

![Peptide Verification]({% link topics/proteomics/images/clinical-mp/clinical-mp-verification-1.JPG %})

![Database generation from verified peptides]({% link topics/proteomics/images/clinical-mp/clinical-mp-verification-2.JPG %})


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

## Get data

> <hands-on-title> Data Upload </hands-on-title>
>
> 1. Create a new history for this tutorial
> 2. Import the files from [Zenodo]({{ page.zenodo_link }}) or from
>    the shared data library (`GTN - Material` -> `{{ page.topic_name }}`
>     -> `{{ page.title }}`):
>
>    ```
>    https://zenodo.org/records/10105821/files/PTRC_Skubitz_Plex2_F10_9Aug19_Rage_Rep-19-06-08.mgf
>    https://zenodo.org/records/10105821/files/PTRC_Skubitz_Plex2_F11_9Aug19_Rage_Rep-19-06-08.mgf
>    https://zenodo.org/records/10105821/files/PTRC_Skubitz_Plex2_F13_9Aug19_Rage_Rep-19-06-08.mgf
>    https://zenodo.org/records/10105821/files/PTRC_Skubitz_Plex2_F15_9Aug19_Rage_Rep-19-06-08.mgf
>    https://zenodo.org/records/10105821/files/SGPS_Peptide_Report.tabular
>    https://zenodo.org/records/10105821/files/MaxQuant_Peptide_Report.tabular
>    https://zenodo.org/records/10105821/files/Distinct_Peptides_for_PepQuery.tabular
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
> 3. Rename the datasets
> 4. Check that the datatype
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="datatypes" %}
>
> 5. Add to each database a tag corresponding to input files.
> 6. Users can create a database collection of the MGF files.
>
>    {% snippet faqs/galaxy/datasets_add_tag.md %}
>
{: .hands_on}


# Import Workflow

> <hands-on-title>Running the Workflow</hands-on-title>
>
> 1. **Import the workflow** into Galaxy:
>
>    {% snippet faqs/galaxy/workflows_run_trs.md path="topics/proteomics/tutorials/clinical-mp-3-verification/workflows/WF3_Verification_Workflow.ga" title="Verification Workflow" %}
>
> 2. Run **Workflow** {% icon workflow %} using the following parameters:
>    - *"Send results to a new history"*: `No`
>    - {% icon param-file %} *" Input MGFs Dataset Collection "*: `MGF dataset collection`
>    - {% icon param-file %} *" SGPS_peptide-report"*: `SGPS_Peptide_Report.tabular`
>    - {% icon param-file %} *" Distinct Peptides for PepQuery"*: `Distinct_Peptides_for_PepQuery.tabular`
>    - {% icon param-file %} *" MaxQuant-peptide-report "*: `MaxQuant_Peptide_Report.tabular`
>
>    {% snippet faqs/galaxy/workflows_run.md %}
>
{: .hands_on}


# Extraction of Microbial Peptides from SearchGUI/PeptideShaker and MaxQuant
Now that we have identified microbial peptides from SearchGUI/PeptideShaker and MaxQuant, we need to extract the microbial peptide sequences and group them to obtain a list of distinct microbial peptides. This list of distinct peptides will be used as input for PepQuery2 to verify confident microbial peptides.

First, we will use the Cut tool to select the peptide and protein columns from the SearchGUI/PeptideShaker and MaxQuant Peptide Reports. Then we use Remove header lines from SGPS and MaxQuant to prepare for concatenation with Remove beginning.

> <hands-on-title> Extracting peptides </hands-on-title>
>
> 1. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c6,c2`
>    - {% icon param-file %} *"From"*: `output` (Input dataset)
>
>
> 2. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c1,c35`
>    - {% icon param-file %} *"From"*: `output` (Input dataset)
>
>
> 3. {% tool [Remove beginning](Remove beginning1) %} with the following parameters:
>    - {% icon param-file %} *"from"*: `out_file1` (output of **Cut** {% icon tool %})
>
>
> 4. {% tool [Remove beginning](Remove beginning1) %} with the following parameters:
>    - {% icon param-file %} *"from"*: `out_file1` (output of **Cut** {% icon tool %})
>
>
{: .hands_on}


## Concatenate peptides from MaxQuant and SGPS for PepQuery2

We will now concatenate the peptide and protein datasets from SearchGUI/PeptideShaker and MaxQuant. Later, we will generate a list of confident peptides using PepQuery2. The list of confident peptides will be searched against the concatenated peptide-protein datasets from SearchGUI/PeptideShaker and MaxQuant to generate a list of verified peptides.

> <hands-on-title> Concatenate SGPS and MaxQuant peptides </hands-on-title>
>
> 1. {% tool [Concatenate datasets](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_cat/0.1.1) %} with the following parameters:
>    - {% icon param-files %} *"Datasets to concatenate"*: `out_file1` (output of **Remove beginning** {% icon tool %}), `out_file1` (output of **Remove beginning** {% icon tool %})
>
>
{: .hands_on}


## Creating input database for PepQuery2

We generate and merge Human UniProt (with Isoforms) and contaminants (cRAP) to make an input database for PepQuery2.

> <hands-on-title> FASTA Merge Files and Filter Unique Sequences</hands-on-title>
>
> 1. {% tool [FASTA Merge Files and Filter Unique Sequences](toolshed.g2.bx.psu.edu/repos/galaxyp/fasta_merge_files_and_filter_unique_sequences/fasta_merge_files_and_filter_unique_sequences/1.2.0) %} with the following parameters:
>    - *"Run in batch mode?"*: `Merge individual FASTAs (output collection if input is collection)`
>        - In *"Input FASTA File(s)"*:
>            - {% icon param-repeat %} *"Insert Input FASTA File(s)"*
>                - {% icon param-file %} *"FASTA File"*: `Human UniProt+Isoforms FASTA` (output of **Protein Database Downloader** {% icon tool %})
>                - - {% icon param-file %} *"FASTA File"*: `cRAP database` (output of **Protein Database Downloader** {% icon tool %})
>
>
{: .hands_on}



## Peptide verification
The PepQuery2 tool will be used to validate the identified microbial peptides from SearchGUI/PeptideShaker and MaxQuant to ensure that they are indeed of microbial origin and that human peptides were not misassigned. We will use the list of `Distinct Peptides` (from the [Discovery Module](https://github.com/subinamehta/training-material/blob/main/topics/proteomics/tutorials/clinical-mp-discovery/tutorial.md)), `Human UniProt+Isoforms+cRAP database`, and our `MGF file collection` as inputs for PepQuery2. The outputs we are interested in are the four PSM Rank (txt) files (one for each MGF file).

Interestingly, the PepQuery2 tool does not rely on searching peptides against a reference protein sequence database as “traditional” shotgun proteomics does, which enables it to identify novel, disease-specific sequences with sensitivity and specificity in its protein validation. More information about PepQuery is available, including the first {% cite Wen2019 %} and second iterations {% cite Wen2023 %}.


> <hands-on-title> Peptide verification </hands-on-title>
>
> 1. {% tool [PepQuery2](toolshed.g2.bx.psu.edu/repos/galaxyp/pepquery2/pepquery2/2.0.2+galaxy0) %} with the following parameters:
>    - *"Validation Task Type"*: `novel peptide/protein validation`
>    - In *"Input Data"*:
>        - *"Input Type"*: `peptide`
>            - *"Peptides?"*: `Peptide list from your history`
>                - {% icon param-file %} *"Peptide Sequences (.txt)"*: `output` (Input dataset)
>        - *"Protein Reference Database from"*: `history`
>            - {% icon param-file %} *"Protein Reference Database File"*: `output` (output of **FASTA Merge Files and Filter Unique Sequences** {% icon tool %})
>        - *"MS/MS dataset to search"*: ` Spectrum Datasets from history`
>            - {% icon param-collection %} *"Spectrum File"*: `output` (Input dataset collection)
>        - *"Report Spectrum Scan as"*: `spectrum title in MGF`
>    - In *"Modifications"*:
>        - *"Fixed modification(s)"*: `1: Carbamidomethylation of C [57.02146372057]` `13: TMT 11-plex of K [229.16293213472]` `14: TMT 11-plex of peptide N-term [229.16293213472]`
>        - *"Variable modification(s)"*: `2: Oxidation of M [15.99491461956]`
>        - *"Use more stringent criterion for unrestricted modification searching"*: `Yes`
>        - *"Consider amino acid substitution modifications?"*: `Yes`
>    - In *"Digestion"*:
>        - *"Enzyme"*: `Trypsin`
>        - *"Max Missed Cleavages"*: `2`
>    - In *"Mass spectrometer"*:
>        - In *"Tolerance"*:
>            - *"Precursor Tolerance"*: `10`
>            - *"Precursor Unit"*: `ppm`
>            - *"Tolerance"*: `0.6`
>        - In *"PSM"*:
>            - *"Fragmentation Method"*: `CID/HCD`
>            - *"Scoring Method"*: `HyperScore`
>            - *"Minimum Charge"*: `2`
>            - *"Maximum Charge"*: `6`
>
>
{: .hands_on}

# Collapsing all the data

Remember that PepQuery2 generates a PSM Rank file for each input MGF file, so we will have four PSM Rank files. To make the analysis more efficient, we will collapse these four PSM Rank files into one dataset.


> <hands-on-title> Collasping PSM rank files into a singular dataset using Collapse Collection </hands-on-title>
>
> 1. {% tool [Collapse Collection](toolshed.g2.bx.psu.edu/repos/nml/collapse_collections/collapse_dataset/5.1.0) %} with the following parameters:
>    - {% icon param-file %} *"Collection of files to collapse into single dataset"*: `psm_rank_txt` (output of **PepQuery2** {% icon tool %})
>    - *"Keep one header line"*: `Yes`
>
>
{: .hands_on}



## Filtering out confident peptides

Now, we want to filter for confident peptides from PepQuery2 and prepare them for the Query Tabular tool.

> <hands-on-title> Filter </hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `output` (output of **Collapse Collection** {% icon tool %})
>    - *"With following condition"*: `c20=='Yes'`
>    - *"Number of header lines to skip"*: `1`
>
>
{: .hands_on}


> <hands-on-title> Remove header line from filtered PepQuery peptides with Remove beginning </hands-on-title>
>
> 1. {% tool [Remove beginning](Remove beginning1) %} with the following parameters:
>    - {% icon param-file %} *"from"*: `out_file1` (output of **Filter** {% icon tool %})
>
>
{: .hands_on}


> <hands-on-title> Cut (select out) peptide sequences from PepQuery output with Cut </hands-on-title>
>
> 1. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c1`
>    - {% icon param-file %} *"From"*: `out_file1` (output of **Remove beginning** {% icon tool %})
>
>
{: .hands_on}


##  **Querying verified peptides**

We will use the Query Tabular tool {% cite Johnson2019 %} to search the PepQuery-verified peptides against the concatenated dataset that contains peptides and proteins from SearchGUI/Peptide and MaxQuant. This step ensures all the PepQuery-verified peptides are assigned to their protein/protein groups.

> <hands-on-title> Querying verified peptides </hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.0) %} with the following parameters:
>    - In *"Database Table"*:
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `out_file1` (output of **Cut** {% icon tool %})
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `pep`
>                - *"Specify Column Names (comma-separated list)"*: `mpep`
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `out_file1` (output of **Concatenate datasets** {% icon tool %})
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `prot`
>                - *"Specify Column Names (comma-separated list)"*: `pep,prot`
>    - *"SQL Query to generate tabular output"*: `select pep.mpep, prot.prot
>    `FROM pep
>    INNER JOIN  prot on pep.mpep=prot.pep `
>    - *"include query result column headers"*: `Yes`
>    `
>
>
> > <comment-title>SQL Query information</comment-title>
> >  The query input files are the list of peptides and the peptide report we obtained from MaxQuant and SGPS. The query is matching each peptide (m.pep) from the PepQuery results to the peptide reports so that each verified peptide has its protein/protein group assigned to it.
> {: .comment}
{: .hands_on}

> <hands-on-title> Remove Header with Remove beginning </hands-on-title>
>
> 1. {% tool [Remove beginning](Remove beginning1) %} with the following parameters:
>    - {% icon param-file %} *"from"*: `output` (output of **Query Tabular** {% icon tool %})
>
>
{: .hands_on}


Using the Group tool, we can select distinct (unique) peptides and proteins from the Query Tabular tool.

> <hands-on-title> Extract distinct peptides with Group </hands-on-title>
>
> 1. {% tool [Group](Grouping1) %} with the following parameters:
>    - {% icon param-file %} *"Select data"*: `out_file1` (output of **Remove beginning** {% icon tool %})
>    - *"Group by column"*: `c1`
>    - In *"Operation"*:
>        - {% icon param-repeat %} *"Insert Operation"*
>            - *"Type"*: `Concatenate Distinct`
>            - *"On column"*: `c2`
>
>
{: .hands_on}


## Retrieve UniProt IDs for distinct peptides

Again, we will use the Query Tabular tool to retrieve UniProt IDs (accession numbers) for the distinct (grouped) peptides.

> <hands-on-title> Query Tabular </hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.0) %} with the following parameters:
>    - In *"Database Table"*:
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `out_file1` (output of **Group** {% icon tool %})
>            - In *"Filter Dataset Input"*:
>                - In *"Filter Tabular Input Lines"*:
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `normalize list columns, replicates row for each item in list`
>                            - *"enter column numbers to normalize"*: `2`
>                            - *"List item delimiter in column"*: `;`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `regex replace value in column`
>                            - *"enter column number to replace"*: `2`
>                            - *"regex pattern"*: `(tr|sp)[|]`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `regex replace value in column`
>                            - *"enter column number to replace"*: `2`
>                            - *"regex pattern"*: `[ ]+`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `regex replace value in column`
>                            - *"enter column number to replace"*: `2`
>                            - *"regex pattern"*: `[|].*$`
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `t1`
>                - *"Use first line as column names"*: `Yes`
>                - *"Specify Column Names (comma-separated list)"*: `pep,prot`
>    ` *"SQL Query to generate tabular output"*: `SELECT distinct(prot) AS Accession
>       from t1`
>        - *"include query result column headers"*: `No`
>
>
{: .hands_on}


> <question-title></question-title>
>
> 1. What is the accession number of a protein?
> 2. Can there be multiple accession numbers for one peptide or protein?
>
> > <solution-title></solution-title>
> >
> > 1. An accession number of a protein, also called a protein accession number, is a unique identifier assigned to a specific protein sequence in a protein sequence database. These accession numbers are used to reference and catalog proteins in a standardized and systematic manner
> >
> > 2. Yes, a single peptide or protein can have multiple accession numbers, particularly when dealing with different protein sequence databases, databases for specific species, or different versions of the same database. That's the reason in our workflow we merge both accession and sequences.
> {: .solution}
>
{: .question}


## Generate FASTA database from UniProt IDs
Using the UniProt IDs from Query Tabular, we will be able to generate a FASTA database for our PepQuery-verified peptides.

> <hands-on-title> UniprotXML-downloader </hands-on-title>
>
> 1. {% tool [UniProt](toolshed.g2.bx.psu.edu/repos/galaxyp/uniprotxml_downloader/uniprotxml_downloader/2.4.0) %} with the following parameters:
>    - *"Select"*: `A history dataset with a column containing Uniprot IDs`
>        - {% icon param-file %} *"Dataset (tab separated) with ID column"*: `output` (Input dataset)
>        - *"Column with ID"*: `c1`
>        - *"Field"*: `Accession`
>    - *"uniprot output format"*: `fasta`
>
>
{: .hands_on}


## Generating compact database

Lastly, we will merge the Human UniProt (with isoforms), contaminants (cRAP) and the PepQuery-verified FASTA databases into one Quantitation Database that will be used as input for the [Quantification Module](https://github.com/subinamehta/training-material/blob/main/topics/proteomics/tutorials/clinical-mp-quantitation/tutorial.md).

> <hands-on-title> Generation of Compact Verified Database with UniProt </hands-on-title>
>
> 1. {% tool [FASTA Merge Files and Filter Unique Sequences](toolshed.g2.bx.psu.edu/repos/galaxyp/fasta_merge_files_and_filter_unique_sequences/fasta_merge_files_and_filter_unique_sequences/1.2.0) %} with the following parameters:
>    - *"Run in batch mode?"*: `Merge individual FASTAs (output collection if input is collection)`
>        - In *"Input FASTA File(s)"*:
>            - {% icon param-repeat %} *"Insert Input FASTA File(s)"*
>                - {% icon param-file %} *"FASTA File"*: `proteome` (output of **UniProt** {% icon tool %})
>
>
{: .hands_on}


# Conclusion

A peptide verification workflow is a critical step in proteomic research that enhances data reliability, quantitative accuracy, and biological understanding by confirming the presence and validity of selected peptides. It is a pivotal quality control process that ensures the trustworthiness of proteomic findings and supports downstream investigations. By completing this tutorial, you have not only verified the microbial peptides but also created a database consisting of protein sequences from the PepQuery-verified peptides. The need of such a database is to ensure that when we quantify our proteins and peptides we are reducing the introduction of false positives. This database will be now used for quantitation purposes.

tools_json:
["Cut", "Cut1", "Remove beginning", "Remove beginning1", "Concatenate datasets", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_cat/0.1.1", "FASTA Merge Files and Filter Unique Sequences", "toolshed.g2.bx.psu.edu/repos/galaxyp/fasta_merge_files_and_filter_unique_sequences/fasta_merge_files_and_filter_unique_sequences/1.2.0", "PepQuery2", "toolshed.g2.bx.psu.edu/repos/galaxyp/pepquery2/pepquery2/2.0.2+galaxy0", "Collapse Collection", "toolshed.g2.bx.psu.edu/repos/nml/collapse_collections/collapse_dataset/5.1.0", "Filter", "Filter1", "Query Tabular", "toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.0", "Group", "Grouping1", "UniProt", "toolshed.g2.bx.psu.edu/repos/galaxyp/uniprotxml_downloader/uniprotxml_downloader/2.4.0"]


topic: proteomics
tutorial: metaquantome-data-creation
title: metaQuantome 1: Data creation
difficulty: intermediate
time_estimation: 1h
requirements_json: []
tags_json: ["[microgalaxy]"]
content_hash: 313a055927bb9800cd619792810a9fea
last_modified: 2026-05-15T22:28:14.461723
zenodo_link: https://doi.org/10.5281/zenodo.4037137
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/metaquantome-data-creation/tutorial.html

content:
Metaproteomics {% cite Metaproteomics_video %} involves the characterization of community-level expression of microbial proteins from an environmental
or clinical sample. Metaproteomics data {% cite Metaproteomics_community_effort %} {% cite Jagtap2015 %} is primarily used to determine the functional status of the microbiome under study along with its taxonomic composition. The [Galaxy-P](http://galaxyp.org/) {% cite Galaxy-P_Metaproteomics %} team published a software suite named metaQuantome {% cite Easterly2019 %} to enable quantitative and statistical analysis and visualization of functional,
taxonomic expression as well as functional and taxonomy interaction. metaQuantome leverages peptide-level quantitative information to analyze the taxonomic, functional expression within the microbial community in different conditions.

![Microbiome](../../images/microbiome.png){: width="75%"}

metaQuantome offers differential abundance analysis, principal components analysis, and clustered heat map visualizations,
across multiple experimental conditions. metaQuantome, an open-source tool, is available via the command line and also
accessible via Galaxy platform for reproducible analysis. As a first step for metaQuantome analysis, metaproteomics
data needs to be made compatible for subsequent analysis. With this in mind, we have developed a metaQuantome data
generation workflow tutorial that will help users generate inputs for metaQuantome analysis.

![Workflow](../../images/metaquantomeworkflow.png){: width="75%"}

To demonstrate the use of the data creation workflow, we have used a thermophilic biogas reactor dataset wherein municipal
food waste and manure is digested to generate methane gas. After one round in the reactor, the microbial community was
simplified and enriched via serial dilution. This inoculum was then transferred to a solution of cellulose from Norwegian
Spruce and incubated at 65°C. Triplicate samples were taken in a time series from 0 to 43 hours after inoculation and mass
spectrometry data was acquired on a Q-Exactive (Thermo) mass spectrometer. For this training, we have chosen two time points 8-hour and 33-hour.

![Dataset](../../images/biogasdataset.png){: width="75%"}

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Pretreatments

The first step in a tutorial is to get the data from the zenodo link provided and making sure that it is in the correct format.

## Get data

> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this tutorial and give it a meaningful name
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
>    {% snippet faqs/galaxy/histories_rename.md %}
>
> 2. Import the files: 6 MZML files, a Protein FASTA file, and an Experimental Design file from [Zenodo]({{ page.zenodo_link }})
>    or from the shared data library (`GTN - Material` -> `{{ page.topic_name }}` -> `{{ page.title }}`)
>
>    ```
>    https://zenodo.org/record/4037137/files/ExperimentalDesign.tsv
>    https://zenodo.org/record/4037137/files/ProteinDB_cRAP.fasta
>    https://zenodo.org/record/4037137/files/T2_A1.mzml
>    https://zenodo.org/record/4037137/files/T2_B1.mzml
>    https://zenodo.org/record/4037137/files/T7A_1.mzml
>    https://zenodo.org/record/4037137/files/T7B_1.mzml
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
>
> 3. Rename the datasets (If needed)
> 4. Check that the datatype ( Make sure they are in the correct formats).
> 6 MZML files (format=`mzml`, a Protein FASTA file (format=`fasta`), and an Experimental Design file (format=`tabular`)
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="datatypes" %}
>
> 5. Add to each database a tag corresponding to the name of the input data (optional).
> 6. Build a **Dataset list** for the four mzml files.
>    - Click the {% icon galaxy-selector %} **Select Items** check box at the top of the history panel
>
>    {% snippet faqs/galaxy/collections_build_list.md %}
>
> 7. Rename the dataset collection as `MZML dataset collection`.
>
{: .hands_on}

We have a choice to run all these steps using a single workflow, then discuss each step and the results in more detail.

> <hands-on-title>Pretreatments</hands-on-title>
>
> 1. **Import the workflow** into Galaxy:
>
>    {% snippet faqs/galaxy/workflows_run_trs.md path="topics/proteomics/tutorials/metaquantome-data-creation/workflows/main_workflow.ga" title="Pretreatments" %}
>
>
> 2. Run **Workflow** {% icon workflow %} using the following parameters:
>    - *"Send results to a new history"*: `No`
>    - {% icon param-file %} *"1: Input Dataset collection"*: `MZML dataset collection`
>    - {% icon param-file %} *"2: Experimental Design"*: `Experimental Design.tsv`
>    - {% icon param-file %} *"3: FASTA_db"*: `ProteinDB_cRAP.fasta`
>    - {% icon param-file %} *"4: In FlashLFQ - control condition for Bayesian protein fold-change analysis"*: `S1`
>
>    {% snippet faqs/galaxy/workflows_run.md %}
>
{: .hands_on}


# Match peptide sequences

For this, the sequence database-searching program called [SearchGUI](https://compomics.github.io/projects/searchgui.html) will be used.
The created dataset collection of the four *MZML files* in the history has to be first converted to MGF to be used as the MS/MS input.


## Convert mzml to MGF with msconvert

msconvert is used in order to convert the input file type, a mzml data collection, to a mgf file type.
The mgf file type can then be used as the Input Peak Lists when running SearchGUI.

> <hands-on-title>mzml to MGF</hands-on-title>
>
> 1. {% tool [msconvert](toolshed.g2.bx.psu.edu/repos/galaxyp/msconvert/msconvert/3.0.19052.0) %} with the following parameters:
>    - {% icon param-collection %} *"Input unrefined MS data"*: `MZML dataset collection`
>    - *"Do you agree to the vendor licenses?"*: `Yes`
>    - *"Output Type"*: `mgf`
>    - In *"Data Processing Filters"*:
>        - *"Apply peak picking?"*: `Yes`
>        - *"Apply m/z refinement with identification data?"*: `No`
>        - *"(Re-)calculate charge states?"*: `No`
>        - *"Filter m/z Window"*: `No`
>        - *"Filter out ETD precursor peaks?"*: `No`
>        - *"De-noise MS2 with moving window filter"*: `No`
>    - In *"Scan Inclusion/Exclusion Filters"*:
>        - *"Filter MS Levels"*: `No`
>    - In *"General Options"*:
>        - *"Sum adjacent scans"*: `No`
>        - *"Output multiple runs per file"*: `No`
>
>
>    > <comment-title></comment-title>
>    > This is a critical step for running this workflow.
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Why do we need to convert the files to MGF?
> 2. Can we use any other input format?
>
> > <solution-title></solution-title>
> >
> > 1. The files have to be converted to MGF for this workflow because we use SearchGUI as the searching tool and it can only read MGF files.
> > 2. Yes, we can also use RAW files as input and just convert RAW files to MGF.
> >
> {: .solution}
>
{: .question}

##  *Search GUI*
SearchGUI is a tool that searches sequence databases on any number of MGF files. In this case, the previously made collection of three MGF files (entitles MGF files) will be used as the MS/MS input. This tool will produce an output file, called a SearchGUI archive file. This file will serve as in input for the next tool used, PeptideShaker.

> <hands-on-title>Search sequence databases</hands-on-title>
> 1. {% tool [Search GUI](toolshed.g2.bx.psu.edu/repos/galaxyp/peptideshaker/search_gui/3.3.10.1) %} with the following parameters:
>    - {% icon param-file %} *"Protein Database"*: `ProteinDB_cRAP.fasta`
>    - {% icon param-file %} *"Input Peak Lists (mgf)"*: `output` (output of **msconvert** {% icon tool %})
>    - In *"Search Engine Options"*:
>        - *"DB-Search Engines"*: `X!tandem`
>    - In *"Protein Digestion Options"*:
>        - *"Digestion"*: `Trypsin`
>        - *"Maximum Missed Cleavages"*: `2`
>    - In *"Precursor Options"*:
>        - *"Fragment Tolerance"*: `0.2`
>        - *"Maximum Charge"*: `6`
>    - In *"Protein Modification Options"*:
>        - *"Fixed Modifications"*: `Carbamidomethylation of C`
>        - *"Variable Modifications"*: `Oxidation of M, Acetylation of Protein N-term`
>    - In *"Andvanced Options"*:
>        - *"SearchGUI Options"*: `Default`
>        - *"X!Tandem Options"*: `Advanced`
>            - *"X!Tandem: Quick Acetyl"*: `No`
>            - *"X!Tandem: Quick Pyrolidone"*: `No`
>            - *"X!Tandem: Maximum Valid Expectation Value"*: `100.0`
>            - *"X!Tandem peptide model refinement"*: `Don't refine`
>        - *"OMSSA Options"*: `Default`
>        - *"MSGF Options"*: `Default`
>        - *"MS Amanda Options"*: `Default`
>        - *"TIDE Options"*: `Default`
>        - *"MyriMatch Options"*: `Default`
>        - *"Comet Options"*: `Default`
>        - *"DirectTag Options"*: `Default`
>        - *"Novor Options"*: `Default`
>
>
>
>    > <comment-title></comment-title>
>    >
>    >  Note that sequence databases used for metaproteomics are usually much larger than the excerpt used in this tutorial. When using large databases, the peptide identification step can take much more time for computation. In metaproteomics, choosing the optimal database is a crucial step of your workflow, for further reading see [Timmins-Schiffman et al (2017)](https://www.ncbi.nlm.nih.gov/pubmed/27824341). To learn more about database construction in general, like integrating contaminant databases or using a decoy strategy for FDR searching, please consult our tutorial on [Database Handling]({{site.baseurl}}/topics/proteomics/tutorials/database-handling/tutorial.html).
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. How many Search Engines can be used?
> 2. Can the parameters be manipulated?
>
> > <solution-title></solution-title>
> >
> > 1. There are 8 database search algorithms, you can use as many as you want. Ideally, 4 database algorithms gives the best results.
> > 2. Yes, The parameters can be manipulated according to the experimental design of the datasets.
> >
> {: .solution}
>
{: .question}

##  *Peptide Shaker*

[PeptideShaker](https://compomics.github.io/projects/peptide-shaker.html) is a post-processing software tool that processes data from the SearchGUI software tool. PeptideShaker is a search engine for interpretation of proteomics identification results from multiple search engines, currently supporting X!Tandem, MS-GF+, MS Amanda, OMSSA, MyriMatch, Comet, Tide, Mascot, Andromeda and mzIdentML. More specifically, PeptideShaker processes data from  the SearchGUI tool through the organization of Peptide-Spectral Matches (PSMs) generated. In addition to organization, it provides an assessment of confidence of the data and generates outputs that can be visualized by users to interpret the results.

> <hands-on-title>Interpretation of SearchGUI</hands-on-title>
> 1. {% tool [Peptide Shaker](toolshed.g2.bx.psu.edu/repos/galaxyp/peptideshaker/peptide_shaker/1.16.36.3) %} with the following parameters:
>    - {% icon param-file %} *"Compressed SearchGUI results"*: `searchgui_results` (output of **Search GUI** {% icon tool %})
>    - *"Specify Advanced PeptideShaker Processing Options"*: `Advanced Processing Options`
>        - *"The PTM probabilistic score to use for PTM localization"*: `A-score`
>    - *"Specify Advanced Filtering Options"*: `Advanced Filtering Options`
>        - *"Maximum Peptide Length"*: `60`
>    - *"Specify Contact Information for mzIdendML"*: `GalaxyP Project contact (Not suitable for PRIDE submission)`
>    - In *"Exporting options"*:
>        - *"Creates a mzIdentML file"*: `Yes`
>        - *"Compress results into a single zip file"*: `No`
>        - *"Reports to be generated"*: `PSM Report, Peptide Report, Protein Report, Certificate of Analysis,`
>
>
>
>    > <comment-title></comment-title>
>    >
>    > There are a number of choices for different data files that can be generated using
>    > PeptideShaker. A compressed file can be made containing all information needed to view the
>    > results in the standalone PeptideShaker viewer. A `mzidentML` file can be created that contains
>    > all peptide sequence matching information and can be utilized by compatible downstream
>    > software. Other outputs are focused on the inferred proteins identified from the PSMs, as well
>    > as phosphorylation reports, relevant if a phosphoproteomics experiment has been undertaken.
>    > More detailed information on peptide inference using SearchGUI and PeptideShaker can be found in
>    > our tutorial on [Peptide and Protein ID]({{site.baseurl}}/topics/proteomics/tutorials/protein-id-sg-ps/tutorial.html).
>    {: .comment}
>
{: .hands_on}


##  *Removing Contaminants*

> <hands-on-title>Remove contaminants from PSM report</hands-on-title>
> This Select tool is used to remove all the contaminants from the Peptide Spectral Match (PSM) search results.
>
> 1. {% tool [Select](Grep1) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `output_psm` (PSM report output of **Peptide Shaker** {% icon tool %})
>    - *"that"*: `NOT Matching`
>    - *"the pattern"*: `con_`
>
> 2. Rename {% icon galaxy-pencil %} to output file to `PSM_Report_no_contaminants`
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
{: .hands_on}

> <hands-on-title>Removing contaminants from Peptide report</hands-on-title>
>
>
> 1. {% tool [Select](Grep1) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `output_peptides` (Peptide Report output of **Peptide Shaker** {% icon tool %})
>    - *"that"*: `NOT Matching`
>    - *"the pattern"*: `con_`
>
> 2. Rename {% icon galaxy-pencil%} the output file to `Peptide_Report_no_contaminants`
>
>
>    > <comment-title></comment-title>
>    >
>    > In Proteomics, contamination is generally detected as peaks in spectra that did not originate
>    > from the samples and can be introduced in the sample from a variety of environmental sources or human error. Identification of these
>    > contaminants is critical to enable their removal before data analysis, mainly, to maintain the validity of conclusions
>    > drawn from statistical analyses. Thus, this selection tool helps us remove the contaminants that were identified in the spectral data.
>    {: .comment}
>
{: .hands_on}

> <question-title></question-title>
>
> 1. Why is removing contaminants important?
>
> > <solution-title></solution-title>
> >
> > 1. Ideally, we would like to remove known contaminants from our samples just to maintain discovering novel proteoforms in our sample.
> >
> {: .solution}
>
{: .question}


## Removing file extensions for Quantification
This is a data manipulation step to make the data compatible with other downstream processing tools. The Replace text tool replaces the .mgf extension from the PSM report so that it can be used as an input for FlashLFQ.

> <hands-on-title>Removing file extensions</hands-on-title>
>
>
> 1. {% tool [Replace Text in a specific column](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_replace_in_column/1.1.3) %} with the following parameters:
>    - {% icon param-file %} *"File to process"*: `PSM_Report_no_contaminants` (output of **Select** {% icon tool %})
>    - In *"Replacement"*:
>        - {% icon param-repeat %} *"Insert Replacement"*
>            - *"in column"*: `Column: 10`
>            - *"Find pattern"*: `.mzml.mgf`
> 2. Rename Input_for_FlashLFQ.
>
>
>
>    > <comment-title></comment-title>
>    >
>    > Replace Text searches given columns and finds and replaces patterns provided by the user.
>    > This tool is removing the extensions (.raw,.mzml,.mgf) in the spectral file column provided by the PeptideShaker tool. This step is critical for FlashLFQ to work.
>    {: .comment}
>
{: .hands_on}

## Extracting Peptide list

> <hands-on-title>Selecting peptide list</hands-on-title>
> This step selects the peptide column from the Select output ( where we have removed the contaminants)
>
> 1. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c6`
>    - {% icon param-file %} *"From"*: `Peptide_Report_no_contaminants` (output of **Select** {% icon tool %})
>
>2. Rename file as peptide_list.
{: .hands_on}

# Peptide Quantification

In this tutorial, we are using FlashLFQ as the quantitation tool. The user can choose to work with other quantitation tools, e.g. moFF and MaxQuant are available in Galaxy.

## FlashLFQ
[FlashLFQ](https://github.com/smith-chem-wisc/FlashLFQ) can quantify MS peaks in order to find the abundances of peptides. FlashLFQ is a fast label-free quantification algorithm. Additionally, the abundances of peptides within the sample can be compared between samples as further analysis beyond this workflow.

> <hands-on-title>Quantification</hands-on-title>
>
> 1. {% tool [FlashLFQ](toolshed.g2.bx.psu.edu/repos/galaxyp/flashlfq/flashlfq/1.0.3.0) %} with the following parameters:
>    - {% icon param-file %} *"identification file"*: `Input_for_FlashLFQ` (output of **Replace Text** {% icon tool %})
>    - {% icon param-collection %} *"spectrum files"*: `MZML dataset collection`
>    - *"match between runs"*: `Yes`
>    - *"Use experimental design for normalization or protein fold-change analysis"*: `Yes`
>        - {% icon param-file %} *"ExperimentalDesign.tsv"*: `ExperimentalDesign.tsv`
>        - *"Perform Bayesian protein fold-change analysis"*: `Yes`
>            - *"control condition for Bayesian protein fold-change analysis"*: `S1`
>
>
>    > <comment-title></comment-title>
>    >
>    > [FlashLFQ](https://github.com/smith-chem-wisc/FlashLFQ) is a label-free quantification tool for mass-spectrometry proteomics. It supports both .mzML and Thermo .raw file formats.
>    > To run FlashLFQ on Galaxy, there are three main input files:
>    > - PSM report from Peptide Shaker (`Input_for_FlashLFQ`)
>    > - MZML/ RAW spectrum files (`MZML dataset collection`)
>    > - Experimental Design File ( `ExperimentalDesign.tsv`)
>    >   The Experimental Design file should be a tabular file with a "File", "Condition", "Sample", "Fraction", and "Replicate" column. The "File" column should match your mzml spectrum file name.
>    {: .comment}
>
{: .hands_on}

> <question-title></question-title>
>
> 1. Can FlashLFQ be used with fractionated data?
>
> 2. Does FlashLFQ perform peptide and protein level quantification?
>
> > <solution-title></solution-title>
> >
> > 1. Yes, FlashLFQ can be used with fractionated datasets and multiple conditions
> >
> > 2. FlashLFQ performed both peptide level and protein level quantification. For protein level, FlashLFQ used Bayesian Fold change analysis.
> >
> {: .solution}
>
{: .question}

## Filtering peptides that are less than 50 amino acids

> <hands-on-title>Extracting peptides<50 amino acids</hands-on-title>
> This is a data manipulation tool. Here, we select those peptides with less than 50 amino acids in length.
>
> 1. {% tool [Filter data on any column using simple expressions ](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `peptide_list` (output of **Cut** {% icon tool %})
>    - *"With following condition"*: `len(c1)<=50`
>    - *"Number of header lines to skip"*: `1`
>
> 2. Rename as Unipept_peptide_list.
>
>    > <comment-title></comment-title>
>    > Unipept fails with peptides more than 50 amino acids in length, thus we decided to work with peptides that are less than 50 amino acids.
>    >
>    {: .comment}
>
{: .hands_on}


## Manipulating text for metaQuantome

> <hands-on-title>Text manipulation for metaQuantome intensity file</hands-on-title>
> Regex Find And Replace goes line by line through the input file and will remove any patterns specified by the user and replace them with expressions also specified by the user. In this case, Regex Find And Replace is being used on a FlashLFQ output file and manipulating the header to make it compatible with metaQuantome along with completely removing the N-terminus and C-terminus tag in the peptide sequences.
>
> 1. {% tool [Regex Find And Replace](toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regex1/1.0.0) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `QuantifiedPeptides` (output of **FlashLFQ** {% icon tool %})
>    - In *"Check"*:
>        - {% icon param-repeat %} *"Insert Check"*
>            - *"Find Regex"*: `Base Sequence`
>            - *"Replacement"*: `peptide`
>        - {% icon param-repeat %} *"Insert Check"*
>            - *"Find Regex"*: `Intensity_`
>        - {% icon param-repeat %} *"Insert Check"*
>            - *”Find Regex”*: `NH2-`
>            - *”Replacement”*: `leave it blank`
>        - {% icon param-repeat %} *"Insert Check"*
>            - *”Find Regex”*: `-COOH`
>            - *”Replacement”*: `leave it blank`
>
> 2. Rename the file as `Intensity`
>
{: .hands_on}

# Functional and Taxonomy annotation


## Unipept for taxonomy annotation

Unipept {% cite Mesuere2018 %} is used again to match tryptic peptides and find the taxonomy and lowest common ancestor of each peptide.

> <hands-on-title>Taxonomy annotation</hands-on-title>
>
> 1. {% tool [Unipept](toolshed.g2.bx.psu.edu/repos/galaxyp/unipept/unipept/4.0.0) %} with the following parameters:
>    - *"Unipept application"*: `pept2lca: lowest common ancestor`
>        - *"Equate isoleucine and leucine"*: `Yes`
>        - *"allfields"*: `Yes`
>    - *"Peptides input format"*: `tabular`
>        - {% icon param-file %} *"Tabular Input Containing Peptide column"*: `Unipept_peptide_list` (output of **Filter** {% icon tool %})
>        - *"Select column with peptides"*: `c1`
>    - *"Choose outputs"*: `Select all`
>
>
>
>    > <comment-title></comment-title>
>    >
>    > There are two Unipept in this workflow, One for taxonomy and other for function.
>    {: .comment}
>
{: .hands_on}


![Taxa](../../images/taxa.png){: width="75%"}

> <question-title></question-title>
>
> 1. Can any other taxonomy and functional tool be used apart from Unipept?
>
> > <solution-title></solution-title>
> >
> > 1. Yes, any tool can be used for taxonomy and functional output. Please make sure the output has the information that includes peptide,taxon_name, taxon_id, genus, species etc.
> >
> {: .solution}
>
{: .question}

The JSON output from the Taxonomy can be visualized using the visualize option and Select the Unipept Taxonomyviewer.

![Unipept-JSON](../../images/UnipeptJSON.png){: width="30%"}

![Taxa-viewer](../../images/unipept_taxonomy_viewer.png){: width="30%"}

![Output](../../images/UnipeptJSONoutput.png){: width="75%"}


## Unipept for Functional annotation

Unipept is used to match tryptic peptides and find the taxonomy and Functional annotation of the peptides. Unipept is used to match sample tryptic peptides to proteins using a fast-matching algorithm. Although Unipept can be accessed and used through the web page, the use of Unipept on Galaxy allows the production of output datasets including the peptide information to be used in sequential steps. Unipept requires a list containing the peptide sequences which was generated by Query Tabular.

> <hands-on-title>Functional annotation</hands-on-title>
>
> 1. {% tool [Unipept](toolshed.g2.bx.psu.edu/repos/galaxyp/unipept/unipept/4.3.0) %} with the following parameters:
>    - *"Unipept application"*: `peptinfo: Tryptic peptides and associated EC and GO terms and lowest common ancestor taxonomy`
>        - *"Equate isoleucine and leucine"*: `Yes`
>        - *"retrieve extra information"*: `Yes`
>        - *"group responses by GO namespace (biological process, molecular function, cellular component)"*: `Yes`
>        - *"allfields"*: `Yes`
>    - *"Peptides input format"*: `tabular`
>        - {% icon param-file %} *"Tabular Input Containing Peptide column"*: `Unipept_peptide_list` (output of **Filter** {% icon tool %})
>        - *"Select column with peptides"*: `c1`
>    - *"Choose outputs"*: `Select all`
>
>
>    > <comment-title></comment-title>
>    >
>    > There are two Unipept in this workflow, One for taxonomy and other for function. Please select all the output options from Unipept.
>    {: .comment}
>
> The JSON output from the Taxonomy can be visualized using the visualize option and Select the Unipept Taxonomyviewer.
>
>
{: .hands_on}

## Extracting EC values

> <hands-on-title>Extract EC numbers</hands-on-title>
> The cut tool cuts out specific columns from the dataset. In this case, the cut tool is being used to extract columns 1 (peptide) and 3 (EC number) from the dataset peptinfo EC.tsv output. This is a manipulation tool for metaQuantome's convenience.
>
> 1. {% tool [Cut](Cut1) %} with the following parameters:
>    - *"Cut columns"*: `c1,c3`
>    - {% icon param-file %} *"From"*: `output_ec_tsv` (output of **Unipept** {% icon tool %})
> 2. Rename EC_table.
{: .hands_on}


## Filtering confident peptides

Query Tabular is a tool that can load tabular data into a SQLite database. This step precedes UniPept, as a list containing the peptide sequences must be generated. In this step a list of gene ontology (GO) terms is being generated.

> <hands-on-title>Filtering confident peptides</hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.0.0) %} with the following parameters:
>    - In *"Database Table"*:
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `output_go_tsv` (output of **Unipept** {% icon tool %})
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `Goterm`
>                - *"Specify Column Names (comma-separated list)"*: `peptide,total_protein_count,go_term,protein_count,go_name,go_funct`
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT Goterm.*
>      FROM Goterm
>      WHERE ((1.0*Goterm.protein_count)/(1.0*Goterm.total_protein_count)) >= 0.05
>      ```
>    - *"include query result column headers"*: `Yes`
>
> 2. Rename as Unipept_Function.
>
>    > <comment-title></comment-title>
>    >
>    > In the Unipept API output, the threshold is set to 0.5% of the overall number of peptides unambiguously assigned to a taxon at a particular taxonomic rank level. Here in the Galaxy platform, we are using Query tabular to perform this filtering.
>    {: .comment}
>
{: .hands_on}


## Removing Hashtag from output

This step is to remove the hashtag from the Peptide header in the Unipept output.

> <hands-on-title>Remove # from peptide header</hands-on-title>
> 1. {% tool [Replace Text](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_replace_in_line/1.1.2) %} with the following parameters:
>    - {% icon param-file %} *"File to process"*: `Unipept_Function` (output of **Unipept** {% icon tool %})
>    - In *"Replacement"*:
>        - {% icon param-repeat %} *"Insert Replacement"*
>            - *"Find pattern"*: `#peptide`
>            - *"Replace with:"*: `peptide`
>
> 2. Rename file as All_functions
{: .hands_on}


## Filter - EC values

We are using this Query tabular to rename the output that we obtained from the Cut column tool.

> <hands-on-title>Extracting EC for metaQuantome</hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.0.0) %} with the following parameters:
>    - In *"Database Table"*:
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `EC_table` (output of **Cut** {% icon tool %})
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `ec`
>                - *"Specify Column Names (comma-separated list)"*: `peptide,go_ec`
>    - *"SQL Query to generate tabular output"*:
>      ```sql
>      SELECT *
>      FROM ec
>      ```
>    - *"include query result column headers"*: `Yes`
>
> 2. Rename file as go_ec
{: .hands_on}


## Filter - Biological Functions

The filter tool allows restriction of the dataset using simple conditional statements. This step is used to filter out the GO terms with biological processes and the corresponding number of peptides associated with these terms.


> <hands-on-title>Extracting biological processes for metaQuantome</hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `Unipept_Function` (output of **Query Tabular** {% icon tool %})
>    - *"With following condition"*: `c5=='biological process'`
>    - *"Number of header lines to skip"*: `1`
>
> 2. Rename file as `go_bp`
{: .hands_on}


![Biological Processes](../../images/biologicalprocess.png){: width="60%"}

## Filter - Cellular components

This step is used to filter out the GO terms with cellular components and the corresponding number of peptides associated with these terms.

> <hands-on-title>Extracting cellular component for metaQuantome</hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `Unipept_Function` (output of **Query Tabular** {% icon tool %})
>    - *"With following condition"*: `c5=='cellular component'`
>    - *"Number of header lines to skip"*: `1`
>
> 2. Rename file as `go_cc`
{: .hands_on}


![Cellular-Component](../../images/cellularcomponent.png){: width="60%"}

## Filter - Molecular Function

This step is used to filter out the GO terms with molecular function and the corresponding number of peptides associated with these terms.

> <hands-on-title>Extracting molecular function for metaQuantome</hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `Unipept_Function` (output of **Query Tabular** {% icon tool %})
>    - *"With following condition"*: `c5=='molecular function'`
>    - *"Number of header lines to skip"*: `1`
> 2. Rename file as `go_mf`
{: .hands_on}


![Molecular-Function](../../images/molecularfunction.png){: width="60%"}

# Conclusion


This completes the walkthrough of the metaQuantome data creation workflow. This tutorial is a guide to have datasets that are metaQuantome ready/compatible and can be used for metaproteomics research. We have incorporated only two conditions in this workflow but users can use as many as they want. Researchers can use this workflow with their data also, please note that the tool parameters and the workflow will be needed to be modified accordingly.

This workflow was developed by the Galaxy-P team at the University of Minnesota. For more information about Galaxy-P or our ongoing work, please visit us at [galaxyp.org](https://galaxyp.org)


{: .comment}

tools_json:
["msconvert", "toolshed.g2.bx.psu.edu/repos/galaxyp/msconvert/msconvert/3.0.19052.0", "Search GUI", "toolshed.g2.bx.psu.edu/repos/galaxyp/peptideshaker/search_gui/3.3.10.1", "Peptide Shaker", "toolshed.g2.bx.psu.edu/repos/galaxyp/peptideshaker/peptide_shaker/1.16.36.3", "Select", "Grep1", "Replace Text in a specific column", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_replace_in_column/1.1.3", "Cut", "Cut1", "FlashLFQ", "toolshed.g2.bx.psu.edu/repos/galaxyp/flashlfq/flashlfq/1.0.3.0", "Filter data on any column using simple expressions", "Filter1", "Regex Find And Replace", "toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regex1/1.0.0", "Unipept", "toolshed.g2.bx.psu.edu/repos/galaxyp/unipept/unipept/4.0.0", "toolshed.g2.bx.psu.edu/repos/galaxyp/unipept/unipept/4.3.0", "Query Tabular", "toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.0.0", "Replace Text", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_replace_in_line/1.1.2", "Filter"]


topic: proteomics
tutorial: mass-spectrometry-imaging-loading-exploring-data
title: Mass spectrometry imaging: Loading and exploring MSI data
difficulty: introductory
time_estimation: 45m
tools_json: []
requirements_json: []
tags_json: ["[mouse, imaging]"]
content_hash: 749954977477f11e9cdb6e125cdb1d9d
last_modified: 2026-05-27T09:01:49.455524
zenodo_link: https://doi.org/10.5281/zenodo.1560645
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/mass-spectrometry-imaging-loading-exploring-data/tutorial.html

content:
Mass spectrometry imaging (MSI) is applied to measure the spatial distribution of hundreds of biomolecules in a sample. A mass spectrometer scans over the entire sample and collects a mass spectrum every 5-200 µm. This results in thousands of spots in which a mass spectrum is acquired. Each mass spectrum consists of hundreds of analytes that are measured by their mass-to-charge (m/z) ratio. For each analyte the peak intensity in the mass spectra of every pixel is known and can be set together to map the spatial distribution of the analyte in the sample.

The technique has a broad range of applications as it is able to measure many different kinds of analytes such as peptides, proteins, metabolites or chemical compounds in a large variety of samples such as cells, tissues and liquid biopsies. Application areas include pharmacokinetic studies, biomarker discovery, molecular pathology, forensic studies, plant research and material sciences. The strength of MSI is the simultaneous analysis of hundreds of analytes in an unbiassed, untargeted, label free, fast and affordable measurement while maintaining morphological information.

Depending on the analyte of interest and the application, different mass spectrometers are used. A mass spectrometer measures the analytes by ionizing, evaporating and sorting them by their mass-to-charge (m/z) ratio. Put simply, a mass spectrometer needs basically three parts: an ionization source, a mass analyzer and a detector. Most common ionization sources for MSI are MALDI (Matrix Assisted Laser Desorption/Ionization), DESI (Desorption Electrospray Ionization) and SIMS (Secondary Ion Mass Spectrometry).

![MSI measurement](../../images/MSI1_maldi_tof_imaging.png "MALDI TOF imaging of a mouse kidney")

One common type of mass spectrometer for MSI is a MALDI Time-Of-Flight (MALDI-TOF) device. During MALDI ionization a laser shoots onto the sample that was covered with a special matrix which absorbs the laser energy and transfers it to the analytes. This process evaporizes and ionizes the analytes that due to their charge can then be accelerated in an electrical field towards the TOF tube. The time of flight through the tube to the detector is measured and as this correlates with the mass over charge (m/z) of the analyte, the flight time allows the calculation of m/z. During measurement complete mass spectra with hundreds of m/z - intensity pairs are acquired in thousands of sample plots leading to big and complex data. Each mass spectrum is annotated with coordinates (x,y) that define its location in the sample. This allows to visualize the intensity distribution of each m/z feature in the sample as a heatmap. Depending on the analyte of interest, the sample type and the mass spectrometer the sample preparation steps as well as the properties of the acquired data differ.

This tutorial introduces the handling of the mass spectrometry imaging (MSI) file type imzML in Galaxy and some first steps to explore the data.
The imzML file format was introduced to ease the exchange of MSI data between different instruments and data analysis software ({% cite Schramm_2012 %}). More and more vendors provide an imzML export option and there are [software solutions](https://ms-imaging.org/wp/imzml/software-tools/) to convert proprietary files into imzML files. Before starting any analysis it is recommended to visualize all features of the data in different ways to better understand the data and to obtain an idea about it's quality and usefulness.


> <agenda-title></agenda-title>
>
> In this tutorial, we will deal with:
>
> 1. TOC
> {:toc}
>
{: .agenda}


# Uploading an imzML file into Galaxy

In case no direct imzML export is provided by the mass spectrometer software, proprietary files can be converted to imzML files with the tools provided on the following website: [ms-imaging.org](https://ms-imaging.org/wp/imzml/software-tools/).
The imzML file consists of two files: The first file contains the metadata in an XML file and has the extension `.imzML`. The second file contains the mass spectra data and is saved as binary file and its extension is `.ibd`. To be valid both files must have the same filename before the extension. More information about the imzML file structure can be found here: [ms-imaging.org](https://ms-imaging.org/wp/imzml/data-structure/). Galaxy provides the `composite` upload for files consisting of several components.

The data for this tutorial comes from MALDI-TOF imaging of peptides in a mouse kidney. To make computation times more suitable for this training, only the m/z range from 1220 - 1625 and a part of the pixels (purple rectangle in figure 1) containing about half of the kidney and one digestion control spot were kept.

![mouse kidney image](../../images/MSI1_mouse_kidney.png "Mouse kidney sample before and after mass spectrometry measurement and H&E staining")


> <hands-on-title>Uploading an imzML file</hands-on-title>
>
> 1. **Create a new history** and give it a name.
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. Upload the data from [Zenodo](https://zenodo.org/record/1560646) via the **composite** option
>
>    > <tip-title>Upload via the composite option</tip-title>
>    > - Open the Galaxy Upload Manager({% icon galaxy-upload %} on the top-right of the tool panel)
>    > - Click on **Composite** on the top
>    > - Set **Composite Type** to `imzml`
>    > - Expand the first **Select** button (for the imzML metadata component)
>    > - Select **Paste/Fetch data** and paste
>    >    ```
>    > https://zenodo.org/record/1560646/files/mouse_kidney_cut.imzML
>    >    ```
>    > - Expand the second **Select** button (for the mass spectral data component)
>    > - Select **Paste/Fetch data** and paste
>    >    ```
>    > https://zenodo.org/record/1560646/files/mouse_kidney_cut.ibd
>    >    ```
>    > - Press **Start**
>    > - **Close** the window
>    {: .tip}
>
>    ![Upload imzML files](../../images/MSI1_upload_composite.png "Upload an imzML file via the composite upload")
>
>    > <tip-title>FTP upload for large files</tip-title>
>    > * In case one subfile is larger than 2 GB the uploading needs to be done via ftp.
>    > * The necessary steps are explained in this tutorial [Getting data into Galaxy]({{ site.baseurl }}/topics/galaxy-interface/tutorials/get-data/slides.html)
>    {: .tip}
>
>    > <tip-title>Uploading an Analyze7.5 file</tip-title>
>    > * `Analyze7.5` files are also supported by Galaxy.
>    > * The file consists of three components and is therefore uploaded via the 'composite' function, analogously to the imzML upload.
>    > * The files to select in the `composite` tab are the header file `.hdr`, the m/z values file `.t2m` and the spectra file `.img`.
>    {: .tip}
>
> 3. Rename the data into `mouse_kidney_cut`
>
>    > <tip-title>Rename a dataset</tip-title>
>    > - Click on the {% icon galaxy-pencil %} **pencil icon** for the dataset to edit its attributes
>    > - In the central panel, change the **Name** field to `mouse_kidney_cut`
>    > - Click the **Save** button
>    {: .tip}
{: .hands_on}


# Exploring MSI data with the MSI Qualitycontrol tool

Before starting any analysis, it is important to confirm that the quality of the acquired data is sufficient.
Furthermore, knowing the data's properties is important to choose the right preprocessing steps and parameters.
The steps that most influence the spatial delocalization and preparation quality in an MALDI imaging experiment is the homogeneous matrix deposition and for peptide analysis in addition the trypsin deposition and digestion step as reported by {% cite Ly_2019 %}. To monitor the digestion quality, three *Bombesin* peptide drops were spotted close to the tissue. Furthermore, the mouse kidney dataset contains internal calibrants that were sprayed together with the matrix onto the tissue and can be used to monitor intensity gradients and mass accuracy. The used calibrants were *Angiotensin I*, *Substance P*, *Fibrinopeptide B* and *ACTH_18-39*.

The **MSI Qualitycontrol* {% icon tool %} provides a fast way to obtain plenty of descriptive statistic plots for MSI datasets.
Internal calibrants or other known, ubiquitous m/z features can be used to obtain further quality measures, such as m/z accuracies.

The mouse kidney dataset contains internal calibrants that were sprayed together with the matrix onto the tissue. The used calibrants were *Angiotensin I*, *Substance P*,
*Fibrinopeptide B* and *ACTH_18-39*. We furthermore spotted *Bombesin* peptides close to the tissue to monitor the digestion quality with the fold change of digested vs. undigested *Bombesin*.


> <hands-on-title>Running the MSI Qualitycontrol tool</hands-on-title>
> 1. Create the tabular file with the m/z values of the internal calibrants:
>    ```
>    m/z       name
>    1296.69    Angiotensin_I
>    1347.72    Substance_P
>    1570.68    Fibrinopeptide_B
>    2465.19    ACTH_18-39
>    ```
>    {% snippet faqs/galaxy/datasets_create_new_file.md convertspaces=true %}
>
> 2. **Rename dataset** to `Calibrants`
>
>    {% snippet faqs/galaxy/datasets_rename.md name="Calibrants" %}
>
> 3. Run the **MSI Qualitycontrol** {% icon tool %} with the following parameters:
>    - {% icon param-file %} *"MSI data"*: `mouse_kidney_cut imzML` will be automatically recognized as input file
>    - *"Title"*: `Mouse kidney introduction tutorial`
>    - {% icon param-file %} *"m/z of interest"*: Select the `Calibrants` tabular file
>    - *"Column with m/z values"*: `Column: 1`
>    - *"Column with name of m/z values"*: `Column: 2`
>    - *"Tabular file contains a header line"*: `Yes`
>    - *"Plot fold change of two m/z"*: `Insert Plot fold change of two m/z`
>    - *"M/z 1"*: `1224.63` (digested *Bombesin*)
>    - *"M/z 2"*: `1619.89` (full length *Bombesin*)
>    - Press **Run Tool**
{: .hands_on}


Open the pdf by clicking on the eye icon (view data) and answer the following questions according to the summary table on the first page.

> <question-title></question-title>
>
> 1. How many m/z features does the dataset contain?
> 2. Are the spectra in profile mode or centroided?
> 3. What is the median number of peaks per spectrum and how can this number be interpreted?
> 4. How many of the provided Calibrants were valid?
>
> > <solution-title></solution-title>
> > 1. 9013
> > 2. Centroided = FALSE means that the data were read in profile mode. The user has to define in every tool if the input data is in profile or centroided mode. The Centroid value reported here corresponds to the choice the user has made in the tool and not by automatic recognition. To find out what the correct choice is visit [Mass spectrometry imaging: Examining the spatial distribution of analytes]({{ site.baseurl }}/topics/metabolomics/tutorials/msi-analyte-distribution/tutorial.html#quality-control-of-the-data).
> > 3. Median # peaks per spectrum: 4158. The **MSI Qualitycontrol** {% icon tool %} consideres intensities > 0 as peaks. Before peak picking this means that also noise with small intensities is counted as peak what explains why nearly every second m/z value has an intensity > 0 (4158 peaks /9013 m/z values). After peak picking the number of peaks will decrease dramatically because only real peaks will be left.
> > 4. 3 Calibrants out of the 4 Calibrants in the tabular files were valid, that means in the m/z range of the dataset. As we cut the m/z axis for this tutorial, *ACTH* is outside the m/z range that we kept (1220 - 1625).
> {: .solution }
{: .question}

Each plot of the **MSI Qualitycontrol** {% icon tool %} is described in the help section at the bottom of the tool, this tutorial will discuss a few selected plots in more detail.


## Digestion efficiency

The complete digestion of proteins into peptides is a crucial step when performing mass spectrometry of peptides. In MSI the digestion is further hindered by the fact that digestion has to occur on the tissue. One way to control digestion efficiency was suggested by [Erich et al.](https://www.sciencedirect.com/science/article/pii/S1570963916301820?via%3Dihub). They spotted *cytochrome c* next to the tissue before and after digestion and compared the protein intensities in the two spots.

For the mouse kidney dataset we applied a similar approach and added three *bombesin* spots next to the kidney tissue (Figure 2) before digestion. *Bombesin* has the amino acid sequence QRLGNQWAVGHLM and a mass of 1619.89 Da. During trypsin digestion *bombesin* is cleaved by trypsin after arginin (R) what leads to the cleaved peptide LGNQWAVGHLM with a mass of 1224.63 Da. The digestion efficiency can be estimated from the log2 ratio (fold change) of these two peptides in the pixels of the *bombesin* spot.

The fold change plots are on page 4 and 5 of the pdf report. The first plot shows the average mass spectra for the digested and the undigested *bombesin* peptides. The blue lines indicate the provided m/z value and the chosen ppm range. The average intensity of the full length *bombesin* peptide is higher than the one of the digested peptide but the average intensity is not helpful here, because we only spotted one drop next to the tissue and only the intensity fold change in those pixels is important. The spectra plot is useful to control the chosen m/z value and ppm range. To obtain the log2 fold change in each spectrum, for each peptide the intensities in the m/z ranges are averaged, the intensity of the first m/z feature is divided by the intensity of the second m/z feature and log2 transformed. The log2 fold change for each spectrum (pixel) is plotted on page 5 and reveals that many spectra in the upper left corner (where the *bombesin* spot is) have a log2 fold change >= 0 what indicates that there is more digested than undigested *bombesin* peptides and that the tryptic digestion was successful.

![Fold Change](../../images/MSI1_foldchange.png "Avererage mass spectra and log2 fold change for Bombesin and its digested peptide")


## Distribution images for Calibrants

Have a look at the calibrant plots from page 6 on, especially regarding the distribution patterns. The colour code shows the intensity of the m/z value that is closest to the input m/z and if the ppm range contains several m/z features their intensities are averaged. The input m/z value and its name are printed on top of the image, the m/z number in the box shows the closest m/z value (that is 1296.68, as the m/z axis consists of mass bins slight differences are expected). Low *angiotensin* intensities occur at the boarder of the *bombesin* spot and at the boarder of the kidney tissue and on some spots in the kidney. In general calibrant intensities are higher in the matrix background than on the tissue due to ion suppression effects. *Substance P* shows also ion suppression in the *bombesin* spot. The heatmap shows no spatial intensity gradient what indicates that spraying of calibrants and matrix was homogeneous and that the MS performed stable during data acquisition.

![Angiotensin heatmap](../../images/MSI1_angiotensin_image.png "Intensity distribution image of Angiotensin I")

> <comment-title>Plotting heatmaps</comment-title>
> * The **MSI mz images** {% icon tool %} tool allows to generate heatmaps with futher options such as contrast enhancement and smoothing functions. The usage of the tool is explained in more detail in the tutorial [Mass spectrometry imaging: Examining the spatial distribution of analytes]({{ site.baseurl }}/topics/metabolomics/tutorials/msi-analyte-distribution/tutorial.html).
{: .comment}

## Number of peaks and total ion current images

On page 9 the number of peaks per spectrum is plotted and the shape of the kidney can be estimated due to slightly higher number of peaks. The number of peaks is defined as intensity > 0 what means that before peak picking also noise with intensity > 0 is counted in. It is quite common for raw MALDI datasets to have a noise baseline in each spectrum and therefore high amounts of 'peaks' before baseline removal is performed. For the mouse kidney dataset baseline removal was already done during acquisition but as also suggested by the median number of peaks per spectrum in the summary table, about half of every m/z value has an intensity > 0. This suggests to check the mass spectra for a baseline and if applicable remove the baseline during preprocessing of the data.

The plot on page 10 shows the total ion current (TIC) for each spectrum with a few outlier TIC > 25000. The TIC is the sum of all intensities of a spectrum. Therefore with more peaks in a spectrum the TIC should also be higher. Due to their low intensities, noise peaks contribute less to the TIC than analyte peaks, but with the large amount of noise we have in this dataset, this of course also sums up. Deviations in TICs are common in MALDI MSI due to e.g. unhomogeneous matrix spray, ion source contamination or pH gradients. To render the spectra more comparable TIC normalization is a default preprocessing step for MALDI MSI data but is based on the assumption that there are comparable numbers of signals present in each spectrum [Deininger et al.](https://link.springer.com/article/10.1007%2Fs00216-011-4929-z).
Both plots can also serve to check for spraying gradients or reduced machine performance during acquisition time. The mouse kidney was measured from bottom to top (plot on page 2), the performance over time can be easier spotted in the upper plots on page 14 and 15, where the x axis represents the spectra in the order they were measured.

![Npeaks and TIC heatmap](../../images/MSI1_npeaks_TIC.png "Number of peaks and TIC per spectrum")


## Most abundand m/z features

The plot on page 13 shows for each spectrum the m/z with the highest intensity ('base peak'). This plot can already reveal some morphological features of the dataset. The plot for the mouse kidney dataset shows that the base peak is the same on the kidney tissue and the matrix background but a different one in the *bombesin* spot. According to the legend the base peak in most spectra is roughly at m/z 1350, the base peak in the *bombesin* spot is roughly at 1280 and in a few spectra at 1570. Later, we will export the spectra information, including the base peak of each spectrum, as a tabular file to find the correct m/z values of the most abundant features in the following spectra: x = 40 y = 50; x = 23, y = 70; x = 20, y = 73.

![most abundant](../../images/MSI1_most_abundant.png "Most abundant m/z for each spectrum and three selected pixel for further investigations")

As the feature around m/z 1350 is the highest feature in most of the spectra it is no suprise to find this feature as highest peak in the average spectra plot on page 20. The second highest peak is around 1300 m/z. It is obvious that those features are the calibrants *substance P* and *angiotensin* as they occur as high intensity peaks on the tissue as well as on the background. At least the concentration of *substance P* but also the concentration of *angiotensin I* could be reduced in further experiments. The concentration of *fibrinopeptide B* is chosen well as the peak at m/z 1570 is visible in most of the spectra plots but does not dominate the spectra as the other two calibrants do.


## m/z accuracy

A MSI dataset has not only deviations in the intensity dimension but also in the m/z dimension. Mass shifts can occur due to sample topography, small length changes in the flight tube or instable high voltage power supply. Mass accuracy is important for two reasons: First, the identification of m/z relies on accurate mass values and second, comparing m/z features across several spectra or even samples requires them to have similar values in order to be considered as the same molecule.

For precise m/z measurements the mass spectrometers are regularly calibrated with external calibrants that are often applied next to the sample. [Gustafsson et al.](https://www.sciencedirect.com/science/article/pii/S1874391912003259?via%3Dihub) sprayed calibrants onto the complete sample and after MSI measurement used those internal calibrants to recalibrate every spectra what dramatically reduced the m/z error and improved the identification of the m/z features. The same approach was used for the mouse kidney dataset that we use in this tutorial: three internal calibrants are in the m/z range that we work with. These calibrants enable the calculation of the average m/z error as well as the m/z error in each spectrum.

Starting at page 22 for each of the three calibrants average mass spectra are plotted. Three different m/z ranges are visualized while the fourth plot represents each datapoint as blue dot what helps to estimate the correct window sizes during preprocessing of the data. The dashed blue line represents the theoretical m/z, the red line indicates the m/z with the highest average intensity and the green line shows the m/z value that is closest to the theoretical m/z. For *angiotensin I* the theoretical m/z value is ~0.06 m/z higher than the peak maximum. There is no m/z value with the exact m/z of *angiotensin I* (1296.69), the closest m/z value is 1296.6776 (green line). The following barplot (on page 25) shows the average m/z error for each calibrant by taking the difference between the m/z of the peak maximum and the theoretical m/z. For *angiotensin I* this is 1296.6346 - 1296.69 = -0.0554 m/z and corresponds to 0.0554/1296.69*1000000 = 42.7 ppm. The next barplot shows the smallest m/z error that is possible due to the discrete m/z bins of the dataset: the difference between the closest m/z value and the theoretical m/z value.

The average m/z error already gives a hint about the m/z accuracy but it is even more important to consider the m/z error in each individual spectrum. The plot on page 27 shows for each calibrant the m/z error in each spectrum. The spectra index corresponds to the order in which the spectra were measured and it becomes obvious that for all calibrants there is a m/z shift of about 200 ppm happening during acquisition. This gradient is also visible in the following plots where the m/z error in ppm is plotted in each pixel. The ppm error for *angiotensin* is about +50 ppm at the bottom of the dataset (start of acquisition) and decreases to about -150 ppm at the top of the image (end of acquisition). To be able to compare m/z features across the spectra they need to have the same m/z value, therefore recalibration with the **MALDIquant preprocessing** {% icon tool %} or binning with the **MSI preprocessing** {% icon tool %} and a  tolerance of 200 ppm is highly recommended.

![mz error](../../images/MSI1_mz_error.png "Plots that show the average and individual m/z errors")

> <comment-title>Plotting mass spectra</comment-title>
> * The **MSI plot spectra** {% icon tool %} tool allows to single, average or overlayed mass spectra plots and to zoom into m/z regions of interest. The tool is explained in more detail in the tutorial [Mass spectrometry imaging: Examining the spatial distribution of analytes]({{ site.baseurl }}/topics/metabolomics/tutorials/msi-analyte-distribution/tutorial.html).
{: .comment}


# Exporting MSI data to tabular files for further exploration of the data

The data from the imzML file format is not directly readable, therefore special tools are needed to extract its information. The **MSI data exporter** {% icon tool %} provides the option to export spectra, feature and intensity data from imzML files as tabular files. The underlaying values of the quality report can be found in the tabular files and allow to follow up on interesting aspects seen in the quality report plots. Furthermore, tabular files are compatible with most software for statistical analysis and visualization. The intensity matrix of an unprocessed file might be huge as all pixels and all m/z values are stored in the file - therefore, the intensity matrix is often more helpful after preprocessing and filtering of the data. Despite preprocessing and filtering, the output tabular files are often too large for visual inspection. Galaxy offers many different text manipulation tools that are helpful to sort and filter such large tabular files.

To find the m/z value that has the highest mean intensity across all pixels, the feature data can be sorted on the column with the mean intensities. Keep in mind that so far also background spectra are included in the calculation of the mean intensity and those would need to be removed before the mean intensities for the tissue can be calculated.
The spectra data output can be filtered for certain spectra to obtain some spectra properties such as the accurate value of its base peak that could not be accurately determined in the corresponding plot of the quality report before.

> <hands-on-title>Export and explore information from MSI data</hands-on-title>
>
> 1. Run **MSI data exporter** {% icon tool %} with the following parameters:
>    - {% icon param-file %} *"MSI data"*: `mouse_kidney_cut imzML`
>    - *"Multiple output files can be selected"*: `mz feature output` and `pixel output`
>
> 2. Run **Sort data in ascending or descending order** {% icon tool %} from the 'text manipulation' category with the following parameters:
>    - {% icon param-file %} *"Sort Query"*: `Data exporter features` (output of **MSI data exporter** {% icon tool %})
>    - *"Number of header lines"*: `1`
>    - *"on column"*: `column: 3`
>    - *"in"*: `descending order`
>    - *"Flavor"*: `general numeric sort`
>
> 3. Run **Select lines that match an expression** {% icon tool %} from the 'filter and sort' category with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `Data exporter spectra` (output of **MSI data exporter** {% icon tool %})
>    - *"the pattern"*: `(xy_40_40)|(xy_23_70)|(xy_20_73)`
>
{: .hands_on}

> <question-title></question-title>
>
> 1. How many spectra does the dataset contain?
> 2. How many numeric properties does the m/z feature output report?
> 3. Which m/z values have the highest mean intensities over all pixels?
>
> > <solution-title></solution-title>
> > 1. 1581 - Clicking on pixel output file name reveals that it has 1582 lines, every line contains the information of one spectrum, but the first line is a header line (click on dataset "MSI data exporter on data 1: spectra" in the history, the line number of the file is written below the dataset name)
> > 2. 7 - The feature file has 8 columns and except for the mz_names, all columns contain numeric properties, that can be used for further calculations.
> > 3. The top m/z values are around 1347.71 and its isotopes (+1 m/z). This m/z feature derives from the *substance P* internal calibrant (the m/z value is not accurate and ondolates a bit because the data was not yet binned or aligned).
> {: .solution }
{: .question}

Exporting and sorting the feature information reveals that *substance P* has the highest mean intensity across all spectra what confirms our estimation when examining the average spectrum plot.
Exporting and filtering the spectra information for three pixel that have different base peaks confirms that the calibrants are the most abundant peaks in most of the spectra. *Substance P* is the base peak in spectrum xy_40_40 and thereby also the most abundant peak in most of the spectra (according to the colouring in the 'most abundant m/z in each spectrum' plot) regardless if they belong to tissue or matrix. Only the pixels that belong to the *bombesin* spot show different base peaks. In spectrum xy_23_70 *angiotensin I* is the highest feature while in spectrum xy_20_73 *fibrinopeptide B* appears as base peak.


topic: proteomics
tutorial: neoantigen-hla-binding-novel-peptides
title: Neoantigen 5b: IEDB binding Validated Neopeptides
difficulty: intermediate
time_estimation: 3H
requirements_json: []
tags_json: ["[label-free]"]
content_hash: 95291709649fa00e0f814f2c6158d747
last_modified: 2026-05-27T09:01:49.458267
zenodo_link: https://zenodo.org/records/14377365
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/neoantigen-hla-binding-novel-peptides/tutorial.html

content:
Neoantigens are peptides derived from tumor-specific mutations, which are recognized by the immune system as foreign and can stimulate an immune response against cancer cells. Identifying these neoantigens is a crucial step in the development of personalized cancer immunotherapies, as they serve as targets for T-cell mediated immune responses. However, predicting which peptides from the tumor genome will bind effectively to major histocompatibility complex (MHC) molecules—key proteins that present antigens to immune cells—remains a significant challenge.

This tutorial outlines a comprehensive workflow for the identification, prediction, and validation of potential neoantigens. We begin by using the Immune Epitope Database (IEDB) to predict the binding affinity of peptide sequences to MHC molecules. IEDB provides powerful tools to model how peptides interact with different MHC alleles, helping to prioritize peptides that are most likely to be presented by the immune system. Finally, we categorize the peptides into strong and weak binders, based on their predicted affinity, which helps in identifying the most promising candidates for cancer immunotherapy.

![HLA-binding-peptides-overview]({% link topics/proteomics/images/neoantigen/Predict_MHC_Binding_for_Novel_Neoantigens.PNG %})


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Neoantigen HLA binding for Novel peptides

## Overview of HLA Binding Prediction for Potential Neoantigens
This workflow outlines a structured approach to predicting and analyzing peptide-HLA (MHC-I) binding affinities, focusing on neoantigens for immunotherapy. Here's an overview of the workflow, broken into key steps:

1. **Get Data** The first step involves gathering and uploading the necessary proteomics data files into the analysis environment. These files typically contain protein sequences or raw spectrum data that will be processed throughout the tutorial. Proper data organization and tagging are essential to ensure smooth workflow execution.
2. **Predicting MHC Binding with IEDB** In this step, the goal is to predict how peptide sequences will bind to MHC-I molecules, an essential part of identifying potential neoantigens. The IEDB tool is launched with parameters such as prediction method (netmhcpan_el), selecting relevant alleles, and uploading peptide sequences in FASTA format.
3. **Filtering Results Based on Affinity** Once the MHC-I binding affinities are predicted, it's time to filter the results based on specific criteria to narrow down the most promising peptides.The peptides are categorized into strong and weak binders: an affinity value of less than 0.5 is a strong binder, while a value between 0.5 and 2 is a weak binder.
4. **Refining Results Using Table Operations** To further refine the results, the data is aggregated, focusing on the highest-ranked peptides based on various parameters like affinity and percent rank. This tool is used to aggregate data and perform operations such as selecting the highest-ranking peptides based on specified criteria (e.g., using a pivot operation).
5. **Filtering and annotating peptide binding affinity to HLA.** In this step, the peptides are filtered to focus on those that exhibit strong evidence of binding affinity to Human Leukocyte Antigen (HLA) molecules. This process involves filtering and annotating these peptides and narrows down the most promising candidates for further investigation, ensuring that only those with reliable peptide-HLA interactions are considered for potential clinical or research applications. This step is critical for identifying peptides with the potential to serve as targets for immunotherapy or vaccine development.

## Get data

> <hands-on-title> Data Upload </hands-on-title>
>
> 1. Create a new history for this tutorial
> 2. Import the files from [Zenodo]({{ page.zenodo_link }}) or from
>    the shared data library (`GTN - Material` -> `{{ page.topic_name }}`
>     -> `{{ page.title }}`):
>
>    ```
>    https://zenodo.org/records/14377365/files/FASTA-IEDB.fasta
>    https://zenodo.org/records/14377365/files/IEDB-Optitype-seq2HLA-alleles.tabular
>    ```
>
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
> 3. Rename the datasets
> 4. Check that the datatype
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="datatypes" %}
>
> 5. Add to each database a tag corresponding to ...
>
>    {% snippet faqs/galaxy/datasets_add_tag.md %}
>
{: .hands_on}

## Predicting MHC Binding with IEDB
In this step of the workflow, the IEDB (Immune Epitope Database) tool is used to predict peptide binding to MHC-I molecules, which is crucial for identifying potential neoantigens. This is accomplished by using the netmhcpan_el prediction method to analyze peptide sequences and their binding affinity to specific MHC alleles. The netmhcpan_el method is a state-of-the-art tool that predicts how likely a peptide sequence is to bind to a given MHC-I allele. The alleles to be tested against are selected from a history file, ensuring that the analysis is tailored to specific genetic variations. Peptides that are predicted to bind MHC-I molecules are provided in a FASTA format, which is the standard for representing protein sequences.
The IEDB tool is integral in neoantigen discovery because it allows researchers to identify which peptides (out of many potential candidates) have a high likelihood of binding to MHC-I molecules. These peptides are of interest as they could trigger an immune response against cancer cells or pathogens, making them candidates for immunotherapy.


> <hands-on-title> IEDB </hands-on-title>
>
> 1. {% tool [IEDB](toolshed.g2.bx.psu.edu/repos/iuc/iedb_api/iedb_api/2.15.2) %} with the following parameters:
>    - *"Prediction"*: `MHC-I Binding`
>        - *"prediction method"*: `netmhcpan_el`
>        - *"Alleles"*: `From history`
>            - {% icon param-file %} *"Alleles file"*: `IEDB-Optitype-seq2HLA-alleles.tabular` (Input dataset)
>        - *"peptide lengths for prediction"*: `8` `9` `10` `11` `12`
>    - *"Peptide sequences"*: `Fasta file`
>        - {% icon param-file %} *"Peptide Sequence Fasta"*: `FASTA-IEDB.fasta` (Input dataset)
>
>
>
{: .hands_on}

> <question-title></question-title>
>
> 1. Why do I need to specify the netmhcpan_el method for peptide-MHC binding prediction?
> 2. What should I do if my peptide sequence file is not in the correct FASTA format?
>
> > <solution-title></solution-title>
> >
> > 1. The netmhcpan_el method is a highly accurate and widely used algorithm for predicting peptide binding to MHC-I molecules. By specifying this method, you're ensuring that the prediction is based on a well-established and reliable tool, increasing the likelihood of accurate results for identifying potential neoantigens.
> > 2. If your peptide sequence file is not in the FASTA format, you'll need to reformat the file before uploading it to the IEDB tool. FASTA format is a plain text format used to represent nucleotide or peptide sequences, where each sequence begins with a > symbol followed by a description line and then the sequence itself. Many bioinformatics tools, including IEDB, require this format to interpret the sequences correctly.
> >
> {: .solution}
>
{: .question}

## Filtering Results Based on Affinity

In this step, the Filter tool is used to refine the results from the previous IEDB step by selecting peptides based on their binding affinity to MHC-I molecules. Peptides are categorized into separate groups based on their binding affinities, with those that bind with lower or higher affinity being filtered accordingly. We utilize the affinity values to identify strong and weak binders. Specifically, peptides with an affinity value greater than 0.5 and less than or equal to 2 are classified as weak binders, while those with an affinity value less than 0.5 are classified as strong binders. This distinction is important, as peptides with very low or extremely high affinities may be as relevant for further analysis.


> <comment-title></comment-title>
>
> Please make sure the inputs and outputs of the weak and strong binders processing steps are well labeled to avoid any confusion.
>
{: .comment}



> <hands-on-title> Filter weak binders </hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `output` (output of **IEDB** {% icon tool %})
>    - *"With following condition"*: `c11>0.5 and c11<=2`
>    - *"Number of header lines to skip"*: `1`
>
>
>
{: .hands_on}


> <hands-on-title> Filter strong binders </hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>    - {% icon param-file %} *"Filter"*: `output` (output of **IEDB** {% icon tool %})
>    - *"With following condition"*: `c11<=0.5`
>    - *"Number of header lines to skip"*: `1`
>
>
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Why do we need to filter strong and weak binder?
>
> > <solution-title></solution-title>
> >
> > 1. Filtering weak and strong binders is crucial for optimizing the identification of peptides that bind to MHC-I molecules with an optimal affinity, which is key for selecting potential neoantigens. Weak binders (with affinities greater than 0.5 but less than or equal to 2) are less likely to trigger a robust immune response, while strong binders (with affinities less than or equal to 0.5) might bind too tightly, potentially causing inefficient or excessive immune reactions. By filtering both extremes, the analysis focuses on peptides with moderate affinity that are more likely to stimulate an effective immune response without causing adverse effects. This targeted filtering not only enhances the relevance of the peptides for therapeutic applications but also improves the quality of predictions by reducing the inclusion of ineffective or irrelevant peptides, ultimately increasing the chances of identifying candidates suitable for vaccine development or immunotherapy.
> >
> {: .solution}
>
{: .question}

## Peptide Annotation Using FASTA-to-Tabular
The **FASTA-to-Tabular** converter transforms peptide FASTA sequences into a tabular format that is easier to filter, join, and annotate. This step is commonly used before submitting peptides to annotation tools such as for database lookups.


> <hands-on-title> Peptide annotation </hands-on-title>
>
> 1. {% tool [FASTA-to-Tabular](toolshed.g2.bx.psu.edu/repos/iuc/fasta_slider/fasta_to_tabular/1.1.1) %} with the following parameters:
>    - {% icon param-file %} *"Convert these sequences"* → the peptide FASTA file  
>    - *"How many columns to divide title string into?"*: `1`  
>    - *"How many title characters to keep?"*: `0`
>
>    This tool converts the peptide FASTA into a structured tabular format, preserving full header information in a single column. The resulting table provides clean sequence identifiers that can be linked to genomic, variant, and immunological metadata in later steps.
>
{: .hands_on}

> <question-title></question-title>
>
> 1. Why do we keep the entire FASTA title string as a single column?  
> 2. How does converting FASTA to tabular format support downstream annotation workflows (e.g., HLA binding, variant mapping, epitope analysis)?
>
> > <solution-title></solution-title>
> >
> > 1. A single-column title ensures that peptide identifiers remain intact and can be reliably matched across tools that expect exact header strings—especially important for workflows combining genomics and proteomics metadata.  
> > 2. Many annotation tools require tabular inputs. Converting FASTA to tabular enables joins, filtering, SQL-based queries, and integration with peptide-centric metadata (variant origin, binding scores, validation status, etc.), allowing seamless downstream analysis.
> >
> {: .solution}
>
{: .question}



## Refining Results Using Table Operations

### Pivoting the table to aggregate affinity scores
In this step, the Table Compute tool is used to refine and aggregate the data from the filtered MHC-I peptide binding results. Specifically, the tool is performing a Pivot operation, which transforms the data for easier analysis and interpretation. The tool organizes the data by a specific index, such as icore, which could represent a unique identifier or a feature of interest in the dataset. The column to be analyzed is allele, which groups the data by different alleles (i.e., the genetic variants of the MHC molecules). The values of interest, which represent the binding affinity scores or ranks (e.g., percentile_rank), are then aggregated using the Maximum function, ensuring that for each group of alleles, the highest binding affinity is retained.

This operation is important because it helps prioritize the peptides that exhibit the strongest binding potential for each allele. By focusing on the best binders per allele, the data becomes more manageable and relevant for further analysis, such as identifying the most promising neoantigen candidates.

This Table Compute tool is used to perform a data manipulation operation called Pivot. This operation transforms the table format and aggregates data based on specific parameters to provide clearer insights.
Specifically:
- The Index is set to icore, which could refer to a specific identifier or feature within the dataset. This helps group the data by this particular attribute.
- The Column parameter is set to allele, so the data will be organized based on different alleles of the MHC molecules, grouping them accordingly.
- The Values being analyzed are the percentile_rank, which represent the binding affinities of the peptides.
- The Aggregator Function is set to Maximum, meaning that for each allele, only the highest binding affinity (best percentile rank) is retained in the output.

> <hands-on-title> Weak-Table Compute </hands-on-title>
>
> 1. {% tool [Table Compute](toolshed.g2.bx.psu.edu/repos/iuc/table_compute/table_compute/1.2.4+galaxy0) %} with the following parameters:
>    - *"Input Single or Multiple Tables"*: `Single Table`
>        - {% icon param-file %} *"Table"*: `out_file1` (output of **Filter** {% icon tool %})
>        - *"Type of table operation"*: `Perform a full table operation`
>            - *"Operation"*: `Pivot`
>                - *"Index"*: `icore`
>                - *"Column"*: `allele`
>                - *"Values"*: `percentile_rank`
>                - *"Aggregator Function"*: `Maximum`
>
> 2. Rename file as "IEDB Binding Affinity - Weak Peptides".
>
{: .hands_on}

## Identifying Weak Neopeptides (SQLite Query)
The **Query Tabular (using sqlite sql)** tool extracts identifiers for weak-binding or otherwise filtered neopeptides from a tabular/SQLite-backed dataset. This step can be used to pull peptide IDs for downstream HLA-binding review, reporting, or separate IEDB-based workflows.

> <hands-on-title> Weak peptides and HLA binding </hands-on-title>
>
> 1. {% tool [Query Tabular: sqlite sql](toolshed.g2.bx.psu.edu/repos/galaxyp/query_tabular/query_tabular/3.3.2) %} with the following parameters:
>    - {% icon param-file %} *"Tabular Dataset for Table"* (table1): `Peptide Annotation` (output of **FASTA-to-Tabular**)
>    - {% icon param-file %} *"Tabular Dataset for Table"* (table2): `IEDB Binding Affinity - Weak Peptides` (output of **Table Compute - Weak peptides**)
>    - *"Save the sqlite database in your history"*: `Yes`
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT t2.*
>      FROM t1
>      JOIN t2
>      ON t1.c2 = t2.icore
>      ```
>
> 2. Run the query to obtain a deduplicated, ordered list of weak-binding peptide identifiers for downstream review or submission to IEDB/HLA pipelines.
> 
{: .hands_on}

> <hands-on-title> Weak-binding neopeptides </hands-on-title>
>
> 1. {% tool [Query Tabular: sqlite sql](toolshed.g2.bx.psu.edu/repos/galaxyp/query_tabular/query_tabular/3.3.2) %} with the following parameters:
>    - {% icon param-file %} *"Tabular Dataset for Table"* (table): `peptide_table_for_sql` (output of **Query Tabular - Weak peptides**)
>    - *"Save the sqlite database in your history"*: `Yes`
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT t1.icore
>      FROM t1
>      ORDER BY t1.icore
>      ```
>
> 2. Run the query to obtain a deduplicated, ordered list of weak-binding peptide identifiers for downstream review or submission to IEDB/HLA pipelines.
> 
{: .hands_on}

> <question-title></question-title>
>
> 1. What is the purpose of extracting `icore` in this query?  
> 2. How can the output of this step be used in an IEDB workflow?
>
> > <solution-title></solution-title>
> >
> > 1. `icore` typically represents a canonical peptide identifier used to join HLA-binding results with peptide metadata; extracting it enables targeted follow-up.  
> > 2. The list can be used to submit only weak-binding or candidate peptides to separate IEDB prediction workflows or for manual curation and reporting.
> >
> {: .solution}
>
{: .question}




> <hands-on-title> Strong-Table Compute </hands-on-title>
>
> 1. {% tool [Table Compute](toolshed.g2.bx.psu.edu/repos/iuc/table_compute/table_compute/1.2.4+galaxy0) %} with the following parameters:
>    - *"Input Single or Multiple Tables"*: `Single Table`
>        - {% icon param-file %} *"Table"*: `out_file1` (output of **Filter** {% icon tool %})
>        - *"Type of table operation"*: `Perform a full table operation`
>            - *"Operation"*: `Pivot`
>                - *"Index"*: `icore`
>                - *"Column"*: `allele`
>                - *"Values"*: `percentile_rank`
>                - *"Aggregator Function"*: `Maximum`
>
> 2. Rename file as "IEDB Binding Affinity - Strong Peptides".
>
{: .hands_on}

## Identifying Strong Neopeptides (SQLite Query)
The **Query Tabular (using sqlite sql)** tool extracts identifiers for strong-binding or otherwise filtered neopeptides from a tabular/SQLite-backed dataset. This step can be used to pull peptide IDs for downstream HLA-binding review, reporting, or separate IEDB-based workflows.

> <hands-on-title> Strong peptides and HLA binding </hands-on-title>
>
> 1. {% tool [Query Tabular: sqlite sql](toolshed.g2.bx.psu.edu/repos/galaxyp/query_tabular/query_tabular/3.3.2) %} with the following parameters:
>    - {% icon param-file %} *"Tabular Dataset for Table"* (table1): `Peptide Annotation` (output of **FASTA-to-Tabular**)
>    - {% icon param-file %} *"Tabular Dataset for Table"* (table2): `IEDB Binding Affinity - Strong Peptides` (output of **Table Compute - Strong peptides**)
>    - *"Save the sqlite database in your history"*: `Yes`
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT t2.*
>      FROM t1
>      JOIN t2
>      ON t1.c2 = t2.icore
>      ```
>
> 2. Run the query to obtain a deduplicated, ordered list of strong-binding peptide identifiers for downstream review or submission to IEDB/HLA pipelines.
> 
{: .hands_on}

> <hands-on-title> Strong-binding neopeptides </hands-on-title>
>
> 1. {% tool [Query Tabular: sqlite sql](toolshed.g2.bx.psu.edu/repos/galaxyp/query_tabular/query_tabular/3.3.2) %} with the following parameters:
>    - {% icon param-file %} *"Tabular Dataset for Table"* (table): `peptide_table_for_sql` (output of **Query Tabular - Strong peptides**)
>    - *"Save the sqlite database in your history"*: `Yes`
>    - *"SQL Query to generate tabular output"*:
>      ```
>      SELECT t1.icore
>      FROM t1
>      ORDER BY t1.icore
>      ```
>
> 2. Run the query to obtain a deduplicated, ordered list of strong-binding peptide identifiers for downstream review or submission to IEDB/HLA pipelines.
> 
{: .hands_on}

> <question-title></question-title>
>
> 1. Why is the Pivot operation used in this step?
> 2. Why do we use the 'Maximum' aggregator function?
>
> > <solution-title></solution-title>
> >
> > 1. The Pivot operation is used to reorganize the data so that each allele is associated with the highest percentile rank (maximum value) for the peptides. This helps in focusing on the top-ranked peptides for each allele, ensuring that the analysis highlights the most promising candidates for immunotherapy or vaccine development.
> > 2. The 'Maximum' function ensures that, for each allele, we keep the peptide with the highest binding affinity (best percentile rank). This step prioritizes the most relevant peptides for further analysis, eliminating lower-affinity binders that are less likely to have therapeutic potential.
> >
> {: .solution}
>
{: .question}



## Annotation of Strong and Weak Binder Peptides

The annotation of strong and weak binders tells you how well peptides interact with Human Leukocyte Antigen (HLA) molecules, which is important for understanding their potential role in immune responses, especially in the context of immunotherapy and vaccine development.

Here’s what the annotations mean:

### 1. Strong Binder Peptides:
- These peptides have high binding affinity to the HLA molecules.
- Peptides that bind strongly to HLA molecules are more likely to be presented to T-cells, which is a crucial step in eliciting an immune response.
- Strong binder peptides are often the focus of vaccine development and cancer immunotherapy because they are more likely to activate the immune system effectively.
- The annotation of strong binders can help identify peptides that are more likely to stimulate immune responses and be used in the development of treatments for diseases like cancer or infections.

### 2. Weak Binder Peptides:
- These peptides have low binding affinity to the HLA molecules.
- Peptides that bind weakly to HLA are less likely to be presented to T-cells and may not elicit a strong immune response.
- Weak binder peptides are generally not prioritized for immunotherapy applications, though they can still be of interest in understanding immune evasion or identifying potential targets that may require further optimization for stronger binding.

### Why the Annotation Matters:
- Differentiating Strong and Weak Binders helps you prioritize which peptides are more likely to be effective in stimulating an immune response.
- This classification is useful for:
  - Designing vaccines or immunotherapies that can generate a strong and specific immune response.
  - Understanding immune system interactions with peptides from pathogens or tumor cells.
  - Identifying biomarkers that can be used in diagnostics or therapeutic monitoring.


# Conclusion

The ability to predict and validate neoantigens is a cornerstone of modern cancer immunotherapy, particularly in personalized immunotherapies such as cancer vaccines and adoptive T-cell therapies. The identification of high-affinity neoantigens, which can effectively stimulate the immune system, is key to developing therapeutic strategies that selectively target tumor cells while sparing healthy tissue.

This workflow is particularly relevant in the neoantigen discovery process, as it combines computational prediction with experimental validation, ensuring that only the most promising peptides are considered for therapeutic development. By integrating IEDB’s predictive capabilities, this workflow bridges the gap between in silico predictions and in vitro experimental data, allowing for a more robust and reliable neoantigen identification pipeline. Separating peptides into strong and weak binders based on their predicted MHC affinity further refines the selection process, ensuring that high-priority candidates are prioritized for downstream therapeutic application.

Given the increasing demand for personalized cancer treatments, this workflow represents a vital approach for accelerating the identification of clinically relevant neoantigens, thus advancing the field of cancer immunotherapy and personalized medicine.

The outputs from the iPepGen workflow, specifically the HLA allele genotypes and verified neoantigen candidate peptide sequences, serve as input to the pVACbind software suite, which we deployed as a Galaxy tool.  pVACbind is part of the personalized Variant Antigens in Cancer tool suite (pVACtools).  The pVACbind software bundles numerous complementary tools for predicting binding of input peptide sequences to HLA protein complexes (both class I and II) coded by specific allele genotypes, as well as two deep learning algorithms, DeepImmuno and BigMHC, for predicting immunogenicity of HLA alleles and bound peptides.  The Galaxy tool outputs a tabular file with aggregated results across all of the algorithms selected by the user, as well as a filtered output showing only those peptide and allele combination scores indicating high potential for immunogenicity.  The (pVACbind)[https://pvactools.readthedocs.io/en/latest/pvacbind.html] software is well documented and provides users with ample information about the bundled tools and how to interpret results for assisting in prioritizing peptides for further experimental testing as immunotherapy agents.

![pvac-process]({% link topics/proteomics/images/neoantigen/pvac.PNG %})

# Rerunning on your own data

To rerun this entire analysis at once, you can use our workflow. If users encounter failed tools and/or workflows, we recommend that users review that the appropriate inputs are selected before re-running.

Below we show how to do this:


> <hands-on-title>Running the Workflow</hands-on-title>
>
> 1. **Import the workflow** into Galaxy:
>    - [Neoantigen IEDB Binding HLA Alleles](https://tinyurl.com/ipepgen-iedb-pep-wf)
>
> 2. Run **Workflow** {% icon workflow %} using the following parameters:
>    - *"Send results to a new history"*: `No`
>    - {% icon param-file %} *"Distinct HLA alleles (can be from OptiType and seq2HLA)"*: `IEDB-Optitype-seq2HLA-alleles.tabular`
>    - {% icon param-file %} *"FASTA file of peptides to test for HLA binding (can be from Arriba)"*: `FASTA-IEDB.fasta`
>
>    {% snippet faqs/galaxy/workflows_run.md %}
>
> 
> 
> 
> <comment-title>DISCLAIMER</comment-title>
>
> - If any step in this workflow fails, please ensure that the input files have been correctly generated and formatted by the preceding tools. Workflow failures often result from improperly called or incomplete input data rather than errors in the workflow itself. Users are responsible for verifying their input before troubleshooting workflow issues.
>
> {: .comment}
>
> 
> 
{: .hands_on}

# Are you feeling adventurous? ✨

## One-Click Neoantigen Workflow

This new [One-Click Neoantigen Workflow](https://usegalaxy.eu/u/galaxyp/w/ipepgen-one-click-workflow) brings together all key modules of the neoantigen discovery process into a single, streamlined analysis within Galaxy. Instead of launching each tutorial separately, users can now execute the entire end-to-end pipeline—from database creation to HLA binding prediction—with just one click —without ever leaving Galaxy.

# Disclaimer
Please note that all the software tools used in this workflow are subject to version updates and changes. As a result, the parameters, functionalities, and outcomes may differ with each new version. Additionally, if the protein sequences are downloaded at different times, the number of sequences may also vary due to updates in the reference databases or tool modifications. We recommend the users to verify the specific versions of software tools used to ensure the reproducibility and accuracy of results.

tools_json:
["IEDB", "toolshed.g2.bx.psu.edu/repos/iuc/iedb_api/iedb_api/2.15.2", "Filter", "Filter1", "FASTA-to-Tabular", "toolshed.g2.bx.psu.edu/repos/iuc/fasta_slider/fasta_to_tabular/1.1.1", "Table Compute", "toolshed.g2.bx.psu.edu/repos/iuc/table_compute/table_compute/1.2.4+galaxy0", "Query Tabular: sqlite sql", "toolshed.g2.bx.psu.edu/repos/galaxyp/query_tabular/query_tabular/3.3.2"]


topic: proteomics
tutorial: peptide-library-data-analysis
title: Peptide Library Data Analysis
difficulty: intermediate
time_estimation: 20m
requirements_json: []
tags_json: ["[]"]
content_hash: c2ae863e5a8d8068babce5431eb83120
last_modified: 2026-05-15T22:28:14.472571
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/peptide-library-data-analysis/tutorial.html

content:
Several computational methods have been proven very useful in the initial screening and prediction of peptides for various biological properties. These methods have emerged as effective alternatives to the lengthy and expensive traditional experimental approaches.  Properties associated with a group of peptide sequences such as overall charge, hydrophobicity profile, or k-mer composition can be utilized to compare peptide sequences and libraries.  In this tutorial, we will be discussing how peptide-based properties like charge, hydrophobicity, the composition of amino acids, etc. can be utilized to analyze the biological properties of peptides. Additionally, we will learn how to use different utilities of the Peptide Design and Analysis Under Galaxy (PDAUG) package to calculate various peptide-based descriptors, and use these descriptors and feature spaces to build informative plots.


### Easy access to tools, workflows and data from the docker image

An easy way to install and use the PDAUG toolset, and follow this tutorial is via a prebuilt docker image equipped with a PDAUG toolset, workflow, and data library. A prebuilds docker image can be downloaded and run by typing a simple command at the terminal after installing docker software on any operating system.

> <hands-on-title>Easy access of tools, workflows and data from docker image</hands-on-title>
>
> 1. Downloading the docker image from the docker hub using `docker pull jayadevjoshi12/galaxy_pdaug:latest` command.
> 2. Running the container with latest PDAUG tools `docker run -i -t -p 8080:80 jayadevjoshi12/galaxy_pdaug:latest`.
> 3. Workflow is available under the workflow section, use `admin` as username and `password` as a password to login as an administrator of your galaxy instance.
> 4. Use `admin` as username and `password` as a password to login galaxy instance, which is available at [localhost](http://127.0.0.1:8080) to access workflow and data.
>
{: .hands_on}


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}


## Peptide Data

Several inbuilt data sets have been provided with the tool`PDAUG Peptide Data Access`. The antimicrobial peptides (AMPs) versus transmembrane peptides (TMPs) dataset was used as an example data set to understand the overall relation between features and biological properties of peptides. AMPs consist of an intersection of all activity annotations of the APD2 and CAMP databases, where gram-positive, gram-negative, and antifungal exact matches were observed. TMPs were extracted from alpha-helical transmembrane regions of proteins for classification.

> <hands-on-title>Fetching inbuild data</hands-on-title>
>
> 1. {% tool [PDAUG Peptide Data Access](toolshed.g2.bx.psu.edu/repos/jay/pdaug_peptide_data_access/pdaug_peptide_data_access/0.1.0) %} with the following parameters:
>    - *"Datasets"*: `AMPvsTMP`
>
{: .hands_on}


## Converting tabular data into fasta format

`PDAUG Peptide Data Access` tool returns data as a tabular file that contains sequences from both the classes. In order to utilize this data in the next steps, first we need to convert tabular data into fasta format. If data contains sequences from two different classes `PDAUG TSVtoFASTA` tool converts and splits data into two separate files for each of the class,  AMPs, and TMPs.  The reason behind converting and splitting the data is that all the downstream tools require two separate files if we are comparing two different peptide classes or calculating features.

> <hands-on-title>Converting tabular data into fasta formate</hands-on-title>
>
> 1. {% tool [PDAUG TSVtoFASTA](toolshed.g2.bx.psu.edu/repos/jay/pdaug_tsvtofasta/pdaug_tsvtofasta/0.1.0) %} with the following parameters:
>    - {% icon param-file %} *"Input file"*: `PDAUG Peptide Data Access - AMPvsTMP (tabular)` (output of **PDAUG Peptide Data Access** {% icon tool %})
>    - *"Peptide Column"*:  `name`
>    - *"Method to convert data"*: `Split Data By Class Label`
>    - *"Column with the class label"*: `class label`
>
>
{: .hands_on}

## Analyzing peptide libraries (AMPs and TMPs) based on features and feature space

### Summary Plot for peptide libraries

In this step, we utilize `PDAUG Peptide Sequence Analysis` tool to compare peptide sequences based on hydrophobicity, hydrophobic movement, charge, amino acid fraction, and sequence length and create a summary plot.



> <hands-on-title>Generating a summary plot to assess peptide dataset</hands-on-title>
>
> 1. {% tool [PDAUG Peptide Sequence Analysis](toolshed.g2.bx.psu.edu/repos/jay/pdaug_peptide_sequence_analysis/pdaug_peptide_sequence_analysis/0.1.0) %} with the following parameters:
>    - *"Analysis options"*: `Plot Summary`
>        - {% icon param-file %} *"First input file"*: `PDAUG TSVtoFASTA on data 1 - first (fasta)` (first output of **PDAUG TSVtoFASTA** {% icon tool %})
>        - {% icon param-file %} *"Second input file"*: `PDAUG TSVtoFASTA on data 1 - second (fasta)` (second output of **PDAUG TSVtoFASTA** {% icon tool %})
>        - *"first input file"*: `TMPs`
>        - *"Second input file"*: `AMPs`
>
>   > <question-title></question-title>
>   > What can be concluded from the summary plot based on different properties?
>   >
>   >  > <solution-title></solution-title>
>   >  > The summary plot represents differences between two sets of peptides based on an amino acid fraction, global charge, sequence length, global hydrophobicity, glocal hydrophobic movement. Additionally, 3D scattered plot shows the clustering of peptides based on three features.
>   >  >
>   >  > 1. Leucine and Valine show relatively higher differences in terms of their fraction within both groups.
>   >  > 2. TMPs show a global charge in the range of 0-5 in comparison to AMPs which show a global charge in a range of 0-14.
>   >  > 3. AMPs show higher variability in terms of their length, global hydrophobic movement, and hydrophobicity in comparison to TMPs.
>   >  > 4. Hydrophobic properties are important in determining transmembrane properties of proteins and peptides which is evident with this summary plot.
>   >  > 5. Clustering of two different kinds of peptides can be observed with a 3D scattered plot based on their properties, however, we can also observe a few peptides with overlapping feature space.
>   >  {: .solution }
>   {: .question}
>
{: .hands_on}

![Summary Plot](../../images/SummaryPlot.png "Summary plot shows comparison between AMPs and TMPs")



### Assessing feature space distribution

In this tool, we have used `PDAUG Fisher's Plot` that compares two peptide libraries based on the feature space using the Fisher test.


> <hands-on-title>Generating a Fisher's plot to assess peptide dataset</hands-on-title>
>
> 1. {% tool [PDAUG Fisher's Plot](toolshed.g2.bx.psu.edu/repos/jay/pdaug_fishers_plot/pdaug_fishers_plot/0.1.0) %} with the following parameters:
>    - {% icon param-file %} *"First fasta file"*: `PDAUG TSVtoFASTA on data 1 - first (fasta)` (first output of **PDAUG TSVtoFASTA** {% icon tool %})
>    - {% icon param-file %} *"Second fasta file"*: `PDAUG TSVtoFASTA on data 1 - second (fasta)` (second output of **PDAUG TSVtoFASTA** {% icon tool %})
>    - *"Label for first population"*: `TMPs`
>    - *"Label for second population"*: `AMPs`
>
>   > <question-title></question-title>
>   > What does Fisher's plot represents?
>   >
>   >  > <solution-title></solution-title>
>   >  >
>   >  > Fisher's plot represents the difference between two groups of peptides based on their feature space. Each tiny square in this plot represents the feature space. Based on the sliding window Fisher's test was performed for each feature space to assess the presence of peptides from two different groups on each of the tiny squares.  The AMPs and TMPs in the feature space represented by their mean hydropathy and amino acid volume. Fisher's plot shows that the sequences with larger hydrophobic amino acids are more frequent in TMPs in comparison to AMPs.
>   >  {: .solution }
>   {: .question}
>
{: .hands_on}

![Fishers plot](../../images/FeatureSpace.png "TMPs peptides show amino acids with larger hydrophobic residues in compare to AMPs")

The AMPs and TMPs in the feature space represented by their mean hydropathy and amino acid volume. Fisher's plot shows that the sequences with larger hydrophobic amino acids are more frequent in TMPs in comparison to AMPs.

## Assessing the relation between peptide features by 3D scatter plot

### Calculating Sequence Property-Based Descriptors

In this step we will calculate Composition, Transition and Distribution (CTD) descriptos. Composition describptors are defined as the number of amino acids of a particular property divided by total number of amino acids.  Transition descriptors are representd as the number of transition from a particular property to different property divided by (total number of amino acids − 1). Distribution descriptors are derived by chain length and the amino acids of a particular property located on this length {% cite Govindan_Nair_2013 %}.


> <hands-on-title>Calculating descriptors for the peptide dataset</hands-on-title>
>
> 1. {% tool [PDAUG Sequence Property Based Descriptors](toolshed.g2.bx.psu.edu/repos/jay/pdaug_sequence_property_based_descriptors/pdaug_sequence_property_based_descriptors/0.1.0) %} with the following parameters:
>    - {% icon param-file %} *"Input fasta file"*: `PDAUG TSVtoFASTA on data 1 - first (fasta)` (first output of **PDAUG TSVtoFASTA** {% icon tool %})
>    - *"Descriptor Type"*: `CTD`
>
> 1. {% tool [PDAUG Sequence Property Based Descriptors](toolshed.g2.bx.psu.edu/repos/jay/pdaug_sequence_property_based_descriptors/pdaug_sequence_property_based_descriptors/0.1.0) %} with the following parameters:
>    - {% icon param-file %} *"Input fasta file"*: `PDAUG TSVtoFASTA on data 1 - second (fasta)` (second output of **PDAUG TSVtoFASTA** {% icon tool %})
>    - *"Descriptor Type"*: `CTD`
>
>
{: .hands_on}


### Adding the Class Label in both AMPs and TMPs

Class labels or target labels usually represents the class of peptides. Here in our data set, we have peptides, either as AMP or TMP. Since we have two classes we can represent these two classes with their actual labels AMPs and TMPs.


- **Adding Class Label (target labels) in AMPs and TMPs data**

> <hands-on-title>Adding Class Labels (target labels) to the tabular data</hands-on-title>
>
> 1. {% tool [PDAUG Add Class Label](toolshed.g2.bx.psu.edu/repos/jay/pdaug_addclasslabel/pdaug_addclasslabel/0.1.0) %} with the following parameters:
>    - {% icon param-file %} *"Input file"*: `PDAUG Sequence Property Based Descriptors on data 2 - CTD (tabular)` (output of **PDAUG Sequence Property Based Descriptors** {% icon tool %})
>    - *"Class Label"*: `TMPs`
>
> 1. {% tool [PDAUG Add Class Label](toolshed.g2.bx.psu.edu/repos/jay/pdaug_addclasslabel/pdaug_addclasslabel/0.1.0) %} with the following parameters:
>    - {% icon param-file %} *"Input file"*: `PDAUG Sequence Property Based Descriptors on data 3 - CTD (tabular)` (output of **PDAUG Sequence Property Based Descriptors** {% icon tool %})
>    - *"Class Label"*: `AMPs`
>
>
{: .hands_on}


### Merging the two tabular data files

We utilize `PDAUG Merge Dataframes` to merge two tabular data files.


> <hands-on-title>Merging two tabular data files</hands-on-title>
>
> 1. {% tool [PDAUG Merge Dataframes](toolshed.g2.bx.psu.edu/repos/jay/pdaug_merge_dataframes/pdaug_merge_dataframes/0.1.0) %} with the following parameters:
>    - {% icon param-files %} *"Input files"*: `PDAUG Add Class Label on data 6 - (tabular)` (output of **PDAUG Add Class Label** {% icon tool %}), `PDAUG Add Class Label on data 7 - (tabular)` (output of **PDAUG Add Class Label** {% icon tool %})
>    - *"Option to merg data"*: `Merge data without adding class label`
>
>
{: .hands_on}


### Plotting CTD descriptor data as Scatter plot

Tool `PDAUG Basic Plots` will be used to compare two peptide libraries based on three CTD descriptors `SecondaryStrD1100`, `SolventAccessibilityD2001`, and `NormalizedVDWVD3050` respectively. A 3D scatter plot will be generated.


> <hands-on-title>Generating a scatter plot to assess features</hands-on-title>
>
> 1. {% tool [PDAUG Basic Plots](toolshed.g2.bx.psu.edu/repos/jay/pdaug_basic_plots/pdaug_basic_plots/0.1.0) %} with the following parameters:
>    - *"Data plotting method"*: `Scatter Plot`
>        - {% icon param-file %} *"Input file"*: `PDAUG Merge Dataframes on data 9 and data 8 - (tabular)` (output of **PDAUG Merge Dataframes** {% icon tool %})
>        - *"Scatter Plot type"*: `3D`
>            - *"First feature"*: `_SecondaryStrD1100`
>            - *"Second feature"*: `_SolventAccessibilityD2001`
>            - *"Third feature"*: `_NormalizedVDWVD3050`
>        - *"Class label column"*: `Class_label`
>
>
{: .hands_on}

![3D Scatter plot ](../../images/3DScattered.png "3D scatter Plot shows relation between featues")

**Figure 3** Represent 3D scattered plot generated based on the CTD descriptors. Red dots represent TMPs and blue dots represent AMPs. Based on these 3 features, we can observe that both groups do not show any clear separation or cluster in the 3D space.


In this tutorial, we learned how to utilize inbuild data, calculate features, and utilize descriptors or features to assess biological properties. We also learned how to utilize various utilities of `PDAUG` to generate useful plots to include in our peptide research.

# Conclusion


In this tutorial, we learned an example flexible and extensible analysis of peptide data using PDAUG tools. We generated various plots based on the quantitative properties of amino acids and peptide sequences.

![Workflow](../../images/PeptideAnalysisWorkflow.png "Workflow used")

tools_json:
["PDAUG Peptide Data Access", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_peptide_data_access/pdaug_peptide_data_access/0.1.0", "PDAUG TSVtoFASTA", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_tsvtofasta/pdaug_tsvtofasta/0.1.0", "PDAUG Peptide Sequence Analysis", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_peptide_sequence_analysis/pdaug_peptide_sequence_analysis/0.1.0", "PDAUG Fisher's Plot", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_fishers_plot/pdaug_fishers_plot/0.1.0", "PDAUG Sequence Property Based Descriptors", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_sequence_property_based_descriptors/pdaug_sequence_property_based_descriptors/0.1.0", "PDAUG Add Class Label", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_addclasslabel/pdaug_addclasslabel/0.1.0", "PDAUG Merge Dataframes", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_merge_dataframes/pdaug_merge_dataframes/0.1.0", "PDAUG Basic Plots", "toolshed.g2.bx.psu.edu/repos/jay/pdaug_basic_plots/pdaug_basic_plots/0.1.0"]


topic: proteomics
tutorial: DIA_lib_OSW
title: Library Generation for DIA Analysis
difficulty: intermediate
time_estimation: 1H
requirements_json: []
tags_json: ["[DIA]"]
content_hash: e22a564e20f6a23b17afbb25aea35ef7
last_modified: 2026-05-27T09:01:49.453508
zenodo_link: https://zenodo.org/record/4293493
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/DIA_lib_OSW/tutorial.html

content:
The proteome refers to the entirety of proteins in a biological system (e.g cell, tissue, organism). Proteomics is the large-scale experimental analysis of proteins and proteomes, most often performed by mass spectrometry that enables great sensitivity and throughput. Especially for complex protein mixtures, bottom-up mass spectrometry is the standard approach. In bottom-up proteomics, proteins are digested with a specific protease into peptides and the measured peptides are in silico reassembled into the corresponding proteins. Inside the mass spectrometer, not only the peptides are measured (MS1 level), but the peptides are also fragmented into smaller peptides which are measured again (MS2 level). This is referred to as tandem-mass spectrometry (MS/MS). Identification of peptides is performed by peptide spectrum matching of the theoretical spectra generated from the input protein database (fasta file) with the measured MS2 spectra. Peptide quantification is most often performed by measuring the area under the curve of the MS1 level peptide peaks, but special techniques such as TMT and DIA allow to quantify peptides on MS2 level. Nowadays, bottom-up tandem-mass spectrometry approaches allow for the identification and quantification of several thousand proteins.

To enable the identification and quantification of such high numbers of proteins in a time-wise limited measurement there has been a lot of MS method and data acquisition optimization. The most commonly used technique is the data dependent acquisition (DDA). Here only the most abundant (top N) peptides from each MS1 scan are selected for subsequent fragmentation, with the most promising chance for successful identifications due to high intensity signals. Afterwards the respective mass over charge (m/z) values are set on an exclusion list enabling the selection of less abundant peptides from the following MS1 scan for the next cycle of top N fragmentation (MS2) scans. However, since this acquisition method is highly dependent on the abundance of the respective peptides at a given retention time this method is referred to as data dependent acquisition (DDA). This dependency on both time as well as intensity leads to measurement specific identifications between multiple measurements.

Another more recently developed method is the so called data independent acquisition (DIA). However due to some unique characteristics of this acquisition method it requires spectral libraries, which contain the peptide sequences as well as their respective fragment spectrum (MS2) information.
Here we will use DDA data from the same samples to build a spectral library which can then be used for the identification of peptides in data independent acquisition (DIA) data from the same samples using e.g. OpenSwathWorkflow [OpenSwathworkflow tutorial]({{site.baseurl}}/topics/proteomics/tutorials/DIA_Analysis_OSW/tutorial.html).

![DDA_lib_gen](../../images/DIA_lib_gen_basic.png "Labelfree proteomics using liquid chromatography tandem-mass spectrometry (LC-MS/MS). Principles of data dependent acquisition (DDA).")

High quality spectral libraries can be generated by fractionation and separate measurement of a representative sample or mixture for a cohort. During the analysis the peptide and protein identifications of all fractions can than be combined into comprehensive spectral libraries. Here the spectral libraries tend to be relatively large offering great sensitivity (even to low abundant peptides), but also contain peptides which are only observable due to the prior fractionation.
Another way of generating spectral libraries is by measuring the same samples using DDA as well as using DIA. Here the DDA results will be analyzed and sample specific spectral library is generated which can then be used for the analysis of the DIA data. The resulting spectral libraries are often smaller and contain only peptides which are observable in complex and non-fractionated samples.

A plethora of software solutions were developed for the analysis of DDA proteomics data. MaxQuant is one of the most popular proteomics softwares because it is easy to use and a free software that offers functionalities for nearly all kinds of proteomics data analysis challenges {% cite Cox2008 %}. Mass spectrometry raw data is normally obtained in a vendor specific, proprietary file format. MaxQuant can directly take those raw files as input. For peptide identification MaxQuant uses a search engine called "Andromeda".

The dataset in this training consists of different Spike-in mixtures of stable amounts of human peptides and different amounts of _E.coli_ peptides. Each sample reflects a non-fractionated MS measurement (DDA) of different Spike-in ratios. To facilitate the analysis and directly combine the identifications of all measurements, we will define the different measurements as fractions of one sample, as it would be the case for e.g. high pH, SCX or HILIC fractionated samples.

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

## Get data

> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this tutorial and give it a meaningful name
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. Import the fasta and raw files as well as the experimental annotation and the iRTassays file from [Zenodo](https://zenodo.org/record/4293493)
>    ```
>    https://zenodo.org/record/4293493/files/Human_database_plus_iRT.fasta
>    https://zenodo.org/record/4293493/files/Ecoli_database.fasta
>    https://zenodo.org/record/4293493/files/iRTassays.tsv
>    https://zenodo.org/record/4293493/files/HEK_Ecoli_exp_design.txt
>    https://zenodo.org/record/4293493/files/Sample1.raw
>    https://zenodo.org/record/4293493/files/Sample2.raw
>    https://zenodo.org/record/4293493/files/Sample3.raw
>    https://zenodo.org/record/4293493/files/Sample4.raw
>    https://zenodo.org/record/4293493/files/Sample5.raw
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
> 3. Once the files are green, rename the experimental design file in 'HEK_Ecoli_exp_design', the iRT transition file in 'iRTassays' and all the raw files in 'Sample1.raw', 'Sample2.raw', 'Sample3.raw', 'Sample4.raw' and 'Sample5.raw'
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
> 5. Once the files are green, generate a collection for all .raw files (and name it DDA_data) as well as for both .fasta files (and name it FASTA)
>
>    {% snippet faqs/galaxy/collections_build_list.md %}
>
{: .hands_on}

# **MaxQuant** Analysis of DDA data

The MaxQuant Galaxy implementation contains the most important MaxQuant parameters. As an alternative, **MaxQuant (using mqpar.xml)** {% icon tool %} can be used with a preconfigured mqpar.xml file.

> <hands-on-title>MaxQuant Analysis</hands-on-title>
>
> 1. {% tool [MaxQuant](toolshed.g2.bx.psu.edu/repos/galaxyp/maxquant/maxquant/2.0.3.0+galaxy0) %} with the following parameters:
>    - In *"Input Options"*:
>        - {% icon param-collection %} *"FASTA files"*: `FASTA` collection
>        - *"identifier parse rule"*: `>([^ ]*)`
>        - *"description parse rule"*: `^>.*\|.*\|[^ ]+ (.*) OS.*$`
>    - In *"Search Options"*:
>        - {% icon param-file %} *"Specify an experimental design template"*: `HEK_Ecoli_exp_design.txt`
>        - *"minimum unique peptides"*: `1`
>        - *"Match between runs"*: `Yes`
>    - In *"Protein quantification"*:
>        - *"Use only unmodified peptides"*: `No`
>    - In *"Parameter Group"*:
>        - {% icon param-collection %} *"Infiles"*: `DDA_data` collection
>            - *"missed cleavages"*: `1`
>            - *"variable modifications"*: `Oxidation (M)`
>    - *"Generate PTXQC (proteomics quality control pipeline) report? (experimental setting)"*: `True`
>    - In *"Output Options"*:
>        - *"Select the desired outputs."*: `Protein Groups` `Peptides` `mqpar.xml` `Evidence` `MSMS`
>
>    > <comment-title>Protein Groups</comment-title>
>    > Proteins that share all their peptides with other proteins cannot be unambiguously identified. Therefore, MaxQuant groups such proteins into one protein group and only one common quantification will be calculated. The different protein properties are separated by semicolon.
>    {: .comment}
>
{: .hands_on}

Here we used a variation of the *"identifier parse rule"* to allow for the organism label to be present in the spectral library. For investigations of single organisms and to keep only the Uniprot identifier one can adjust the *"identifier parse rule"* accordingly.
More details on the different **MaxQuant** parameters can be found in this [MaxQuant tutorial]({{site.baseurl}}/topics/proteomics/tutorials/maxquant-label-free/tutorial.html).

> <tip-title>Continue with results from Zenodo</tip-title>
>
> In case the MaxQuant run is not yet finished, the results can be downloaded from Zenodo to be able to continue the tutorial
> 1. Import the files from [Zenodo](https://zenodo.org/record/4293493)
>    ```
>    https://zenodo.org/record/4293493/files/MaxQuant_PTXQC_report.pdf
>    https://zenodo.org/record/4293493/files/MaxQuant_Protein_Groups.tabular
>    https://zenodo.org/record/4293493/files/MaxQuant_Peptides.tabular
>    https://zenodo.org/record/4293493/files/MaxQuant_Evidence.tabular
>    https://zenodo.org/record/4293493/files/MaxQuant_MSMS.tabular
>    https://zenodo.org/record/4293493/files/MaxQuant_mqpar.xml
>    ```
{: .tip}

## Quality control results

To get a first overview of the MaxQuant results, the PTXQC report is helpful. Click on the {% icon galaxy-eye %} eye of the PTXQC pdf file to open it in Galaxy. Screening through the different plots might already give you a hint on how many peptides and proteins were identified as well as some of the data quality.

The PTXQC software ({% cite Bielow2015 %}) was built to enable direct proteomics quality control from MaxQuant result files. This quality control can be directly used in the Galaxy MaxQuant wrapper by setting *"Generate PTXQC"* to `True`. This will generate a pdf file with multiple quality control plots. Be aware that the cutoffs set in PTXQC might not be applicable to your experiment and mass spectrometer type and therefore "under performing" and "fail" do not necessarily mean that the quality is poor.

> <question-title></question-title>
>
> 1. How many proteins were found in total?
> 2. How many peptides were found in total?
>
>
> > <solution-title></solution-title>
> > 1. Approximately 5,370 proteins were found (see ProteinGroups output)
> > 2. Approximately 34,970 peptides were found (see Peptides output)
> >
> {: .solution}
>
{: .question}


## **Filter** for unique peptides in the *evidence* and *msms* output

> <hands-on-title>Filtering the <b>MaxQuant</b> search results for unique peptides</hands-on-title>
>
> 1. {% tool [Filter](Filter1) %} with the following parameters:
>        - {% icon param-file %} *"Infile"*: `MaxQuant_Evidence`
>    - *"With following condition"*: `len(c9.split(';')) < 2`
>    - *"Number of header lines to skip"*: `1`
>
> 2. **Rename** {% icon galaxy-pencil %} the output file to 'Filter on MaxQuant_Evidence'
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
> 3. {% tool [Filter](Filter1) %} with the following parameters:
>        - {% icon param-file %} *"Infile"*: `MaxQuant_MSMS`
>    - *"With following condition"*: `len(c12.split(';')) < 2`
>    - *"Number of header lines to skip"*: `1`
>
> 4.  **Rename** {% icon galaxy-pencil %} the output file to 'Filter on MaxQuant_MSMS'
>
>    > <comment-title>Unique Features / peptides</comment-title>
>    > Peptides which only occur in one protein are considered as unique for this specific protein. To avoid ambigious protein mapping later, we filter the **MaxQuant** search results for unique peptides only. CAUTION: This increase in specificity (each peptide originates from only one protein) will reduce the size of the spectral library and might lead to decreased sensitivity  during the DIA analysis.
>    {: .comment}
>
{: .hands_on}

> <question-title></question-title>
>
> 1. How many unique features per lines remain after the filtering in the evidence and the msms output?
>
> > <solution-title></solution-title>
> >
> > 1. ~100,000 lines in the evidence and ~98,000 lines in the msms.
> >
> {: .solution}
>
{: .question}


# diapysef library generation

> <hands-on-title>Generation of a spectral library using the unique <b>MaxQuant</b> search results and indexed retention time <i>iRT</i> peptides</hands-on-title>
>
> 1. {% tool [**diapysef library generation** generates spectral library for DIA analysis](toolshed.g2.bx.psu.edu/repos/galaxyp/diapysef/diapysef/0.3.5.0) %}:
>    - In *"MaxQuant output file msms.txt*:
>        - {% icon param-file %} *"Infile"*: `Filter on MaxQuant_MSMS`
>    - In *"MaxQuant output file evidence.txt*:
>        - {% icon param-file %} *"Infile"*: `Filter on MaxQuant_Evidence`
>    - In *"Retention time alignment method"*:
>        - {% icon param-file %} *"Infile"*: `iRTassays.tsv`
>
>    > <comment-title>Indexed retention time <i>iRT</i> peptides</comment-title>
>    >To allow for improved alignement of the different measurements, synthetic (non-endogenous) peptides which were spiked-in to all samples prior to the MS measurement. First the measured retention times (RTs) of those spiked-in peptides are extracted in the **MaxQuant** search results. Using the measured RTs as well as arbitrary assigned values (ranging from -26 to 99) a linear regression through the 11 synthetic peptides is applied.  Based on this linear regression fit *indexed* retention times (iRTs) are assigned to all other peptides.
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. How many of the 11 synthetic peptides were found in the first DDA (Sample1) file?
> 2. How many were found in the second DDA (Sample2) file?
>
> > <solution-title></solution-title>
> >
> > 1. 8 iRT peptides were found in the first DDA file
> > 2. 9 iRT peptides were found in the second DDA file
> >
> {: .solution}
>
{: .question}

# Spectral library refinement with **OpenSwathAssayGenerator**

> <hands-on-title>Spectral library optimization and refinement using <b>OpenSwathAssayGenerator</b></hands-on-title>
>
> 1. {% tool [OpenSwathAssayGenerator](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_openswathassaygenerator/OpenSwathAssayGenerator/2.6+galaxy0) %} with the following parameters:
>    - *"Output file type -- default: determined from file extension or content"*: `tabular (tsv)`
>    - *"MZ threshold in Thomson for precursor ion selection"*: `0.015`
>    - *"upper MZ limit for precursor ions"*: `1000.0`
>    - *"MZ threshold in Thomson for fragment ion annotation"*: `0.015`
>
>
>    > <comment-title>Adjustment of the Spectral library</comment-title>
>    > The spectral library coming from **diapysef library generation** contains all observed fragment ions from the DDA runs resulting in a relativly large spectral library. Large libraries can lead to inceased processing times as well as fewer identifications after adjusting based on the False Discovery Rate (FDR). Thus, it is recommened to optimize and refine the spectral library by e.g. filtering for peptides with at least 6 transitions (increased confidence) and limiting the maximum also to 6 transitions (avoiding inflated libraries). Furthermore, the scan range can be adjusted (here between 400 - 1000 m/z) covering the same m/z range as in the DIA measurements.
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. How many transitions does the refined spectral library contain and how many were removed?
>
> > <solution-title></solution-title>
> >
> > 1. The refined library contains ~170,000 lines, and almost 700,000 lines were removed.
> >
> {: .solution}
>
{: .question}

# Adding decoy sequences with **OpenSwathDecoyGenerator**

> <hands-on-title>Adding <i>decoy</i> transitions to the spectral library</hands-on-title>
>
> 1. {% tool [OpenSwathDecoyGenerator](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_openswathdecoygenerator/OpenSwathDecoyGenerator/2.6+galaxy0) %} with the following parameters:
>    - *"Output file type -- default: determined from file extension or content"*: `tabular (tsv)`
>    - *"Advanced Options"*: `Show Advanced Options`
>        - *"MZ threshold in Thomson for fragment ion annotation"*: `0.015`
>
>    > <comment-title><i>Decoy</i> transitions</comment-title>
>    > To enable correct false discovery rate (FDR) computation later on, we add computanionally generated decoy sequences to the spectral library. Those "non-observed" sequences can be generated based on the observed sequences with slight modifications. The most commonly used methods are either **shuffle** (randomly altering the amino acid sequence of each observed transition) or **reverse** (by reversing the actually obeserved transitions). Those artificially generated transitions were labelled as **decoy** and are later on considered as known false positives.
>    > Example: By applying an FDR of 1 % we only allow for e.g only 1 such decoy transition out of 100 identifications. Thus one could estimate that the remaining 99 non-labeled identifications contain also 1 % false positive hits.
>    {: .comment}
>
{: .hands_on}

> <question-title></question-title>
>
> 1. How many lines do you expect after running the **OpenSwathDecoyGenerator** on your spectral library containing only observed transitions?
>
> > <solution-title></solution-title>
> >
> > 1. We expect double the amount of lines (~340,000), since we generate one *decoy* (non-observed) per *target* (observed) sequence.
> >
> {: .solution}
>
{: .question}

# Converting the spectral library with **TargetedFileConverter**

> <hands-on-title>Converting the final spectral library from <i>.tsv</i> to the sqlite <i>.pqp</i> format</hands-on-title>
>
> 1. {% tool [TargetedFileConverter](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_targetedfileconverter/TargetedFileConverter/2.6+galaxy0) %} with the following parameters:
>    - *"Output file type -- default: determined from file extension or content"*: `pqp`
>
>    > <comment-title>Finding the right format for the spectral library.</comment-title>
>    >Generally there is a broad variety of data formats for spectral libraries including *.tsv*, *.dlib*, *.pqp* and more. Depending on the DIA analysis software one or multiple formats are supported and can be used. In **OpenSwathWorkflow** one needs to have the spectral library in *.pqp* format to being able to combine multiple runs after the DIA analysis and before applying the FDR scoring. This is particularily interesting when the multiple runs should be compared later on.
>    {: .comment}
>
{: .hands_on}


> <question-title></question-title>
>
> 1. How many peptides and proteins does the final library contain?
> 2. How many *target* peptides and proteins are in the library?
>
> > <solution-title></solution-title>
> >
> > 1. The final spectral library contains over 56,000 peptides covering over 10,200 proteins.
> > 2. Since we added equal numbers of *decoy* sequences we expect to have only half of the peptides and proteins (~28,000 and ~5,100) which are real targets.
> >
> {: .solution}
>
{: .question}


# Conclusion


![DDA_lib_gen_pipe](../../images/DIA_lib_gen_sum.png "All-in one workflow for DIA analysis in Galaxy. The generation of a spectral library is highlighted in red.")

Using data dependent acquisiton (DDA) mass spectrometry data we generated a spectral library which can be used for the analysis of data independent acquisition (DIA) data. The quality and content of the spectral library is crucial for the following DIA data analysis. Thus, in some analysis it might be beneficial or even necessary to use slightly adjusted spectral libraries, containing e.g. semi-tryptic peptides (see enzyme in **MaxQuant**), non-unique peptides (skip filtering) or longer peptides (higher missed cleavages).

![DDA_lib_gen_galaxy](../../images/DIA_lib_gen_workflow.png "Galaxy worfklow containing all necessary steps for the genration of a spectral library.")

tools_json:
["MaxQuant", "toolshed.g2.bx.psu.edu/repos/galaxyp/maxquant/maxquant/2.0.3.0+galaxy0", "Filter", "Filter1", "**diapysef library generation** generates spectral library for DIA analysis", "toolshed.g2.bx.psu.edu/repos/galaxyp/diapysef/diapysef/0.3.5.0", "OpenSwathAssayGenerator", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_openswathassaygenerator/OpenSwathAssayGenerator/2.6+galaxy0", "OpenSwathDecoyGenerator", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_openswathdecoygenerator/OpenSwathDecoyGenerator/2.6+galaxy0", "TargetedFileConverter", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_targetedfileconverter/TargetedFileConverter/2.6+galaxy0"]


topic: proteomics
tutorial: proteome_annotation
title: Annotating a protein list identified by LC-MS/MS experiments
difficulty: intermediate
time_estimation: 1H
tools_json: []
requirements_json: []
tags_json: ["[DDA, human]"]
content_hash: 3ebd149038e20365dfe8f8e46bfb0b39
last_modified: 2026-05-15T22:28:14.479974
zenodo_link: https://zenodo.org/record/3405119
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/proteome_annotation/tutorial.html

content:
[ProteoRE Galaxy instance](http://www.proteore.org) provides necessary tools to execute a whole annotation pipeline of a protein list identified by LC-MS/MS experiments. This activity introduces these tools and guides you through a simple pipeline using some example datasets based on the study entitled "Proteomic characterization of human exhaled breath condensate" {% cite Lacombe2018 %}.
The goal of this study was to identify proteins secreted in the respiratory tract (lung, bronchi). Samples were obtained non-invasively by condensation of exhaled air that contains submicron droplets of airway lining fluid. Two pooled samples of EBC, each obtained from 10 healthy donors, were processed. Two 'technical' control samples were processed in parallel to the pooled samples to correct for exogenous protein contamination.
A total of 229 unique proteins were identified in EBC among which 153 proteins were detected in both EBC pooled samples. A detailed bioinformatics analysis of these 153 proteins showed that most of the proteins identified corresponded to proteins secreted in the respiratory tract (lung, bronchi).

> <agenda-title></agenda-title>
>
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Get Input Datasets

For this tutorial, we will use 3 datasets: the list of proteins identified by LC-MS/MS in the exhaled breath condensate (EBC) from {% cite Lacombe2018 %} and two others EBC proteomes previously published ({% cite Muccilli2015 %}  and {% cite Bredberg2011 %}). These datasets are available from Zenodo [here](https://zenodo.org/record/3405119).

> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this tutorial and give it a name
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. Import the files from [Zenodo](https://zenodo.org/record/3405119) or from the shared data library (ask your instructors).
>
>    ```
>    https://zenodo.org/record/3405119/files/Lacombe_2018.txt
>    https://zenodo.org/record/3405119/files/Bredberg.txt
>    https://zenodo.org/record/3405119/files/Mucilli.txt
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
{: .hands_on}


# Filtering out technical contaminants

A group of 10 proteins were identified in both “technical” control samples with an enrichment in EBC samples below a fixed threshold. These proteins were thus considered to be technical contaminants (see list of proteins in Table 4 in {% cite Lacombe2018 %}) and have to be removed from the initial dataset.

> <hands-on-title>Remove the contaminants</hands-on-title>
>
> 1. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>    - {% icon param-file %} *"Input file"*: `Lacombe_2018.txt`
>    - *"Operation"*: `Discard`
>    - {% icon param-repeat %} *"Insert Filter by keywords"*
>      - *"Column number on which to apply the filter"*: `c1`
>      - *"Search for exact match ?"*: `No`
>      - *"Enter keywords"*: `copy/paste`
>        - *"Copy/paste keywords to find"*: `P04264 P35908 P13645 Q5D862 Q5T749 Q8IW75 P81605 P22531 P59666 P78386`
>
>    > <comment-title>Outputs</comment-title>
>    > - **Filtered_Lacombe_2018.txt - Discarded_lines**: output list with the ten proteins (contaminants) removed from the original dataset (10 proteins)
>    > - **Filtered_Lacombe_2018.txt**: output contains the remaining proteins that will be considered for further analysis (151 proteins)
>    {: .comment}
>
{: .hands_on}


# Check for the presence of biological contaminants

As EBC samples are obtained from air exhaled through the oral cavity, and even though the RTube collection device contained a saliva trap to separate saliva from the exhaled breath, contamination with salivary proteins had to be assessed. We decided to check the expression pattern for each protein of the "core" EBC proteome using the [The Human Protein Atlas](https://www.proteinatlas.org/) (HPA, {% cite Uhln2005 %}). As HPA is indexed by Ensembl gene identifier (ENSG) we first need to convert Uniprot ID to Ensembl gene (ENSG). Secondly, check for proteins which are highly expressed in the salivary glands as reported by HPA, then in a third step, we filter out these proteins.

> <hands-on-title>Convert Uniprot ID to Ensembl gene ID</hands-on-title>
>
> 1. **ID Converter** {% icon tool %} with the following parameters:
>    - *"Enter IDs"*: `Input file containing IDs`
>        - {% icon param-file %} *"Select your file"*: `Filtered_Lacombe_2018.txt` output from **Filter by keywords** {% icon tool %}
>    - *"Column number of IDs to map"*: `c1`
>    - *"Species"*: `Human (Homo sapiens)`
>        - *"Type/source of IDs"*: `Uniprot accession number (e.g. P31946)`
>        - *"Target type of IDs you would like to map to"*:
>          - {% icon param-check %} `Ensembl gene ID (e.g. ENSG00000166913)`
>
>    > <comment-title>Output</comment-title>
>    >
>    > In the output file, a new column which contains Ensembl IDs was added (at the end)
>    {: .comment}
{: .hands_on}


> <hands-on-title>Check for proteins highly expressed in salivary glands</hands-on-title>
>
> 1. **Add expression data** {% icon tool %} with the following parameters:
>    - *"Enter your IDs"*: `Input file containing your IDs`
>    - {% icon param-file %} *"Select your file"*: `ID Converter on data ..` from **ID Converter** {% icon tool %}
>    - *"Column IDs"*: `c4` (column containing Ensembl IDs)
>    - *"Does file contain header"*: `Yes`
>    - *"Select informareactometion to add to your list"*:
>       - {% icon param-check %} `Gene name`
>       - {% icon param-check %} `Gene description`
>       - {% icon param-check %} `RNA tissue category (according to HPA)`
>       - {% icon param-check %} `RNA tissue specificity abundance in "Transcript Per Million`
>
>
>    > <comment-title>Outputs</comment-title>
>    >
>    > In the output file, four columns were added (5, 6, 7 and 8) corresponding to the retrieved information from HPA.
>    {: .comment}
>
{: .hands_on}

Examine the output table. Note that in the last column of the list (column 8), we see that *AMY1B*, *CALML5*, *PIP*, *ZG16B*, *CST4*, *MUC7*, *CST1* and *CST2* have been reported as highly enriched in salivary gland with elevated RNA transcript specific Transcript Per Million (TPM) value for each, suggesting that these proteins may come from the saliva and not from the exhaled breath condensate. We will remove these biological contaminants from our initial protein set.

```
[..]
P04745  Alpha-amylase           1  23  ENSG00000174876  AMY1B  Amylase, alpha 1B (salivary) Tissue enriched   salivary gland: 1847.5
[..]
Q9NZT1  Calmodulin-like protein 5  8  ENSG00000178372   CALML5 Calmodulin-like 5            Group enriched    salivary gland: 262.7;skin: 651.2
[..]
```

In the next step, we will filter the data to remove these biological contaminants (i.e. proteins highly expressed in salivary glands)
by filtering out the lines that contain the word `salivary` in the column of RNA transcript specific TPM.

> <hands-on-title>Filter the data to remove the biological contaminants</hands-on-title>
>
>  1. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>     - {% icon param-file %} *"Input file"*: `Add expression data on data ..` from **Add expression data** {% icon tool %}
>     - *"Operation"*: `Discard`
>     - {% icon param-repeat %} *"Insert Filter by keywords"*
>       - *"Column number on which to apply the filter"* : `c8`  (column with RNA transcript specific TPM)
>       - *"Search for exact match ?" : `No`
>       - *"Enter keywords"*: `copy/paste`
>          - *"Copy/paste keyword to fine"*: `salivary`
>
>     > <comment-title>Outputs</comment-title>
>     > Two output files are created:
>     > - **Filtered Add expression data on data .. - Discarded lines** (12 proteins)
>     > - **FilteredAdd expression data on data ..** (157 proteins)
>     {: .comment}
>
>  > <tip-title>Using genes instead of keywords</tip-title>
>  > Note also that a list of “gene” may have been entered (selected on the basis of their TPM value) applied to column 5 instead of the keywords "salivary" to column 8, as it has been done in {% cite Lacombe2018 %}.
>  {: .tip}
>
{: .hands_on}


# Functional annotation of the EBC proteome (enrichment analysis)

The resulting list of 157 proteins identified in the two pooled EBC samples (excluding the 10 contaminants proteins) is now submitted to Gene Ontology (GO)-term enrichment analysis to determine functions that were significantly enriched in our EBC proteomic dataset. To do so, we'll use the ClusterProfiler tool (based on the R package clusterProfiler) for functional annotation. 
Now we can perform the GO terms analysis. Input list is the EBC proteome to be analyzed after technical and biological contaminants
removal, which is the output of biological contaminants filter step.

> <hands-on-title>GO terms analysis</hands-on-title>
>
> 1. **GO terms classification and enrichment analysis** {% icon tool %} with the following parameters:
>    - *"Enter your IDs"*: `Input file containing your IDs`
>    - {% icon param-file %} *"Choose a file that contains your list of IDs"*: `Filtered_Add expression data on data ..`  from **Filter by keywords** {% icon tool %}
>    - *"Column number of IDs"*: `c1`
>    - *"Select type/source of IDs"*: `UniProt accession number (e.g.:P31946)`
>    - *"Species"*: `Homo sapiens`
>    - *"Select GO terms category"*:
>      - {% icon param-check %} `Cellular Component`
>      - {% icon param-check %} `Biological process`
>      - {% icon param-check %} `Molecular Function`
>    - *"Perform GO categories representation analysis?"*: `Yes`
>    - *"Ontology level"*: `3`
>    - *"Perform GO categories enrichment analysis?"*: `Yes`
>      - *"Define your own background IDs?"*: `No`
>        - *"Graphical display"*:
>          - {% icon param-check %} `dot-plot`
>
>   > <comment-title>Output</comment-title>
>   >
>   > Results created in History panel are the following:
>   >   - Cluster profiler
>   >   - ClusterProfiler diagram outputs (collection dataset of all graphical outputs)
>   >   - ClusterProfiler text files (collection dataset of all text files)
>   >
>   >   The suffix “GGO” (GroupGO) corresponds to the results “GO categories representation analysis” option
>   >   (performs a gene/protein classification based on GO distribution at a specific level). The suffix
>   >   “EGO” (EnrichGO) corresponds to the results from the enrichment analysis. Two types of graphical output are provided either
>   >   in the form of bar-plot or dot-plot.
>   {: .comment}
{: .hands_on}


# Visualize EBC proteome on biological pathways (using Reactome)

The 157 proteins identified in EBC samples are now mapped to biological pathways and visualized
via the web service of Reactome ({% cite croft2013reactome %}), an open access, manually curated and peer-reviewed human pathway
database that aims to provide intuitive bioinformatics tools for the visualization,
interpretation and analysis of pathway knowledge.

> <hands-on-title>Protein list mapping on Reactome database</hands-on-title>
>
> 1. **Query pathway database [Reactome]** {% icon tool %} with the following parameters:
>    - *"Input IDs"*: `Input file containing your IDs`
>    - {% icon param-file %} *"Input file containing your IDs"*: `Filtered_Add expression data on data ..` from **Filter by keywords** {% icon tool %}
>    - *"Column number of IDs"*: `c1`
>    - *"Species"*: `Human (Homo sapiens)`
>
{: .hands_on}

Within the `Query pathway database on data ..` output of the tool, you can click on a link that opens the connection on Reactome:
![the mapping of your IDs on the database](../../images/ProteoreAnnot-reactome.png).

Here you can explore the Reactome map of your IDs to see the context of your biological pathways.


# Comparison with other proteomic datasets from previous studies

> <hands-on-title>Lists comparison with Venn diagramm tool</hands-on-title>
>
> 1. **Venn diagram** {% icon tool %} with the following parameters:
>    - {% icon param-repeat %} *"Insert List to compare"*
>      - *"Enter your list"*: `Input file containing your list`
>      - {% icon param-file %} *"Select your file"*: `kept_lines` (output of **Filter by keywords and/or numerical value** {% icon tool %})
>      - *"Enter the name of this list"*: `Lacombe et al`
>    - {% icon param-repeat %} *"Insert List to compare"*
>      - *"Enter your list"*: `Input file containing your list`
>      - {% icon param-file %} *"Select your file"*: `output` (Input dataset)
>      - *"Enter the name of this list"*: `Bredberg et al`
>    - {% icon param-repeat %} *"Insert List to compare"*
>      - *"Enter your list"*: `Input file containing your list`
>      - {% icon param-file %} *"Select your file"*: `output` (Input dataset)
>      - *"Enter the name of this list"*: `Mucilli et al`
>
>   > <comment-title>Output</comment-title>
>   >
>   > The Venn diagram shows the number of proteins specific and in common between the 3 lists.
>   > ![Graphical output of the Venn diagram](../../images/ProteoreAnnot-Venn.png).
>   >
>   {: .comment}
{: .hands_on}

# Conclusion


ProteoRE offers a panel of tools to annotate a protein list.
We showed that it is possible to make ID conversion, perform tissu-expression annotation, but also
Gene Ontology analysis as well as Reactome interogation.
This allows the user to go deeper in the analysis of proteomics analyses results.


topic: proteomics
tutorial: protein-quant-sil
title: Peptide and Protein Quantification via Stable Isotope Labelling (SIL)
difficulty: advanced
time_estimation: 1h
requirements_json: []
tags_json: ["[DDA, SILAC]"]
content_hash: e8044a623bc7fb93dbc2fb1ee7920017
last_modified: 2026-05-27T09:01:49.462266
zenodo_link: https://zenodo.org/record/1051552
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/protein-quant-sil/tutorial.html

content:
To compare protein amounts in different samples from MS/MS data, two different experiment setups exist. Firstly, unmodified proteins can be measured in separate runs at one sample per MS-run. Secondly, proteins of samples to compare can be labelled with small chemical tags, mixed, and measured side-by-side in a single MS-run.
There are two types of chemical tags:
  1. Isobaric tags display the same mass on first hand, but fragment during the generation of the MS/MS spectra to yield reporter ions of different mass. The intensity of those reporter ions can be compared in MS/MS spectra. There are two types of isobaric tags commercially available: *tandem mass tags* (TMT) and *isobaric tags for relative and absolute quantitation* (iTRAQ).
  2. Isotopic tags are chemically identical, but differ in their mass due to incorporated stable isotopes. Examples of different isotopic tags for stable isotope labelling (SIL) are ICAT, SILAC, dimethylation, or heavy oxygen (<sup>18</sup>O).

This tutorial deals with protein quantitation via stable isotope labelling (SIL). For isotopic tags, quantitation can be achieved by comparing the intensity of MS1 peptide mass traces. The whole MS1 profile of a peptide, i.e. the intensities of all its isotopic peaks over time, is called a *peptide feature* (Figure 1a).
Incorporation of stable isotopes results in different peptide masses on MS1 level, which give rise to coeluting ion traces in the TIC with a mass difference typical for each different chemical tag (Figure 1b). Figure originally published in [Nilse et al, 2015](http://www.ncbi.nlm.nih.gov/pubmed/25931027).

In this tutorial, we will use tools of the [OpenMS suite](http://www.openms.org) to identify and quantify peptides and proteins.

![ms1 feature](../../images/protein-quant-sil_ms1feature.png "MS1 mass traces. A) Two peptide features of co-eluting SIL peptides. B) MS1 spectra at a given RT. C) XIC monoisotopic peak light peptide. D) XIC monoisotopic peak heavy peptide.")

## Prerequisites


If you are in the planning phase of your quantitative proteomics experiment, you may want to consider our tutorial on different [quantitation methods]({{site.baseurl}}/topics/proteomics/tutorials/labelfree-vs-labelled/tutorial.html) first.

To learn about *protein identification* in Galaxy, please consider our OpenMS-based [peptide ID tutorial]({% link topics/proteomics/tutorials/protein-id-oms/tutorial.md %}).

> <hands-on-title>Introduction</hands-on-title>
> In the hands-on section of this tutorial, we will use a quantitative comparison of HEK cell lysate as a test dataset. In this experiment, HEK cells were once labelled with light, once with heavy SILAC. Both cultures were lysed simultaneously and the cell lysates were mixed in a certain ratio.
> A detailed description of the full dataset is available in the [PRIDE archive](https://www.ebi.ac.uk/pride/).
>
> Your objective in this hands-on-tutorial is to find out the correct mixing ratio of the test sample.
>
> To speed up analysis, the input dataset was filtered to include only those data acquired in second 2000-3000 of the original LC gradient.
{: .hands_on}

> <agenda-title></agenda-title>
>
> In this tutorial, we will deal with:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Peptide and Protein Identification

In this tutorial, peptide identification will be performed using the workflow of the previous [Peptide ID Tutorial]({% link topics/proteomics/tutorials/protein-id-oms/tutorial.md %}). Alternatively one can perform the protein identification step by step in the [Peptide ID Tutorial]({% link topics/proteomics/tutorials/protein-id-oms/tutorial.md %}) using the SILAC dataset from [zenodo](https://zenodo.org/record/1051552) **but** beware to specify the labels in the `param_variable_modifications` of **XTandemAdapter** {% icon tool %}.

A common problem in mass spectrometry are misassigned mono-isotopic precursor peaks. Most search engines allow for some adaptation of the monoisotopic peak and we will use this by leaving `By default, misassignment to the first and second isotopic 13C peak are also considered` at `No`.

[//]: # TODO: Read about monoisotopic peak problem, give citation to review!

> <hands-on-title>Data upload</hands-on-title>
>
> 1. Create a new history for this SILAC Proteome exercise
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. Import the mzml file, containing the measured mass spectra from [Zenodo](https://doi.org/10.5281/zenodo.1051552) or a data library:
>
>    ```
>    https://zenodo.org/record/1051552/files/HEK_SILAC-K6R6_ST905_part.mzml
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
>    > <comment-title></comment-title>
>    > The data have been preprocessed during the conversion from the machine raw file. We used background removal on MS1 and MS2 level, and MS2 deisotoping.
>    {: .comment}
>
> 2. Import the human protein database (including cRAP contaminants and decoys) from [zenodo](https://zenodo.org/record/892005/files/Human_database_including_decoys_%28cRAP_added%29.fasta) or a data library:
>
>    ```
>    https://zenodo.org/record/892005/files/Human_database_including_decoys_%28cRAP_added%29.fasta
>    ```
>
> 3. Import the [workflow]({% link topics/proteomics/tutorials/protein-id-oms/workflows/workflow.ga %})
>
>    ```
>    {{ site.url }}/{{site.baseurl}}/topics/proteomics/tutorials/protein-id-oms/workflows/workflow.ga
>    ```
>
> 4. Modify the workflow
>
>   1. Connect the `mzML` input directly to the **XTandemAdapter** {% icon tool %} node and delete **PeakPickerHiRes**.
>   2. Change the **XTandemAdapter** {% icon tool %} parameters: Add the **param_variable_modifications** `Label:13C(6) (K)` and `Label:13C(6) (R)`
>
> 4. Run the workflow with
>   - the mzML dataset `1: mzML dataset`
>   - the human FASTA database `2: protein FASTA database`
>
>   > <tip-title>Using Galaxy Workflows</tip-title>
>   > If you want to learn more about Galaxy workflows, please consult the [Galaxy Introduction]({{site.baseurl}}/topics/introduction/tutorials/galaxy-intro-101/tutorial.html#the-workflow-editor)
>   {: .tip}
>
{: .hands_on}

> <question-title></question-title>
> 1. How many peptides and proteins were successfully identified?
>
> > <solution-title></solution-title>
> > 1.    2217 non-redundant peptides and 763 proteins were identified.
> > Numbers may slightly vary depending on the versions of the tools and the used FASTA file.
> {: .solution }
{: .question}

# MS1 Feature Detection

MS1 feature detection is a critical step in quantitative workflows. In principle, there are two different ways to define features:
1. Feature detection solely based upon MS1 data (mzML/raw files) without prior knowledge of peptide identifications (IDs).
    - Advantage: Feature results can be used to assist in peptide identification.
    - Drawback: Not all peptide identifications can be mapped to features, thus not every identified peptide can be quantified.
2. Feature detection based upon peptide IDs.
    - Advantage: Most peptide IDs trigger a feature detection.
    - Drawback: Feature results cannot be used to improve peptide ID.

The OpenMS suite provides several tools (FeatureFinders) for MS1 feature detection. For SIL we have to use **FeatureFinderMultiplex**, which does not take peptide IDs as an input.

> <hands-on-title>MS1 Feature Detection</hands-on-title>
>
> 1. Run {% tool [FeatureFinderMultiplex](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_featurefindermultiplex/FeatureFinderMultiplex/2.6+galaxy0) %} with
>    - {% icon param-file %} *"LC-MS dataset in centroid or profile mode"*: mzML file
>    - In *"algorithmic parameters"*
>      - *"Labels used for labelling the samples"*: `[ ][Arg6,Lys6]`
>      - *"m/z tolerance for search of peak patterns"*: `10`
>      - *"Maximum number of missed cleavages due to incomplete digestion"*: `1`
>    - *"Optional outputs"*: `out_multiplets (Optional output file containing all detected peptide groups`
>
{: .hands_on}

> <comment-title>Multiple labels per peptide</comment-title>
> When using SILAC-KR or dimethyl-labelling and trypsin digestion, exactly one labelled amino acid per peptide is expected. The only labelled amino acids are lysine (K) and arginine (R) and trypsin cuts after each of them. However, a small percentage of missed cleavage normally occur also in those datasets. Setting *"Maximum number of missed cleavages due to incomplete digestion"* to `1` will be sufficient to deal with most missed cleavages.
>
> When using other enzymes (e.g. Lys-C) or other labels (e.g. $$^{18}O$$), several labelled amino acids per peptide are expected. You can search for those features by increasing the parameter *"Maximum number of missed cleavages due to incomplete digestion"*.
{: .comment}

# Mapping Identifications to Features

We now have feature quantifications for MS1 elution peaks, peptide identifications for the MS2 spectra and protein identifications.
The next step is to map the MS2-based peptide identifications to the quantified MS1 precursor peaks ("peptide features"). This will enable the quantification of identified peptides.
For labelled data, it is necessary to map peptide identifications to *consensus* features (i.e. a pair of one light peptide feature with one matching heavy feature in the correct m/z distance).
For `consensusXML`, IDMapper uses the consensus centroids, not the feature boundaries for mapping. Therefore, the RT tolerance has to be set higher than for mapping to `featureXML`. A good starting value is half the expected typical retention time.

Sometimes several peptide identifications are mapped to a feature. The tool [IDConflictResolver](http://ftp.mi.fu-berlin.de/pub/OpenMS/release-documentation/html/TOPP_IDConflictResolver.html) filters the mapping so that only the identification with the best score is associated to each feature.
Another refinement of the quantitative result is obtained by removing falsely mapped identifications e.g. light identification mapped to heavy feature. This step is performed by the **MultiplexResolver** {% icon tool %} that returns a first file with the correctly mapped peptides and as a second output the falsly mapped peptides.

Finally, the correctly mapped peptides will be combined into protein quantifications with the **ProteinQuantifier** {% icon tool %}.

> <hands-on-title>Quant to ID matching</hands-on-title>
>
> 1. Run {% tool [IDMapper](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_idmapper/IDMapper/2.6+galaxy0) %} with
>    - {% icon param-file %} *"Protein/peptide identifications file"*: output of **FalseDiscoveryRate**
>    - {% icon param-file %} *"Feature map/consensus map file"*: output of **FeatureFinderMultiplex**
>    - *"RT tolerance (in seconds) for the matching of peptide identifications and (consensus) features"*: `20`
>    - *"m/z tolerance (in ppm or Da) for matching of peptide identifications and (consensus) features"*: `10`
>    - In *"Additional options for consensusXML input"*
>      - *"Match using RT and m/z of sub-features instead of consensus RT and m/z"*: `Yes`
>      - *"Store the map index of the sub-feature in the peptide ID"*: `Yes`
>
> 2. Run {% tool [IDConflictResolver](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_idconflictresolver/IDConflictResolver/2.6+galaxy0) %} with
>    - {% icon param-file %} *"Input file"*: output of **IDMapper**
>
> 3. Run {% tool [MultiplexResolver](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_multiplexresolver/MultiplexResolver/2.5+galaxy0) %} with
>    - {% icon param-file %} *"Peptide multiplets with assigned sequence information"*: output of **IDConflictResolver**
>    - *"Labels used for labelling the samples"*: `[ ][Arg6,Lys6]`
>    - *"Maximum number of missed cleavages due to incomplete digestion"*: `1`
>
> 4. Run {% tool [ProteinQuantifier](toolshed.g2.bx.psu.edu/repos/galaxyp/openms_proteinquantifier/ProteinQuantifier/2.6+galaxy0) %} with
>   - {% icon param-file %} *"Input file"*: first output of **MultiplexResolver**
>   - {% icon param-file %} *"Protein inference results"*: output of **FalseDiscoveryRate**
>   - *"Calculate protein abundance from this number of proteotypic peptides (most abundant first; '0' for all)"*: `0`
>   - *"Averaging method used to compute protein abundances from peptide abundances"*: `sum`
>   - *"Add the log2 ratios of the abundance values to the output"*: `Yes`
>   - *"Optional outputs"*: `out (Output file for protein abundances)` and `peptide_out (Output file for peptide abundances)`
>
{: .hands_on}

> <comment-title>ProteinQuantifier parameters</comment-title>
> Peptide quantitation algorithms are more precise for high abundant peptides. Therefore, it is recommended to base protein quantitations on those peptides. In ProteinQuantifier, you may restrict the calculation of protein abundances to the most abundant peptides by using the option "Calculate protein abundance from this number of proteotypic peptides".
> However, we recommend to use the averaging method `sum` instead. By using this option, protein ratios are based on the sum of all peptide abundances. Thus, highly abundant peptides thus have more influence on protein abundance calculation than low abundant peptides.
> A simple sum-of-intensities algorithm provided the best estimates of true protein ratios in a comparison of several protein quantitation algorithms ([Carrillo et al., Bioinformatics, 2009](https://www.ncbi.nlm.nih.gov/pubmed/19892804)).
{: .comment}

# Descriptive Statistics and Plotting of Protein Quantitations

**ProteinQuantifier** produces two output tables: the first one gives information about the quantified proteins, the second one gives information about the quantified peptides.
For proteins, we added a log-transformed ratio to the output, which is saved in column 8 of the protein table. The ratio is calculated as **log2 (abundance2/abundance1)**, which is sometimes called the *fold change (FC)* ratio.

To get a quick overview of the results, you can calculate basic descriptive statistics and plot the data as a histogram.
Comment lines in the beginning of a `tabular` file may sometimes cause errors, therefore we will remove them with the tool **Select last lines from a dataset (tail)**.

> <hands-on-title>Descriptive Statistics</hands-on-title>
> 1. Run {% tool [Summary Statistics](Summary_Statistics1) %} with
>   - {% icon param-file %} *"Summary statistics on"*: protein table output (first file) of **ProteinQuantifier**
>   - *"Column or expression"*: `c8`
>
> 2. Run {% tool [Select last lines from a dataset (tail)](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0) %} with
>   - {% icon param-file %} *"Text file"*: protein table output (first file) of **ProteinQuantifier**
>   - *"Operation"*: `Keep everything from this line on`
>   - *"Number of lines"*: `4`
>
> 3. Run {% tool [Histogram](toolshed.g2.bx.psu.edu/repos/devteam/histogram/histogram_rpy/1.0.4) %} with
>   - {% icon param-file %} *"Dataset"*: output of **Select last**
>   - *"Numerical column for x axis"*: `Column: 8`
>   - *"Number of breaks (bars)"*: `20`
>   - *"Plot title"* and *"Label for x axis"* to something meaningful.
>
>   > <comment-title>Calculating descriptive statistics for peptides</comment-title>
>   > The peptide table output of **ProteinQuantifier** does not give the log-transformed ratio for each peptide. Nonetheless, you may calculate basic statistics of the FC values by running **Summary Statistics** with *"Column or expression"* set to `log(c6/c5,2)`.
>   {: .comment}
>
{: .hands_on}

> <question-title></question-title>
> 1. How many peptides and proteins were successfully quantified?
> 2. What might have been the mixing ratio of the input dataset?
> 3. In the histogram, there is a second local maximum at about FC 0. What might that mean?
>
> > <solution-title></solution-title>
> > 1.    With the above parameters, you should have quantified 870 peptides and 421 proteins (slight variations are expected depending on tool version or fasta file)
> > 2. In the histogram, you see that the peak of the density curve is between -1.1 and -1.2. In the summary statistics, you can see that the mean protein ratio was -0.98. An FC of -1 indicates that the unlabelled proteins were twice as abundant as their heavy-labelled counterparts. Indeed, the mixing ratio of the dataset was 2 parts light labelled HEK cell lysate and 1 part heavy labelled HEK cell lysate.
> > 3. Some proteins were quantified with an FC close to 0. These may stem from incomplete SILAC labelling. Even after two weeks of cell culture in SILAC medium, some proteins with a very low turnover rate may remain unlabelled.
> {: .solution }
{: .question}

# Evaluation and Optimization of Quantitation Results

Protein quantitation is a multi-step procedure. Many parameters of different steps influence the final results. Therefore, it is recommended to optimize the tool parameters for each dataset and to carefully evaluate quantitation results. While the total number of quantified proteins is a first important parameter for optimization, it is also necessary to visualize the results and check for correct feature finding and ID mapping.

Galaxy does not provide a tool for proteomics visualization, we recommend to use the OpenMS Viewer **TOPPView**.
Basic TOPPView tutorials are available as [videos](https://www.openms.de/getting-started/command-line-and-visualisations/) and a more comprehensive tutorial as [HTML](http://ftp.mi.fu-berlin.de/pub/OpenMS/release-documentation/html/TOPP_TOPPView.html) or [PDF](http://ftp.mi.fu-berlin.de/pub/OpenMS/release-documentation/TOPP_tutorial.pdf).

For the optimization of tool parameters, it is recommended not to work with a complete LC-MS/MS run. Instead, we will use **FileFilter** to extract a small *RT-slice* of our input dataset, i.e. a fraction of the original dataset that was measured during a short period of time. Reducing the test data reduces the time needed for analysis and facilitates visual examination of the data.

Using Galaxy Workflows enables us to quickly re-run a full analysis with changed parameters. To learn about Galaxy Workflows, consult this [tutorial]({% link topics/galaxy-interface/tutorials/history-to-workflow/tutorial.md %}).

**Cave:** Be aware that only very small parts of your dataset can be checked by visual examination. To minimize biases, try to look at the same areas / features of each result file.

> <hands-on-title>Data reduction and visual evaluation with TOPPView</hands-on-title>
>
> 1. Run **FileFilter** {% icon tool %} with
>   - {% icon param-file %} *"Input file"*: `mzML` file
>   - *"Retention time range to extract"*: `2000:2200`
>
> 2. Extract a workflow out of your history or import the [premade workflow]({% link topics/proteomics/tutorials/protein-id-oms/workflows/workflow.ga %})
>
> 3. Run the whole workflow again with default settings on the reduced `mzML` file.
>
> 4. Run **FileFilter** {% icon tool %} with
>   - {% icon param-file %} *"Input file"*: **IDConflictResolver** output
>   - *"Remove features without annotations"*: `Yes`
>
> 5. Rename the **FileFilter** output to `Annotated features`
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
> 6. Run **FileFilter** {% icon tool %} with
>   - {% icon param-file %} *"Input file"*: **IDConflictResolver** output
>   - *"Remove features without annotations"*: `Yes`
>
> 7. Rename the **FileFilter** output to `UNannotated features`
>
> 8. Download locally the following files:
>   - Spectra: `mzML` file
>   - peptide IDs: **IDScoreSwitcher** `idXML` output file
>   - features: **FeatureFinderMultiplex** `featureXML` output file
>   - consensus features: **FileFilter** `consensusXML` output files ("Annotated" and "UNannotated" features)
>
> 9. Open **TOPPView**
> 10. Open the `mzML` file in **TOPPView** with
>   - **Open as** set to `new window`
>   - **Map view** set to `2D`
>   - **Low intensity cutoff** set to `off`
> 11. Open all other downloaded files in **TOPPView** with
>   - **Open as** set to `new layer`
> 12. Activate the `mzML` layer and click on `Show projections`
>
>   ![showProjections](../../images/protein-quant-sil_showProjections.png "The projections display intensities plotted against RT (top panel) and plotted against m/z (right panel).")
>
> 13. Activate the `consensusXML` layers and click on `Show consensus feature element positions`
>
>   ![showConsensus](../../images/protein-quant-sil_showConsensus.png "Arrows between linked light and heavy features centroids are displayed.")
>
> 14. Evaluate your data analysis, by
>   - zooming into a specific region (hold `Ctrl` and use the mouse to zoom)
>   - measuring m/z and RT distances (select the `mzML` layer, hold `Shift` and use the mouse to measure)
>   - displaying an area in 3D view (`right-click` into the 2D View and select `Switch to 3D view`)
>   - switching on and off the display of single layers (`left-click` at the tick-boxes in the window "Layers")
{: .hands_on}

## Examples

1. **Displaying annotated vs. UNannotated features**: visualize annotated (= mapped) and unannotated (= unmapped) features by switching between activating only the "Annotated_features.consensusxml" or only the "UNannotated_features.consensusxml" layer

    ![displaying feature annotations](../../images/protein-quant-sil_example_featureAnnotation.png "The feature below was mapped to and annotated with a peptide identification, the feature above was not mapped. A) Annotated layer is active. B) UNannotated layer is active.")

2. **Correct mapping**: a feature was detected, a peptide was identified and the two were mapped.

    ![Correct mapping of a high-abundant peptide](../../images/protein-quant-sil_example_highAbundant.png "A high-abundant peptide. A) 2D View. B) 3D View.")
    ![Correct mapping of a low-abundant peptide](../../images/protein-quant-sil_example_lowAbundant.png "A low-abundant peptide. A) 2D View. B) 3D View.")

3. **No feature detected for a contaminant.** Contaminants are often not labelled, but occur only in their unlabelled isoform. Therefore, they do not give rise to a consensus feature in FeatureFinderMultiplex.

    ![contaminant](../../images/protein-quant-sil_example_contaminant.png "A contaminant. There are no elution peaks for the heavy labelled peptide isoform. A) 2D View. B) 3D View.")

> <hands-on-title>Check a possible contaminant</hands-on-title>
> 1. Run **TextExporter** {% icon tool %} with
>   - {% icon param-file %} *"Input file"*: **IDFilter** output file
> 2. Run **Search in textfiles (grep)** {% icon tool %} with
>   - {% icon param-file %}*"Select lines from"*: output of **TextExporter**
>   - *"Regular Expression"*: the peptide sequence (e.g. `MFLSFPTTK`)
> 3. Check if the peptide was mapped to a protein marked with "CONTAMINANT".
{: .hands_on}

## Typical Problems

Three problems typically hamper correct peptide mapping:

1. **A feature is detected, but no peptide identification is nearby.**

    - *Possible cause*: This may be caused by imperfect peptide identification. However, it is never expected that every single MS2-spectrum leads to an identification. The protein might be missing in the database, or the peptide may carry a modification that was not included in the search.
    - *Possible solution*: Improve your search engine settings.

    ![noID](../../images/protein-quant-sil_problem_noID.png "Several features without peptide IDs. Several MS2 spectra were generated (fragment scan precursors marked with red circles), but did not lead to a peptide identification.")

2. **A peptide was identified, but no feature is nearby.**

    - *Possible cause*:
        1. The elution peaks of the peptide may be distorted. This is typical for low intensity peptides. If a lot of peptides have distorted elution peaks this may be a sign of spray instability.
        2. The peptide is a contaminant.
    - *Possible solution*:
        1. Lower the FeatureFinderMultiplex parameters **Two peptides in a multiplet are expected to have the same isotopic pattern** and/or **The isotopic pattern of a peptide should resemble the averagine model at this m/z position** or broaden the **Range of isotopes per peptide in the sample** (in **Advanced Options**).
        2. No optimization of parameters is needed (see [example above](#examples))

    ![noID](../../images/protein-quant-sil_problem_noFeature.png "A peptide was identified in its unlabelled and in its labelled isoform, but no feature was detected. A) 2D View. No third isotopic peak was detected for the labelled peptide. B) 3D View.")

3. **A peptide was identified and a feature was detected nearby, but the two are not mapped to each other.**

    - *Possible cause*:
        1. The MS2 event and the feature are too far apart to be mapped.
        2. The precursor of the MS2 was not correctly assigned to the mono-isotopic peak.
        3. The detected feature is too small in RT dimension and covers only a part of the peptide peaks.
    - *Possible solution*:
        1. Increase the IDMapper parameter **RT tolerance (in seconds) for the matching of peptide identifications and (consensus) features**.
        2. Feature size in RT dimension cannot be directly corrected, use solution 1 instead.

    ![noMapping](../../images/protein-quant-sil_problem_noMapping.png "A feature was detected, but the RT dimension is shorter than the peptides's elution peak. Also, the 2nd isotopic peak was fragmented and was not corrected due to the short feature. A) 2D View. B) 3D View.")

Two problems typically disturb correct peptide quantitation:

1. **A peptide is mapped to the wrong feature.**
    - *Possible cause*: Co-eluting peptides of a similar mass may be falsely mapped to a nearby feature, if the correct peptide did not lead to an identification or was identified only with a low score. In *high-resolution data*, this problem of is very limited. Co-eluting peptides can normally be distinguished by slightly different m/z values. In *low-resolution data*, wrong assignment may occur more often.
    - *Possible solution*: If a high value is used for the precursor mass tolerance, try to keep the RT tolerance low to avoid false mapping.
2. **Background noise (1) or co-eluting peptides (2) are incorporated in a feature.**
    - *Possible solution*:
        1. Use noise-filtering either during pre-processing or by increasing the FeatureFinderMultiplex parameter **Lower bound for the intensity of isotopic peaks**
        2. Reduce the FeatureFinderMultiplex parameter **m/z tolerance for search of peak patterns**.

> <question-title></question-title>
> 2. How many peptides could not be mapped to MS1 features? (Click on the **IDMapper** output and look at the tool's infobox.)
> 3. How many features could not be mapped to a peptide identification? (Click on the **ProteinQuantifier** output and look at the tool's infobox.)
> 1. Which problems are most prominent in the test dataset?
>
> > <solution-title></solution-title>
> > 1. 1,395 peptide IDs could not be mapped to a feature.
> > 2. 1,898 features, corresponding to 949 consensus features could not be mapped to a peptide identification.
> > 3. The mapping of peptide IDs to features seems to have worked mostly fine. The main problems seem to be (1) missing peptide identifications, (2) missing features where a peptide was identified and (3) features that span a shorter RT range than the corresponding peptide's elution peak.
> {: .solution }
{: .question}

## Optimization of Quantitation Results

For optimization, it is critical to modify **only one parameter at a time**.
Also, it is recommended to optimize the tools in the order of their position in the workflow.

In the test dataset, several peptides were identified, but not quantified. Some of the peptides were even identified in the unlabelled, as well as in the labelled form. To optimize the feature detection, we will relax the parameters of FeatureFinderMultiplex.

> <hands-on-title>Optimize Feature Detection</hands-on-title>
>
> 1. Run the whole workflow again:
>    - Change the **FeatureFinderMultiplex** parameter *"Range of isotopes per peptide in the sample"* from `3:6` to `2:6`.
> 2. Integrate the **HighResPrecursorMassCorrector** {% icon tool %} into the workflow.
>    - Use the mzML file and the featureXML from the **FeatureFinderMultiplex** {% icon tool %} as input
>    - Set **Additional retention time tolerance added to feature boundaries** between `0.0` and `10.0`
>    - Connect the output with the search engine.
> 3. Compare the number of identified proteins, unmatched features and unmapped peptides for each parameter setting.
> 4. Visualize the results with TOPPView to check for correct feature detection and feature-to-peptide mapping.
>
>   > <tip-title>Sending workflow results to new history</tip-title>
>   > When running a workflow, you may send the results to a new history. This helps keeping track of different parameter settings.
>   {: .tip}
{: .hands_on}

> <question-title></question-title>
> Which parameter improved the number of quantified proteins?
>
> > <solution-title></solution-title>
> > Both changes led to more quantified proteins. Increasing the isotope range led to 26 \% more protein quantitations, increasing the RT tolerance led to 7 \% more protein quantitations.
> {: .solution }
{: .question}

tools_json:
["FeatureFinderMultiplex", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_featurefindermultiplex/FeatureFinderMultiplex/2.6+galaxy0", "IDMapper", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_idmapper/IDMapper/2.6+galaxy0", "IDConflictResolver", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_idconflictresolver/IDConflictResolver/2.6+galaxy0", "MultiplexResolver", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_multiplexresolver/MultiplexResolver/2.5+galaxy0", "ProteinQuantifier", "toolshed.g2.bx.psu.edu/repos/galaxyp/openms_proteinquantifier/ProteinQuantifier/2.6+galaxy0", "Summary Statistics", "Summary_Statistics1", "Select last lines from a dataset (tail)", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0", "Histogram", "toolshed.g2.bx.psu.edu/repos/devteam/histogram/histogram_rpy/1.0.4"]


topic: proteomics
tutorial: neoantigen-predicting-hla-binding
title: Neoantigen 5a: Predicting HLA Binding
difficulty: intermediate
time_estimation: 3H
requirements_json: []
tags_json: ["[label-free]"]
content_hash: 828befd26b0669f845b35513014f7385
last_modified: 2026-05-27T09:01:49.459672
zenodo_link: https://zenodo.org/records/14375917
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/neoantigen-predicting-hla-binding/tutorial.html

content:
Neoantigen prediction for HLA binding is a critical component of personalized cancer immunotherapy. Neoantigens, which are tumor-specific antigens resulting from mutations in cancer cells, can be recognized by the immune system, making them promising targets for tailored immunotherapies. Human leukocyte antigen (HLA) molecules play a key role in presenting these neoantigens on the surface of cells, where they can be detected by T-cells, triggering an immune response.

This tutorial focuses on predicting HLA binding affinities for potential neoantigens, an essential step in identifying effective targets for immunotherapy. The workflow includes the use of tools such as OptiType and seq2HLA to determine HLA genotypes, as well as data reformatting and querying methods to manage complex data outputs.

By completing this tutorial, learners will gain an understanding of:

- The bioinformatics approaches required to predict HLA binding,
- Practical skills for neoantigen identification, including managing and analyzing genomic data,
- How to apply specific bioinformatics tools to analyze HLA binding predictions effectively.

This hands-on tutorial is designed to offer practical experience for learners aiming to integrate bioinformatics techniques into their immunotherapy research or clinical practice, emphasizing the theoretical and technical concepts essential for neoantigen prediction.

![HLAtyping-overview]({% link topics/proteomics/images/neoantigen/Prediction_of_HLA_Binding.PNG %})

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Predicting HLA binding
## Overview of HLA Binding Prediction Workflow
This tutorial provides a step-by-step guide for predicting HLA binding of neoantigens, a crucial part of personalized immunotherapy research. Using OptiType and seq2HLA, we will perform HLA typing and analyze which neoantigens are likely to bind to a specific individual’s HLA molecules, potentially driving an immune response. This process is essential for identifying candidate peptides that could serve as effective targets in immunotherapy.

1. **Get Data** The tutorial begins with the acquisition and upload of necessary sequencing files. These files typically contain raw paired-end reads or other sequencing outputs, which will be processed to identify HLA alleles. Proper organization and tagging of data are crucial for maintaining an efficient workflow.
2. **HLA Typing with OptiType** OptiType is used first in this tutorial for HLA typing. This tool processes the uploaded sequencing data to identify HLA class I alleles, which are essential for the subsequent neoantigen binding predictions. OptiType’s output will include the predicted HLA alleles that are specific to the individual’s immune profile.
3. **HLA Typing with seq2HLA** As a complementary approach, we will use seq2HLA for HLA typing to cross-validate results. By comparing predictions from both OptiType and seq2HLA, we can ensure greater accuracy in identifying relevant HLA alleles, allowing us to confidently proceed with neoantigen predictions.
4. **Reformatting and Filtering HLA Alleles** After obtaining results from both HLA typing tools, the next step is to reformat and filter the data. This involves removing redundant entries and preparing the data in a format that’s optimized for binding prediction. Cleaning and filtering ensure that only the most relevant HLA alleles are used in the neoantigen analysis.
5. **Querying and Validating HLA Typing Results** The final step is to use SQL-like queries to further refine and validate the HLA typing results. This allows us to filter and focus on the HLA alleles most relevant to our research question, ensuring the quality and relevance of the dataset for predicting neoantigen binding.

This structured workflow enables a streamlined approach for accurate HLA typing and binding prediction, setting the foundation for personalized immunotherapy and advancing the development of effective cancer treatments.

## Get data

> <hands-on-title> Data Upload </hands-on-title>
>
> 1. Create a new history for this tutorial
> 2. Import the files from [Zenodo]({{ page.zenodo_link }}) or from
>    the shared data library (`GTN - Material` -> `{{ page.topic_name }}`
>     -> `{{ page.title }}`):
>
>    ```
>    https://zenodo.org/records/14375917/files/RNA-Seq_Reads_1.fastqsanger.gz
>    https://zenodo.org/records/14375917/files/RNA-Seq_Reads_2.fastqsanger.gz
>
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
> 3. Rename the datasets
> 4. Check that the datatype
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="datatypes" %}
>
> 5. Add to each database a tag corresponding to ...
>
>    {% snippet faqs/galaxy/datasets_add_tag.md %}
>
{: .hands_on}


## HLA typing with **OptiType**

OptiType is a bioinformatics tool designed specifically for HLA class I typing using paired-end sequencing reads. In this workflow, OptiType identifies the HLA alleles that a person possesses, which are crucial for understanding which neoantigens may effectively bind to an individual’s immune receptors. This tool enhances the personalization of immunotherapy by providing highly accurate HLA allele predictions. In turn, this allows for more targeted analysis of potential neoantigen binding candidates.

> <hands-on-title> OptiType </hands-on-title>
>
> 1. {% tool [OptiType](toolshed.g2.bx.psu.edu/repos/iuc/optitype/optitype/1.3.5+galaxy0) %} with the following parameters:
>    - *"Single or Paired-end reads"*: `Paired`
>        - {% icon param-file %} *"Select first set of reads"*: `RNA-Seq_Reads_1.fastqsanger` (Input dataset)
>        - {% icon param-file %} *"Select second set of reads"*: `RNA-Seq_Reads_2.fastqsanger` (Input dataset)
>    - *"Enumerations"*: `3`
>
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Why do we use paired-end reads in OptiType?
> 2. What does the "Enumerations" parameter mean in OptiType, and why set it to 3?
>
> > <solution-title></solution-title>
> >
> > 1. Paired-end reads are used because they provide more comprehensive information about the DNA sequence. This improves the accuracy of HLA typing, as OptiType can analyze data from both directions of a DNA segment, reducing ambiguity and increasing the chance of correctly identifying HLA alleles.
> > 2. The "Enumerations" parameter controls the number of best-matching HLA allele combinations that OptiType will report. Setting it to 3 provides multiple possible allele combinations for verification and ensures that we capture the most likely HLA types while still keeping the output manageable for downstream analysis.
> >
> {: .solution}
>
{: .question}

## HLA typing with **seq2HLA**

seq2HLA is a computational tool for identifying HLA types from RNA-Seq or DNA-Seq data. It is especially useful in immunogenomics research, as it allows for the prediction of an individual’s HLA class I and II alleles, which play a key role in immune response. In this workflow, seq2HLA provides essential data for identifying potential neoantigens by aligning sequencing reads to reference HLA alleles, allowing researchers to understand the specific immune profile of each sample.

> <hands-on-title> seq2HLA </hands-on-title>
>
> 1. {% tool [seq2HLA](toolshed.g2.bx.psu.edu/repos/iuc/seq2hla/seq2hla/2.3+galaxy0) %} with the following parameters:
>    - *"Name prefix for this analysis"*: `STS26TGen`
>    - *"Paired-end reads"*: `Paired`
>        - {% icon param-file %} *"Select first set of reads"*: `RNA-Seq_Reads_1.fastqsanger` (Input dataset)
>        - {% icon param-file %} *"Select second set of reads"*: `RNA-Seq_Reads_2.fastqsanger` (Input dataset)
>
>
{: .hands_on}

> <question-title></question-title>
>
> 1. Why is it important to specify a "Name prefix for this analysis"?
> 2. What is the significance of using paired-end reads in seq2HLA?
>
> > <solution-title></solution-title>
> >
> > 1. The "Name prefix for this analysis" parameter allows users to easily identify the output files related to a specific sample or experiment. By assigning a unique prefix, you can better organize and retrieve results, especially in workflows with multiple samples.
> > 2. Paired-end reads enhance seq2HLA's accuracy by providing complementary information from both ends of the DNA or RNA fragment. This improves the resolution and reliability of the HLA typing results, as more context is available to match against the reference HLA alleles.
> >
> {: .solution}
>
{: .question}

## Reformatting and Filtering HLA Alleles

This step involves reformatting and filtering the HLA alleles output from the OptiType tool to retain only the relevant and unique alleles. The process is essential for streamlining the data and ensuring that only the significant allele information is passed on for further analysis. Using a simple AWK program, we can filter out redundant data and focus on distinct HLA alleles, which are crucial for downstream neoantigen discovery and immunogenomics applications.

> <hands-on-title> Text reformatting </hands-on-title>
>
> 1. {% tool [Text reformatting](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_awk_tool/9.3+galaxy1) %} with the following parameters:
>    - {% icon param-file %} *"File to process"*: `result` (output of **OptiType** {% icon tool %})
>    - *"AWK Program"*:
> ```
> $1 ~ /[0-9]/{
>    for (i = 2; i <=7; i++) { allele[$i]++}
> }
> END {
>    for (i in allele) {
>        print i
>    }
> }
> ```
>
{: .hands_on}

> <question-title></question-title>
>
> 1. What is the purpose of using the AWK program in this step?
> 2. Why is it important to filter out redundant HLA alleles?
>
> > <solution-title></solution-title>
> >
> > 1. The AWK program here helps identify and filter unique HLA alleles from the output of OptiType. This step removes duplicates and ensures that only relevant alleles are retained for further analysis, improving data quality and accuracy.
> > 2. Filtering out redundant alleles simplifies the dataset and enhances computational efficiency, making downstream analyses quicker and more focused on significant variants. This is essential for accurately interpreting immune responses in personalized medicine and neoantigen discovery.
> >
> {: .solution}
>
{: .question}

## Querying and Validating HLA Typing Results

In this step, we use the Query Tabular tool to validate and organize the HLA typing results from OptiType and seq2HLA outputs. By querying and filtering the data, we create a consolidated list of HLA alleles, formatted consistently for further analysis. This process ensures that we have a clean dataset of HLA alleles that will improve the accuracy of downstream analyses, such as neoantigen prediction or immune response studies.

> <hands-on-title> Query tabular </hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.2) %} with the following parameters:
>    - In *"Database Table"*:
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `outfile` (output of **Text reformatting** {% icon tool %})
>            - In *"Filter Dataset Input"*:
>                - In *"Filter Tabular Input Lines"*:
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `by regex expression matching`
>                            - *"regex pattern"*: `^(\w+[*]\d\d:\d\d\d?).*$`
>                            - *"action for regex match"*: `include line on pattern match`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `regex replace value in column`
>                            - *"enter column number to replace"*: `c1`
>                            - *"regex pattern"*: `^(\w+[*]\d\d:\d\d\d?).*$`
>                            - *"replacement expression"*: `HLA-\1`
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `optitype`
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `c1_genotype4digits` (output of **seq2HLA** {% icon tool %})
>            - In *"Filter Dataset Input"*:
>                - In *"Filter Tabular Input Lines"*:
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `skip leading lines`
>                            - *"Skip lines"*: `1`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `select columns`
>                            - *"enter column numbers to keep"*: `2,4`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `regex replace value in column`
>                            - *"enter column number to replace"*: `1`
>                            - *"regex pattern"*: `^(\w+[*]\d\d:\d\d\d?).*$`
>                            - *"replacement expression"*: `HLA-\1`
>                    - {% icon param-repeat %} *"Insert Filter Tabular Input Lines"*
>                        - *"Filter By"*: `regex replace value in column`
>                            - *"enter column number to replace"*: `2`
>                            - *"regex pattern"*: `^(\w+[*]\d\d:\d\d\d?).*$`
>                            - *"replacement expression"*: `HLA-\1`
>            - In *"Table Options"*:
>                - *"Specify Name for Table"*: `seq2hla`
>    - *"SQL Query to generate tabular output"*:
> ``` sql
> SELECT hla FROM
> (SELECT c1 AS hla FROM optitype
> UNION
> SELECT c1 AS hla FROM seq2hla WHERE c1 LIKE '%*%:%'
> UNION
> SELECT c2 AS hla FROM seq2hla WHERE c2 LIKE '%*%:%')
> ORDER BY hla
> ```
>
>    - *"include query result column headers"*: `No`
>    - In *"Additional Queries"*:
>        - In *"SQL Query"*:
>            - {% icon param-repeat %} *"Insert SQL Query"*
>                - *"SQL Query to generate tabular output"*:
> ``` sql
> SELECT c1 FROM optitype
> ORDER BY c1
> ```
>  - *"include query result column headers"*: `No`
>    - {% icon param-repeat %} *"Insert SQL Query"*
>        - *"SQL Query to generate tabular output"*:
> ``` sql
> SELECT c1 FROM seq2hla WHERE c1 LIKE '%*%:%'
> UNION
> SELECT c2 FROM seq2hla WHERE c2 LIKE '%*%:%'
> ```
>
> - *"include query result column headers"*: `No`
>
>
{: .hands_on}


> <question-title></question-title>
>
> 1. Why is it necessary to use SQL queries on HLA typing results?
> 2. How do we know the query results are accurate for the next steps?
>
> > <solution-title></solution-title>
> >
> > 1. SQL queries allow us to filter, organize, and validate the HLA typing results efficiently. This approach ensures consistent formatting and removes unnecessary or redundant data, making the dataset more manageable for further analysis.
> > 2. By carefully setting regex patterns and filtering options, we can ensure that only valid HLA allele formats are included. Reviewing the query results for consistency and completeness further ensures accuracy before moving to the next steps in the pipeline.
> >
> {: .solution}
>
{: .question}

# Conclusion

This tutorial covers the workflow for identifying and validating HLA alleles using OptiType and seq2HLA. Each step in the process, from reformatting and filtering to querying, is essential for generating accurate and consistent allele data. This validated data can then be used confidently in downstream immunological analyses, including neoantigen prediction and personalized medicine applications.


# Rerunning on your own data

To rerun this entire analysis at once, you can use our workflow. Below we show how to do this:


> <hands-on-title>Running the Workflow</hands-on-title>
>
>
> 1. **Import the workflow** into Galaxy:
>    - [Neoantigen HLA Genotyping](https://tinyurl.com/ipepgen-hla-genotyping-wf)
>
> 2. Run **Workflow** {% icon workflow %} using the following parameters:
>    - *"Send results to a new history"*: `No`
>    - {% icon param-file %} *"RNA-Seq_Reads_1 (forward strand)"*: `RNA-Seq_Reads_1.fastqsanger.gz`
>    - {% icon param-file %} *"RNA-Seq_Reads_2 (reverse strand)"*: `RNA-Seq_Reads_2.fastqsanger.gz`
>
>    {% snippet faqs/galaxy/workflows_run.md %}
>
> 
> 
> 
> 
> <comment-title>DISCLAIMER</comment-title>
>
> - If any step in this workflow fails, please ensure that the input files have been correctly generated and formatted by the preceding tools. Workflow failures often result from improperly called or incomplete input data rather than errors in the workflow itself. Users are responsible for verifying their input before troubleshooting workflow issues.
>
> {: .comment}
>
>    
>
{: .hands_on}

# Are you feeling adventurous? ✨

## One-Click Neoantigen Workflow

This new [One-Click Neoantigen Workflow](https://usegalaxy.eu/u/galaxyp/w/ipepgen-one-click-workflow) brings together all key modules of the neoantigen discovery process into a single, streamlined analysis within Galaxy. Instead of launching each tutorial separately, users can now execute the entire end-to-end pipeline—from database creation to HLA binding prediction—with just one click —without ever leaving Galaxy.

# Disclaimer

Please note that all the software tools used in this workflow are subject to version updates and changes. As a result, the parameters, functionalities, and outcomes may differ with each new version. Additionally, if the protein sequences are downloaded at different times, the number of sequences may also vary due to updates in the reference databases or tool modifications. We recommend the users to verify the specific versions of software tools used to ensure the reproducibility and accuracy of results.

tools_json:
["OptiType", "toolshed.g2.bx.psu.edu/repos/iuc/optitype/optitype/1.3.5+galaxy0", "seq2HLA", "toolshed.g2.bx.psu.edu/repos/iuc/seq2hla/seq2hla/2.3+galaxy0", "Text reformatting", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_awk_tool/9.3+galaxy1", "Query Tabular", "toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.2"]


topic: proteomics
tutorial: biomarker_selection
title: Biomarker candidate identification
difficulty: intermediate
time_estimation: 3H
tools_json: []
requirements_json: []
tags_json: ["[DDA, human]"]
content_hash: a4a4835f7c709b761e5bac066d9e2ca5
last_modified: 2026-05-15T22:28:14.394969
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/biomarker_selection/tutorial.html

content:
A biomarker is a measurable biological component that can be routinely detected in clinical practice and reflects a disease state,
response to therapeutic treatment, or other relevant biological state.

[ProteoRE Galaxy instance](http://www.proteore.org) provides necessary tools to execute a complete biomarkers selection pipeline.
In this tutorial we introduce successively the tools of this pipeline, and guide you to execute them in order to complete the entire
pipeline on a concrete example. This strategy is described by {% cite Nguyen2019 %}.


> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}



# Global view of the strategy


For this tutorial, no input data are required as the first steps will be to select data from
public databases with ProteoRE tools.

The strategy consists in selecting, one step after another, the most interesting candidates biomarkers.
Our use-case here is to identify candidate biomarkers for myocardial infarction tissue-leakage.

Criteria candidate biomarkers have to fulfill through this pipeline are:
- heart-specificity
- cytoplasmic localization
- detection in LC-MS/MS experiments already done

![Overview of the pipeline described in this tutorial](../../images/pipeline.png "Pipeline of the tutorial, from Nguyen et al., as of in 2019.")


{% snippet faqs/galaxy/analysis_results_may_vary.md %}

# Selection of tissue-specific proteins

We will start by selecting proteins associated with heart muscle tissue based on experimental data available from
[The Human Protein Atlas](https://www.proteinatlas.org/) (HPA) (Publication: {% cite Uhln2005 %})


> <hands-on-title>Build tissue-specific expression dataset based on ImmunoHistoChemistry</hands-on-title>
>
> 1. **Create a new history** and give it a name.
>
>    {% snippet faqs/galaxy/histories_create_new.md %}
>
> 2. **Build tissue-specific expression dataset** {% icon tool %} with the following parameters:
>    - *"Experimental data source (antibody- or RNAseq-based)"*: `Expression profiles based on immunohistochemistry`
>    - *"Select tissue"*: `Heart muscle`
>    - *"Expression level"*: `High` and `Medium`
>    - *"Reliability score"*: `Enhanced` and `Supported`
>
>   > ### Output
>   > - **Tissue-specific expression from IHC** (1596 lines): List of the selected proteins.
>   > 6 columns: 'Gene', 'Gene name' and the retrieved info from HPA.
>   {: .comment}
{: .hands_on}

We will now rerun the same tool but to select transcripts according to their expression profile.


> <hands-on-title>Build tissue-specific expression dataset based on RNAseq</hands-on-title>
>
> 1. **Build tissue-specific expression dataset** {% icon tool %} with the following parameters:
>    - *"Experimental data source (antibody- or RNAseq-based)"*: `RNA levels based on RNA-seq experiments`
>    - *"Select tissue"*: `Heart muscle`
>
>   > ### Output
>   > - **Tissue-specific expression from RNAseq** (19613 lines): List of the selected transcripts.
>   > 4 columns: 'Gene', 'Gene name' and the retrieved info from HPA.
>   {: .comment}
{: .hands_on}


This second list must be reduced by removing transcripts that are not highly enriched in heart muscle.
To do so, a filter is applied on the expression value provided by HPA and measured in TPM (last column of the output file).
In ProteoRE we'll use the "Filter by keywords and/or numerical value" tool.


> <hands-on-title>Filter on expression value criterion</hands-on-title>
>
> 1. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>    - *"Input File"*: `Tissue-specific expression from RNASeq` from the previous step
>    - *"Operation"*: `Discard`
>    - In *"Filter by numerical value"*:
>        - {% icon param-repeat %} *"Insert Filter by numerical value"*
>            - *"Column number on which to apply the filter"*: `c4`
>            - *"Select operator"*: `<=`
>            - *"Value"*: `10.0`
>    - *"Sort by column ?"*: `Yes`
>      - *"Sort result files by"*: `c4`
>
> > <question-title></question-title>
> >
> > How many lines are there in the file of heart transcripts
> > with a TPM value >10 ?
> >
> > > <solution-title></solution-title>
> > > 5257 lines.
> > {: .solution}
> {: .question}
>
>
{: .hands_on}

We have now 2 datasets of heart-muscle proteins/transcripts, based on IHC (Immonohistochemistry) data or [TPM](https://statquest.org/2015/07/09/rpkm-fpkm-and-tpm-clearly-explained/) (Expression level expressed in Transcripts Per Million) value.

We want now to select candidate biomarkers that are expressed in the heart muscle according to **both** IHC and RNA-seq data, using the Jvenn tool.


> <hands-on-title>Venn diagram</hands-on-title>
>
> 1. **Venn diagram** {% icon tool %} with the following parameters:
>    - In *"List to compare"*:
>        - {% icon param-repeat %} *"Insert List to compare"*
>            - *"Enter your list"*: `Input file containing your list`
>                - *"Select your file"*: `Tissue-specific expression from IHC`
>                - *"Enter the name of this list"*: `heart IHC`
>        - {% icon param-repeat %} *"Insert List to compare"*
>            - *"Enter your list"*: `Input file containing your list`
>                - *"Select your file"*: `Filtered tissue-specific expression from RNAseq`
>                - *"Enter the name of this list"*: `heart RNAseq`
>
> 2. Examine {% icon galaxy-eye %} the Venn diagram output:
>
>    ![Venn diagram output](../../images/biomarker-selection/jVenn_chart-tuto2.png)
>
>    > <question-title></question-title>
>    > How many IDs are common to both IHC and RNA-seq data?
>    >   > <solution-title></solution-title>
>    >   > 931 candidate biomarkers are detected by both IHC and RNA-seq data.
>    >   {: .solution}
>    {: .question}
{: .hands_on}

For greater clarity we'll keep only the column with those 931 candidate biomarkers detected in both IHC and RNA-seq data in the
rest of our pipeline.


> <hands-on-title>Obtain list of candidate biomarkers</hands-on-title>
>
> 1. **Cut** {% icon tool %} with the following parameters:
>    - *"File to cut"*: `Venn diagram text output`
>    - *"Cut by"*: `fields`
>        - *"List of Fields"*: `Column: 3`
>
>    Now we'll filter this dataset not to keep the 'NA' lines.
>
> 2. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>    - *"Input file"*: output from **Cut** {% icon tool %}
>    - *"Operation"*: `Discard`
>    - In *"Filter by keywords"*:
>        - {% icon param-repeat %} *"Insert Filter by keywords"*
>            - *"Search for exact match?"*: `Yes`
>            - *"Enter keywords"*: `copy/paste`
>                - *"Copy/paste keywords to find (keep or discard)"*: `NA`
>    - *"Sort by column ?"*: `Yes`
>      - *"Sort result files by"*: `c1`
>
> 3. Let's rename the 931 IDs dataset in "heart931" for simplification.
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
{: .hands_on}


The pipeline will then continue based on these 931 candidates, from which we have to select biomarkers that are
highly specific to the heart using additional expression data (still from HPA).


> <hands-on-title>Add expression data</hands-on-title>
>
> 1. **Add expression data** {% icon tool %} with the following parameters:
>    - *"Enter your IDs (Ensembl gene IDs only, e.g. ENSG00000064787)"*: `Input file containing your IDs`
>      - *"Select your file"*: `Heart931` output we created in the previous step
>    - In *"RNAseq/Ab-based expression data"*:
>        - *"Select information to add to your list"*:
>          - {% icon param-check %} `Gene name`
>          - {% icon param-check %} `Gene description`
>          - {% icon param-check %} `RNA tissue category`
>          - {% icon param-check %} `RNA tissue specificity abundance in Transcript Per Million`
>
{: .hands_on}

We wish to focus on transcripts that have been classed as (according to the HPA definition):
 - **Tissue enriched** (expression in one tissue at least fivefold higher than all other tissues),
 - **Group enriched** (fivefold higher average TPM in a group of two to to seven tissues compared to all other tissues) and
 - **Tissue enhanced** (fivefold higher average TPM in one or more tissues/cell lines compared to the mean TPM for all tissues)


This information is listed in the column 4 : *"RNA tissue category"* of the result dataset.

Let's use **Filter by keywords and/or numerical value** {% icon tool %} to select the candidate biomarkers based on this
*"RNA tissue category"* criterion.


> <hands-on-title>Filter by keywords and/or numerical value</hands-on-title>
>
> 1. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>    - *"Input file"*: output from **Add expression data** {% icon tool %}
>    - In *"Filter by keywords"*:
>        - {% icon param-repeat %} *"Insert Filter by keywords"*
>            - *"Column number on which to apply the filter"*: `c4`
>            - *"Enter keywords"*: `copy/paste`
>                - *"Copy/paste keywords to find (keep or discard)"*: `enriched enhanced`
>    - *"Sort by column ?"*: `Yes`
>      - *"Sort result files by"*: `c1`
>
>    > ### Output
>    > - **Filtered Add_expression_data**: output list of the heart biomarkers with RNA tissue category
>    >   containing "enriched" or "enhanced" (115 lines = what we are interested in)
>    >
>    > - **Filtered Add_expression_data - discarded lines**: output list of the heart biomarkers with
>    > RNA tissue category NOT containing "enriched" or "enhanced" (not what we are interested in)
>    {: .comment}
>
> 2. Let's rename the filtered dataset **heart115**
>
>    {% snippet faqs/galaxy/datasets_rename.md %}
>
{: .hands_on}

We now have identified 115 candidates considered to have significantly higher expression in heart muscle according to HPA criteria.


# Annotation with biochemical and cellular features


Candidate biomarkers we want to identify have to be cytoplasmic and without transmembrane domains (TMD).
Thus we will retrieve protein features from neXtProt to retrieve those informations.

Since HPA only considers [Ensemble](https://www.ensembl.org) `ENSG` identifiers (related to the gene), although [neXtProt](https://www.nextprot.org/) uses [UniProt](https://www.uniprot.org/) identifiers (related to proteins), first thing to do is to map the Ensembl identifiers contained our list of (115)
candidates to their corresponding UniProt accession number. The tool **ID Converter** is what we need to do so.


> <hands-on-title>ID Converter</hands-on-title>
>
> 1. **ID Converter** {% icon tool %} with the following parameters:
>    - *"Enter IDs"*: `Input file containing IDs`
>    - *"Select your file"*: `heart115`
>    - *"Species"*: `Human (Homo sapiens)`
>        - *"Type/source of IDs"*: `Ensembl gene ID (e.g. ENSG00000166913)`
>        - In *"Target type"*:
>            - *"Target type of IDs you would like to map to"*:
>              - {% icon param-check %} `Uniprot accession number`
>              - {% icon param-check %} `Uniprot ID`
>
>   > ### Output
>   > **ID converter**: In this dataset, 2 columns (columns 6 and 7, at the end) which contain
>   > UniProt accession number and ID are added.
>   > Note: We used here the release "Homo sapiens 08/05/2019"; results can be slightly different
>   > according to the version number of Uniprot.
>   {: .comment}
{: .hands_on}

We have now UniProt IDs for the 115 candidate biomarkers: we are able to collect protein features from [neXtProt](https://www.nextprot.org/).
For this purpose, we use the **Add protein features** {% icon tool %} ProteoRE tool.


> <hands-on-title>Add protein features</hands-on-title>
>
> 1. **Add protein features** {% icon tool %} with the following parameters:
>    - *"Enter your IDs (neXtProt or UniProt)"*: `Input file containing your IDs `
>        - *"Select your file"*: the output from **ID Converter** {% icon tool %}
>        - *"Column IDs (e.g : Enter c1 for column n°1)"*: `c6`
>    - In *"Select features"*:
>        - *"Physico-Chemical Features"*:
>          - {% icon param-check %} `Number of transmembrane domains`
>        - *"Localization"*:
>          - {% icon param-check %} `Subcellular Location`
>        - *"Disease information"*: `Yes`
>
>   > ### Output
>   > **Add information from NextProt**: In this file (115 lines), 3 columns (columns 8, 9 and 10)
>   > were added (at the end). These columns present TMDomains, Subcell Location and Diseases info.
>   {: .comment}
{: .hands_on}

With this dataset, we can select proteins reported as localized in the cytoplasm and having
no transmembrane domains by running the Filter by keywords and/or numerical value tool.


> <hands-on-title>Filter by keywords and/or numerical value</hands-on-title>
>
> 1. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>    - *"Input file"*: the output from **Add protein features** {% icon tool %}
>    - *"Select an operator to combine your filters (if more than one)"*: `AND`
>    - In *"Filter by keywords"*:
>        - {% icon param-repeat %} *"Insert Filter by keywords"*
>            - *"Column number on which to apply the filter"*: `c9`
>            - *"Enter keywords"*: `copy/paste`
>                - *"Copy/paste keywords to find (keep or discard)"*: `cytoplasm cytosol`
>    - In *"Filter by numerical value"*:
>        - {% icon param-repeat %} *"Insert Filter by numerical value"*
>            - *"Column number on which to apply the filter"*: `c8`
>            - *"Value"*: `0`
>    - *"Sort by column ?"*: `Yes`
>        - *"Sort result files by:"*: `c5`
>        - *"Sort in descending order ?"*: `Yes`
>
>
>   > ### Output
>   > - **Filtered Add_information_from_neXtProt**: output list of the proteins having a cytoplasmic
>   > location and no TMD (48 proteins)
>   > - **Filtered Add_information_from_neXtProt - discarded lines**: output list of the proteins NOT
>   > cytoplasmic and having at least 1 TMD.
>   {: .comment}
{: .hands_on}

We have now 45 proteins. The next step is to identify those proteins already previously observed in
LS MS/MS experiments.


# Check for previous detection by LC-MS/MS experiments

> <hands-on-title>Get MS/MS observations in tissue/fluid</hands-on-title>
>
> 1. **Get MS/MS observations in tissue/fluid** {% icon tool %} with the following parameters:
>    - *"Enter your IDs (UniProt Accession number only)"*: `Input file containing your IDs `
>        - *"Select your file"*: the filtered output from the previous step
>        - *"Column of IDs"*: `c6`
>    - *"Proteomics dataset (biological sample)"*:
>        - {% icon param-check %} `Human Heart`
>        - {% icon param-check %} `Human Plasma non glyco`
>
>   > ### Output
>   > **Get MS/MS observations in tissue/fluid**: In this file, 2 columns (11 and 12, at the end)
>   > were added with the info of number of times peptides were seen by MS/MS.
>   {: .comment}
{: .hands_on}

Let's now keep only proteins that have already been seen by MS/MS in the plasma (last column of the file).


> <hands-on-title>Filter for proteins seen in the plasma</hands-on-title>
>
> 1. **Filter by keywords and/or numerical value** {% icon tool %} with the following parameters:
>    - *"Input file"*: the MA/MS observations output from the previous step
>    - *"Operation"*: `Discard`
>    - In *"Filter by keywords"*:
>        - {% icon param-repeat %} *"Insert Filter by keywords"*
>            - *"Column number on which to apply the filter"*: `c12`
>            - *"Search for exact match?"*: `Yes`
>            - *"Enter keywords"*: `copy/paste`
>                - *"Copy/paste keywords to find (keep or discard)"*: `NA`
>    - *"Sort by column ?"*: `Yes`
>      - *"Sort results file by"*: `c1`
>
>   > ### Output
>   > - **Filtered Get MS/MS observations in tissue/fluid**: output list of the proteins
>   > whose some peptides have been seen in plasma (21 proteins)
>   > - **Filtered Get MS/MS observations in tissue/fluid - discarded lines**:
>   > output list of proteins with no peptides seen in the plasma
>   {: .comment}
{: .hands_on}



# Conclusion

At the end of the process we end up with a list of 22 biomarkers that are **highly enriched in heart muscle**, localized
**in the cytosol** and **detectable by MS in the plasma**.
*NB: Please be aware that, due to databases update, number of biomarkers you end up with can be different from 21 that we obtain here.*

Briefly and from a biological point of view, 3 of these proteins exhibit a relative low detection level in the plasma
compared to heart muscle tissue, and are reported with a very high heart-muscle-specific RNA abundance.
These potential mechanistic biomarkers of myocardial infarction include (i) cardiac Troponin I type 3 (TNNI3 (P19429))
that is routinely used as the most specific marker of myocardial injury and (ii) the heart-type fatty acid-binding protein
(FABP3 (P05413)) that has been proposed as a diagnostic and prognostic marker for acute and chronic cardiac injury.

Extraction of a workflow from your history is valuable for analyses reproducibility and traceability.
Moreover, a workflow can also be made reusable with modifiable parameters, and as a result this strategy can
be applied to other types of tissue injury (e.g. brain, liver, kidney).


topic: proteomics
tutorial: secretome-prediction
title: Secretome Prediction
difficulty: intermediate
time_estimation: 30m
tools_json: []
requirements_json: []
tags_json: ["[human]"]
content_hash: e5a9867705e28c2251be8a17b6b3caaf
last_modified: 2026-05-27T09:01:49.464128
zenodo_link: https://zenodo.org/record/519260
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/secretome-prediction/tutorial.html

content:
<!-- Moved to draft due to lack of agenda, not using citation mechanism, not including any hands-on boxes, not using a workflow step despite that being the focus -->

# Secretome Prediction using GO annotations and localization prediction

## Introduction

The cellular secretome contains both proteins that are secreted by cells and proteins that are shed from the cellular surface. Here, we describe an approach to predict those proteins in an input list that would be expected in the cellular secretome. This approach combines Gene Ontology (GO) annotation and the [WoLF PSORT](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1933216/) algorithm for localization prediction.

We chose to include all proteins that are annotated as, or predicted to be, lysosomal proteins. Lysosomal proteins are routinely secreted by malignant and non-malignant cells in high amounts, due to "leakiness" of the mannose-6-phosphate receptor pathway [1,2].
Furthermore, we chose to exclude proteins annotated as being part of extracellular organelles, e.g. exosomes. While exosomes are secreted by malignant and non-malignant cells, exosomal proteins are expected in the secretome at very low amounts, if not especially enriched for.

For secretome prediction, we combine localization data from the Gene Ontology database with a classical protein localization prediction algorithm (WoLF PSORT). The workflow was designed for sensitivity, i.e. a protein predicted by *at least one of the used tools* will be included in the output. To change this, follow the instructions in the box **Comment: Customizing the Workflow** below.

## Overview

The figure below gives an overview of the Galaxy workflow:

![Overview Secretome Prediction WF](../../images/wf_secretomePrediction_goWolfpsort.png)

## Input

The workflow needs three input files:

  1. A tabular file, the first column containing uniprot accession numbers of the proteins of interest. [Test data](https://doi.org/10.5281/zenodo.519260)

		> <comment-title>Test data</comment-title>
		> The provided test dataset for input 1 is a list of human proteins, identified by LC-MS/MS in the cellular supernatant of MDA-MB-231 cells. The dataset was originally published in [(Sigloch et al., BBA, 2016)](https://www.ncbi.nlm.nih.gov/pubmed/27526672).
		{: .comment}

  2. The complete uniprot GO database for the organism of interest, available [via FTP](ftp://ftp.ebi.ac.uk/pub/databases/GO/goa/). To download the human GOA file needed for the test input, paste the following link to the Galaxy upload tool: 'ftp://ftp.ebi.ac.uk/pub/databases/GO/goa/HUMAN/goa_human.gaf.gz'

		> <comment-title>Uniprot Gene Ontology Association (GOA) files</comment-title>
		> - [Information about different GOA file types can be found here](https://www.ebi.ac.uk/GOA/downloads).
		> - [Information about the structure of the files can be found here](ftp://ftp.ebi.ac.uk/pub/databases/GO/goa/HUMAN/README).
	  {: .comment}

  3. The complete GO Open Biomedical Ontology (OBO), i.e. "GO term tree", accessible at http://purl.obolibrary.org/obo/go/go.obo

> <comment-title>Customizing the Workflow</comment-title>
> This workflow was designed for sensitivity, not for specificity. If you need to increase the specificity, you have the following possibilities, with decreasing efficiency:
> 1. Switch the setting `Output lines appearing in` of the last **Join** {% icon tool %} (last tool before the final **Unique** {% icon tool %} from `All lines [-a 1 -a 2]` to `Both 1st & 2nd file`. Thus, your output will contain only those proteins that are equally predicted by both methods used.
> 2. (Only after doing 1.) Adding another way of localization prediction, i.e. another database or another prediction algorithm.
> 3. Replacing **WoLF PSORT** {% icon tool %} by a more precise localization prediction tool. If you choose this approach, remember that you will probably have to adjust the settings for all tools in the workflow that are processing the **WoLF PSORT** {% icon tool %} output.
{: .comment}

## Citation

If you use this workflow directly, or any derivative of it, in work leading to a scientific publication,
please cite:

F.C. Sigloch, J.D. Knopf, J. Weißer, A. Gomez-Auli, M.L. Biniossek, A. Petrera, et al., Proteomic analysis of silenced cathepsin B expression suggests non-proteolytic cathepsin B functionality, Biochim. Biophys. Acta - Mol. Cell Res. 1863 (2016) 2700–2709. doi:10.1016/j.bbamcr.2016.08.005. https://www.ncbi.nlm.nih.gov/pubmed/27526672

## Literature

[1] B. Schröder, C. Wrocklage, A. Hasilik, P. Saftig, The proteome of lysosomes., Proteomics. 10 (2010) 4053–76. doi:10.1002/pmic.201000196.

[2] J. Reiser, B. Adair, T. Reinheckel, Specialized roles for cysteine cathepsins in health and disease, J. Clin. Invest. 120 (2010) 3421–3431. doi:10.1172/JCI42918.


topic: proteomics
tutorial: clinical-mp-5-data-interpretation
title: Clinical Metaproteomics 5: Data Interpretation
difficulty: intermediate
time_estimation: 3H
requirements_json: []
tags_json: ["[label-TMT11]"]
content_hash: 7734127a4a0739c599bc2cece10a8783
last_modified: 2026-05-27T09:01:49.454120
zenodo_link: https://doi.org/10.5281/zenodo.10105821
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/clinical-mp-5-data-interpretation/tutorial.html

content:
The final workflow in the array of clinical metaproteomics tutorials is the data interpretation workflow. Interpreting MaxQuant data using MSstats involves applying a rigorous statistical framework to glean meaningful insights from quantitative proteomic datasets. The MaxQuant output is explored to understand data distribution and variability. Subsequent normalization helps account for systematic variations. MSstats allows the user to define the experimental design, including sample groups and conditions, to perform statistical analysis. The output provides valuable information about differential protein expression across conditions, estimates of fold changes, and associated p-values, aiding in the identification of biologically significant proteins. Furthermore, MSstats enables quality control and data visualization, ultimately enhancing our ability to draw meaningful conclusions from complex proteomic datasets. Additional tutorial material for using MaxQuant and MSstatTMT for TMT data analysis can be found at [MaxQuant and MSstats for the analysis of TMT data](https://gxy.io/GTN:T00220).

![Data-Interpretation-workflow]({% link topics/proteomics/images/clinical-mp/clinical-mp-data-interpretation.JPG %})

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

## Get data

> <hands-on-title> Data Upload </hands-on-title>
>
> 1. Create a new history for this tutorial
> 2. Import the files from [Zenodo]({{ page.zenodo_link }}) or from
>    the shared data library (`GTN - Material` -> `{{ page.topic_name }}`
>     -> `{{ page.title }}`):
>
>    ```
>    https://zenodo.org/records/10105821/files/Annotation.tabular
>    https://zenodo.org/records/10105821/files/Comparison_Matrix.tabular
>    https://zenodo.org/records/10105821/files/MaxQuant_Evidence.tabular
>    https://zenodo.org/records/10105821/files/MaxQuant_Protein_Groups.tabular
>    https://zenodo.org/records/10105821/files/Quantified-Peptides.tabular
>
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
> 3. Rename the datasets
> 4. Check that the datatype
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="datatypes" %}
>
> 5. Add to each database a tag corresponding to ...
>
>    {% snippet faqs/galaxy/datasets_add_tag.md %}
>
{: .hands_on}

# Import Workflow


> <hands-on-title>Running the Workflow</hands-on-title>
>
> 1. **Import the workflow** into Galaxy:
>
>    {% snippet faqs/galaxy/workflows_run_trs.md path="topics/proteomics/tutorials/clinical-mp-5-data-interpretation/workflows/WF5_Data_Interpretation_Worklow.ga" title="Data Interpretation Workflow" %}
>
> 2. Run **Workflow** {% icon workflow %} using the following parameters:
>    - *"Send results to a new history"*: `No`
>    - {% icon param-file %} *" Quantified Peptides * "*: `Quantified-Peptides.tabular`
>    - {% icon param-file %} *" MaxQuant Protein Groups"*: `MaxQuant_Protein_Groups.tabular`
>    - {% icon param-file %} *" MaxQuant Evidence"*: `MaxQuant_Evidence.tabular`
>    - {% icon param-file %} *" Annotation.txt "*: `Annotation.tabular`
>    - {% icon param-file %} *" Comparison Matrix "*: `Comparison_Matrix.tabular`
>
>    {% snippet faqs/galaxy/workflows_run.md %}
>
{: .hands_on}

## Taxonomic analysis with **Unipept**
Unipept serves as a vital bioinformatics platform for the analysis of mass spectrometry-based shotgun proteomics data, especially in the study of microbial communities. Its primary utility lies in taxonomic and functional analyses, enabling researchers to identify and quantify microorganisms within diverse environments. The platform facilitates comparative studies across samples, conditions, or time points, shedding light on the dynamic responses of microbial communities to environmental changes. Unipept integrates with public databases like UniProt, ensuring access to comprehensive and updated information for annotations. Being community-driven and open source, Unipept fosters collaboration and transparency, with a user-friendly web interface that accommodates researchers of varying bioinformatics expertise. In essence, Unipept is an invaluable resource, offering tools for the exploration of metaproteomic data and contributing to advancements in our understanding of microbial ecology.


> <hands-on-title> Unipept 5.0 </hands-on-title>
>
>
> 1. {% tool [Unipept](toolshed.g2.bx.psu.edu/repos/galaxyp/unipept/unipept/4.5.1) %} with the following parameters:
>    - *"Unipept application"*: `peptinfo: Tryptic peptides and associated EC and GO terms and lowest common ancestor taxonomy`
>    - *"Peptides input format"*: `tabular`
>        - {% icon param-file %} *"Tabular Input Containing Peptide column"*: `output` (Input dataset)
>        - *"Select column with peptides"*: `c1`
>    - *"Match input peptides by"*: `Match to the full input peptide`
>    - *"Choose outputs"*: `Tabular with one line per peptide` `JSON Taxomony Tree` `Peptide GO terms in normalized tabular` `Peptide InterPro entries in normalized tabular` `Peptide EC terms in normalized tabular` `JSON EC Coverage Tree`
>
{: .hands_on}

![Data-Interpretation with Unipept]({% link topics/proteomics/images/clinical-mp/clinical-mp-data-interpretation-figure2.jpg %})

## Extraction of Microbial Sequences

> <hands-on-title> Extract Microbial sequences with Select </hands-on-title>
>
> 1. {% tool [Select](Grep1) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `output` (Input dataset)
>    - *"that"*: `NOT Matching`
>    - *"the pattern"*: `(_HUMAN)|(_REVERSED)|(REV_)|(CON)|(con)`
>    - *"Keep header line"*: `Yes`
>
>
{: .hands_on}


> <hands-on-title> Select sequences matching "HUMAN" </hands-on-title>
>
> 1. {% tool [Select](Grep1) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `output` (Input dataset)
>    - *"the pattern"*: `(_HUMAN)`
>    - *"Keep header line"*: `Yes`
>
>
{: .hands_on}

> <hands-on-title> Select out reverse and contaminants </hands-on-title>
>
> 1. {% tool [Select](Grep1) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `out_file1` (output of **Select** {% icon tool %})
>    - *"that"*: `NOT Matching`
>    - *"the pattern"*: `(_REVERSED)|(REV_)|(CON)|(con)`
>    - *"Keep header line"*: `Yes`
>
>
{: .hands_on}


# MSstats TMT
MSstats TMT(Tandem Mass Tag) is a computational tool designed for the robust statistical analysis of mass spectrometry-based quantitative proteomics data using TMT labeling. TMT is a widely used method for multiplexed quantitative proteomics, enabling simultaneous identification and quantification of proteins across multiple samples. MSstats TMT plays a crucial role in this process by providing a statistical framework for analyzing TMT data, and facilitating accurate and reliable protein abundance measurements. The tool offers a range of features, including quality control, normalization, and statistical modeling, allowing researchers to identify differentially expressed proteins with confidence. MSstats TMT is particularly valuable in large-scale studies where quantifying protein expression across multiple conditions is essential for understanding complex biological processes. Its application contributes to advancing our understanding of proteomic changes in response to various experimental conditions or perturbations.

## Statistical Analysis of Microbial proteins with **MSstatsTMT**

> <hands-on-title> MSstatsTMT </hands-on-title>
>
> 1. {% tool [MSstatsTMT](toolshed.g2.bx.psu.edu/repos/galaxyp/msstatstmt/msstatstmt/2.0.0+galaxy1) %} with the following parameters:
>    - *"Input Source"*: `MaxQuant`
>        - {% icon param-file %} *"evidence.txt - feature-level data"*: `output` (Input dataset)
>        - {% icon param-file %} *"proteinGroups.txt"*: `out_file1` (output of **Select Microbial** {% icon tool %})
>        - {% icon param-file %} *"annotation.txt"*: `output` (Input dataset)
>    - In *"Plot Output Options"*:
>        - *"Select protein IDs to draw plots"*: `generate all plots for each protein`
>    - *"Compare Groups"*: `Yes`
>        - *"Use comparison matrix?"*: `Yes`
>            - {% icon param-file %} *"Comparison Matrix"*: `output` (Input dataset)
>        - *"Select outputs"*: `Group Comparison` `MSstats Volcano Plot` `MSstats Comparison Plot`
>        - In *"Comparison Plot Options"*:
>            - *"Select protein IDs to draw plots"*: `generate all plots for each protein`
>            - *"Select comparisons to draw plots"*: `Generate all plots for each comparison`
>        - *"Select outputs"*: `MSstatsTMT summarization log` `MSstatsTMT summarization MSstats` `Protein abundance`
>
>
{: .hands_on}


## Statistical Analysis of Human proteins with **MSstatsTMT**

> <hands-on-title> MSstatsTMT</hands-on-title>
>
> 1. {% tool [MSstatsTMT](toolshed.g2.bx.psu.edu/repos/galaxyp/msstatstmt/msstatstmt/2.0.0+galaxy1) %} with the following parameters:
>    - *"Input Source"*: `MaxQuant`
>        - {% icon param-file %} *"evidence.txt - feature-level data"*: `output` (Input dataset)
>        - {% icon param-file %} *"proteinGroups.txt"*: `out_file1` (output of **Select HUMAN** {% icon tool %})
>        - {% icon param-file %} *"annotation.txt"*: `output` (Input dataset)
>    - In *"Plot Output Options"*:
>        - *"Select protein IDs to draw plots"*: `generate all plots for each protein`
>    - *"Compare Groups"*: `Yes`
>        - *"Use comparison matrix?"*: `Yes`
>            - {% icon param-file %} *"Comparison Matrix"*: `output` (Input dataset)
>        - *"Select outputs"*: `Group Comparison` `MSstats Volcano Plot` `MSstats Comparison Plot`
>        - In *"Comparison Plot Options"*:
>            - *"Select protein IDs to draw plots"*: `generate all plots for each protein`
>            - *"Select comparisons to draw plots"*: `Generate all plots for each comparison`
>        - *"Select outputs"*: `MSstatsTMT summarization log` `MSstatsTMT summarization MSstats` `Protein abundance`
>
>
{: .hands_on}

The MSstats output typically includes essential information such as estimated fold changes, p-values, and other statistical measures that help identify differentially expressed proteins across experimental conditions or sample groups. It provides a clear picture of the variations in protein expression levels, aiding in the prioritization of biologically relevant targets. MSstats output also often includes visualizations and quality control metrics, making it a valuable resource for researchers in their quest to extract meaningful insights from complex proteomic datasets and understand the underlying biology of their experiments.
Example of our data interpretation:

![Data-Interpretation results with MSstats]({% link topics/proteomics/images/clinical-mp/clinical-mp-data-interpretation-figure3.jpg %})


# Conclusion
With the completion of this tutorial, you have successfully completed the clinical metaproteomics tutorials.

In conclusion, clinical metaproteomics tutorials represent an essential gateway to harnessing the power of advanced proteomic techniques in the realm of clinical research and applications. These bioinformatics tutorials serve as valuable guides for understanding the intricacies of metaproteomic workflows, from  data analysis to interpretation. By providing comprehensive knowledge and practical insights, they equip researchers and clinicians with the tools necessary to explore the rich diversity of the microbiome and its impact on health and disease or environment. As metaproteomic techniques continue to evolve and integrate with clinical practice, we hope these tutorials will be instrumental in shaping clinical research.

tools_json:
["Unipept", "toolshed.g2.bx.psu.edu/repos/galaxyp/unipept/unipept/4.5.1", "Select", "Grep1", "MSstatsTMT", "toolshed.g2.bx.psu.edu/repos/galaxyp/msstatstmt/msstatstmt/2.0.0+galaxy1"]


topic: proteomics
tutorial: neoantigen-fusion-database-generation
title: Neoantigen 1a: Fusion-Database-Generation
difficulty: intermediate
time_estimation: 2H
requirements_json: []
tags_json: ["[label-free]"]
content_hash: f25039cd87c7c9033bccb25154cbab5f
last_modified: 2026-05-27T09:01:49.457893
zenodo_link: https://zenodo.org/records/14365542
workflows_json: []
url:
https://training.galaxyproject.org/training-material/topics/proteomics/tutorials/neoantigen-fusion-database-generation/tutorial.html

content:
A neoantigen is a novel peptide (protein fragment) that is produced by cancer cells due to mutations, including gene fusions, that alter the DNA sequence in a way that generates unique proteins not found in normal cells. Because these mutated proteins are unique to the tumor, they are recognized as "foreign" by the immune system. Neoantigens are valuable in immunotherapy because they can serve as specific targets for the immune system, allowing treatments to selectively attack cancer cells while sparing normal tissue. By stimulating an immune response specifically against these neoantigens, therapies like cancer vaccines or T-cell-based treatments can be developed to enhance the body’s natural defense mechanisms, making neoantigens a promising avenue for personalized cancer treatment.

Creating a fusion database is essential in cancer genomics and personalized medicine, as it identifies crucial biomarkers, enhances diagnostic accuracy, and supports therapeutic development. Gene fusions, where parts of two previously separate genes merge, can produce abnormal proteins that drive cancer. Cataloging these fusion events in a database helps researchers identify specific biomarkers linked to cancer types and design more targeted treatments. Additionally, fusion events may lead to unique peptide sequences, known as neoantigens, which are found only in cancer cells. These neoantigens can be targeted by the immune system, making fusion databases valuable in designing personalized immunotherapies like cancer vaccines or T-cell therapies. Some gene fusions also create oncogenic proteins that promote tumor growth, such as the BCR-ABL fusion in chronic myeloid leukemia. Including such information in a database aids in identifying potential therapeutic targets and predicting treatment efficacy. On the diagnostic side, known gene fusions serve as reliable markers, helping clinicians better classify cancer types and choose the most effective treatments. Finally, fusion databases provide a critical reference for researchers studying fusion mechanisms, their impact on disease progression, and their prevalence across cancers, ultimately fueling the discovery of novel treatments and therapies.

To generate the fusion database, RNA star and Arriba tools are used in this workflow.


![Fusions_Protein_Database workflow]({% link topics/proteomics/images/neoantigen/Fusions_Protein_Database.PNG %})

> <agenda-title></agenda-title>
>
> In this tutorial, we will cover:
>
> 1. TOC
> {:toc}
>
{: .agenda}

# Overview of Fusion Neoantigen Database Workflow

The workflow in this tutorial guides users through the generation of a fusion neoantigen database, covering key steps in bioinformatics to identify, filter, and prepare fusion-specific peptides for further immunological study. Below is an overview of each major stage:

1. **Get Data** The process begins with the upload and quality assessment of raw sequencing data, which is then uncompressed. This stage sets the groundwork for all subsequent analyses.
2. **Fusion Detection and Alignment** RNA sequencing data undergoes alignment to a reference genome using tools like **RNA STAR**, followed by **Arriba** to detect fusion events. These tools identify gene fusions and help characterize the gene segments that combine to form new fusion genes.
3. **Filtering and Refinement** After identifying fusions, various filters are applied to remove non-specific or common fusion events using blacklist data and other criteria. This step ensures that only relevant, unique fusion events are retained for neoantigen prediction.
4. **Peptide Sequence Extraction and Formatting**
Potential neoantigen peptides are extracted from the fusion gene sequences. Using tools such as **Text Reformatting** and **Tabular-to-FASTA**, the data is transformed into formats suitable for further immunological analysis.
5. **Final Database Formatting**
The workflow concludes by applying regex adjustments and formatting functions to standardize the output, creating a database of potential fusion neoantigens.

In summary, this workflow provides a structured approach to preparing fusion neoantigen data for downstream applications, such as immunotherapy research, by making fusion-derived peptides accessible in a database for experimental or clinical exploration.


# Get data

> <hands-on-title> Data Upload </hands-on-title>
>
> 1. Create a new history for this tutorial
> 2. Import the files from [Zenodo]({{ page.zenodo_link }}) or from
>    the shared data library (`GTN - Material` -> `{{ page.topic_name }}`
>     -> `{{ page.title }}`):
>
>    ```
>    https://zenodo.org/records/14365542/files/human_reference_genome.fasta
>    https://zenodo.org/records/14365542/files/human_reference_genome_annotation.gtf
>    https://zenodo.org/records/14365542/files/RNA-Seq_Reads_1.fastqsanger.gz
>    https://zenodo.org/records/14365542/files/RNA-Seq_Reads_2.fastqsanger.gz
>    ```
>
>    {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
>    {% snippet faqs/galaxy/datasets_import_from_data_library.md %}
>
> 3. Rename the datasets
> 4. Check that the datatype
>
>    {% snippet faqs/galaxy/datasets_change_datatype.md datatype="datatypes" %}
>
> 5. Add to each database a tag corresponding to ...
>
>    {% snippet faqs/galaxy/datasets_add_tag.md %}
>
{: .hands_on}


# Data preparation

## Convert compressed file to uncompressed

Uncompressing data is a crucial first step in many bioinformatics workflows because raw sequencing data files, especially from high-throughput sequencing, are often stored in compressed formats (such as `.gz` or `.zip`) to save storage space and facilitate faster data transfer. Compressed files need to be uncompressed to make the data readable and accessible for analysis tools, which generally require the data to be in plain text or other compatible formats. By uncompressing these files, we ensure that downstream applications can efficiently process and analyze the raw sequencing data without compatibility issues related to compression. In this workflow, we do that for both forward and reverse files.

> <hands-on-title> Converting compressed to uncompressed </hands-on-title>
>
> 1. {% tool [Convert compressed file to uncompressed.](CONVERTER_gz_to_uncompressed) %} with the following parameters:
>    - {% icon param-file %} *"Choose compressed file"*: `RNA-Seq_Reads_1.fastqsanger.gz` (Input dataset)
>
>
{: .hands_on}

> <hands-on-title> Task description </hands-on-title>
>
> 1. {% tool [Convert compressed file to uncompressed.](CONVERTER_gz_to_uncompressed) %} with the following parameters:
>    - {% icon param-file %} *"Choose compressed file"*: `RNA-Seq_Reads_2.fastqsanger.gz` (Input dataset)
>
>
{: .hands_on}


# Alignment with RNA STAR

**RNA STAR** (Spliced Transcripts Alignment to a Reference) is a high-performance tool used to align RNA sequencing (RNA-seq) reads to a reference genome. It identifies the best matches between RNA reads and genome sequences by detecting exon-exon junctions, which are critical for accurately mapping reads from spliced transcripts. RNA STAR uses a "two-pass" mapping approach that first identifies splice junctions across all reads and then uses these junctions to guide a more accurate alignment on the second pass. This capability is especially valuable for studying gene expression, discovering novel splice variants, and identifying fusion genes in cancer and other disease research. The output includes aligned sequences that can be used in subsequent steps of bioinformatics pipelines, such as fusion detection and differential expression analysis.

> <hands-on-title> Spliced transcripts Alignment to a human reference </hands-on-title>
>
> 1. {% tool [RNA STAR](toolshed.g2.bx.psu.edu/repos/iuc/rgrnastar/rna_star/2.7.10b+galaxy4) %} with the following parameters:
>    - *"Single-end or paired-end reads"*: `Paired-end (as individual datasets)`
>        - {% icon param-file %} *"RNA-Seq FASTQ/FASTA file, forward reads"*: `RNA-Seq_Reads_1.fastqsanger` (output of **Convert compressed file to uncompressed.** {% icon tool %})
>        - {% icon param-file %} *"RNA-Seq FASTQ/FASTA file, reverse reads"*: `RNA-Seq_Reads_2.fastqsanger` (output of **Convert compressed file to uncompressed.** {% icon tool %})
>    - *"Custom or built-in reference genome"*: `Use a built-in index`
>        - *"Reference genome with or without an annotation"*: `use genome reference without builtin gene-model but provide a gtf`
>            - *"Select reference genome"*: `Human Dec. 2013 (GRCh38/hg38) (hg38)`
>            - {% icon param-file %} *"Gene model (gff3,gtf) file for splice junctions"*: `human_reference_genome_annotation.gtf` (Input dataset)
>            - *"Per gene/transcript output"*: `No per gene or transcript output`
>    - *"Use 2-pass mapping for more sensitive novel splice junction discovery"*: `Yes, perform single-sample 2-pass mapping of all reads`
>    - *"Report chimeric alignments?"*: `Within the BAM output (together with regular alignments; WithinBAM SoftClip) soft-clipping in the CIGAR for supplemental chimeric alignments`
>    - In *"Output filter criteria"*:
>        - *"Would you like to set additional output filters?"*: `No`
>    - In *"Algorithmic settings"*:
>        - *"Configure seed, alignment and limits options"*: `Use parameters suggested for STAR-Fusion`
>    - *"Compute coverage"*: `No coverage`
>
>
{: .hands_on}


> <question-title></question-title>
>
> 1. What is RNA STAR, and what does it do?
> 2. How do I interpret the alignment statistics in STAR’s output?
>
> > <solution-title></solution-title>
> >
> > 1. STAR is a tool for aligning RNA-Seq reads to a reference genome, helping researchers understand gene expression and identify splice junctions. STAR requires RNA-Seq reads, usually in FASTQ format. It also needs a reference genome file in FASTA format and annotation files in GTF/GFF format to build an index. STAR outputs alignments in BAM/SAM format, as well as splice junction files. It can also provide additional alignment stats in log files.
> > 2. STAR provides logs with mapping statistics, such as the percentage of uniquely mapped reads, which can be useful for quality control. Aligned BAM files from STAR can be visualized in genome browsers like IGV (Integrative Genomics Viewer) to examine coverage and splicing.
> >
> {: .solution}
>
{: .question}

# Fusion detection with Arriba

**Arriba** is a specialized tool used for detecting gene fusions from RNA sequencing (RNA-seq) data. It is particularly focused on identifying fusion events in cancer, where gene fusions can drive oncogenic processes. Arriba uses the output from **RNA STAR** alignments, specifically looking at chimeric alignments that result from fusion transcripts, and applies a series of filtering steps to reduce false positives.

Arriba’s pipeline includes features for:
- Filtering out common artifacts and false-positive fusions based on blacklisted regions.
- Annotating fusion breakpoints.
- Generating a visualization of detected fusion events.

The output includes a list of fusion candidates with key information like fusion partners, breakpoint locations, reading frames, and peptide sequences. Arriba’s results can provide insight into potential neoantigens, helping guide research into therapeutic targets or immune-based therapies for cancer.

> <hands-on-title> Add filters to reduce false positives </hands-on-title>
> 1. {% tool [Arriba Get Filters](toolshed.g2.bx.psu.edu/repos/iuc/arriba_get_filters/arriba_get_filters/2.4.0+galaxy1) %} with the following parameters:
>    - *"Select reference"*: `GRCh38`
>
{: .hands_on}


> <hands-on-title> Fusion detection </hands-on-title>
>
> 1. {% tool [Arriba](toolshed.g2.bx.psu.edu/repos/iuc/arriba/arriba/2.4.0+galaxy1) %} with the following parameters:
>    - {% icon param-file %} *"STAR Aligned.out.sam"*: `mapped_reads` (output of **RNA STAR** {% icon tool %})
>    - *"Genome assembly fasta (that was used for STAR alignment)"*: `From your history`
>        - {% icon param-file %} *"Genome assembly fasta"*: `human_reference_genome.fasta` (Input dataset)
>    - *"Genome GTF annotation source"*: `From your history`
>        - {% icon param-file %} *"Gene annotation in GTF format"*: `human_reference_genome_annotation.gtf` (Input dataset)
>    - {% icon param-file %} *"File containing blacklisted ranges."*: `blacklist` (output of **Arriba Get Filters** {% icon tool %})
>    - {% icon param-file %} *"File containing protein domains"*: `protein_domains` (output of **Arriba Get Filters** {% icon tool %})
>    - {% icon param-file %} *"File containing known fusions"*: `known_fusions` (output of **Arriba Get Filters** {% icon tool %})
>    - *"Use whole-genome sequencing data"*: `no`
>    - *"Generate visualization"*: `Yes`
>        - {% icon param-file %} *"Cytobands"*: `cytobands` (output of **Arriba Get Filters** {% icon tool %})
>
>
{: .hands_on}


> <question-title></question-title>
>
> 1. What is ARRIBA, and what does it do?
> 2. How can I ensure ARRIBA finds specific known fusions?
>
> > <solution-title></solution-title>
> >
> > 1. ARRIBA is a tool for detecting gene fusions in RNA-Seq data, especially helpful for identifying cancer-associated fusions and other structural variations. ARRIBA needs:A sorted BAM file with RNA-Seq reads aligned by STAR; STAR’s chimeric output (Chimeric.out.junction) to identify candidate fusion junctions; Reference annotation files, like a gene annotation GTF file and a blacklist file to filter false positives.
> > 2. Ensure that the STAR alignment and ARRIBA parameters are optimized for sensitivity. Adjusting settings for segment length and alignment quality in STAR can improve detection of specific known fusions.
> >
> {: .solution}
>
{: .question}


# Postprocessing

## Clean up data using Text reformatting

**Text Reformatting** is a step used in bioinformatics workflows to manipulate and clean up data for easier downstream processing. In fusion detection workflows, text reformatting is often used to parse and restructure output files, making the data consistent and accessible for subsequent analysis steps.

In this workflow, text reformatting involves:
- Extracting specific columns or fields from tabular outputs, such as gene names, breakpoint coordinates, or fusion peptide sequences.
- Formatting peptide sequences and related information into specific columns or concatenating fields for unique identifiers.
- Converting the data into a consistent format that downstream tools can interpret, such as converting tab-separated values into a structured layout for database input or analysis.

The reformatting step ensures that the processed data adheres to the requirements of other tools, enabling seamless integration across the workflow and supporting reliable, interpretable final results.

> <hands-on-title> Formating Arriba output</hands-on-title>
>
> 1. {% tool [Text reformatting](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_awk_tool/1.1.2) %} with the following parameters:
>    - {% icon param-file %} *"File to process"*: `fusions_tsv` (output of **Arriba** {% icon tool %})
>    - *"AWK Program"*:
> ```
> (NR==1){
>    for (i=1;i<=NF;i++) {
>        if ($i ~ gene1) {
>            gene1 = i;
>        }
>        if ($i == gene2) {
>            gene2 = i;
>        }
>        if ($i == breakpoint1) {
>            breakpoint1 = i;
>        }
>        if ($i == breakpoint2) {
>            breakpoint2 = i;
>        }
>        if ($i == reading_frame) {
>            reading_frame = i;
>        }
>        if ($i == peptide_sequence) {
>            pscol = i;
>        }
>    }
> }
> (NR>1){
>    pseq = $pscol
>    if (pseq != .) {
>        bp = index(pseq,|);
>        pos = bp - 8;
>        n=split(pseq,array,|);
>        pep = toupper(array[1] array[2])
>        sub([*],,pep)
>        g1 = $gene1;
>        g2 = $gene2;
>        sub([(,].*,,g1);
>        sub([(,].*,,g2);
>        id = g1 _ g2
>        brkpnts = $breakpoint1 _ $breakpoint2
>        neopep = substr(pep,pos)
>        if ($reading_frame == in-frame) {
>            neopep = substr(pep,pos,16)
>        }
>        print(id \t (NR-1) \t brkpnts \t neopep);
>    }
> }
> ```
>
>
>
{: .hands_on}



## Data refinement with Query Tabular

**Query Tabular** is a bioinformatics tool used to extract and manipulate specific data from tabular datasets in workflows. This tool allows users to perform SQL-like queries on tabular data, enabling them to filter, aggregate, and transform datasets based on user-defined criteria.

In this workflow, the **Query Tabular** tool is employed for several purposes:

- **Data Filtering:** Users can select specific rows based on certain conditions (e.g., filtering fusions that meet particular criteria).
- **Column Manipulation:** Users can specify which columns to retain or create new columns by combining or transforming existing data.
- **Aggregation:** The tool allows for summarizing data, such as counting occurrences of specific fusion events or summarizing results based on particular categories.
- **Output Customization:** Users can format the output to suit downstream processing needs, making it easier to pass data to subsequent analysis tools.

By leveraging **Query Tabular**, researchers can efficiently refine and structure their data, ensuring that only relevant information is carried forward in the workflow, ultimately aiding in the identification and analysis of significant biological insights.

> <hands-on-title> Manipulating the data to extract fusions </hands-on-title>
>
> 1. {% tool [Query Tabular](toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.1) %} with the following parameters:
>    - In *"Database Table"*:
>        - {% icon param-repeat %} *"Insert Database Table"*
>            - {% icon param-file %} *"Tabular Dataset for Table"*: `outfile` (output of **Text reformatting** {% icon tool %})
>            - In *"Table Options"*:
>                - *"Specify Column Names (comma-separated list)"*: `c1,c2,c3,c4`
>    - *"SQL Query to generate tabular output"*:
> ``` sql
> SELECT t1.c1 || '__' || t1.c2  || '__' || t1.c3, t1.c4
> FROM t1
> ```
>    - *"include query result column headers"*: `No`
>
>
{: .hands_on}


##  Transform data using Tabular-to-FASTA

Tabular to FASTA conversion is a common task in bioinformatics that transforms data structured in a tabular format (such as CSV or TSV) into FASTA format, widely used for representing nucleotide or protein sequences. This conversion is essential when sequence data needs to be input into various bioinformatics tools or databases that require FASTA-formatted files.

> <hands-on-title> Converting tabular to fasta </hands-on-title>
>
> 1. {% tool [Tabular-to-FASTA](toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fasta/tab2fasta/1.1.1) %} with the following parameters:
>    - {% icon param-file %} *"Tab-delimited file"*: `output` (output of **Query Tabular** {% icon tool %})
>    - *"Title column(s)"*: `1`
>    - *"Sequence column"*: `2`
>
>
{: .hands_on}


## Using Regex Find And Replace

Using regex (regular expressions) for find and replace is a powerful technique for text manipulation, allowing you to search for patterns and replace them with desired text. Below is a guide on how to use regex for find and replace, including examples in different programming languages. In this context, we are adding "fusion" to the database header.

> <hands-on-title> Adding fusion tag in the fasta header </hands-on-title>
>
> 1. {% tool [Regex Find And Replace](toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regex1/1.0.3) %} with the following parameters:
>    - {% icon param-file %} *"Select lines from"*: `output` (output of **Tabular-to-FASTA** {% icon tool %})
>    - In *"Check"*:
>        - {% icon param-repeat %} *"Insert Check"*
>            - *"Find Regex"*: `>(\b\w+\S+)(.*$)`
>            - *"Replacement"*: `>generic|fusion_\1|\2`
>
>    {% snippet faqs/galaxy/analysis_regular_expressions.md %}
>
> 2. Rename the output FASTA as `Arriba-Fusion-Database.fasta`
> 
{: .hands_on}


# Conclusion

The workflow outlined above demonstrates a systematic approach to processing biological data, emphasizing the importance of each step in ensuring accurate and reliable results. By integrating tools like RNA-STAR for alignment and Arriba for structural variant detection, researchers can effectively analyze complex genomic information. The transition from tabular data to FASTA format and the application of regex for find-and-replace operations further streamline data management, enhancing efficiency and clarity. Ultimately, this workflow not only facilitates the identification of neoantigens but also contributes to the broader goals of personalized medicine and targeted therapies. By leveraging these methodologies, researchers can gain deeper insights into the genetic underpinnings of diseases and advance the development of innovative treatments.

# Rerunning on your own data

To rerun this entire analysis at once, you can use our workflow. Below, we show how to do this:

> <hands-on-title>Running the Workflow</hands-on-title>
>
> 1. **Import the workflow** into Galaxy:
>    - [Neoantigen Fusion Database Generation](https://tinyurl.com/ipepgen-gene-fusion-wf)
>
>
> 2. Run **Workflow** {% icon workflow %} using the following parameters:
>    - *"Send results to a new history"*: `No`
>    - {% icon param-file %} *"RNA-Seq_Reads_1 (forward strand)"*: `RNA-Seq_Reads_1.fastqsanger.gz`
>    - {% icon param-file %} *"RNA-Seq_Reads_2 (reverse strand)"*: `RNA-Seq_Reads_2.fastqsanger.gz`
>    - {% icon param-file %} *"Human Reference Genome Annotation"*: `human_reference_genome_annotation.gtf`
>    - {% icon param-file %} *"Human Reference Genome"*: `human_reference_genome.fasta`
>
>    {% snippet faqs/galaxy/workflows_run.md %}
>
> 
> 
> 
> <comment-title>DISCLAIMER</comment-title>
>
> - If any step in this workflow fails, please ensure that the input files have been correctly generated and formatted by the preceding tools. Workflow failures often result from improperly called or incomplete input data rather than errors in the workflow itself. Users are responsible for verifying their input before troubleshooting workflow issues.
>
> {: .comment}
>
> 
{: .hands_on}


# Are you feeling adventurous? ✨

## One-Click Neoantigen Workflow

This new [One-Click Neoantigen Workflow](https://usegalaxy.eu/u/galaxyp/w/ipepgen-one-click-workflow) brings together all key modules of the neoantigen discovery process into a single, streamlined analysis within Galaxy. Instead of launching each tutorial separately, users can now execute the entire end-to-end pipeline—from database creation to HLA binding prediction—with just one click —without ever leaving Galaxy.

# Disclaimer

Please note that all the software tools used in this workflow are subject to version updates and changes. As a result, the parameters, functionalities, and outcomes may differ with each new version. Additionally, if the protein sequences are downloaded at different times, the number of sequences may also vary due to updates in the reference databases or tool modifications. We recommend the users to verify the specific versions of software tools used to ensure the reproducibility and accuracy of results.

tools_json:
["Convert compressed file to uncompressed.", "CONVERTER_gz_to_uncompressed", "RNA STAR", "toolshed.g2.bx.psu.edu/repos/iuc/rgrnastar/rna_star/2.7.10b+galaxy4", "Arriba Get Filters", "toolshed.g2.bx.psu.edu/repos/iuc/arriba_get_filters/arriba_get_filters/2.4.0+galaxy1", "Arriba", "toolshed.g2.bx.psu.edu/repos/iuc/arriba/arriba/2.4.0+galaxy1", "Text reformatting", "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_awk_tool/1.1.2", "Query Tabular", "toolshed.g2.bx.psu.edu/repos/iuc/query_tabular/query_tabular/3.3.1", "Tabular-to-FASTA", "toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fasta/tab2fasta/1.1.1", "Regex Find And Replace", "toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regex1/1.0.3"]


