Skip to content

Commit

Permalink
Pwsm target decoy (#769)
Browse files Browse the repository at this point in the history
* Broke tests

* Pwsm GetHashCode now only considers Full Sequence

* Fixed broken test

* Update mzLib.nuspec

reverted changes to nuspec

---------

Co-authored-by: trishorts <mshort@chem.wisc.edu>
  • Loading branch information
Alexander-Sol and trishorts authored Jul 30, 2024
1 parent 1cc83f5 commit bcbce5b
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ public class PeptideWithSetModifications : ProteolyticPeptide, IBioPolymerWithSe
{
public string FullSequence { get; private set; } //sequence with modifications
public int NumFixedMods { get; }
// Parameter to store a hash code corresponding to a Decoy or a Target peptide
// Parameter to store the full sequence of the corresponding Target or Decoy peptide
// If the peptide in question is a decoy, this pairs it to the target it was generated from
// If the peptide in question is a target, this pairs it to its corresponding decoy
public int? PairedTargetDecoyHash { get; private set; }
public string PairedTargetDecoySequence { get; private set; }
/// <summary>
/// Dictionary of modifications on the peptide. The N terminus is index 1.
/// The key indicates which residue modification is on (with 1 being N terminus).
Expand All @@ -40,7 +40,7 @@ public class PeptideWithSetModifications : ProteolyticPeptide, IBioPolymerWithSe
/// </summary>
public PeptideWithSetModifications(Protein protein, IDigestionParams digestionParams, int oneBasedStartResidueInProtein,
int oneBasedEndResidueInProtein, CleavageSpecificity cleavageSpecificity, string peptideDescription, int missedCleavages,
Dictionary<int, Modification> allModsOneIsNterminus, int numFixedMods, string baseSequence = null, int? pairedTargetDecoyHash = null)
Dictionary<int, Modification> allModsOneIsNterminus, int numFixedMods, string baseSequence = null, string pairedTargetDecoySequence = null)
: base(protein, oneBasedStartResidueInProtein, oneBasedEndResidueInProtein, missedCleavages, cleavageSpecificity, peptideDescription, baseSequence)
{
_allModsOneIsNterminus = allModsOneIsNterminus;
Expand All @@ -49,7 +49,7 @@ public PeptideWithSetModifications(Protein protein, IDigestionParams digestionPa
FullSequence = this.DetermineFullSequence();
ProteinAccession = protein.Accession;
UpdateCleavageSpecificity();
PairedTargetDecoyHash = pairedTargetDecoyHash; // Added PairedTargetDecoyHash as a nullable integer
PairedTargetDecoySequence = pairedTargetDecoySequence;
}

/// <summary>
Expand All @@ -59,7 +59,7 @@ public PeptideWithSetModifications(Protein protein, IDigestionParams digestionPa
public PeptideWithSetModifications(string sequence, Dictionary<string, Modification> allKnownMods, int numFixedMods = 0,
IDigestionParams digestionParams = null, Protein p = null, int oneBasedStartResidueInProtein = int.MinValue,
int oneBasedEndResidueInProtein = int.MinValue, int missedCleavages = int.MinValue,
CleavageSpecificity cleavageSpecificity = CleavageSpecificity.Full, string peptideDescription = null, int? pairedTargetDecoyHash = null)
CleavageSpecificity cleavageSpecificity = CleavageSpecificity.Full, string peptideDescription = null, string pairedTargetDecoySequence = null)
: base(p, oneBasedStartResidueInProtein, oneBasedEndResidueInProtein, missedCleavages, cleavageSpecificity, peptideDescription)
{
if (sequence.Contains("|"))
Expand All @@ -72,7 +72,7 @@ public PeptideWithSetModifications(string sequence, Dictionary<string, Modificat
GetModsAfterDeserialization(allKnownMods);
NumFixedMods = numFixedMods;
_digestionParams = digestionParams as DigestionParams;
PairedTargetDecoyHash = pairedTargetDecoyHash; // Added PairedTargetDecoyHash as a nullable integer
PairedTargetDecoySequence = pairedTargetDecoySequence;

if (p != null)
{
Expand Down Expand Up @@ -902,14 +902,7 @@ public override bool Equals(object obj)

public override int GetHashCode()
{
if (DigestionParams == null)
{
return FullSequence.GetHashCode();
}
else
{
return FullSequence.GetHashCode() + DigestionParams.DigestionAgent.GetHashCode();
}
return FullSequence.GetHashCode();
}

/// <summary>
Expand Down Expand Up @@ -1140,27 +1133,25 @@ public PeptideWithSetModifications GetReverseDecoyFromTarget(int[] revisedAminoA
Protein decoyProtein = new Protein(proteinSequence, "DECOY_" + this.Protein.Accession, null, new List<Tuple<string, string>>(), new Dictionary<int, List<Modification>>(), null, null, null, true);
DigestionParams d = _digestionParams;

// Creates a hash code corresponding to the target's sequence
int targetHash = GetHashCode();
PeptideWithSetModifications decoyPeptide;
//Make the "peptideDescription" store the corresponding target's sequence
if (newBaseString != this.BaseSequence)
{
decoyPeptide = new PeptideWithSetModifications(decoyProtein, d, this.OneBasedStartResidueInProtein, this.OneBasedEndResidueInProtein, this.CleavageSpecificityForFdrCategory, this.FullSequence, this.MissedCleavages, newModificationsDictionary, this.NumFixedMods, newBaseString);
// Sets PairedTargetDecoyHash of the original target peptie to the hash hode of the decoy sequence
PairedTargetDecoyHash = decoyPeptide.GetHashCode();
PairedTargetDecoySequence = decoyPeptide.FullSequence;
// Sets PairedTargetDecoyHash of the decoy peptide to the hash code of the target sequence
decoyPeptide.PairedTargetDecoyHash = targetHash;
decoyPeptide.PairedTargetDecoySequence = this.FullSequence;
return decoyPeptide;

}
else
{
//The reverse decoy procedure failed to create a PeptideWithSetModificatons with a different sequence. Therefore,
//we retrun the mirror image peptide.
decoyPeptide = this.GetPeptideMirror(revisedAminoAcidOrder);
PairedTargetDecoyHash = decoyPeptide.GetHashCode();
decoyPeptide.PairedTargetDecoyHash = targetHash;
decoyPeptide = this.GetPeptideMirror(revisedAminoAcidOrder);
PairedTargetDecoySequence = decoyPeptide.FullSequence;
decoyPeptide.PairedTargetDecoySequence = this.FullSequence;
return decoyPeptide;
}

Expand Down Expand Up @@ -1318,17 +1309,15 @@ public PeptideWithSetModifications GetScrambledDecoyFromTarget(int[] revisedAmin

Protein decoyProtein = new Protein(proteinSequence, "DECOY_" + this.Protein.Accession, null, new List<Tuple<string, string>>(), new Dictionary<int, List<Modification>>(), null, null, null, true);
DigestionParams d = _digestionParams;
// Creates a hash code corresponding to the target's sequence
int targetHash = GetHashCode();
PeptideWithSetModifications decoyPeptide;
//Make the "peptideDescription" store the corresponding target's sequence
if (newBaseString != this.BaseSequence)
{
decoyPeptide = new PeptideWithSetModifications(decoyProtein, d, this.OneBasedStartResidueInProtein, this.OneBasedEndResidueInProtein, this.CleavageSpecificityForFdrCategory, this.FullSequence, this.MissedCleavages, newModificationsDictionary, this.NumFixedMods, newBaseString);
// Sets PairedTargetDecoyHash of the original target peptie to the hash hode of the decoy sequence
PairedTargetDecoyHash = decoyPeptide.GetHashCode();
PairedTargetDecoySequence = decoyPeptide.FullSequence;
// Sets PairedTargetDecoyHash of the decoy peptide to the hash code of the target sequence
decoyPeptide.PairedTargetDecoyHash = targetHash;
decoyPeptide.PairedTargetDecoySequence = this.FullSequence;
return decoyPeptide;

}
Expand All @@ -1337,8 +1326,8 @@ public PeptideWithSetModifications GetScrambledDecoyFromTarget(int[] revisedAmin
//The reverse decoy procedure failed to create a PeptideWithSetModificatons with a different sequence. Therefore,
//we retrun the mirror image peptide.
decoyPeptide = this.GetPeptideMirror(revisedAminoAcidOrder);
PairedTargetDecoyHash = decoyPeptide.GetHashCode();
decoyPeptide.PairedTargetDecoyHash = targetHash;
PairedTargetDecoySequence = decoyPeptide.FullSequence;
decoyPeptide.PairedTargetDecoySequence = this.FullSequence;
return decoyPeptide;
}
}
Expand Down
15 changes: 8 additions & 7 deletions mzLib/Test/TestPeptideWithSetMods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ public static void TestDifferentProteaseEquals()
Assert.That(pep1.Parent.Equals(pep2.Parent));
Assert.That(!pep1.DigestionParams.DigestionAgent.Equals(pep2.DigestionParams.DigestionAgent));
Assert.That(!pep1.Equals(pep2));
Assert.That(!pep1.GetHashCode().Equals(pep2.GetHashCode()));
// HashCode is only concerned with the full sequence, not the protease. Only the equals method is interested in the protease used
Assert.That(pep1.GetHashCode().Equals(pep2.GetHashCode()));
}

[Test]
Expand Down Expand Up @@ -765,8 +766,8 @@ public static void TestReverseDecoyFromTarget()
int testTargetHash = p.GetHashCode();
// Hash code corresponding to the decoy sequence, should be PairedTargetDecoyHash for target
int testDecoyHash = reverse.GetHashCode();
Assert.AreEqual(reverse.PairedTargetDecoyHash, testTargetHash);
Assert.AreEqual(p.PairedTargetDecoyHash, testDecoyHash);
Assert.AreEqual(reverse.PairedTargetDecoySequence.GetHashCode(), testTargetHash);
Assert.AreEqual(p.PairedTargetDecoySequence.GetHashCode(), testDecoyHash);
Assert.AreEqual("EDITPEPK", reverse.BaseSequence);
Assert.AreEqual(new int[] { 6, 5, 4, 3, 2, 1, 0, 7 }, newAminoAcidPositions);
Assert.IsTrue(reverse.Protein.IsDecoy);
Expand Down Expand Up @@ -841,8 +842,8 @@ public static void TestReverseDecoyFromTarget()
int testMirrorTargetHash = p_tryp.GetHashCode();
// Hash code corresponding to the decoy sequence, should be PairedTargetDecoyHash for target
int testMirrorDecoyHash = p_tryp_reverse.GetHashCode();
Assert.AreEqual(testMirrorTargetHash, p_tryp_reverse.PairedTargetDecoyHash);
Assert.AreEqual(testMirrorDecoyHash, p_tryp.PairedTargetDecoyHash);
Assert.AreEqual(testMirrorTargetHash, p_tryp_reverse.PairedTargetDecoySequence.GetHashCode());
Assert.AreEqual(testMirrorDecoyHash, p_tryp.PairedTargetDecoySequence.GetHashCode());
Assert.AreEqual("RVTRITV", p_tryp_reverse.BaseSequence);
Assert.AreEqual(new int[] { 6, 5, 4, 3, 2, 1, 0 }, newAminoAcidPositions);
Assert.IsTrue(p_tryp_reverse.AllModsOneIsNterminus.ContainsKey(1));//n-term acetyl
Expand Down Expand Up @@ -871,8 +872,8 @@ public static void TestScrambledDecoyFromTarget()
int testTargetHash = p.GetHashCode();
// Hash code corresponding to the decoy sequence, should be PairedTargetDecoyHash for target
int testDecoyHash = testScrambled.GetHashCode();
Assert.AreEqual(testScrambled.PairedTargetDecoyHash, testTargetHash);
Assert.AreEqual(p.PairedTargetDecoyHash, testDecoyHash);
Assert.AreEqual(testScrambled.PairedTargetDecoySequence.GetHashCode(), testTargetHash);
Assert.AreEqual(p.PairedTargetDecoySequence.GetHashCode(), testDecoyHash);
Assert.AreEqual("IDEETPPK", testScrambled.BaseSequence);
Assert.AreEqual(new int[] { 4, 5, 6, 1, 3, 0, 2, 7 }, newAminoAcidPositions);
// Check n-term acetyl
Expand Down

0 comments on commit bcbce5b

Please sign in to comment.