Skip to content

Optimize MS2 value peak extraction - #775

Merged
YukiMatsuzawa merged 4 commits into
masterfrom
copilot/yukimatsuzawa-performance-hotspot-fix
Sep 8, 2026
Merged

Optimize MS2 value peak extraction#775
YukiMatsuzawa merged 4 commits into
masterfrom
copilot/yukimatsuzawa-performance-hotspot-fix

Conversation

@YukiMatsuzawa

Copy link
Copy Markdown
Contributor

Summary

  • eliminate the preliminary full scan used only to count matching MS2 spectra
  • collect value peaks during the existing extraction pass
  • preserve the returned per-m/z arrays and ordering

Performance audit: 10 opportunities

  1. Implemented — DataAccess.GetMs2ValuePeaks: remove the duplicate provider traversal used to pre-count results; high impact for large raw-data ranges and low implementation risk.
  2. DataAccess.GetMs2Peaklist: cache/reuse spectrum eligibility checks when multiple product ions are extracted from the same precursor window instead of reloading and filtering the same scans for every product m/z.
  3. DataAccess.GetMs2ValuePeaks: compute intensities for sorted target m/z values with a shared monotonic peak cursor and avoid repeated setup when target lists are reused across files.
  4. DataAccess.GetDriftChromatogramByRtMz: replace repeated ContainsKey plus indexer lookups in nested dictionaries with TryGetValue to reduce hash lookups in the inner peak loop.
  5. DataAccess.GetDriftChromatogramByRtMz: replace per-peak double[] allocations with a value-oriented accumulator to reduce GC pressure during ion-mobility extraction.
  6. SpectrumViewModel and SplitSpectrumsViewModel: maintain a membership set for drag/drop duplicate checks instead of linear Contains scans as displayed scan counts grow.
  7. SpectrumViewModel and SplitSpectrumsViewModel: combine the repeated spectrum min/max enumerations per collection-change event so each spectrum is traversed once per axis update.
  8. DataAccess.IsSWATH: perform one pass over MS2 spectra rather than materializing multiple LINQ sequences and enumerating them repeatedly.
  9. DataAccess.GetBaselineCorrectedPeaklistByMassAccuracy: reserve output capacity from the input peak count to avoid repeated list growth during chromatogram construction.
  10. DataAccess.GetDriftChromatogramByScanRtMz: use the existing RT index lookup to bound both directional scans before loading spectra, reducing provider calls outside the requested RT window.

Validation

  • dotnet test tests\\MSDIAL5\\MsdialCoreTests\\MsdialCoreTests.csproj --no-restore --filter FullyQualifiedName~DataAccessTests

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The behavioral shape of the returned data remains consistent while eliminating a redundant provider traversal, and the remaining feedback is limited to minor allocation overhead reductions.

Pull request overview

This PR optimizes MS2 value-peak extraction by removing a preliminary full provider scan that previously existed only to count eligible MS2 spectra, and instead collecting peaks during the existing extraction traversal while preserving the per-target-m/z output structure.

Changes:

  • Removed the pre-counting pass (GetTargetArrayLength) that duplicated provider traversal work.
  • Switched MS2 value peak collection to build per-target lists during the main scan loop and materialize them to arrays at the end.
File summaries
File Description
src/MSDIAL5/MsdialCore/Utility/DataAccess.cs Removes a redundant scan pass in GetMs2ValuePeaks and collects value peaks in a single traversal while returning the same per-m/z array structure.
Review details
  • Files reviewed: 1/1 changed files
  • Comments generated: 2
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/MSDIAL5/MsdialCore/Utility/DataAccess.cs Outdated
Comment thread src/MSDIAL5/MsdialCore/Utility/DataAccess.cs Outdated
YukiMatsuzawa and others added 3 commits September 4, 2026 15:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…o copilot/yukimatsuzawa-performance-hotspot-fix
@YukiMatsuzawa
YukiMatsuzawa merged commit afd5f95 into master Sep 8, 2026
1 check passed
@YukiMatsuzawa
YukiMatsuzawa deleted the copilot/yukimatsuzawa-performance-hotspot-fix branch September 8, 2026 05:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants