From 704f352e71839067a3760f0e0c914560ea6981a2 Mon Sep 17 00:00:00 2001 From: rrad Date: Sun, 23 Nov 2025 13:49:15 -0800 Subject: [PATCH] read peptide ID as string. correctly override cli input paths. additional error reporting --- src/AScorePro/Interface/PeptidesFile.cs | 4 +- src/AScorePro/Program.cs | 72 ++++++++++++++----------- src/Common/Sequence/Peptide.cs | 2 +- 3 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/AScorePro/Interface/PeptidesFile.cs b/src/AScorePro/Interface/PeptidesFile.cs index f5c89d9..b2c103a 100644 --- a/src/AScorePro/Interface/PeptidesFile.cs +++ b/src/AScorePro/Interface/PeptidesFile.cs @@ -12,7 +12,7 @@ public struct PeptidesFileEntry { /// Not used in AScore, can be any unique number for /// identification purposes. /// - public int Id; + public string Id; /// /// The scan number is used to look up the scan from the @@ -73,7 +73,7 @@ public IEnumerator GetEnumerator() private PeptidesFileEntry ParsePeptide(string line) { var entry = new PeptidesFileEntry(); string[] pieces = line.Split("\t"); - entry.Id = int.Parse(pieces[0]); + entry.Id = pieces[0]; entry.ScanNumber = int.Parse(pieces[1]); entry.Peptide = pieces[2]; entry.PrecursorMz = double.Parse(pieces[3]); diff --git a/src/AScorePro/Program.cs b/src/AScorePro/Program.cs index c701754..751796d 100644 --- a/src/AScorePro/Program.cs +++ b/src/AScorePro/Program.cs @@ -53,13 +53,15 @@ static void Main(string[] args) } else { - AScoreMulti(aScore, scans, peptideParser, ascoreOptions); + AScoreMulti(aScore, scans, peptideParser, peptidesPath, ascoreOptions); } } catch (Exception ex) { if (ex.Message.Length > 0) { Console.WriteLine("An error occurred: " + ex.Message); + Console.WriteLine("Stack trace:"); + Console.WriteLine(ex.StackTrace); try { using (StreamWriter writer = new StreamWriter("error.log", true)) { writer.WriteLine("[" + DateTime.Now.ToString() + "]"); @@ -96,8 +98,9 @@ private static void AScoreSingle(AScoreCalculator aScore, Peptide peptide, Scan /// Instance of AScore used on all peptides /// Collection of scans /// Unserializes peptides from the text input + /// Path to peptides file (may override options) /// AScore options - private static void AScoreMulti(AScoreCalculator aScore, ScanCache scans, PeptideParser parser, AScoreOptions options) + private static void AScoreMulti(AScoreCalculator aScore, ScanCache scans, PeptideParser parser, string peptidesPath, AScoreOptions options) { var stream = new FileStream(options.Out, FileMode.Create, FileAccess.Write); using (var writer = new StreamWriter(stream)) @@ -111,41 +114,48 @@ private static void AScoreMulti(AScoreCalculator aScore, ScanCache scans, Peptid } writer.Write("\n"); - var peptides = new PeptidesFile(options.PeptidesFile); + var peptides = new PeptidesFile(peptidesPath); foreach (PeptidesFileEntry entry in peptides) { - var peptide = parser.Parse(entry.Peptide); - peptide.PrecursorMz = entry.PrecursorMz; - peptide.Id = entry.Id; - peptide.ScanNumber = entry.ScanNumber; - var scan = scans.GetScan(peptide.ScanNumber); - var result = aScore.Run(peptide, scan); + try + { + var peptide = parser.Parse(entry.Peptide); + peptide.PrecursorMz = entry.PrecursorMz; + peptide.Id = entry.Id; + peptide.ScanNumber = entry.ScanNumber; + var scan = scans.GetScan(peptide.ScanNumber); + var result = aScore.Run(peptide, scan); - Peptide topPeptide = result.Peptides[0]; - writer.Write(topPeptide.Id); - writer.Write("\t"); - writer.Write(result.ModCount); - writer.Write("\t"); - writer.Write(result.Peptides.Count); - writer.Write("\t"); - writer.Write(topPeptide.ToString()); - writer.Write("\t"); - writer.Write(topPeptide.Score.ToString("F9")); + Peptide topPeptide = result.Peptides[0]; + writer.Write(topPeptide.Id); + writer.Write("\t"); + writer.Write(result.ModCount); + writer.Write("\t"); + writer.Write(result.Peptides.Count); + writer.Write("\t"); + writer.Write(topPeptide.ToString()); + writer.Write("\t"); + writer.Write(topPeptide.Score.ToString("F9")); - // Flatten output. Show up to six mods. - for (int i = 0; i < 6; ++i) { - if (i < result.Sites.Count) { - var site = result.Sites[i]; - writer.Write("\t"); - writer.Write(site.Position); - writer.Write("\t"); - writer.Write(site.Score.ToString("F9")); - } - else { - writer.Write("\t\\N\t\\N"); + // Flatten output. Show up to six mods. + for (int i = 0; i < 6; ++i) { + if (i < result.Sites.Count) { + var site = result.Sites[i]; + writer.Write("\t"); + writer.Write(site.Position); + writer.Write("\t"); + writer.Write(site.Score.ToString("F9")); + } + else { + writer.Write("\t\\N\t\\N"); + } } + writer.Write("\n"); + } + catch (Exception ex) + { + Console.WriteLine($"Warning: Skipping peptide {entry.Id} scan {entry.ScanNumber}: {ex.Message}"); } - writer.Write("\n"); } } } diff --git a/src/Common/Sequence/Peptide.cs b/src/Common/Sequence/Peptide.cs index 460bcdf..6657d78 100644 --- a/src/Common/Sequence/Peptide.cs +++ b/src/Common/Sequence/Peptide.cs @@ -18,7 +18,7 @@ public class Peptide /// /// A unique number used to identify the peptide. /// - public int Id; + public string Id; /// /// The scan number for the peptide