From be9468d633bc4c7b1fa9d1f805f2430eca2524ac Mon Sep 17 00:00:00 2001 From: CCranney <11773171+CCranney@users.noreply.github.com> Date: Tue, 12 Sep 2023 07:55:21 -0700 Subject: [PATCH 1/6] implemented minimum differences required option for maxlfq protein quant method --- src/csodiaq/csodiaq.py | 2 +- src/csodiaq/csodiaqParser.py | 12 ++++ .../scoring/quantificationFunctions.py | 16 ++--- .../system_tests/scoring/test_scoring.py | 48 +++++++++---- .../scoring/test_quantificationFunctions.py | 56 ++++++++++++++- tests/unit/test_csodiaqParser.py | 69 +++++++++++++++++++ 6 files changed, 179 insertions(+), 24 deletions(-) diff --git a/src/csodiaq/csodiaq.py b/src/csodiaq/csodiaq.py index 8a466ee..9ab37b7 100644 --- a/src/csodiaq/csodiaq.py +++ b/src/csodiaq/csodiaq.py @@ -109,7 +109,7 @@ def run_scoring(args): if len(proteinDfs) > 0: printer("Begin Quantifying Common Proteins") commonProteinDf = compile_common_protein_quantification_file( - proteinDfs, commonPeptideDf, args["proteinQuantMethod"] + proteinDfs, commonPeptideDf, args["proteinQuantMethod"], args["minNumDifferences"] ) commonProteinDf.to_csv(os.path.join(outputDir, "commonProteins.csv")) printer("Finish Scoring") diff --git a/src/csodiaq/csodiaqParser.py b/src/csodiaq/csodiaqParser.py index 0491beb..7d24fea 100644 --- a/src/csodiaq/csodiaqParser.py +++ b/src/csodiaq/csodiaqParser.py @@ -4,6 +4,7 @@ import numpy as np from abc import ABC, abstractmethod import re +import warnings def set_args_from_command_line_input(): @@ -101,6 +102,13 @@ def add_score_parser(commandParser): default="maxlfq", help="Method by which protein quantification metric is calculated (based on peptide quantities). \nOptional, default is 'maxlfq' method. Choices are 'maxlfq' or 'average'.", ) + scoringParser.add_argument( + "-min", + "--minNumDifferences", + type=_RestrictedInt("minNumDifferences", minValue=1, maxValue=2), + default=2, + help="Specific to the maxLFQ protein quantification method. Requires at minimum the given number of matches before a sample to sample ratio or difference is accepted.\nOptional, default is 2. Only 1 or 2 is accepted. \nThis flag will throw a warning error when paired with a protein quantification method other than 'maxlfq'.", + ) def add_reanalysis_parser(commandParser): @@ -147,6 +155,10 @@ def check_for_conflicting_args(args): raise argparse.ArgumentTypeError( "The correctionDegree parameter is invalidated by the noCorrection flag. Please inspect your input and remove one of them." ) + if args["command"] == "score" and args["proteinQuantMethod"] != "maxlfq" and args["minNumDifferences"] != 2: + warnings.warn( + f"The minNumDifferences flag will only have an effect when paired with the 'maxlfq' proteinQuantMethod flag. You used it with the '{args['proteinQuantMethod']}' method, so this flag will be ignored.", UserWarning + ) if ( args["command"] == "targetedReanalysis" and args["protein"] diff --git a/src/csodiaq/scoring/quantificationFunctions.py b/src/csodiaq/scoring/quantificationFunctions.py index 008308d..2bd8e16 100644 --- a/src/csodiaq/scoring/quantificationFunctions.py +++ b/src/csodiaq/scoring/quantificationFunctions.py @@ -54,7 +54,7 @@ def extract_all_ion_counts_from_df(df, allValuesToCompare, columnName): def compile_common_protein_quantification_file( - proteinDfs, commonPeptidesDf, proteinQuantificationMethod + proteinDfs, commonPeptidesDf, proteinQuantificationMethod, minNumDifferences ): if proteinQuantificationMethod == "average": return compile_ion_count_comparison_across_runs_df( @@ -66,7 +66,7 @@ def compile_common_protein_quantification_file( ) elif proteinQuantificationMethod == "maxlfq": return run_maxlfq_on_all_proteins_found_across_runs( - proteinDfs, commonPeptidesDf + proteinDfs, commonPeptidesDf, minNumDifferences ) @@ -86,7 +86,7 @@ def set_non_present_protein_levels_to_zero( return peptideQuantityDf -def run_maxlfq_on_all_proteins_found_across_runs(proteinDfs, commonPeptidesDf): +def run_maxlfq_on_all_proteins_found_across_runs(proteinDfs, commonPeptidesDf, minNumDifferences): peptideProteinConnections = [] headerToProteinPresenceDict = {} for header, proteinDf in proteinDfs.items(): @@ -112,7 +112,7 @@ def run_maxlfq_on_all_proteins_found_across_runs(proteinDfs, commonPeptidesDf): peptideQuantityDf = set_non_present_protein_levels_to_zero( peptideQuantityDf, protein, headerToProteinPresenceDict ) - proteinQuantitiesDict[protein] = maxlfq(peptideQuantityDf.to_numpy()) + proteinQuantitiesDict[protein] = maxlfq(peptideQuantityDf.to_numpy(), minNumDifferences) commonProteinsDf = pd.DataFrame.from_dict(proteinQuantitiesDict) commonProteinsDf.index = commonPeptidesDf.index return np.exp(commonProteinsDf).replace(1, 0) @@ -162,13 +162,13 @@ def calculate_protein_intensities_across_samples_from_cholesky_factorization(A, return linalg.cho_solve(a, B) -def maxlfq(sampleByPeptideMatrix, tolerance=-10.0): +def maxlfq(sampleByPeptideMatrix, minNumDifferences, tolerance=-10.0): sampleByPeptideMatrix[sampleByPeptideMatrix < tolerance] = 0 - A, B = prepare_matrices_for_cholesky_factorization(sampleByPeptideMatrix) - oneOrFewerMatchIdx = np.diagonal(A) == 0 + A, B = prepare_matrices_for_cholesky_factorization(sampleByPeptideMatrix, minNumDifferences) + unmatchedIdx = np.diagonal(A) == 0 A, B = apply_regularization_to_matrices(sampleByPeptideMatrix, A, B) proteinScoreAcrossSamples = ( calculate_protein_intensities_across_samples_from_cholesky_factorization(A, B) ) - proteinScoreAcrossSamples[oneOrFewerMatchIdx] = 0 + proteinScoreAcrossSamples[unmatchedIdx] = 0 return proteinScoreAcrossSamples diff --git a/tests/system/system_tests/scoring/test_scoring.py b/tests/system/system_tests/scoring/test_scoring.py index 3aa3806..98fa9a6 100644 --- a/tests/system/system_tests/scoring/test_scoring.py +++ b/tests/system/system_tests/scoring/test_scoring.py @@ -410,11 +410,10 @@ def test__scoring__evaluate_common_proteins_maxlfq_method_works_correctly( expectedCommonProteinDf=expectedCommonProteinDf, ) - -def test__scoring__evaluate_common_proteins_one_peptide_match_excludes_protein_in_maxlfq( - inputFileDirectory, expectedOutputDirectory +def evaluate_common_proteins_one_peptide_match_in_maxlfq( + inputFileDirectory, expectedOutputDirectory, expectedCommonProteinDf, minNumDifferences ): - inputHeader = f"one_match_common_proteins" + inputHeader = f"one_match_common_proteins_{minNumDifferences}minNumDifferences" inputFileDirectoryChild = os.path.join(inputFileDirectory, inputHeader) os.mkdir(inputFileDirectoryChild) @@ -443,6 +442,8 @@ def test__scoring__evaluate_common_proteins_one_peptide_match_excludes_protein_i "score", "-i", inputFileDirectoryChild, + "-min", + str(minNumDifferences), ] subprocess.run(args, capture_output=True) assert_common_peptide_outputs_are_correct( @@ -457,6 +458,23 @@ def test__scoring__evaluate_common_proteins_one_peptide_match_excludes_protein_i outputDirPath = os.path.join(inputFileDirectoryChild, "fdrScores-macc-maxlfq") outputDirContents = os.listdir(outputDirPath) assert "commonProteins.csv" in outputDirContents + expectedCommonProteinDf = expectedCommonProteinDf.set_index( + pd.Index( + [ + f"CsoDIAq-file_{sample1Header}_fullOutput", + f"CsoDIAq-file_{sample2Header}_fullOutput", + f"CsoDIAq-file_{sample3Header}_fullOutput", + ] + ) + ) + commonProteinDf = pd.read_csv( + os.path.join(outputDirPath, "commonProteins.csv"), index_col=0 + ).sort_index() + assert_pandas_dataframes_are_equal(expectedCommonProteinDf, commonProteinDf) + +def test__scoring__evaluate_common_proteins_one_peptide_match__excludes_protein_in_maxlfq_when_minNumDifferences_2( + inputFileDirectory, expectedOutputDirectory +): expectedCommonProteinDf = pd.DataFrame( [ [100.0, 0.0], @@ -464,17 +482,21 @@ def test__scoring__evaluate_common_proteins_one_peptide_match_excludes_protein_i [0.0, 0.0], ], columns=["protein", "proteinX"], - index=[ - f"CsoDIAq-file_{sample1Header}_fullOutput", - f"CsoDIAq-file_{sample2Header}_fullOutput", - f"CsoDIAq-file_{sample3Header}_fullOutput", - ], ) - commonProteinDf = pd.read_csv( - os.path.join(outputDirPath, "commonProteins.csv"), index_col=0 - ).sort_index() - assert_pandas_dataframes_are_equal(expectedCommonProteinDf, commonProteinDf) + evaluate_common_proteins_one_peptide_match_in_maxlfq(inputFileDirectory, expectedOutputDirectory, expectedCommonProteinDf, minNumDifferences=2) +def test__scoring__evaluate_common_proteins_one_peptide_match__includes_protein_in_maxlfq_when_minNumDifferences_1( + inputFileDirectory, expectedOutputDirectory +): + expectedCommonProteinDf = pd.DataFrame( + [ + [100.0, 100.0], + [100.0, 100.0], + [100.0, 100.0], + ], + columns=["protein", "proteinX"], + ) + evaluate_common_proteins_one_peptide_match_in_maxlfq(inputFileDirectory, expectedOutputDirectory, expectedCommonProteinDf, minNumDifferences=1) def evaluate_overlap_protein_quant_comparison( inputFileDirectory, expectedOutputDirectory, method, expectedCommonProteinDf diff --git a/tests/unit/scoring/test_quantificationFunctions.py b/tests/unit/scoring/test_quantificationFunctions.py index d617c17..8f8e539 100644 --- a/tests/unit/scoring/test_quantificationFunctions.py +++ b/tests/unit/scoring/test_quantificationFunctions.py @@ -118,6 +118,7 @@ def test__quantification_functions__compile_common_protein_quantification_file__ }, commonPeptidesDf=None, proteinQuantificationMethod="average", + minNumDifferences=None, ) assert expectedOutputDf.equals(outputDf) @@ -155,7 +156,7 @@ def test__set_non_present_protein_levels_to_zero(): assert expectedOutputDf.equals(outputDf) -def test__maxlfq__from_paper(): +def test__maxlfq__from_paper__default_2_peptide_connections_required_per_sample(): """ Tests the maxLFQ algorithm for protein quantification as summarized in in figure 2 of their paper. @@ -200,6 +201,11 @@ def test__maxlfq__from_paper(): F 6:1 5:1 4:1 3:1 2:1 - Applying the maxLFQ function to this input, you'd expect quantities that reflect these ratios. + + NOTE: By default this algorithm only uses differences/ratios calculated between samples that have + at least 2 peptide matches and excludes all others. In the case of sample F, which has no such + differences/ratios, the protein is quantified as 0. See later test for adjusting this setting + to requiring at least 1 peptide match, which would then include a quantity for sample F. """ numPeptides = 7 numSamples = 6 @@ -241,5 +247,51 @@ def test__maxlfq__from_paper(): [7.83589964, 7.65357809, 7.43065038, 7.14296831, 6.73758953, 0] ) - output = maxlfq(normalizedInputDf.to_numpy()) + output = maxlfq(normalizedInputDf.to_numpy(), minNumDifferences=2) np.testing.assert_array_almost_equal(expectedOutput, output) + +def test__maxlfq__from_paper__only_1_peptide_connection_required_per_sample(): + """ + Evaluating the above example, but only requiring 1 peptide connection between samples. + """ + numPeptides = 7 + numSamples = 6 + peptideIntensityIncrease = [10**i for i in range(-3, 4)] + sampleIntensityIncrease = list(range(numSamples, 0, -1)) + inputDf = pd.DataFrame( + np.multiply.outer(sampleIntensityIncrease, peptideIntensityIncrease), + columns=[f"P{i}" for i in range(1, numPeptides + 1)], + index=["A", "B", "C", "D", "E", "F"], + ) + cellsToDelete = [ + (0, 0), + (0, 2), + (0, 3), + (0, 4), + (0, 6), + (1, 0), + (1, 3), + (1, 4), + (1, 6), + (2, 4), + (3, 2), + (3, 4), + (4, 0), + (4, 2), + (4, 4), + (4, 5), + (5, 0), + (5, 2), + (5, 3), + (5, 5), + (5, 6), + ] + for cell in cellsToDelete: + inputDf.iloc[cell[0], cell[1]] = 0 + + normalizedInputDf = np.log(inputDf) + expectedOutput = np.array( + [7.164394, 6.982073, 6.759121, 6.471439, 6.065974, 5.372443] + ) + output = maxlfq(normalizedInputDf.to_numpy(), minNumDifferences=1) + np.testing.assert_array_almost_equal(expectedOutput, output) \ No newline at end of file diff --git a/tests/unit/test_csodiaqParser.py b/tests/unit/test_csodiaqParser.py index 80065f2..6e45027 100644 --- a/tests/unit/test_csodiaqParser.py +++ b/tests/unit/test_csodiaqParser.py @@ -2,6 +2,7 @@ import argparse import re import os +import warnings from csodiaq import set_args_from_command_line_input, check_for_conflicting_args from csodiaq.csodiaqParser import ( _OutputDirectory, @@ -670,6 +671,7 @@ def test__csodiaq_parser__set_args_from_command_line_input__initialize_scoring( assert len(parsedScoreArgs["input"]["idFiles"]) == 2 assert parsedScoreArgs["score"] == "macc" assert parsedScoreArgs["proteinQuantMethod"] == "maxlfq" + assert parsedScoreArgs["minNumDifferences"] == 2 def test__csodiaq_parser__set_args_from_command_line_input__score_succeeds_with_macc_input( @@ -717,6 +719,73 @@ def test__csodiaq_parser__set_args_from_command_line_input__score_suceeds_with_m args = vars(parser.parse_args(scoreArgs)) assert args["proteinQuantMethod"] == "average" +def test__csodiaq_parser__set_args_from_command_line_input__score_suceeds_with_min_num_differences_equal_to_1( + parser, scoreArgs +): + scoreArgs += ["-min", "1"] + args = vars(parser.parse_args(scoreArgs)) + assert args["minNumDifferences"] == 1 + +def test__csodiaq_parser__set_args_from_command_line_input__score_suceeds_with_min_num_differences_equal_to_2( + parser, scoreArgs +): + scoreArgs += ["-min", "2"] + args = vars(parser.parse_args(scoreArgs)) + assert args["minNumDifferences"] == 2 + +def test__csodiaq_parser__set_args_from_command_line_input__score_fails_with_float_min_num_differences( + parser, scoreArgs +): + scoreArgs += ["-min", "1.2"] + errorOutput = ( + "The minNumDifferences argument must be an integer." + ) + with pytest.raises(argparse.ArgumentTypeError, match=re.escape(errorOutput)): + args = vars(parser.parse_args(scoreArgs)) + +def test__csodiaq_parser__set_args_from_command_line_input__score_fails_when_min_num_differences_less_than_1( + parser, scoreArgs +): + scoreArgs += ["-min", "0"] + errorOutput = ( + "The minNumDifferences argument must be an integer greater than or equal to 1." + ) + with pytest.raises(argparse.ArgumentTypeError, match=re.escape(errorOutput)): + args = vars(parser.parse_args(scoreArgs)) + +def test__csodiaq_parser__set_args_from_command_line_input__score_fails_when_min_num_differences_greater_than_2( + parser, scoreArgs +): + scoreArgs += ["-min", "3"] + errorOutput = ( + "The minNumDifferences argument must be an integer less than or equal to 2." + ) + with pytest.raises(argparse.ArgumentTypeError, match=re.escape(errorOutput)): + args = vars(parser.parse_args(scoreArgs)) + +def test__csodiaq_parser__set_args_from_command_line_input__score_fails_when_min_num_differences_greater_than_2( + parser, scoreArgs +): + scoreArgs += ["-min", "3"] + errorOutput = ( + "The minNumDifferences argument must be an integer less than or equal to 2." + ) + with pytest.raises(argparse.ArgumentTypeError, match=re.escape(errorOutput)): + args = vars(parser.parse_args(scoreArgs)) + +@pytest.mark.skip( + "This test would require a huge setup for a minor warning message (in test_csodiaq.py). Skipping" +) +def test__csodiaq_parser__check_for_conflicting_args__score_throws_error_when_non_maxlfq_method_used_with_min_num_difference_flag( + parser, scoreArgs +): + scoreArgs += ["-p", "average"] + scoreArgs += ["-min", "1"] + errorOutput = ( + "The minNumDifferences flag will only have an effect when paired with the 'maxlfq' proteinQuantMethod flag. You used it with the 'average' method, so this flag will be ignored." + ) + with pytest.raises(argparse.ArgumentTypeError, match=re.escape(errorOutput)): + args = vars(parser.parse_args(scoreArgs)) @pytest.fixture def reanalysisFiles(): From a14300de0f98eaafca4aa5b7cae7e6f851b9d030 Mon Sep 17 00:00:00 2001 From: CCranney <11773171+CCranney@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:18:59 -0700 Subject: [PATCH 2/6] implemented test for maxlfq evaluating unconnected peptide clusters --- tests/system/system_tests/scoring/__init__.py | 4 + .../ClusteredCommonProteinScoresBreakdown.py | 60 +++++++++++++++ .../system_tests/scoring/test_scoring.py | 76 +++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 tests/system/system_tests/scoring/testFileContentCreators/ClusteredCommonProteinScoresBreakdown.py diff --git a/tests/system/system_tests/scoring/__init__.py b/tests/system/system_tests/scoring/__init__.py index 389bbc5..4b5f43f 100644 --- a/tests/system/system_tests/scoring/__init__.py +++ b/tests/system/system_tests/scoring/__init__.py @@ -19,3 +19,7 @@ OverlapSample1And2Breakdown, OvelapSample3Breakdown, ) +from .testFileContentCreators.ClusteredCommonProteinScoresBreakdown import ( + ClusterSample1And2Breakdown, + ClusterSample3And4Breakdown, +) diff --git a/tests/system/system_tests/scoring/testFileContentCreators/ClusteredCommonProteinScoresBreakdown.py b/tests/system/system_tests/scoring/testFileContentCreators/ClusteredCommonProteinScoresBreakdown.py new file mode 100644 index 0000000..a201d77 --- /dev/null +++ b/tests/system/system_tests/scoring/testFileContentCreators/ClusteredCommonProteinScoresBreakdown.py @@ -0,0 +1,60 @@ +import pandas as pd +from .BaselineCommonProteinScoresBreakdown import BaselineCommonProteinScoresBreakdown + +""" +NOTE: this is specific to the maxlfq method. This method tests the viability + of having two unconnected clusters of peptides that correspond to the + same protein. + +protein quantification profile: + peptide1 peptide2 peptide3 peptide4 +sample1 100.0 100.0 - - +sample2 100.0 100.0 - - +sample3 - - 200.0 200.0 +sample3 - - 200.0 200.0 + +protein quantification: + protein +sample1 100.0 +sample2 100.0 +sample3 200.0 +sample4 200.0 +""" + + +class ClusterSample1And2Breakdown(BaselineCommonProteinScoresBreakdown): + def _create_input_for_quantifiable_proteins(self): + df = pd.DataFrame( + [ + ["peptide1", "1/protein", 1, 0, 0, 100.0], + ["peptide2", "1/protein", 1, 0, 0, 100.0], + ["peptide3", "1/protein", 1, 0, 0, 0.0], + ["peptide4", "1/protein", 1, 0, 0, 0.0], + ], + columns=["peptide", "protein", "zLIB", "isDecoy", "rank", "ionCount"], + ) + return pd.concat([df, self._create_generic_peptide_line()]) + + def _make_expected_protein_output(self, peptideDf): + proteinDf = super()._make_expected_protein_output(peptideDf) + proteinDf["uniquePeptide"] = [0, 0, 0, 0, 1] + return proteinDf + + +class ClusterSample3And4Breakdown(BaselineCommonProteinScoresBreakdown): + def _create_input_for_quantifiable_proteins(self): + df = pd.DataFrame( + [ + ["peptide1", "1/protein", 1, 0, 0, 0.0], + ["peptide2", "1/protein", 1, 0, 0, 0.0], + ["peptide3", "1/protein", 1, 0, 0, 200.0], + ["peptide4", "1/protein", 1, 0, 0, 200.0], + ], + columns=["peptide", "protein", "zLIB", "isDecoy", "rank", "ionCount"], + ) + return pd.concat([df, self._create_generic_peptide_line()]) + + def _make_expected_protein_output(self, peptideDf): + proteinDf = super()._make_expected_protein_output(peptideDf) + proteinDf["uniquePeptide"] = [0, 0, 0, 0, 1] + return proteinDf diff --git a/tests/system/system_tests/scoring/test_scoring.py b/tests/system/system_tests/scoring/test_scoring.py index 98fa9a6..5649ec6 100644 --- a/tests/system/system_tests/scoring/test_scoring.py +++ b/tests/system/system_tests/scoring/test_scoring.py @@ -16,6 +16,8 @@ OneMatchSample3Breakdown, OverlapSample1And2Breakdown, OvelapSample3Breakdown, + ClusterSample1And2Breakdown, + ClusterSample3And4Breakdown, ) @@ -598,3 +600,77 @@ def test__scoring__evaluate_common_proteins_work_correctly_with_overlapping_prot method="maxlfq", expectedCommonProteinDf=expectedCommonProteinDf, ) + +def test__scoring__evaluate_protein_quantities_are_calculated_even_with_multiple_peptide_clusters( + inputFileDirectory, expectedOutputDirectory +): + inputHeader = f"maxlfq_multiple_peptide_clusters_" + + inputFileDirectoryChild = os.path.join(inputFileDirectory, inputHeader) + os.mkdir(inputFileDirectoryChild) + + sample1Header = "maxlfq_multiple_peptide_clusters_sample_1" + sample1Breakdown = ClusterSample1And2Breakdown(expectedOutputDirectory) + inputFilePath = os.path.join( + inputFileDirectoryChild, f"CsoDIAq-file_{sample1Header}_fullOutput.csv" + ) + sample1Breakdown.inputDf.to_csv(inputFilePath, index=False) + sample2Header = "maxlfq_multiple_peptide_clusters_sample_2" + sample2Breakdown = ClusterSample1And2Breakdown(expectedOutputDirectory) + inputFilePath = os.path.join( + inputFileDirectoryChild, f"CsoDIAq-file_{sample2Header}_fullOutput.csv" + ) + sample2Breakdown.inputDf.to_csv(inputFilePath, index=False) + sample3Header = "maxlfq_multiple_peptide_clusters_sample_3" + sample3Breakdown = ClusterSample3And4Breakdown(expectedOutputDirectory) + inputFilePath = os.path.join( + inputFileDirectoryChild, f"CsoDIAq-file_{sample3Header}_fullOutput.csv" + ) + sample3Breakdown.inputDf.to_csv(inputFilePath, index=False) + sample4Header = "maxlfq_multiple_peptide_clusters_sample_4" + sample4Breakdown = ClusterSample3And4Breakdown(expectedOutputDirectory) + inputFilePath = os.path.join( + inputFileDirectoryChild, f"CsoDIAq-file_{sample4Header}_fullOutput.csv" + ) + sample4Breakdown.inputDf.to_csv(inputFilePath, index=False) + + args = [ + "csodiaq", + "score", + "-i", + inputFileDirectoryChild, + ] + subprocess.run(args, capture_output=True) + assert_common_peptide_outputs_are_correct( + inputFileDirectoryChild, + { + sample1Header: sample1Breakdown, + sample2Header: sample2Breakdown, + sample3Header: sample3Breakdown, + sample4Header: sample4Breakdown, + }, + method='maxlfq', + ) + + outputDirPath = os.path.join(inputFileDirectoryChild, f"fdrScores-macc-maxlfq") + outputDirContents = os.listdir(outputDirPath) + assert "commonProteins.csv" in outputDirContents + expectedCommonProteinDf = pd.DataFrame( + [ + [100.0, 0.0], + [100.0, 0.0], + [200.0, 0.0], + [200.0, 0.0], + ], + columns=["protein", "proteinX"], + index=[ + f"CsoDIAq-file_{sample1Header}_fullOutput", + f"CsoDIAq-file_{sample2Header}_fullOutput", + f"CsoDIAq-file_{sample3Header}_fullOutput", + f"CsoDIAq-file_{sample4Header}_fullOutput", + ] + ) + commonProteinDf = pd.read_csv( + os.path.join(outputDirPath, "commonProteins.csv"), index_col=0 + ).sort_index() + assert_pandas_dataframes_are_equal(expectedCommonProteinDf, commonProteinDf) \ No newline at end of file From 2d61a6c633fc723cf7fb3b9ab6e05cedf313b920 Mon Sep 17 00:00:00 2001 From: CCranney <11773171+CCranney@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:56:11 -0700 Subject: [PATCH 3/6] removed protein group separation from maxlfq protein quantification method --- .../scoring/quantificationFunctions.py | 13 +- tests/system/system_tests/scoring/__init__.py | 4 - .../OverlapCommonProteinScoresBreakdown.py | 73 ----------- .../system_tests/scoring/test_scoring.py | 113 +----------------- 4 files changed, 8 insertions(+), 195 deletions(-) delete mode 100644 tests/system/system_tests/scoring/testFileContentCreators/OverlapCommonProteinScoresBreakdown.py diff --git a/src/csodiaq/scoring/quantificationFunctions.py b/src/csodiaq/scoring/quantificationFunctions.py index 2bd8e16..28bda5a 100644 --- a/src/csodiaq/scoring/quantificationFunctions.py +++ b/src/csodiaq/scoring/quantificationFunctions.py @@ -87,21 +87,14 @@ def set_non_present_protein_levels_to_zero( def run_maxlfq_on_all_proteins_found_across_runs(proteinDfs, commonPeptidesDf, minNumDifferences): - peptideProteinConnections = [] headerToProteinPresenceDict = {} for header, proteinDf in proteinDfs.items(): - peptideProteinConnectionsForSample = ( - initialize__format_peptide_protein_connections( - proteinDf, proteinColumn="leadingProtein" - ) - ) - peptideProteinConnections.append(peptideProteinConnectionsForSample) headerToProteinPresenceDict[header] = set( - peptideProteinConnectionsForSample["protein"] + proteinDf["leadingProtein"] ) proteinPeptideDict = ( - pd.concat(peptideProteinConnections) - .groupby("protein")["peptide"] + pd.concat(list(proteinDfs.values())) + .groupby("leadingProtein")["peptide"] .apply(set) .to_dict() ) diff --git a/tests/system/system_tests/scoring/__init__.py b/tests/system/system_tests/scoring/__init__.py index 4b5f43f..445659a 100644 --- a/tests/system/system_tests/scoring/__init__.py +++ b/tests/system/system_tests/scoring/__init__.py @@ -15,10 +15,6 @@ OneMatchSample1And2Breakdown, OneMatchSample3Breakdown, ) -from .testFileContentCreators.OverlapCommonProteinScoresBreakdown import ( - OverlapSample1And2Breakdown, - OvelapSample3Breakdown, -) from .testFileContentCreators.ClusteredCommonProteinScoresBreakdown import ( ClusterSample1And2Breakdown, ClusterSample3And4Breakdown, diff --git a/tests/system/system_tests/scoring/testFileContentCreators/OverlapCommonProteinScoresBreakdown.py b/tests/system/system_tests/scoring/testFileContentCreators/OverlapCommonProteinScoresBreakdown.py deleted file mode 100644 index 2ac1a05..0000000 --- a/tests/system/system_tests/scoring/testFileContentCreators/OverlapCommonProteinScoresBreakdown.py +++ /dev/null @@ -1,73 +0,0 @@ -import pandas as pd -from .BaselineCommonProteinScoresBreakdown import BaselineCommonProteinScoresBreakdown - -""" -NOTE: this is specific to the maxlfq method. Samples with 1 or 0 peptides - shared with other samples are considered 0. - -protein quantification profile for protein 1: - peptide1 peptide2 peptide3 -sample1 X X X -sample2 X X X -sample3 - X X - -protein quantification profile for protein 2: - peptide2 peptide3 peptide4 -sample1 X X - -sample2 X X - -sample3 X X X - -protein 1 quantification: - protein -sample1 X -sample2 X -sample3 0 - -protein 2 quantification for average method: - protein -sample1 0 -sample2 0 -sample3 X - -protein 2 quantification for maxlfq method: - protein -sample1 0 -sample2 0 -sample3 0 -""" - - -class OverlapSample1And2Breakdown(BaselineCommonProteinScoresBreakdown): - def _create_input_for_quantifiable_proteins(self): - df = pd.DataFrame( - [ - ["peptide1", "1/protein1", 1, 0, 0, 100.0], - ["peptide2", "2/protein1/protein2", 1, 0, 0, 100.0], - ["peptide3", "2/protein1/protein2", 1, 0, 0, 100.0], - ], - columns=["peptide", "protein", "zLIB", "isDecoy", "rank", "ionCount"], - ) - return pd.concat([df, self._create_generic_peptide_line()]) - - def _make_expected_protein_output(self, peptideDf): - proteinDf = super()._make_expected_protein_output(peptideDf) - proteinDf["uniquePeptide"] = [1, 0, 0, 1] - return proteinDf - - -class OvelapSample3Breakdown(BaselineCommonProteinScoresBreakdown): - def _create_input_for_quantifiable_proteins(self): - df = pd.DataFrame( - [ - ["peptide2", "2/protein1/protein2", 1, 0, 0, 100.0], - ["peptide3", "2/protein1/protein2", 1, 0, 0, 100.0], - ["peptide4", "1/protein2", 1, 0, 0, 100.0], - ], - columns=["peptide", "protein", "zLIB", "isDecoy", "rank", "ionCount"], - ) - return pd.concat([df, self._create_generic_peptide_line()]) - - def _make_expected_protein_output(self, peptideDf): - proteinDf = super()._make_expected_protein_output(peptideDf) - proteinDf["uniquePeptide"] = [0, 0, 1, 1] - return proteinDf diff --git a/tests/system/system_tests/scoring/test_scoring.py b/tests/system/system_tests/scoring/test_scoring.py index 5649ec6..3eb7e92 100644 --- a/tests/system/system_tests/scoring/test_scoring.py +++ b/tests/system/system_tests/scoring/test_scoring.py @@ -14,8 +14,6 @@ MethodSample3Breakdown, OneMatchSample1And2Breakdown, OneMatchSample3Breakdown, - OverlapSample1And2Breakdown, - OvelapSample3Breakdown, ClusterSample1And2Breakdown, ClusterSample3And4Breakdown, ) @@ -301,7 +299,7 @@ def test__scoring__evaluate_common_proteins_has_zero_quantity_in_missing_sample_ [100.0, 0.0], [0.0, 0.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], ) evaluate_standard_protein_quant_comparison( inputFileDirectory, @@ -403,7 +401,7 @@ def test__scoring__evaluate_common_proteins_maxlfq_method_works_correctly( [391.487326, 0.0], [391.493149, 0.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], ) evaluate_method_protein_quant_comparison( inputFileDirectory, @@ -483,7 +481,7 @@ def test__scoring__evaluate_common_proteins_one_peptide_match__excludes_protein_ [100.0, 0.0], [0.0, 0.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], ) evaluate_common_proteins_one_peptide_match_in_maxlfq(inputFileDirectory, expectedOutputDirectory, expectedCommonProteinDf, minNumDifferences=2) @@ -496,111 +494,10 @@ def test__scoring__evaluate_common_proteins_one_peptide_match__includes_protein_ [100.0, 100.0], [100.0, 100.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], ) evaluate_common_proteins_one_peptide_match_in_maxlfq(inputFileDirectory, expectedOutputDirectory, expectedCommonProteinDf, minNumDifferences=1) -def evaluate_overlap_protein_quant_comparison( - inputFileDirectory, expectedOutputDirectory, method, expectedCommonProteinDf -): - inputHeader = f"overlap_common_proteins_{method}_method" - - inputFileDirectoryChild = os.path.join(inputFileDirectory, inputHeader) - os.mkdir(inputFileDirectoryChild) - - sample1Header = "overlap_common_protein_eval_sample_1" - sample1Breakdown = OverlapSample1And2Breakdown(expectedOutputDirectory) - inputFilePath = os.path.join( - inputFileDirectoryChild, f"CsoDIAq-file_{sample1Header}_fullOutput.csv" - ) - sample1Breakdown.inputDf.to_csv(inputFilePath, index=False) - sample2Header = "overlap_common_protein_eval_sample_2" - sample2Breakdown = OverlapSample1And2Breakdown(expectedOutputDirectory) - inputFilePath = os.path.join( - inputFileDirectoryChild, f"CsoDIAq-file_{sample2Header}_fullOutput.csv" - ) - sample2Breakdown.inputDf.to_csv(inputFilePath, index=False) - sample3Header = "overlap_common_protein_eval_sample_3" - sample3Breakdown = OvelapSample3Breakdown(expectedOutputDirectory) - inputFilePath = os.path.join( - inputFileDirectoryChild, f"CsoDIAq-file_{sample3Header}_fullOutput.csv" - ) - sample3Breakdown.inputDf.to_csv(inputFilePath, index=False) - - args = [ - "csodiaq", - "score", - "-i", - inputFileDirectoryChild, - "-p", - method, - ] - subprocess.run(args, capture_output=True) - assert_common_peptide_outputs_are_correct( - inputFileDirectoryChild, - { - sample1Header: sample1Breakdown, - sample2Header: sample2Breakdown, - sample3Header: sample3Breakdown, - }, - method=method, - ) - - outputDirPath = os.path.join(inputFileDirectoryChild, f"fdrScores-macc-{method}") - outputDirContents = os.listdir(outputDirPath) - assert "commonProteins.csv" in outputDirContents - expectedCommonProteinDf = expectedCommonProteinDf.set_index( - pd.Index( - [ - f"CsoDIAq-file_{sample1Header}_fullOutput", - f"CsoDIAq-file_{sample2Header}_fullOutput", - f"CsoDIAq-file_{sample3Header}_fullOutput", - ] - ) - ) - commonProteinDf = pd.read_csv( - os.path.join(outputDirPath, "commonProteins.csv"), index_col=0 - ).sort_index() - assert_pandas_dataframes_are_equal(expectedCommonProteinDf, commonProteinDf) - - -def test__scoring__evaluate_common_proteins_work_correctly_with_overlapping_proteins__average_method( - inputFileDirectory, expectedOutputDirectory -): - expectedCommonProteinDf = pd.DataFrame( - [ - [100.0, 0.0, 100.0], - [100.0, 0.0, 100.0], - [0.0, 100.0, 100.0], - ], - columns=["protein1", "protein2", "proteinX"], - ) - evaluate_overlap_protein_quant_comparison( - inputFileDirectory, - expectedOutputDirectory, - method="average", - expectedCommonProteinDf=expectedCommonProteinDf, - ) - - -def test__scoring__evaluate_common_proteins_work_correctly_with_overlapping_proteins__maxlfq_method( - inputFileDirectory, expectedOutputDirectory -): - expectedCommonProteinDf = pd.DataFrame( - [ - [100.0, 0.0, 0.0], - [100.0, 0.0, 0.0], - [0.0, 0.0, 0.0], - ], - columns=["protein1", "protein2", "proteinX"], - ) - evaluate_overlap_protein_quant_comparison( - inputFileDirectory, - expectedOutputDirectory, - method="maxlfq", - expectedCommonProteinDf=expectedCommonProteinDf, - ) - def test__scoring__evaluate_protein_quantities_are_calculated_even_with_multiple_peptide_clusters( inputFileDirectory, expectedOutputDirectory ): @@ -662,7 +559,7 @@ def test__scoring__evaluate_protein_quantities_are_calculated_even_with_multiple [200.0, 0.0], [200.0, 0.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], index=[ f"CsoDIAq-file_{sample1Header}_fullOutput", f"CsoDIAq-file_{sample2Header}_fullOutput", From 4bfcf206e36b7077f4a40eeb670cb6c1e4887af6 Mon Sep 17 00:00:00 2001 From: CCranney <11773171+CCranney@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:20:26 -0700 Subject: [PATCH 4/6] replaced averaging protein quant method with sum (based on v1 code) --- src/csodiaq/csodiaqParser.py | 2 +- .../scoring/quantificationFunctions.py | 64 ++++++------- ...dComparisonCommonProteinScoresBreakdown.py | 6 +- .../StandardCommonProteinScoresBreakdown.py | 9 +- .../system_tests/scoring/test_scoring.py | 18 ++-- .../scoring/test_quantificationFunctions.py | 93 ++++++++++++++++--- tests/unit/test_csodiaqParser.py | 14 ++- 7 files changed, 144 insertions(+), 62 deletions(-) diff --git a/src/csodiaq/csodiaqParser.py b/src/csodiaq/csodiaqParser.py index 7d24fea..537ff21 100644 --- a/src/csodiaq/csodiaqParser.py +++ b/src/csodiaq/csodiaqParser.py @@ -98,7 +98,7 @@ def add_score_parser(commandParser): scoringParser.add_argument( "-p", "--proteinQuantMethod", - choices=["maxlfq", "average"], + choices=["maxlfq", "sum"], default="maxlfq", help="Method by which protein quantification metric is calculated (based on peptide quantities). \nOptional, default is 'maxlfq' method. Choices are 'maxlfq' or 'average'.", ) diff --git a/src/csodiaq/scoring/quantificationFunctions.py b/src/csodiaq/scoring/quantificationFunctions.py index 28bda5a..1c1e8f3 100644 --- a/src/csodiaq/scoring/quantificationFunctions.py +++ b/src/csodiaq/scoring/quantificationFunctions.py @@ -56,19 +56,31 @@ def extract_all_ion_counts_from_df(df, allValuesToCompare, columnName): def compile_common_protein_quantification_file( proteinDfs, commonPeptidesDf, proteinQuantificationMethod, minNumDifferences ): - if proteinQuantificationMethod == "average": - return compile_ion_count_comparison_across_runs_df( - { - key: calculate_ion_count_for_each_protein_in_protein_fdr_df(value) - for key, value in proteinDfs.items() - }, - "protein", - ) - elif proteinQuantificationMethod == "maxlfq": - return run_maxlfq_on_all_proteins_found_across_runs( - proteinDfs, commonPeptidesDf, minNumDifferences + headerToProteinPresenceDict = {header: set(proteinDf["leadingProtein"]) for header, proteinDf in proteinDfs.items()} + proteinPeptideDict = ( + pd.concat(list(proteinDfs.values())) + .groupby("leadingProtein")["peptide"] + .apply(set) + .to_dict() + ) + proteinQuantitiesDict = {} + for protein, peptideSet in proteinPeptideDict.items(): + peptideQuantityDf = commonPeptidesDf[list(peptideSet)] + peptideQuantityDf = set_non_present_protein_levels_to_zero( + peptideQuantityDf, protein, headerToProteinPresenceDict ) + if proteinQuantificationMethod == "sum": + proteinSampleQuantities = ion_count_sum(peptideQuantityDf) + elif proteinQuantificationMethod == "maxlfq": + proteinSampleQuantities = run_maxlfq_with_normalizations(peptideQuantityDf, minNumDifferences) + proteinQuantitiesDict[protein] = proteinSampleQuantities + commonProteinsDf = pd.DataFrame.from_dict(proteinQuantitiesDict) + commonProteinsDf.index = commonPeptidesDf.index + return commonProteinsDf +def ion_count_sum(sampleByPeptideMatrix): + sampleByPeptideMatrix = sampleByPeptideMatrix.loc[:, (sampleByPeptideMatrix != 0).all(axis=0)] + return np.array(sampleByPeptideMatrix.sum(axis=1)) def set_non_present_protein_levels_to_zero( peptideQuantityDf, protein, headerToProteinPresenceDict @@ -82,33 +94,15 @@ def set_non_present_protein_levels_to_zero( ) peptideQuantityDf.loc[ peptideQuantityDf.index.isin(indicesWithoutProtein), : - ] = -np.inf + ] = 0 return peptideQuantityDf -def run_maxlfq_on_all_proteins_found_across_runs(proteinDfs, commonPeptidesDf, minNumDifferences): - headerToProteinPresenceDict = {} - for header, proteinDf in proteinDfs.items(): - headerToProteinPresenceDict[header] = set( - proteinDf["leadingProtein"] - ) - proteinPeptideDict = ( - pd.concat(list(proteinDfs.values())) - .groupby("leadingProtein")["peptide"] - .apply(set) - .to_dict() - ) - normalizedCommonPeptideDf = np.log(commonPeptidesDf) - proteinQuantitiesDict = {} - for protein, peptideSet in proteinPeptideDict.items(): - peptideQuantityDf = normalizedCommonPeptideDf[list(peptideSet)] - peptideQuantityDf = set_non_present_protein_levels_to_zero( - peptideQuantityDf, protein, headerToProteinPresenceDict - ) - proteinQuantitiesDict[protein] = maxlfq(peptideQuantityDf.to_numpy(), minNumDifferences) - commonProteinsDf = pd.DataFrame.from_dict(proteinQuantitiesDict) - commonProteinsDf.index = commonPeptidesDf.index - return np.exp(commonProteinsDf).replace(1, 0) +def run_maxlfq_with_normalizations(peptideQuantityDf, minNumDifferences): + proteinSampleQuantities = maxlfq(np.log(peptideQuantityDf).to_numpy(), minNumDifferences) + proteinSampleQuantities = np.exp(proteinSampleQuantities) + proteinSampleQuantities[proteinSampleQuantities == 1] = 0 + return proteinSampleQuantities def prepare_matrices_for_cholesky_factorization( diff --git a/tests/system/system_tests/scoring/testFileContentCreators/MethodComparisonCommonProteinScoresBreakdown.py b/tests/system/system_tests/scoring/testFileContentCreators/MethodComparisonCommonProteinScoresBreakdown.py index 445437a..4bc30d3 100644 --- a/tests/system/system_tests/scoring/testFileContentCreators/MethodComparisonCommonProteinScoresBreakdown.py +++ b/tests/system/system_tests/scoring/testFileContentCreators/MethodComparisonCommonProteinScoresBreakdown.py @@ -11,9 +11,9 @@ protein quantification for 'average' method: protein -sample1 200.0 -sample2 233.3 -sample3 266.7 +sample1 600.0 +sample2 700.0 +sample3 800.0 protein quantification for 'maxlfq' method: protein diff --git a/tests/system/system_tests/scoring/testFileContentCreators/StandardCommonProteinScoresBreakdown.py b/tests/system/system_tests/scoring/testFileContentCreators/StandardCommonProteinScoresBreakdown.py index 483c146..5d3e12f 100644 --- a/tests/system/system_tests/scoring/testFileContentCreators/StandardCommonProteinScoresBreakdown.py +++ b/tests/system/system_tests/scoring/testFileContentCreators/StandardCommonProteinScoresBreakdown.py @@ -8,11 +8,18 @@ sample2 X X sample3 - - -protein quantification: +protein quantification for maxlfq method: protein sample1 X sample2 X sample3 0 + +protein quantification for sum method (only peptides found in all samples counted): + protein +sample1 0 +sample2 0 +sample3 0 + """ diff --git a/tests/system/system_tests/scoring/test_scoring.py b/tests/system/system_tests/scoring/test_scoring.py index 3eb7e92..dd23d5e 100644 --- a/tests/system/system_tests/scoring/test_scoring.py +++ b/tests/system/system_tests/scoring/test_scoring.py @@ -276,16 +276,16 @@ def test__scoring__evaluate_common_proteins_has_zero_quantity_in_missing_sample_ ): expectedCommonProteinDf = pd.DataFrame( [ - [100.0, 100.0], - [100.0, 100.0], + [0.0, 100.0], + [0.0, 100.0], [0.0, 100.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], ) evaluate_standard_protein_quant_comparison( inputFileDirectory, expectedOutputDirectory, - method="average", + method="sum", expectedCommonProteinDf=expectedCommonProteinDf, ) @@ -378,16 +378,16 @@ def test__scoring__evaluate_common_proteins_average_method_works_correctly( ): expectedCommonProteinDf = pd.DataFrame( [ - [200.0, 100.0], - [233.333333333333, 100.0], - [266.666666666667, 100.0], + [600.0, 100.0], + [700.0, 100.0], + [800.0, 100.0], ], - columns=["protein", "proteinX"], + columns=["1/protein", "1/proteinX"], ) evaluate_method_protein_quant_comparison( inputFileDirectory, expectedOutputDirectory, - method="average", + method="sum", expectedCommonProteinDf=expectedCommonProteinDf, ) diff --git a/tests/unit/scoring/test_quantificationFunctions.py b/tests/unit/scoring/test_quantificationFunctions.py index 8f8e539..696b84b 100644 --- a/tests/unit/scoring/test_quantificationFunctions.py +++ b/tests/unit/scoring/test_quantificationFunctions.py @@ -9,6 +9,7 @@ compile_common_protein_quantification_file, set_non_present_protein_levels_to_zero, maxlfq, + ion_count_sum, ) @@ -96,19 +97,26 @@ def test__quantification_functions__compile_ion_count_comparison_across_runs_df( def test__quantification_functions__compile_common_protein_quantification_file__averaging_method(): inputData = [ - ["1/protein1", 100.0], - ["1/protein1", 200.0], - ["1/protein1", 300.0], - ["2/protein2/protein3", 400.0], - ["2/protein2/protein3", 500.0], + ["peptide1", "1/protein1"], + ["peptide2", "1/protein1"], + ["peptide3", "1/protein1"], + ["peptide4", "2/protein2/protein3"], + ["peptide5", "2/protein2/protein3"], ] - inputDf1 = pd.DataFrame(inputData, columns=["leadingProtein", "ionCount"]) + inputDf1 = pd.DataFrame(inputData, columns=["peptide", "leadingProtein"]) inputDf2 = inputDf1.copy() fileHeader1 = "test1" fileHeader2 = "test2" + commonPeptidesDf = pd.DataFrame( + [ + [100.0,200.0,300.0,400.0,500.0] for _ in range(2) + ], + columns = ["peptide1","peptide2","peptide3","peptide4","peptide5"], + index = [fileHeader1, fileHeader2] + ) expectedOutputDf = pd.DataFrame( - [[200.0, 450.0, 450.0], [200.0, 450.0, 450.0]], - columns=["protein1", "protein2", "protein3"], + [[600.0, 900.0], [600.0, 900.0]], + columns=["1/protein1", "2/protein2/protein3"], index=[fileHeader1, fileHeader2], ) outputDf = compile_common_protein_quantification_file( @@ -116,8 +124,8 @@ def test__quantification_functions__compile_common_protein_quantification_file__ fileHeader1: inputDf1, fileHeader2: inputDf2, }, - commonPeptidesDf=None, - proteinQuantificationMethod="average", + commonPeptidesDf=commonPeptidesDf, + proteinQuantificationMethod="sum", minNumDifferences=None, ) assert expectedOutputDf.equals(outputDf) @@ -145,7 +153,7 @@ def test__set_non_present_protein_levels_to_zero(): [ [100.0, 100.0], [100.0, 100.0], - [-np.inf, -np.inf], + [0, 0], ], columns=peptides, index=samples, @@ -156,6 +164,69 @@ def test__set_non_present_protein_levels_to_zero(): assert expectedOutputDf.equals(outputDf) +def test__ion_count_sum(): + """ + Tests the ion count summary method of protein quantification. + + The test is based on the following protein profile (columns peptides, rows samples): + P1 P2 P3 P4 P5 P6 + A - X - - X - + B - X X - X - + C X X X X X X + D X X - X X X + + The protein profile is expected to filter out peptides with any missing samples: + P2 P5 + A X X + B X X + C X X + D X X + + Then summarize them across samples. So with the following example: + + P1 P2 P3 P4 + A 4.0 40.0 400.0 0 + B 3.0 30.0 300.0 0 + C 0 20.0 200.0 2000.0 + D 0 10.0 100.0 1000.0 + + It would filter down to the following: + P2 P3 + A 40.0 400.0 + B 30.0 300.0 + C 20.0 200.0 + D 10.0 100.0 + + And result in the following protein quantities across samples. + protein + A 440.0 + B 330.0 + C 220.0 + D 110.0 + """ + numPeptides = 4 + numSamples = 4 + peptideIntensityIncrease = [10**i for i in range(numPeptides)] + sampleIntensityIncrease = list(range(numSamples, 0, -1)) + inputDf = pd.DataFrame( + np.multiply.outer(sampleIntensityIncrease, peptideIntensityIncrease).astype(float), + columns=[f"P{i}" for i in range(1, numPeptides + 1)], + index=["A", "B", "C", "D",], + ) + cellsToDelete = [ + (0, 3), + (1, 3), + (2, 0), + (3, 0), + ] + for cell in cellsToDelete: + inputDf.iloc[cell[0], cell[1]] = 0 + + expectedOutput = np.array([440.0, 330.0, 220.0, 110.0]) + output = ion_count_sum(inputDf) + np.testing.assert_array_almost_equal(expectedOutput, output) + + def test__maxlfq__from_paper__default_2_peptide_connections_required_per_sample(): """ Tests the maxLFQ algorithm for protein quantification as summarized in in figure 2 of their paper. diff --git a/tests/unit/test_csodiaqParser.py b/tests/unit/test_csodiaqParser.py index 6e45027..adb34da 100644 --- a/tests/unit/test_csodiaqParser.py +++ b/tests/unit/test_csodiaqParser.py @@ -715,9 +715,19 @@ def test__csodiaq_parser__set_args_from_command_line_input__score_suceeds_with_m def test__csodiaq_parser__set_args_from_command_line_input__score_suceeds_with_maxlfq_protein_quant_method( parser, scoreArgs ): - scoreArgs += ["-p", "average"] + scoreArgs += ["-p", "sum"] args = vars(parser.parse_args(scoreArgs)) - assert args["proteinQuantMethod"] == "average" + assert args["proteinQuantMethod"] == "sum" + +def test__csodiaq_parser__set_args_from_command_line_input__score_fails_with_invalid_protein_quant_method( + parser, scoreArgs +): + scoreArgs += ["-p", "shouldFail"] + errorOutput = ( + "argument -p/--proteinQuantMethod: invalid choice: 'shouldFail' (choose from 'maxlfq', 'sum')" + ) + with pytest.raises(argparse.ArgumentTypeError, match=re.escape(errorOutput)): + args = vars(parser.parse_args(scoreArgs)) def test__csodiaq_parser__set_args_from_command_line_input__score_suceeds_with_min_num_differences_equal_to_1( parser, scoreArgs From 04e75611fe43838f9568575033c1491c10947739 Mon Sep 17 00:00:00 2001 From: CCranney <11773171+CCranney@users.noreply.github.com> Date: Mon, 18 Sep 2023 20:11:39 -0700 Subject: [PATCH 5/6] peak intensities are square rooted before feeding into cosine scoring, increases yield --- src/csodiaq/scoring/scoringFunctions.py | 2 +- .../testFileContentCreators/BaselineSpectraBreakdown.py | 3 ++- tests/unit/scoring/test_scoringFunctions.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/csodiaq/scoring/scoringFunctions.py b/src/csodiaq/scoring/scoringFunctions.py index dd2280c..4790a8b 100644 --- a/src/csodiaq/scoring/scoringFunctions.py +++ b/src/csodiaq/scoring/scoringFunctions.py @@ -8,7 +8,7 @@ def score_library_to_query_matches(matches): matches.groupby(["libraryIdx", "queryIdx"]) .apply( lambda x: calculate_cosine_similarity_score( - x["libraryIntensity"], x["queryIntensity"] + np.sqrt(x["libraryIntensity"]), np.sqrt(x["queryIntensity"]) ) ) .reset_index(name="cosineScore") diff --git a/tests/system/system_tests/identification/testFileContentCreators/BaselineSpectraBreakdown.py b/tests/system/system_tests/identification/testFileContentCreators/BaselineSpectraBreakdown.py index 0bf747d..d34997a 100644 --- a/tests/system/system_tests/identification/testFileContentCreators/BaselineSpectraBreakdown.py +++ b/tests/system/system_tests/identification/testFileContentCreators/BaselineSpectraBreakdown.py @@ -250,6 +250,7 @@ def find_number_of_total_query_peaks_in_scan(spectra): def create_vector_that_can_be_used_to_create_cosine_score(vectorA, cosineScore): + vectorA = np.sqrt(vectorA) unitVector = vectorA / np.linalg.norm(vectorA) positiveVector = np.array(np.full((len(vectorA)), 1000.0)) perpendicularVector = positiveVector - positiveVector.dot(unitVector) * unitVector @@ -257,7 +258,7 @@ def create_vector_that_can_be_used_to_create_cosine_score(vectorA, cosineScore): vectorB = ( cosineScore * unitVector + np.sqrt(1 - cosineScore**2) * perpendicularVector ) - return vectorB + return vectorB ** 2 def calculate_mz_value_from_ppm(mz, ppm): diff --git a/tests/unit/scoring/test_scoringFunctions.py b/tests/unit/scoring/test_scoringFunctions.py index 22c35bf..9b6beba 100644 --- a/tests/unit/scoring/test_scoringFunctions.py +++ b/tests/unit/scoring/test_scoringFunctions.py @@ -54,7 +54,7 @@ def test__score_functions__score_library_to_query_matches(vectorA, vectorB): matchesDf["libraryIntensity"] = vectorA matchesDf["queryIdx"] = [queryIdx for i in vectorA.index] matchesDf["queryIntensity"] = vectorB - cosineScore = calculate_cosine_similarity_score(vectorA, vectorB) + cosineScore = calculate_cosine_similarity_score(np.sqrt(vectorA), np.sqrt(vectorB)) expectedOutputDf = pd.DataFrame( data=[[libraryIdx, queryIdx, cosineScore]], columns=["libraryIdx", "queryIdx", "cosineScore"], @@ -66,7 +66,7 @@ def test__score_functions__score_library_to_query_matches(vectorA, vectorB): lowScoreMatchesDf["libraryIdx"] = [libraryIdx - 1 for i in vectorA.index] reverseVectorA = pd.Series(list(vectorA)[::-1]) lowScoreMatchesDf["libraryIntensity"] = reverseVectorA - lowCosineScore = calculate_cosine_similarity_score(reverseVectorA, vectorB) + lowCosineScore = calculate_cosine_similarity_score(np.sqrt(reverseVectorA), np.sqrt(vectorB)) unsortedMatchesDf = pd.concat([lowScoreMatchesDf, matchesDf]) expectedOutputDf = pd.DataFrame( data=[ From 90db9184f0c41d7cdb3e5b254179587ac4e98941 Mon Sep 17 00:00:00 2001 From: CCranney <11773171+CCranney@users.noreply.github.com> Date: Mon, 18 Sep 2023 20:38:28 -0700 Subject: [PATCH 6/6] custom correction tolerance increased by 1ppm (increases yield), beginning to roll back v1 system tests --- .../identification/matchingFunctions.py | 2 +- .../CustomCorrectionSpectraBreakdown.py | 2 +- .../identification/test_identification.py | 15 +++++-- tests/system/v1_to_v2/test_compareToV1.py | 37 ------------------ .../v1_to_v2/test_files/v1FullOutput.csv.gz | Bin 142680 -> 0 bytes .../identification/test_matchingFunctions.py | 2 +- 6 files changed, 15 insertions(+), 43 deletions(-) delete mode 100644 tests/system/v1_to_v2/test_files/v1FullOutput.csv.gz diff --git a/src/csodiaq/identification/matchingFunctions.py b/src/csodiaq/identification/matchingFunctions.py index 1f3ba31..b216a9b 100644 --- a/src/csodiaq/identification/matchingFunctions.py +++ b/src/csodiaq/identification/matchingFunctions.py @@ -221,7 +221,7 @@ def calculate_ppm_offset_tolerance_using_tallest_bin_peak(ppms): binHeights, tallestBinIdx ) offset = bins[tallestBinIdx] - tolerance = abs(offset - bins[nearestNoiseBinIdx]) + tolerance = abs(offset - bins[nearestNoiseBinIdx]) + 1 return offset, tolerance diff --git a/tests/system/system_tests/identification/testFileContentCreators/CustomCorrectionSpectraBreakdown.py b/tests/system/system_tests/identification/testFileContentCreators/CustomCorrectionSpectraBreakdown.py index 54ce398..0891224 100644 --- a/tests/system/system_tests/identification/testFileContentCreators/CustomCorrectionSpectraBreakdown.py +++ b/tests/system/system_tests/identification/testFileContentCreators/CustomCorrectionSpectraBreakdown.py @@ -10,7 +10,7 @@ def format_query_mz_values(self, libraryMzs, mzWindowGroup): numBins = 200 ppmCenterBin = 10.0 binWidth = 0.1 - emptyBinNum = 4 + emptyBinNum = 20 centerBinDistribution = np.random.uniform( ppmCenterBin - (binWidth / 2), ppmCenterBin + (binWidth / 2), size=(4,) ) diff --git a/tests/system/system_tests/identification/test_identification.py b/tests/system/system_tests/identification/test_identification.py index 25334f5..07892d2 100644 --- a/tests/system/system_tests/identification/test_identification.py +++ b/tests/system/system_tests/identification/test_identification.py @@ -277,9 +277,7 @@ def test__identification__baseline_no_matches_raises_error( outputDir, baselineSpectraBreakdown, ) - assert_no_matches_after_correction_raises_warning( - inputQueryFile, libraryFile, outputDir, baselineSpectraBreakdown - ) + def assert_no_matches_before_correction_raises_warning_and_skips_offending_file_only( @@ -321,6 +319,17 @@ def assert_no_matches_before_correction_raises_warning_and_skips_offending_file_ def assert_no_matches_after_correction_raises_warning( inputQueryFile, libraryFile, outputDir, baselineSpectraBreakdown ): + """ + Currently unused. The applicability of this error is questionable and may be removed entirely in the future. + + Would be added to 'test__identification__baseline_no_matches_raises_error', though it would require using + input data with wider differences between m/z values in each spectra. + ''' + assert_no_matches_after_correction_raises_warning( + inputQueryFile, libraryFile, outputDir, baselineSpectraBreakdown + ) + ''' + """ args = [ "csodiaq", "id", diff --git a/tests/system/v1_to_v2/test_compareToV1.py b/tests/system/v1_to_v2/test_compareToV1.py index 9970758..5d34102 100644 --- a/tests/system/v1_to_v2/test_compareToV1.py +++ b/tests/system/v1_to_v2/test_compareToV1.py @@ -90,43 +90,6 @@ def get_columns_that_should_match(type): "leadingProteinFDR", ] - -def test__identifier__main_workflow(commandLineArgs): - identifier = Identifier(commandLineArgs, isTesting=True) - queryFile = commandLineArgs["input"][0] - identifier._queryContext = QueryLoaderContext(queryFile) - - expectedMatchDf = pd.read_csv( - get_file_from_system_test_folder("matchDf_precorrected.csv.gz"), - compression="gzip", - ) - matchDf = identifier._match_library_to_query_spectra() - assert_numeric_pandas_dataframes_are_equal(expectedMatchDf, matchDf, "match") - - expectedCorrectedMatchDf = pd.read_csv( - get_file_from_system_test_folder("matchDf_postcorrected.csv.gz"), - compression="gzip", - ) - matchDf = identifier._apply_correction_to_match_dataframe(matchDf) - assert_numeric_pandas_dataframes_are_equal( - expectedCorrectedMatchDf, matchDf, "match" - ) - - expectedScoreDf = pd.read_csv( - get_file_from_system_test_folder("scoreDf.csv.gz"), - compression="gzip", - ) - scoreDf = identifier._score_spectra_matches(matchDf) - assert_numeric_pandas_dataframes_are_equal(expectedScoreDf, scoreDf, "score") - - expectedFullDf = pd.read_csv( - get_file_from_system_test_folder("v1FullOutput.csv.gz"), compression="gzip" - ) - - fullDf = identifier._format_identifications_as_dataframe(matchDf, scoreDf) - assert_numeric_pandas_dataframes_are_equal(expectedFullDf, fullDf, "full") - - def test__scoring_workflow(): fullDf = pd.read_csv( get_file_from_system_test_folder("v2FullOutput.csv.gz"), compression="gzip" diff --git a/tests/system/v1_to_v2/test_files/v1FullOutput.csv.gz b/tests/system/v1_to_v2/test_files/v1FullOutput.csv.gz deleted file mode 100644 index 0e57a3672e63bd8e7b6f250892dd31ff004d39f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142680 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