def chain(l): '''Return the chain of letters of t from a sorted list of b-/y-ion masses.''' i, n = 0, len(l) while True: li = l[i] try: i, ti = it.dropwhile(lambda x: not x[1], ((k, ro.aa_of_mass_exact(l[k] - li)) for k in xrange(i + 1, n))).next() except StopIteration: break yield ti
def longest_protein_from_spectrum_graph(a): '''Main driver to solve this problem.''' g = nx.DiGraph() g.add_weighted_edges_from((u, v, r) for u, v, r in ((i, j, ro.aa_of_mass_exact(v - u)) for i, u in enumerate(a) for j, v in enumerate(a) if v > u) if r) i, l = nx.topological_sort(g), np.zeros((len(a),), dtype=int) for u in i: l[u] = 0 if g.in_degree(u) == 0 else (max(l[v] for v in g.predecessors_iter(u)) + 1) u = np.argmax(l) d, s = l[u], '' for _ in xrange(d): v = max((l[v], v) for v in g.predecessors_iter(u))[1] s, u, d = g[v][u]['weight'] + s, v, l[v] return s