/// <summary> /// Sort XicPoints and select one peak per scan /// </summary> /// <param name="xic"></param> /// <returns></returns> public static Xic GetSelectedXic(Xic xic) { if (xic.Count == 0) { return(xic); } xic.Sort(); // Need to guarantee a sorted Xic // select one best peak for each scan var newXic = new Xic(); var prevScanNum = xic[0].ScanNum; var bestPeak = xic[0]; for (var i = 1; i < xic.Count; i++) { var xicPeak = xic[i]; if (xicPeak.ScanNum > prevScanNum) { newXic.Add(bestPeak); bestPeak = xicPeak; } else { if (xicPeak.Intensity > bestPeak.Intensity) { bestPeak = xicPeak; } } prevScanNum = xicPeak.ScanNum; } newXic.Add(bestPeak); return(newXic); }
/// <summary> /// Check 2 Xics for equality /// </summary> /// <param name="other"></param> /// <returns></returns> protected bool Equals(Xic other) { for (var i = 0; i < Count; i++) { if (!this[i].Equals(other[i])) { return(false); } } return(true); }
/// <summary> /// Get the Pearson correlation of 2 XICs /// </summary> /// <param name="other"></param> /// <returns></returns> public double GetCorrelation(Xic other) { if (Count == 0 || other == null || other.Count == 0) { return(0); } var count1 = Count; var count2 = other.Count; var index1 = 0; var index2 = 0; var intList1 = new List <double>(); var intList2 = new List <double>(); while (index1 < count1 && index2 < count2) { var comp = this[index1].ScanNum - other[index2].ScanNum; if (comp < 0) { ++index1; } else if (comp > 0) { ++index2; } else { intList1.Add(this[index1].Intensity); intList2.Add(other[index2].Intensity); ++index1; ++index2; } } var correlation = FitScoreCalculator.GetPearsonCorrelation(intList1.ToArray(), intList2.ToArray()); return(correlation); }
/// <summary> /// Get the Cosine score of 2 XICs /// </summary> /// <param name="other"></param> /// <returns></returns> public double GetCosine(Xic other) { if (Count == 0 || other == null || other.Count == 0) { return(0); } //var minScanNum = Math.Min(this[0].ScanNum, other[0].ScanNum); //var maxScanNum = Math.Max(this[Count-1].ScanNum, other[other.Count-1].ScanNum); var minScanNum = this[0].ScanNum; var maxScanNum = this[Count - 1].ScanNum; var intArr1 = new double[maxScanNum - minScanNum + 1]; foreach (var p in this) { intArr1[p.ScanNum - minScanNum] = p.Intensity; } var intArr2 = new double[maxScanNum - minScanNum + 1]; foreach (var p in other) { var index = p.ScanNum - minScanNum; if (index < 0 || index >= intArr2.Length) { continue; } intArr2[p.ScanNum - minScanNum] = p.Intensity; } var correlation = FitScoreCalculator.GetCosine(intArr1, intArr2); return(correlation); }