Skip to content

Commit

Permalink
Revert intensity pairs pr765 (#784)
Browse files Browse the repository at this point in the history
* correct Within calculation

* update unit tests

* this is the spot

* add space

* unused using

* vnc

* revert IntensityPairs method from pr 765

---------

Co-authored-by: MICHAEL SHORTREED <mrshortreed@wisc.edu>
  • Loading branch information
trishorts and MICHAEL SHORTREED committed May 28, 2024
1 parent 84b2e9d commit cfc2f28
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 85 deletions.
102 changes: 50 additions & 52 deletions mzLib/MassSpectrometry/MzSpectra/SpectralSimilarity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,40 @@ namespace MassSpectrometry.MzSpectra
{
public class SpectralSimilarity
{
public SpectralSimilarity(MzSpectrum experimentalSpectrum, MzSpectrum theoreticalSpectrum, SpectrumNormalizationScheme scheme, double toleranceInPpm, bool keepAllExperimentalPeaks = false, bool keepAllTheoreticalPeaks = true, double filterOutBelowThisMz = 300)
public SpectralSimilarity(MzSpectrum experimentalSpectrum, MzSpectrum theoreticalSpectrum, SpectrumNormalizationScheme scheme, double toleranceInPpm, bool allPeaks, double filterOutBelowThisMz = 300)
{
ExperimentalYArray = Normalize(FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(experimentalSpectrum.XArray,experimentalSpectrum.YArray, filterOutBelowThisMz).Select(p=>p.Item2).ToArray(),scheme);
ExperimentalXArray = FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(experimentalSpectrum.XArray, experimentalSpectrum.YArray, filterOutBelowThisMz).Select(p => p.Item1).ToArray();
TheoreticalYArray = Normalize(FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(theoreticalSpectrum.XArray, theoreticalSpectrum.YArray, filterOutBelowThisMz).Select(p => p.Item2).ToArray(), scheme);
TheoreticalXArray = FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(theoreticalSpectrum.XArray, theoreticalSpectrum.YArray, filterOutBelowThisMz).Select(p => p.Item1).ToArray();
_localPpmTolerance = toleranceInPpm;
_scheme = scheme;
_keepAllExperimentalPeaks = keepAllExperimentalPeaks;
_keepAllTheoreticalPeaks = keepAllTheoreticalPeaks;
IntensityPairs = GetIntensityPairs(keepAllExperimentalPeaks, keepAllTheoreticalPeaks);
_allPeaks = allPeaks;
IntensityPairs = GetIntensityPairs(allPeaks);
}

public SpectralSimilarity(MzSpectrum experimentalSpectrum, IReadOnlyList<double> theoreticalX, IReadOnlyList<double> theoreticalY, SpectrumNormalizationScheme scheme, double toleranceInPpm, bool keepAllExperimentalPeaks = false, bool keepAllTheoreticalPeaks = true, double filterOutBelowThisMz = 300)
public SpectralSimilarity(MzSpectrum experimentalSpectrum, IReadOnlyList<double> theoreticalX, IReadOnlyList<double> theoreticalY, SpectrumNormalizationScheme scheme, double toleranceInPpm, bool allPeaks, double filterOutBelowThisMz = 300)
{
ExperimentalYArray = Normalize(FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(experimentalSpectrum.XArray, experimentalSpectrum.YArray, filterOutBelowThisMz).Select(p => p.Item2).ToArray(), scheme);
ExperimentalXArray = FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(experimentalSpectrum.XArray, experimentalSpectrum.YArray, filterOutBelowThisMz).Select(p => p.Item1).ToArray();
TheoreticalYArray = Normalize(FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(theoreticalX, theoreticalY, filterOutBelowThisMz).Select(p => p.Item2).ToArray(), scheme);
TheoreticalXArray = FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(theoreticalX, theoreticalY, filterOutBelowThisMz).Select(p => p.Item1).ToArray();
_localPpmTolerance = toleranceInPpm;
_scheme = scheme;
_keepAllExperimentalPeaks = keepAllExperimentalPeaks;
_keepAllTheoreticalPeaks = keepAllTheoreticalPeaks;
IntensityPairs = GetIntensityPairs(keepAllExperimentalPeaks, keepAllTheoreticalPeaks);
_allPeaks = allPeaks;
IntensityPairs = GetIntensityPairs(allPeaks);
}

public SpectralSimilarity(IReadOnlyList<double> pXArray, IReadOnlyList<double> pYArray, IReadOnlyList<double> qXArray, IReadOnlyList<double> qYArray, SpectrumNormalizationScheme scheme, double toleranceInPpm, bool keepAllExperimentalPeaks = false, bool keepAllTheoreticalPeaks = true, double filterOutBelowThisMz = 300)
public SpectralSimilarity(IReadOnlyList<double> pXArray, IReadOnlyList<double> pYArray, IReadOnlyList<double> qXArray, IReadOnlyList<double> qYArray, SpectrumNormalizationScheme scheme, double toleranceInPpm, bool allPeaks, double filterOutBelowThisMz = 300)
{
ExperimentalYArray = Normalize(FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(pXArray, pYArray, filterOutBelowThisMz).Select(p => p.Item2).ToArray(), scheme);
ExperimentalXArray = FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(pXArray, pYArray, filterOutBelowThisMz).Select(p => p.Item1).ToArray();
TheoreticalYArray = Normalize(FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(qXArray, qYArray, filterOutBelowThisMz).Select(p => p.Item2).ToArray(), scheme);
TheoreticalXArray = FilterOutIonsBelowThisMzAndRemoveZeroIntensityPeaks(qXArray, qYArray, filterOutBelowThisMz).Select(p => p.Item1).ToArray();
_localPpmTolerance = toleranceInPpm;
_scheme = scheme;
_keepAllExperimentalPeaks = keepAllExperimentalPeaks;
_keepAllTheoreticalPeaks = keepAllTheoreticalPeaks;
IntensityPairs = GetIntensityPairs(keepAllExperimentalPeaks, keepAllTheoreticalPeaks);
_allPeaks = allPeaks;
IntensityPairs = GetIntensityPairs(allPeaks);
}
public double[] ExperimentalYArray { get; }
public double[] ExperimentalXArray { get; }
Expand All @@ -53,7 +50,7 @@ public SpectralSimilarity(IReadOnlyList<double> pXArray, IReadOnlyList<double> p

private readonly double _localPpmTolerance;
private readonly SpectrumNormalizationScheme _scheme;
private readonly bool _keepAllExperimentalPeaks;
private readonly bool _allPeaks;
private readonly bool _keepAllTheoreticalPeaks;

Check warning on line 54 in mzLib/MassSpectrometry/MzSpectra/SpectralSimilarity.cs

View workflow job for this annotation

GitHub Actions / build

Field 'SpectralSimilarity._keepAllTheoreticalPeaks' is never assigned to, and will always have its default value false

Check warning on line 54 in mzLib/MassSpectrometry/MzSpectra/SpectralSimilarity.cs

View workflow job for this annotation

GitHub Actions / build

Field 'SpectralSimilarity._keepAllTheoreticalPeaks' is never assigned to, and will always have its default value false

Check warning on line 54 in mzLib/MassSpectrometry/MzSpectra/SpectralSimilarity.cs

View workflow job for this annotation

GitHub Actions / build

Field 'SpectralSimilarity._keepAllTheoreticalPeaks' is never assigned to, and will always have its default value false

public List<(double, double)> IntensityPairs { get; } = new();
Expand Down Expand Up @@ -116,7 +113,7 @@ private static double[] Normalize(double[] spectrum, SpectrumNormalizationScheme
/// <param name="experimentalYArray"></param>
/// <param name="theoreticalYArray"></param>
/// <returns></returns>
private List<(double,double)> GetIntensityPairs(bool keepAllExperimentalPeaks, bool keepAllTheoreticalPeaks, double[] experimentalYArray = null, double[] theoreticalYArray = null)
private List<(double,double)> GetIntensityPairs(bool allPeaks, double[] experimentalYArray = null, double[] theoreticalYArray = null)
{
if (experimentalYArray == null) experimentalYArray = ExperimentalYArray;
if (theoreticalYArray == null) theoreticalYArray = TheoreticalYArray;
Expand All @@ -126,54 +123,55 @@ private List<(double,double)> GetIntensityPairs(bool keepAllExperimentalPeaks, b
//when all mz of theoretical peaks or experimental peaks are less than mz cut off , it is treated as no corresponding library spectrum is found and later the similarity score will be assigned as null.
return new List<(double, double)> { (-1, -1) };
}

List<(double, double)> intensityPairs = new();
int expIndex = 0;
int theoIndex = 0;
do
List<(double, double)> experimental = new();
List<(double, double)> theoretical = new();

for (int i = 0; i < ExperimentalXArray.Length; i++)
{
if (Within(ExperimentalXArray[expIndex], TheoreticalXArray[theoIndex]))
{
intensityPairs.Add((experimentalYArray[expIndex], theoreticalYArray[theoIndex]));
expIndex++;
theoIndex++;
}
else if(ExperimentalXArray[expIndex] < TheoreticalXArray[theoIndex])
experimental.Add((ExperimentalXArray[i], experimentalYArray[i]));
}
for (int i = 0; i < TheoreticalXArray.Length; i++)
{
theoretical.Add((TheoreticalXArray[i], theoreticalYArray[i]));
}

experimental = experimental.OrderByDescending(i => i.Item2).ToList();
theoretical = theoretical.OrderByDescending(i => i.Item2).ToList();

foreach ((double, double) xyPair in theoretical)
{
int index = 0;
while (experimental.Count > 0 && index < experimental.Count)
{
if (keepAllExperimentalPeaks)
if (Within(experimental[index].Item1, xyPair.Item1))
{
intensityPairs.Add((experimentalYArray[expIndex], 0));
intensityPairs.Add((experimental[index].Item2, xyPair.Item2));
experimental.RemoveAt(index);
index = -1;
break;
}
expIndex++;
index++;
}
else
if (experimental.Count == 0)
{
if (keepAllTheoreticalPeaks)
{
intensityPairs.Add((0, theoreticalYArray[theoIndex]));
}
theoIndex++;
index++;
}
if (index > 0)
{
//didn't find a experimental mz in range
intensityPairs.Add((0, xyPair.Item2));
}
}
while (expIndex < ExperimentalXArray.Length && theoIndex < TheoreticalXArray.Length);

//if the theoretical peak count is different than the experimental peak count, and the bool createPairsForAllExperimentalMzValues = TRUE then
//we need to add zero intensity pairs for each experimental peak that does not have a corresponding theoretical peak
while (expIndex < ExperimentalXArray.Length && keepAllExperimentalPeaks)
{
intensityPairs.Add((experimentalYArray[expIndex], 0));
expIndex++;
}
//We add an intensity pair for every value in the theoretical spectrum.
while (theoIndex < TheoreticalXArray.Length && keepAllTheoreticalPeaks)
//If we're keeping all experimental and theoretical peaks, then we add intensity pairs for all unpaired experimental peaks here.
if (experimental.Count > 0 && allPeaks)
{
intensityPairs.Add((0, theoreticalYArray[theoIndex]));
theoIndex++;
}

//if there are no intensity pairs, then we are required to return a single pair of (-1,-1) to indicate that no peaks were found
if (intensityPairs.Count == 0)
{
intensityPairs.Add((-1, -1));
foreach ((double, double) xyPair in experimental)
{
intensityPairs.Add((xyPair.Item2, 0));
}
}
return intensityPairs;
}
Expand Down Expand Up @@ -330,7 +328,7 @@ public static double[] NormalizeSpectrumSum(double[] spectrum)
// This method should only be used when allPeaks is set to true
public double? SpectralEntropy()
{
if (_scheme != SpectrumNormalizationScheme.SpectrumSum && !_keepAllExperimentalPeaks && !_keepAllTheoreticalPeaks)
if (_scheme != SpectrumNormalizationScheme.SpectrumSum && !_allPeaks && !_keepAllTheoreticalPeaks)
{
return null;
}
Expand Down
2 changes: 1 addition & 1 deletion mzLib/Omics/SpectrumMatch/LibrarySpectrum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public string CalculateSpectralAngleOnTheFly(List<MatchedFragmentIon> spectrumMa
MatchedFragmentIons.Select(f => f.Intensity).ToArray(),
SpectralSimilarity.SpectrumNormalizationScheme.MostAbundantPeak,
toleranceInPpm: 20,
keepAllExperimentalPeaks: true);
allPeaks: true);
double? spectralContrastAngle = spectraComparison.SpectralContrastAngle();

return spectralContrastAngle == null
Expand Down
Loading

0 comments on commit cfc2f28

Please sign in to comment.