//assumes peaks are sorted by peakrt void mark_overlaps_by_peak_rt(IList <PeaksUsedOrNot> peaks, PeakCoordSet peak_set, PeaksUsedOrNot p) { var overlap_bounds = peak_set.find_overlap_bounds_by_peak_rt_idx(p.p); for (int i = overlap_bounds.leftmost; i <= overlap_bounds.rightmost; i++) { peaks[i].used = true; } }
///this takes the set of peaks and extends them, based on potential shoulder peaks which have odd alignments void extend_peak_set(IList <SlimCrawPeak> in_peaks, IList <SlimCrawPeak> out_peaks, bool start_at_peak = false) { if (in_peaks.Count == 0) { return; } List <SlimCrawPeak> peak_ptrs_by_rt = new List <SlimCrawPeak>(in_peaks); peak_ptrs_by_rt.Sort(crawutils.CompByPeakRTIdx); List <PeaksUsedOrNot> peaks_by_rt = new List <PeaksUsedOrNot>(peak_ptrs_by_rt.Select(p => new PeaksUsedOrNot(p))); List <PeaksUsedOrNot> peaks_by_I = new List <PeaksUsedOrNot>(peaks_by_rt); peaks_by_I.Sort(crawutils.CompByPeakRawHeight); PeakCoordSet peak_coords = new PeakCoordSet(peak_ptrs_by_rt); int intensity_index = peaks_by_I.Count - 1; do { intensity_index--; PeaksUsedOrNot here = peaks_by_I[intensity_index]; if (!here.used) { //extend peak extend_to_1d_zero(here.p, pf.method.extend_from_peak_rt); if (pf.method.ratchet_back_to_frac_maxval > -1) { ratchet_back_to_frac_maxval(here.p, pf.method.ratchet_back_to_frac_maxval); } //exclude overlappers -- find peaks from my start to my end //TODO -- deal with overlappers... or convert to linear walk algorithm //safe, since push_back will copy the dereferenced SlimCrawPeakPtr if (pf.method.exclude_extension_overlaps_by_peakrt) { mark_overlaps_by_peak_rt(peaks_by_rt, peak_coords, here); } out_peaks.Add(here.p); here.used = true; } } while (intensity_index > 0); }