Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "metabolomics_spectrum_resolver/mass-spec-package"]
path = metabolomics_spectrum_resolver/mass-spec-package
url = https://github.com/AkJay1722/mass-spec-package.git
1 change: 1 addition & 0 deletions metabolomics_spectrum_resolver/mass-spec-package
Submodule mass-spec-package added at c1cc52
42 changes: 41 additions & 1 deletion metabolomics_spectrum_resolver/parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@

from metabolomics_spectrum_resolver.error import UsiError

from metabolomics_spectrum_resolver.zenodo_mzml_repo import mzml_repo


timeout = 45 # seconds

MS2LDA_SERVER = "http://ms2lda.org/basicviz/"
Expand Down Expand Up @@ -46,7 +49,7 @@
# collection identifier
# Unofficial proteomics spectral library identifier: MASSIVEKB
# Metabolomics collection identifiers: GNPS, MASSBANK, MS2LDA, MOTIFDB, MTBLS, ST
r":(MASSIVEKB|GNPS|GNPS2|MASSBANK|MS2LDA|MOTIFDB|TINYMASS|MTBLS\d+|ST\d{6}|)"
r":(MASSIVEKB|GNPS|GNPS2|MASSBANK|MS2LDA|MOTIFDB|TINYMASS|MTBLS\d+|ST\d{6}|ZENODO-\d+|)"
# msRun identifier
r":(.*)"
# index flag
Expand Down Expand Up @@ -136,6 +139,8 @@ def parse_usi(usi: str) -> Tuple[sus.MsmsSpectrum, str, str]:
spectrum, source_link = _parse_metabolomics_workbench(usi)
elif collection.startswith("tinymass"):
spectrum, source_link = _parse_tinymass(usi)
elif collection.startswith("zenodo"):
spectrum, source_link = _parse_zenodo(usi)
else:
raise UsiError(f"Unknown USI collection: {match.group(1)}", 400)
splash_key = splash_builder.splash(
Expand Down Expand Up @@ -473,6 +478,41 @@ def _parse_gnps2_dataset(usi: str) -> Tuple[sus.MsmsSpectrum, str]:
except (requests.exceptions.HTTPError, json.decoder.JSONDecodeError):
raise UsiError("Unknown GNPS2 Dataset USI", 404)

# parsing from Zenodo
def _parse_zenodo(usi: str) -> Tuple[sus.MsmsSpectrum, str]:
match = _match_usi(usi)
zenodo_id = match.group(1).split("-")[-1]
filename = match.group(2)
index_flag = match.group(3)
if index_flag.lower() == "scan":
scan = match.group(4)

zenodo_obj = mzml_repo(zenodo_id)
zenodo_obj.partial_indexing = False
scan_obj = zenodo_obj.get_scan(filename, int(scan))

# get peaks
intensity_list = scan_obj["intensities"]
mz_list = scan_obj["mz"]
charge = scan_obj["charge"]
precursor_mz = scan_obj["precursor_mz"]

try:
charge = int(charge)
except:
charge = 0

try:
precursor_mz = float(precursor_mz)
except:
precursor_mz = 0

source_link = f"https://zenodo.org/record/{zenodo_id}"

spectrum = sus.MsmsSpectrum(usi, precursor_mz, charge, mz_list, intensity_list)

return spectrum, source_link

# Parse TINYMASS task spectra
def _parse_tinymass(usi: str) -> Tuple[sus.MsmsSpectrum, str]:
match = _match_usi(usi)
Expand Down
6 changes: 6 additions & 0 deletions metabolomics_spectrum_resolver/templates/homepage.html
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ <h2>
</a>
</div>

<div class="text-center">
<a href="/spectrum/?usi=mzspec:ZENODO-10211590:D141_POS.mzML:scan:421">
<button class="btn btn-primary btn-sm btn-block">Zenodo Repository Spectrum</button>
</a>
</div>

<br>

<div class="text-center">
Expand Down
2 changes: 1 addition & 1 deletion metabolomics_spectrum_resolver/templates/minimal.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<hr>

<div class="footer-copyright text-center py-3">
Metabolomics Spectrum Resolver - Release 2025.07.10
Metabolomics Spectrum Resolver - Release 2025.09.10
</div>


Expand Down
1 change: 0 additions & 1 deletion test/test_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,6 @@ def test_parse_motifdb():
parsing.parse_usi(usi.replace(":171163", ":this_index_does_not_exist"))
assert exc_info.value.error_code == 404


def test_parse_timeout():
with unittest.mock.patch(
"metabolomics_spectrum_resolver.parsing.requests.get",
Expand Down
Loading