@@ -243,9 +243,14 @@ def get_valid_triplets(node, edges, paths_crossing, min_edge_support, min_covera
243
243
244
244
def resolve_hairpins (nodelength , nodes , paths_crossing , node_seqs , node_lens , edges , maybe_resolvable , min_edge_support , min_coverage , removable_nodes ):
245
245
hairpins = set ()
246
+ unresolvable_hairpins = set ()
246
247
for node in iterate_deterministic (nodes ):
247
248
if ">" + node not in edges : continue
248
249
if "<" + node not in edges : continue
250
+ if len (edges [">" + node ]) >= 2 and "<" + node in edges [">" + node ]:
251
+ unresolvable_hairpins .add (node )
252
+ if len (edges ["<" + node ]) >= 2 and ">" + node in edges ["<" + node ]:
253
+ unresolvable_hairpins .add (node )
249
254
if len (edges [">" + node ]) == 1 and getone (edges [">" + node ]) == "<" + node :
250
255
hairpins .add (">" + node )
251
256
if len (edges ["<" + node ]) == 1 and getone (edges ["<" + node ]) == ">" + node :
@@ -257,6 +262,7 @@ def resolve_hairpins(nodelength, nodes, paths_crossing, node_seqs, node_lens, ed
257
262
for node in hairpins :
258
263
if revnode (node ) in hairpins : continue # double hairpin resolution hard to implement, so just ignore it
259
264
if len (edges [revnode (node )]) == 0 : continue # don't resolve disconnected hairpins, they're probably spurious anyway
265
+ if node [1 :] in unresolvable_hairpins : continue # weird unresolvable structures
260
266
resolutions = {}
261
267
for path in iterate_paths (paths_crossing , node [1 :]):
262
268
if len (path ) < 4 : continue
@@ -310,7 +316,7 @@ def resolve_hairpins(nodelength, nodes, paths_crossing, node_seqs, node_lens, ed
310
316
remove_paths .append (path )
311
317
if len (path ) < 4 : continue
312
318
add_this = []
313
- add_this .append (path [0 ])
319
+ if path [ 0 ][ 1 :] != node [ 1 :]: add_this .append (path [0 ])
314
320
for i in range (1 , len (path )- 2 ):
315
321
if path [i ] == node and path [i + 1 ] == revnode (node ):
316
322
key = (path [i - 1 ], path [i + 2 ])
0 commit comments