Parquet IO: improve ProteinIdentification identifier architecture
Les mainteneurs répondent en général sous 1 jour
@jpfeuffer y travaille déjà.
Depuis le 24/5/2026.
Évaluation
Cette issue n'a pas encore été évaluée.
Description
This issue is to track some potential improvements we should also land in the xml format path.
Context
PR #9400 closes two real gaps in the parquet IO layer by bringing identifier handling to parity with the XML lane (load-side synthesis via UniqueIdGenerator, store-side uniqueness check). That's the right pragmatic fix, but the underlying architecture has some design debt — shared with the XML lane — that's worth addressing in a future parquet schema revision.
Current design
- The
run_identifierstring serves dual duty: it's the internal join key linkingPeptideIdentification→ProteinIdentification, and it's the semantic "run identity" used by tools likeIDMerger/IDRipperto decide what to collapse or split. - On every load (XML and now parquet), the identifier is synthesized as
<search_engine>_<date>_<UniqueIdGenerator::getUniqueId()>. Two loads of the same file produce different in-memory identifiers for the same data. - Identifier synthesis lives inside the IO layer (
IdXMLFile::load,PSMArrowIO::importFromParquet, etc.), meaning deserialization mutates domain objects.
Proposed improvements
1. Deterministic content-based identifiers
Replace the non-deterministic UniqueIdGenerator::getUniqueId() suffix with a hash of the run's invariant properties (search engine, search parameters, input file paths, date). Benefits:
- Two loads of the same file yield the same in-memory state → reproducible, debuggable
- Collision resistance comes from content, not randomness
- Downstream tests no longer need to mask identifier suffixes
2. Separate internal join key from run identity
The parquet schema could use a structural join key (integer index or row position) for the internal PeptideIdentification ↔ ProteinIdentification linkage, and carry the human-meaningful run identity as a separate column. This eliminates the need for rename maps and re-stamping during deserialization — the join is positional, not string-based.
3. Move identifier management out of the IO layer
IO should faithfully round-trip what's stored. Collision prevention belongs in the operations that actually create collisions: IDMerger, IDRipper, or a shared utility called at the tool level (e.g., ensureUniqueRunIdentifiers()). The IO layer would just deserialize; merge/split tools would call the uniqueness logic before combining data from multiple sources.
Trade-offs
- All three are breaking changes to the on-disk format and tool-level contracts, so they'd need to be coordinated as part of a "parquet v2 schema" effort.
- The current parity-with-XML approach (#9400) is correct for now — it closes real bugs without changing the architecture.
- Proposals 1–3 are independent and could be adopted incrementally.
Assigning @jpfeuffer and @cbielow for discussion on scope and prioritization.
- Langage dominant
- C++
- Étoiles
- 623
- Forks
- 441
- Merge moyen
- 23 h 59 min
- PR mergées (30 j)
- 283
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de OpenMS/OpenMS
-
MSstatsFile: Condition written unquoted, so conditions containing commas produce malformed MSstats CSVPeut-être pris @niharikavuchintala l’a pris il y a 5 jours. Ouvertenew contributor
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
OpenMS/OpenMS#10512 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
[FEATUREFINDER] Biosaur2Algorithm::centroidProfileSpectra_: dead drift-time guard would drop every FAIMS CVPeut-être à nouveau libre @kavyansh-1 l’a pris il y a 36 jours, et aucune pull request n’est ouverte. Ouvertedefect
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
OpenMS/OpenMS#10005 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
IsobaricWorkflow: a spectrum with several identifications is quantified once per identificationOuvertenew contributor
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
OpenMS/OpenMS#10603 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
BrukerTimsFile: uncaught SQLite::Exception 'no such table: Precursors' on TDF data without PASEF precursorsPeut-être pris @timosachsenberg l’a pris il y a 1 jour. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
-
FileConverter converts Bruker MALDI imaging .d to flat mzML (or aborts) instead of refusing itPeut-être pris @timosachsenberg l’a pris il y a 1 jour. Ouverte
Difficulté 4/5 1-2 jours Accessibilité débutants 25/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de OpenMS/OpenMS
Issues similaires
-
Web3 RPC: one-element batch request returns an object instead of an array (breaks ethers.js v6)Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
FISCO-BCOS/FISCO-BCOS#5706 ·
Les mainteneurs répondent en général sous 3 jours
-
[开源推荐] Windows 系统维护工具箱,支持后台任务队列Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
521xueweihan/HelloGitHub#4011 ·
-
docs(simulation): Quickstart publishes UDP 14550, which the SITL images' own docs say not to doOuvertestatus:needs-triage
Difficulté 1/5 1-3 heures Accessibilité débutants 78/100
PX4/PX4-Autopilot#29292 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
I/O internal correctness medium priority rt_lib
Difficulté 2/5 1-3 heures Accessibilité débutants 79/100
Les mainteneurs répondent en général sous 1 jour
-
GUI
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
sonic-pi-net/sonic-pi#3594 ·