def pair_f(f, rtimes, std_sizes, similarity, deviation=False): """ match rtimes to std_sizes return: [ (rtime, size), ... ] or [ (rtime, size, f(rtime), dev), ... ] """ rtimes = list(reversed(rtimes)) std_sizes = list(reversed(std_sizes)) similarity = list(reversed(similarity)) S = generate_scores(std_sizes, rtimes, similarity, f) result = dp(S, -5e-3) matches = result['matches'] aligned_peaks = [(rtimes[j], std_sizes[i]) for i, j in matches] if not deviation: return aligned_peaks peak_pairs = [] for (rtime, size) in aligned_peaks: rtime_size = f(rtime) peak_pairs.append((rtime, size, rtime_size, (size - rtime_size)**2)) return peak_pairs
def align_dp(rtimes, sizes, similarity, z, rss, order=3): """ align ladders with peaks using dynamic programming (global alignment) return (dpscore, RSS, Z, ladder_aligned_peaks) """ sizes = list(sorted(sizes, reverse=True)) rtimes = list(sorted(rtimes, reverse=True)) dpscore = -1 while True: S = generate_scores(sizes, rtimes, similarity, np.poly1d(z)) result = dp(S, -5e-3) cur_dpscore = result['D'][-1][-1] matches = result['matches'] aligned_peaks = [(sizes[i], rtimes[j]) for i, j in matches] # realign std_size, peak_sizes = zip(*aligned_peaks) cur_zres = estimate_z(peak_sizes, std_size, order) if cur_dpscore < dpscore: if is_verbosity(4): cerr('W: dynamic programming did not converge!!') break if cur_dpscore == dpscore: break z = cur_zres.z rss = cur_zres.rss dpscore = cur_dpscore sized_peaks = aligned_peaks return DPResult(dpscore, rss, z, sized_peaks)