Skip to content

Commit

Permalink
Merge pull request #329 from jonasscheid/add-chromatogram-extractor
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasscheid authored Sep 19, 2024
2 parents 722343b + eb79fce commit da9fc4d
Show file tree
Hide file tree
Showing 14 changed files with 217 additions and 31 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## v2.6.1dev

### `Added`

- Added `PYOPENMS_CHROMATOGRAMEXTRACTOR` extracting MS1 Chromatograms and visualize them in multiQC report [#329](https://github.com/nf-core/mhcquant/pull/329)

## v2.6.0 - nfcore/mhcquant "Mr Bob" - 2024/06/17

### `Added`
Expand Down
42 changes: 39 additions & 3 deletions assets/multiqc_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ custom_logo_url: https://github.com/nf-core/mhcquant
custom_logo_title: "nf-core/mhcquant"

report_comment: >
This report has been generated by the <a href="https://github.com/nf-core/mhcquant/releases/tag/2.6.0" target="_blank">nf-core/mhcquant</a>
This report has been generated by the <a href="https://github.com/nf-core/mhcquant/tree/dev" target="_blank">nf-core/mhcquant</a>
analysis pipeline. For information about how to interpret these results, please see the
<a href="https://nf-co.re/mhcquant/2.6.0/docs/output" target="_blank">documentation</a>.
<a href="https://nf-co.re/mhcquant/dev/docs/output" target="_blank">documentation</a>.
report_section_order:
"nf-core-mhcquant-methods-description":
order: -1000
Expand All @@ -15,5 +15,41 @@ report_section_order:
order: -1002

export_plots: true

disable_version_detection: true

# Modules to run
run_modules:
- custom_content

# Custom tables and plots
custom_data:
# Summary of chromatogram plot
chromatogram:
plot_type: "linegraph"
file_format: "csv"
section_name: "MS1 Chromatogram"
description: |
An MS1 chromatogram is a plot of the intensity of precursor ions (MS1) detected over time,
typically with retention time (RT) on the x-axis and ion intensity on the y-axis.
It represents the total ion current (TIC) from the MS1 scan,
which is useful for monitoring the overall elution profile of compounds during a chromatographic separation.
pconfig:
id: "chromatogram"
title: "MS1 Chromatograms"
xlab: "Retention time [min]"
xmin: 0
ylab: "Intensity"
logswitch: true
logswitch_active: true

sp:
chromatogram:
fn: "*_chrom.csv"
## Define the order of sections
#module_order:
# - custom_content
#
## Set the order of custom code plots and tables
#custom_content:
# order:
# - chromatogram
51 changes: 51 additions & 0 deletions bin/chromatogram_extractor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env python
# Written by Jonas Scheid under the MIT license

import logging
import csv
import argparse
import matplotlib.pyplot as plt

import pandas as pd
import pyopenms as oms

# Setup logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")


def parse_arguments():
parser = argparse.ArgumentParser(description='Exctract TICs of MS1 Spectra')
parser.add_argument('-in','--input', type=str, help='Path to the spectrum file')
parser.add_argument('-out', '--output', type=str, help='Path to the output CSV file containing RT and TIC of Precursors')
return parser.parse_args()

def main():
args = parse_arguments()
input_file = args.input
output_file = args.output

# Load the mzML file
logging.info(f'Loading file: {input_file}')
exp = oms.MSExperiment()
mzml_file = oms.MzMLFile()
mzml_file.load(input_file, exp)

# Get RT and Spectrum TIC of MS1 Spectra
chromatogram = [(spectrum.getRT() / 60 , spectrum.calculateTIC()) for spectrum in exp.getSpectra() if spectrum.getMSLevel() == 1]
logging.info(f'Found {len(chromatogram)} MS1 Spectra')
logging.info(f'RT range: {round(chromatogram[0][0],2)} - {round(chromatogram[-1][0],2)} [min]')
# Create pandas df
chromatogram_df = pd.DataFrame(chromatogram, columns=['RT', 'TIC'])
# bin data into minutes and take the mean of the TIC
chromatogram_df = chromatogram_df.groupby('RT').mean().reset_index()
# Add RT=0 and Intensity=0 to start and end of chromatogram_df
start = pd.DataFrame([{'RT': 0, 'TIC': 0}])
end = pd.DataFrame([{'RT': chromatogram_df['RT'].max(), 'TIC': 0}])
# Concatenate the DataFrames
chromatogram_df = pd.concat([start, chromatogram_df, end], ignore_index=True)

# Write to csv
chromatogram_df.to_csv(output_file, index=False, header=False)

if __name__ == '__main__':
main()
6 changes: 6 additions & 0 deletions conf/modules.config
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,12 @@ process {
]
}

withName: 'PYOPENMS_CHROMATOGRAMEXTRACTOR' {
publishDir = [
enabled: false
]
}

withName: 'OPENMS_MAPALIGNERIDENTIFICATION' {
ext.args = [
"-model:type linear",
Expand Down
2 changes: 1 addition & 1 deletion modules.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
},
"multiqc": {
"branch": "master",
"git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a",
"git_sha": "06c8865e36741e05ad32ef70ab3fac127486af48",
"installed_by": ["modules"]
},
"openms/decoydatabase": {
Expand Down
47 changes: 47 additions & 0 deletions modules/local/pyopenms_chromatogramextractor.nf
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
process PYOPENMS_CHROMATOGRAMEXTRACTOR {
tag "$meta.id"
label 'process_single'

conda "bioconda::pyopenms=3.1.0"
container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
'https://depot.galaxyproject.org/singularity/pyopenms:3.1.0--py311h9b8898c_0' :
'biocontainers/pyopenms:3.1.0--py311h9b8898c_0' }"

input:
tuple val(meta), path(mzml)

output:
tuple val(meta), path("*.csv") , emit: csv
path "versions.yml" , emit: versions

when:
task.ext.when == null || task.ext.when

script:
def prefix = task.ext.prefix ?: "${mzml.baseName}"
def args = task.ext.args ?: ''

"""
chromatogram_extractor.py \\
-in $mzml \\
-out ${prefix}_chrom.csv \\
cat <<-END_VERSIONS > versions.yml
"${task.process}":
pyOpenMS: \$(pip show pyopenms | grep Version | cut -d ' ' -f 2)
END_VERSIONS
"""

stub:
def args = task.ext.args ?: ''
def prefix = task.ext.prefix ?: "${mzml.baseName}"

"""
touch ${prefix}_chrom.csv
cat <<-END_VERSIONS > versions.yml
"${task.process}":
pyOpenMS: \$(pip show pyopenms | grep Version | cut -d ' ' -f 2)
END_VERSIONS
"""
}
4 changes: 1 addition & 3 deletions modules/nf-core/multiqc/environment.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 11 additions & 3 deletions modules/nf-core/multiqc/main.nf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions modules/nf-core/multiqc/meta.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions modules/nf-core/multiqc/tests/main.nf.test

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions modules/nf-core/multiqc/tests/main.nf.test.snap

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions modules/nf-core/multiqc/tests/nextflow.config

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion nextflow.config
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ manifest {
description = """Identify and quantify peptides from mass spectrometry raw data"""
mainScript = 'main.nf'
nextflowVersion = '!>=23.04.0'
version = '2.6.0'
version = '2.6.1dev'
doi = '10.1021/acs.jproteome.9b00313'
}

Expand Down
Loading

0 comments on commit da9fc4d

Please sign in to comment.