Dmitry Avtonomov

Lead Software Engineer

Protein Metrics

profile for Dmitry Avtonomov at Stack Overflow, Q&A for professional and enthusiast programmers

About me

Best way to describe myself would be: a software engineer with a lot of hands on experience in mass-spectrometry (liquid and gas chromatography, ion mobility).

Usual course of action - acquire new data, explore it with visualizations, come up with a suitable processing algorithm. In most cases this results in desktop GUI applications for the viz part and CLI programs to perform batch data processing.

  • Prefer writing code in Java or C#, with occasional forays into C++.
  • Contributing to Open Source projects like Apache NetBeans .
  • Sharing love through Maven Central.
  • Daily drivers: Java, Gradle, Maven, C# (NET Standard 2.0), Git, SQL
  • Occasional usage: R, Python, Nodejs, React, Hugo, Gatsby and much more

Some project links:

  • BatMass (Java, NetBeans Platform) - Mass spectrometry data visualization and processing.
  • MSFTBX (Java, gRPC, JNA) - Java library for unified mass-spec data access: mzML, mzXML, pepXML, protXML, mzId, mzIdentML, etc. Available through Maven Central.
  • FragPipe (Java Swing, JNA) - Pipelined complete LC/MS proteomic analysis with a graphical interface. Peptide/protein search, validation, FDR estimation, quantitation, PTM analysis, spectral library building etc.
  • MSFragger (Java) - Ultra-fast proteomics search engine for Closed and Open searches.
  • IMTBX+Grppr (C#, WinForms, Java) - A suite of tools for extracting signals from Ion Mobility (IM) data (IM-MS, LC-IM-MS) and performing isotopic envelopes detection.
  • DIA-Umpire - Data Independent Acquisition (DIA) data processing tool that doesn't require a spectral library (Java).


  • Algorithms
  • Data Visualization
  • Mass Spectrometry
  • Desktop Applications
  • Instrument Control


  • PhD, Physics and Mathematics, 2012

    Institute for Energy Problems of Chemical Physics

  • MSc, Applied Physics and Mathematics, 2008

    Moscow Institute of Physics and Technology (MIPT)

  • BSc, Applied Physics and Mathematics, 2006

    Moscow Institute of Physics and Technology (MIPT)


LC-MS data visualization and exploration framework. View spectra, extracted ion chromatograms and 2D ion maps of LC-MS experiments. Synchronized viewers. Visualize DIA experiments. Overlay MS/MS events, peptide identifications or custom data (via delimited text files) over a 2D map. 🚀

Visit website Download

Recent Posts

How to find large files in Git history: a one-liner

One liner:

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sed -n 's/^blob //p' \
| sort --numeric-sort --key=2 \
| cut -c 1-12,41- \
| $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

Credit SO: https://stackoverflow.com/a/42544963/88814

How to view Git changes on a single branch since its creation

The command: git log --oneline master..feature/some-branch Will show commits on feature branch since it was forked off master. Suppose you have a repo that looks like this: base - A - B - C - D (master) \ \- X - Y - Z (myBranch) Verify the repo status: > git checkout master Already on 'master' > git status ; git log --oneline On branch master nothing to commit, working directory clean d9addce D 110a9ab C 5f3f8db B 0f26e69 A e764ffa base and for myBranch:

How to remove "other search engines" from Chrome

Open the Chrome search engine settings page: chrome://settings/searchEngines Selector for topmost “Remove search engine” button in “Other search engines” list: document.querySelector("body > settings-ui").shadowRoot .querySelector("#main").shadowRoot .querySelector("settings-basic-page").shadowRoot .querySelector("#basicPage > settings-section.expanded > settings-search-page").shadowRoot .querySelector("#pages > settings-subpage > settings-search-engines-page").shadowRoot .querySelector("#otherEngines").shadowRoot .querySelector("#frb0").shadowRoot .querySelector("#delete"); You can repeatedly call the selector and “click()” on the button. document.querySelector("body > settings-ui").shadowRoot .querySelector("#main").shadowRoot .querySelector("settings-basic-page").shadowRoot .querySelector("#basicPage > settings-section.expanded > settings-search-page").shadowRoot .querySelector("#pages > settings-subpage > settings-search-engines-page").

How-to: Git clean up .orig files generated after conflict resolution

Preamble After a merge conflict resolution you're often left with files ending with .orig extension. I have them added to my global .gitignore. Hence I can't easily get rid of them with regular: git clean -fd. Solution git clean has -e argument for a regular expression to match files. To preview what will happen: git clean -e '!*.orig' --dry-run To actually delete the files: git clean -e '!*.orig' -f It's that simple.

Installing WSL2 on Windows 10

The easy way. Get the full featured Linux running under Windows.