ExperimentalDesign cannot express two multiplexing dimensions (SILAC inside TMT), and the QPX guard for it is untested
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 48/100
Hướng nghiên cứu
Start with ExperimentalDesign.cpp, especially isValid_(), setMSFileSection(), and the fromConsensusMap/fromFeatureMap/fromIdentifications factories. Then read ProteinGroupArrowExport_impl.h, ProteinGroupArrowExport.cpp, QPXCollectionExport.cpp, and their tests; run the relevant exporter tests. Done means the inconsistent derived-design behavior is resolved or explicitly decided, and the guard is covered with a two-header, one-file fixture through both export paths.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Two multiplexing dimensions in one experiment — SILAC nested inside TMT channels — cannot be expressed in an ExperimentalDesign, and the guard that would catch such a design in the QPX exporter is untested. Filing to double-check whether the limitation is intended and whether the guard is reachable.
[!NOTE]
Status 2026-08-08 — re-verified againstdevelop1131d8f618.Question 1 is answered: the limitation stands, and it is not just an OpenMS one. Per @jpfeuffer: the shape was never anticipated when
ExperimentalDesignwas written, no OpenMS tool can handle it (IsobaricWorkflowhas no notion of a 3D feature, and its quantifier knows nothing about labelling-mod → sample), and QPX cannot express it either — itslabelwould have to be split into channel × labelling-mod, or concatenated (H_126N,L_126N, …). Supporting it would mean a design-model change, a QPX-model change and aFeatureFinderMultiplex-style mass-shift check, in that order. Filed as an observation from an SDRF/ExperimentalDesignconsistency sweep, not as a request — not planned.Questions 2 and 3 are still open, and both were re-confirmed today. They are small, local, and independent of the SILAC-in-TMT question that produced them — they are the part of this issue worth acting on.
Line drift: the loader throw is now
ExperimentalDesign.cpp:770(was:712).
The data shape
bigbio/sdrf-annotated-datasets datasets/PXD040455/PXD040455.sdrf.tsv (1178 rows, CI-validated) puts a SILAC pair inside every TMT channel:
('Chip1_K562HeLa_F2.raw', 'TMT127N') -> ['Chip1_F2_TMT127N_heavy', 'Chip1_F2_TMT127N_light']
Measured over the whole file: 551 of 627 (comment[data file], comment[label]) pairs carry more than one source name. So the isobaric channel alone does not identify the sample — it takes (channel, SILAC state).
Where it stops
1. sdrf-pipelines crashes. parse_sdrf convert-openms -s PXD040455.sdrf.tsv -t1 -l (0.1.6):
File ".../sdrf_pipelines/parse_sdrf.py", line 93, in openms_from_sdrf
raise ValueError(msg) from ex
ValueError: Error: list index out of range
No design is produced and the message says nothing about the cause. Reporting separately against sdrf-pipelines; noting it here because it means the shape cannot reach OpenMS through the SDRF route today.
2. The OpenMS loader refuses it. ExperimentalDesign has a single Label column, so both dimensions have to share it. Hand-writing the shape:
Fraction_Group Fraction Spectra_Filepath Label Sample
1 1 Chip1_F2.mzML 1 1
1 1 Chip1_F2.mzML 1 2 <- same channel, SILAC partner
throws at src/openms/source/METADATA/ExperimentalDesign.cpp:770 (inside isValid_, :747–):
(Fraction Group, Fraction, Label) combination can only appear once
So this class of experiment cannot be analysed by ProteomicsLFQ / ProteinQuantifier / IsobaricWorkflow via a design file at all.
The bit I would like double-checked
ProteinGroupArrowExport's QPX 1.1 quantification-unit model assumes (run, label) -> one sample, and refuses otherwise:
the experimental design assigns several samples to one (run file, label) combination
Given the loader refuses the same shape first, that guard looks unreachable from a loaded design — but it is not unreachable in general, because ExperimentalDesign::fromConsensusMap() does not run isValid_(). Two column headers on one file with the same channel_id but different sample_name meta values produce duplicate (path, label) rows with different samples, and nothing rejects them.
Both halves re-confirmed on 1131d8f618:
isValid_()has exactly one caller: the two-argumentExperimentalDesign(msfile_section, sample_section)constructor (ExperimentalDesign.cpp:41-49).setMSFileSection(:608-612) only assigns and callssort_()— it does not validate.fromConsensusMap(:98-191),fromFeatureMapandfromIdentificationsall build throughsetMSFileSection, so none of the three derived-design paths is validated at all. InfromConsensusMapthe duplicate arises in thesample_namebranch (:160-173), which maps each distinctsample_nameto its own index with no uniqueness constraint on(path, label).- The guard itself is
units.inconsistent()— set atProteinGroupArrowExport_impl.h:132(if (!inserted && it->second != entry.sample)), read atProteinGroupArrowExport.cpp:251and mirrored atQPXCollectionExport.cpp:106. Still no test exercises it.ProteinGroupArrowExport_test.cppandQPXCollectionExport_test.cppbetween them pinraggedUnit,missingCell,invalidSample,ambiguousLabel,droppedRunsand the merge-index refusal — but nothing builds two headers on one file that disagree about the sample.
Adjacent and already handled, so do not conflate the two: ExperimentalDesign::annotateColumnHeaders (:51-, added by #9836) does guard the reverse collapse — two headers of one file resolving to the same design row, which is what the Multiplex tools produce when a light/heavy pair has no channel_id and both collapse onto label 1. That is a different failure and it is covered.
Questions:
Is the single-Answered — see the status note at the top. It is a real limitation of the OpenMS design model and of QPX'sLabellimitation intended and permanent?label; supporting SILAC-in-TMT is a multi-repository model change and is not planned.- (open, and wider than first stated) Should the derived-design factories validate what the file loader validates? It is not only
fromConsensusMap—fromFeatureMapandfromIdentificationsskipisValid_()too, because all three go throughsetMSFileSectionand only the constructor validates. Right now a programmatically built design can hold a shape that a design file cannot, and that is the only route by which the exporter guard below can fire. - (open) The exporter guard has no test. Worth pinning precisely because the only route to it is the unvalidated one: a test has to build the ConsensusMap directly, since no design file can produce the shape.
Suggested definition of done for 2 and 3. For 3: a ProteinGroupArrowExport_test section that builds one file with two column headers sharing a channel_id and carrying different sample_name values, and asserts the export refuses with the "several samples to one (run file, label)" message — plus the same through QPXCollectionExport::requireExportable. For 2: decide whether fromConsensusMap should reject or repair; if it rejects, 3's test has to move to a hand-built ExperimentalDesign instead, so do 3 first and let its fixture tell you what 2 would break.
Reproduce
curl -sL https://raw.githubusercontent.com/bigbio/sdrf-annotated-datasets/main/datasets/PXD040455/PXD040455.sdrf.tsv -o PXD040455.sdrf.tsv
python3 - <<'PY'
import csv, collections
rd=list(csv.DictReader(open('PXD040455.sdrf.tsv'), delimiter='\t'))
cell=collections.defaultdict(set)
for r in rd: cell[(r['comment[data file]'], r['comment[label]'])].add(r['source name'])
print(len(cell), 'pairs;', sum(1 for v in cell.values() if len(v)>1), 'with >1 source name')
PY
Found while making the QPX -out_qpx pg view spec-conformant for bigbio/qpx#220 (see #9817).
- Ngôn ngữ chính
- C++
- Star
- 623
- Fork
- 441
- Merge trung bình
- 23 giờ 47 phút
- Pull request đã merge (30 ngày)
- 289
Chuẩn bị môi trường
Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của OpenMS/OpenMS
-
MSstatsFile: Condition written unquoted, so conditions containing commas produce malformed MSstats CSVCó thể đã có người làm @niharikavuchintala đã nhận 4 ngày trước. Đang mởnew contributor
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
OpenMS/OpenMS#10512 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[FEATUREFINDER] Biosaur2Algorithm::centroidProfileSpectra_: dead drift-time guard would drop every FAIMS CVCó thể làm lại được @kavyansh-1 đã nhận 34 ngày trước và không có pull request nào đang mở. Đang mởdefect
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
OpenMS/OpenMS#10005 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
OpenMS/OpenMS#10591 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
ProSE: rescore all runs of a multi-file search with one joint Percolator modelCó thể đã có người làm @satyam102006 đã nhận hôm nay. Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 8/100
OpenMS/OpenMS#10581 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 15/100
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của OpenMS/OpenMS
Issue tương tự
-
agent:Windows bug code-review LOW testing
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 63/100
Maintainer thường phản hồi trong vòng 1 ngày
-
[Cleanup] Include the public header in work_split.cppCó thể đã có người làm @blozano-tt đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
tenstorrent/tt-metal#60850 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Build: the CUDA backend fails without cuDNN instead of skipping the cuDNN shim (as the cuDF shim does)Có thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
beehive-lab/TornadoVM#1248 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
SimVascular/svZeroDSolver#253 ·
-
bug Filter
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
BlueQuartzSoftware/simplnx#1825 ·
Maintainer thường phản hồi trong vòng 3 ngày