nussinov_algorithm.py 953 B

1234567891011121314151617181920212223242526272829
  1. #implement nussinov algorithm to predict secondary structure
  2. def nussinov(seq):
  3. n = len(seq)
  4. #initialize matrix
  5. matrix = np.zeros((n,n))
  6. #fill matrix
  7. for i in range(n):
  8. for j in range(i+4,n):
  9. #fill in the matrix
  10. matrix[i,j] = max(matrix[i,j-1], matrix[i+1,j], matrix[i+1,j-1] + s(seq[i],seq[j]), max([matrix[i,k] + matrix[k+1,j] for k in range(i+1,j)]))
  11. #traceback
  12. i,j = 0,n-1
  13. pairs = []
  14. while i < j:
  15. if matrix[i,j] == matrix[i+1,j]:
  16. i += 1
  17. elif matrix[i,j] == matrix[i,j-1]:
  18. j -= 1
  19. elif matrix[i,j] == matrix[i+1,j-1] + s(seq[i],seq[j]):
  20. pairs.append((i,j))
  21. i += 1
  22. j -= 1
  23. else:
  24. for k in range(i+1,j):
  25. if matrix[i,j] == matrix[i,k] + matrix[k+1,j]:
  26. pairs.append((k,k+1))
  27. i,j = k,k+1
  28. break
  29. return pairs