From 846c14254b646778e1530a2e26b79c74fa83fe26 Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Tue, 2 Jun 2026 14:59:23 -0700 Subject: [PATCH 1/3] fix(spectronaut): Enable Fraction column to be processed --- R/clean_Spectronaut.R | 9 +++++---- inst/tinytest/test_clean_Spectronaut.R | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/R/clean_Spectronaut.R b/R/clean_Spectronaut.R index ebf7cc98..b5fd581e 100644 --- a/R/clean_Spectronaut.R +++ b/R/clean_Spectronaut.R @@ -29,8 +29,8 @@ cols = c(protein_col, peptide_col, "FGCharge", "FFrgIon", f_charge_col, "RFileName", "RCondition", "RReplicate", - "EGQvalue", pg_qval_col, interference_col, exclude_col, - intensity_col) + "RFraction", "EGQvalue", pg_qval_col, interference_col, + exclude_col, intensity_col) if (calculateAnomalyScores){ cols = c(cols, anomalyModelFeatures) } @@ -41,9 +41,10 @@ spec_input, c(protein_col, peptide_col, "FGCharge", "FFrgIon", f_charge_col, "RFileName", intensity_col, - "RCondition", "RReplicate"), + "RCondition", "RReplicate", "RFraction"), c("ProteinName", "PeptideSequence", "PrecursorCharge", "FragmentIon", - "ProductCharge", "Run", "Intensity", "Condition", "BioReplicate"), + "ProductCharge", "Run", "Intensity", "Condition", "BioReplicate", + "Fraction"), skip_absent = TRUE) spec_input = .assignSpectronautIsotopeLabelType( diff --git a/inst/tinytest/test_clean_Spectronaut.R b/inst/tinytest/test_clean_Spectronaut.R index be05e5fd..48497683 100644 --- a/inst/tinytest/test_clean_Spectronaut.R +++ b/inst/tinytest/test_clean_Spectronaut.R @@ -9,6 +9,20 @@ output = MSstatsConvert:::.cleanRawSpectronaut(msstats_input, intensity = 'FG.MS calculateAnomalyScores = FALSE, anomalyModelFeatures = c()) expect_true(all(output$Intensity == 100000)) +# When R.Fraction is absent, no Fraction column is added (prior behavior) +expect_false("Fraction" %in% colnames(output)) + +# R.Fraction is transferred and renamed to Fraction when present +spectronaut_frac = data.table::copy(spectronaut_raw) +spectronaut_frac$R.Fraction = 2L +msstats_frac = MSstatsConvert::MSstatsImport( + list(input = spectronaut_frac), "MSstats", "Spectronaut") +output_frac = MSstatsConvert:::.cleanRawSpectronaut(msstats_frac, intensity = 'FG.MS1Quantity', + calculateAnomalyScores = FALSE, + anomalyModelFeatures = c()) +expect_true("Fraction" %in% colnames(output_frac)) +expect_false("RFraction" %in% colnames(output_frac)) +expect_true(all(output_frac$Fraction == 2L)) expect_error(MSstatsConvert:::.cleanRawSpectronaut(msstats_input, intensity = 'invalid', calculateAnomalyScores = FALSE, From c28893d2aa7eafadd355249ea56a3a28015280be Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Tue, 2 Jun 2026 15:09:37 -0700 Subject: [PATCH 2/3] fix edge case of NA in R.Fraction --- R/clean_Spectronaut.R | 6 +++++- inst/tinytest/test_clean_Spectronaut.R | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/R/clean_Spectronaut.R b/R/clean_Spectronaut.R index b5fd581e..807af7ec 100644 --- a/R/clean_Spectronaut.R +++ b/R/clean_Spectronaut.R @@ -8,7 +8,7 @@ anomalyModelFeatures, peptideSequenceColumn = "EG.ModifiedSequence", heavyLabels = NULL) { - FFrgLossType = FExcludedFromQuantification = NULL + FFrgLossType = FExcludedFromQuantification = Fraction = NULL spec_input = getInputFile(msstats_object, "input") .validateSpectronautInput(spec_input, peptideSequenceColumn) @@ -47,6 +47,10 @@ "Fraction"), skip_absent = TRUE) + if ("Fraction" %in% colnames(spec_input)) { + spec_input[is.na(Fraction), Fraction := 1] + } + spec_input = .assignSpectronautIsotopeLabelType( spec_input, heavyLabels) diff --git a/inst/tinytest/test_clean_Spectronaut.R b/inst/tinytest/test_clean_Spectronaut.R index 48497683..01b881e8 100644 --- a/inst/tinytest/test_clean_Spectronaut.R +++ b/inst/tinytest/test_clean_Spectronaut.R @@ -24,6 +24,18 @@ expect_true("Fraction" %in% colnames(output_frac)) expect_false("RFraction" %in% colnames(output_frac)) expect_true(all(output_frac$Fraction == 2L)) +# NA values in R.Fraction are replaced with 1 +spectronaut_frac_na = data.table::copy(spectronaut_raw) +spectronaut_frac_na$R.Fraction = NA_integer_ +msstats_frac_na = MSstatsConvert::MSstatsImport( + list(input = spectronaut_frac_na), "MSstats", "Spectronaut") +output_frac_na = MSstatsConvert:::.cleanRawSpectronaut(msstats_frac_na, intensity = 'FG.MS1Quantity', + calculateAnomalyScores = FALSE, + anomalyModelFeatures = c()) +expect_true("Fraction" %in% colnames(output_frac_na)) +expect_false(any(is.na(output_frac_na$Fraction))) +expect_true(all(output_frac_na$Fraction == 1)) + expect_error(MSstatsConvert:::.cleanRawSpectronaut(msstats_input, intensity = 'invalid', calculateAnomalyScores = FALSE, anomalyModelFeatures = c()), From bca444c2f3b3ffaf7240550be7ff45792ce6f4a1 Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Tue, 2 Jun 2026 15:16:00 -0700 Subject: [PATCH 3/3] add warning --- R/clean_Spectronaut.R | 10 +++++++++- inst/tinytest/test_clean_Spectronaut.R | 3 --- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/R/clean_Spectronaut.R b/R/clean_Spectronaut.R index 807af7ec..48b4287d 100644 --- a/R/clean_Spectronaut.R +++ b/R/clean_Spectronaut.R @@ -48,7 +48,15 @@ skip_absent = TRUE) if ("Fraction" %in% colnames(spec_input)) { - spec_input[is.na(Fraction), Fraction := 1] + n_missing_fraction = sum(is.na(spec_input$Fraction)) + if (n_missing_fraction > 0) { + msg = paste("**", n_missing_fraction, + "row(s) have missing (NA) values in the Fraction column.", + "These will be assigned to Fraction 1.") + getOption("MSstatsLog")("WARN", msg) + getOption("MSstatsMsg")("WARN", msg) + spec_input[is.na(Fraction), Fraction := 1] + } } spec_input = .assignSpectronautIsotopeLabelType( diff --git a/inst/tinytest/test_clean_Spectronaut.R b/inst/tinytest/test_clean_Spectronaut.R index 01b881e8..a4a581a7 100644 --- a/inst/tinytest/test_clean_Spectronaut.R +++ b/inst/tinytest/test_clean_Spectronaut.R @@ -9,10 +9,8 @@ output = MSstatsConvert:::.cleanRawSpectronaut(msstats_input, intensity = 'FG.MS calculateAnomalyScores = FALSE, anomalyModelFeatures = c()) expect_true(all(output$Intensity == 100000)) -# When R.Fraction is absent, no Fraction column is added (prior behavior) expect_false("Fraction" %in% colnames(output)) -# R.Fraction is transferred and renamed to Fraction when present spectronaut_frac = data.table::copy(spectronaut_raw) spectronaut_frac$R.Fraction = 2L msstats_frac = MSstatsConvert::MSstatsImport( @@ -24,7 +22,6 @@ expect_true("Fraction" %in% colnames(output_frac)) expect_false("RFraction" %in% colnames(output_frac)) expect_true(all(output_frac$Fraction == 2L)) -# NA values in R.Fraction are replaced with 1 spectronaut_frac_na = data.table::copy(spectronaut_raw) spectronaut_frac_na$R.Fraction = NA_integer_ msstats_frac_na = MSstatsConvert::MSstatsImport(