Source code for pytadbit.boundary_aligner.locally

"""
02 Dec 2012

this is not working... Local aligner for Topologically Associated Domains
"""
from __future__ import print_function
from numpy import zeros, log

[docs]def smith_waterma(tads1, tads2): """ WARNING: not working! """ tads1 = [1.0, 3.0, 5.0, 6.0, 12.0, 15.0, 17.0, 19.0] tads2 = [1.0, 5.0, 6.0, 7.0, 10.0, 11.0, 13.0, 17.0, 19.0, 20.0] bin_size = 1. chr_len = 20. for penalty in range(1,10): penalty = -float(penalty)/10 for penalty2 in range(1,10): penalty2 = -float(penalty2)/10 penalty = -0.3 penalty2 = -0.1 print('-'*50) print(' ->', penalty, penalty2) l_tads1= len(tads1) l_tads2= len(tads2) pointers = zeros((l_tads1+1, l_tads2+1)) scores = zeros((l_tads1+1, l_tads2+1)) fieled = zeros((l_tads1+1, l_tads2+1)) #penalty = -.5 for i in range(1, l_tads1+1): for j in range(1, l_tads2+1): value = 1-log((1+bin_size*abs(tads2[j-1]-tads1[i-1]))**2)/log((1+chr_len)**2) penalty_i = penalty_j = penalty penalty_j = penalty2 if pointers[i, j-1] == 1 else penalty penalty_i = penalty2 if pointers[i-1, j] == 2 else penalty vals = {'diag': value + (scores[i-1, j-1]), 'left': value + (scores[i, j-1] ) + penalty_j, 'up' : value + (scores[i-1, j] ) + penalty_i, 'end' : 0} if bin_size*abs(tads2[j-1]-tads1[i-1]) > 3000000: vals['diag'] = scores[i-1, j-1] + penalty best = max(vals, key=lambda x: vals[x]) scores[i, j] = vals[best] fieled[i, j] = value if best == 'end' : pointers[i, j] = 0 elif best == 'left': pointers[i, j] = 1 elif best == 'up' : pointers[i, j] = 2 else: pointers[i, j] = 3 align1 = [] align2 = [] val = scores.argmax() i = val / (len(tads2)+1) j = val % (len(tads2)+1) while pointers[i, j]: if pointers[i, j] == 3: align1.insert(0,tads1[i-1]) align2.insert(0,tads2[j-1]) i -= 1 j -= 1 elif pointers[i, j] == 2: align1.insert(0,tads1[i-1]) align2.insert(0,'-') i -= 1 elif pointers[i, j] == 1: align1.insert(0,'-') align2.insert(0,tads2[j-1]) j -= 1 print(' '.join(['%6s' % (int(y)) for y in [0.0]+tads2])) for x in scores: print(' '.join(['%6s' % (round(y, 2)) for y in x])) for x in pointers: print(' '.join(['%s' % (int(y)) for y in x])) print('|'.join(['%4s' % (str(x)[:-2] if x!='-' else '-'*3) for x in align1])) print('|'.join(['%4s' % (str(x)[:-2] if x!='-' else '-'*3) for x in align2]))
#for x in fieled: print ' '.join(['%6s' % (round(y, 2)) for y in x])