private List <LcMsPeakCluster> MergeFeatures(LcMsPeakMatrix featureFinder, List <LcMsPeakCluster> features) { //foreach (var f in _featureList) f.ActivateAllPeaks(); var featureSet = new NodeSet <LcMsPeakCluster>(); featureSet.AddRange(features); var connectedFeatureSet = featureSet.ConnnectedComponents(_mergeComparer); var mergedFeatures = new List <LcMsPeakCluster>(); foreach (var fSet in connectedFeatureSet) { if (fSet.Count == 1) { mergedFeatures.Add(fSet[0]); } else { var maxScan = fSet.Max(f => f.MaxScanNum); var minScan = fSet.Min(f => f.MinScanNum); var maxCharge = fSet.Max(f => f.MaxCharge); var minCharge = fSet.Min(f => f.MinCharge); var maxScore = double.MinValue;//fSet.Max(f => f.Score); LcMsPeakCluster maxScoredClusterOriginal = null; LcMsPeakCluster maxScoredCluster = null; foreach (var f in fSet) { var newFeature = featureFinder.GetLcMsPeakCluster(f.RepresentativeMass, minCharge, maxCharge, minScan, maxScan); if (newFeature != null && (maxScoredCluster == null || newFeature.Score > maxScoredCluster.Score)) { maxScoredCluster = newFeature; } if (f.Score > maxScore) { maxScoredClusterOriginal = f; maxScore = f.Score; } } var feature = featureFinder.GetLcMsPeakCluster(fSet.Select(f => f.Mass).Mean(), minCharge, maxCharge, minScan, maxScan); if (feature != null && (maxScoredCluster == null || feature.Score > maxScoredCluster.Score)) { maxScoredCluster = feature; } //Console.WriteLine("------------- Merge -----------------"); //foreach (var f in fSet) Console.WriteLine("*\t{0}\t{1}\t{2}\t{3}", f.RepresentativeMass, f.MinScanNum, f.MaxScanNum, f.Score); //Console.WriteLine("**\t{0}\t{1}\t{2}\t{3}", maxScoredCluster.RepresentativeMass, maxScoredCluster.MinScanNum, maxScoredCluster.MaxScanNum, maxScoredCluster.Score); if (maxScoredCluster == null) { maxScoredCluster = maxScoredClusterOriginal; } if (maxScoredCluster.Score < maxScore) { maxScoredCluster.Score = maxScore; } mergedFeatures.Add(maxScoredCluster); } //if (selectedFeature != null) postFilteredSet.Add(selectedFeature); } //return postFilteredSet.OrderBy(f => f.RepresentativeMass); return(mergedFeatures); }