def global_alignment_score(v, w, scoring_matrix, sigma):
'''Return the global alignment score of v and w subject to the given scoring matrix and indel penalty sigma.'''
# Initialize the scoring matrix.
S = [[0 for j in xrange(len(w)+1)] for i in xrange(len(v)+1)]
# Initialize the edges with the given penalties.
for i in xrange(1, len(v)+1):
S[i][0] = -i*sigma
for j in xrange(1, len(w)+1):
S[0][j] = -j*sigma
# Fill in the Score and Backtrack matrices.
for i in xrange(1, len(v)+1):
for j in xrange(1, len(w)+1):
scores = [S[i-1][j] - sigma, S[i][j-1] - sigma, S[i-1][j-1] + scoring_matrix[v[i-1], w[j-1]]]
S[i][j] = max(scores)
return S[len(v)][len(w)]
if __name__ == '__main__':
from scripts import BLOSUM62, ReadFASTA
# Parse the two input protein strings.
s, t = [fasta[1] for fasta in ReadFASTA('rosalind_fibd.txt')]
# Get the alignment score.
score = str(global_alignment_score(s, t, BLOSUM62(), 5))
# Print and save the answer.
print score
with open('011_FIBD.txt', 'w') as output_data:
output_data.write(score)
ZGVmIGdsb2JhbF9hbGlnbm1lbnRfc2NvcmUodiwgdywgc2NvcmluZ19tYXRyaXgsIHNpZ21hKToKICAgICcnJ1JldHVybiB0aGUgZ2xvYmFsIGFsaWdubWVudCBzY29yZSBvZiB2IGFuZCB3IHN1YmplY3QgdG8gdGhlIGdpdmVuIHNjb3JpbmcgbWF0cml4IGFuZCBpbmRlbCBwZW5hbHR5IHNpZ21hLicnJwoKICAgICMgSW5pdGlhbGl6ZSB0aGUgc2NvcmluZyBtYXRyaXguCiAgICBTID0gW1swIGZvciBqIGluIHhyYW5nZShsZW4odykrMSldIGZvciBpIGluIHhyYW5nZShsZW4odikrMSldCgogICAgIyBJbml0aWFsaXplIHRoZSBlZGdlcyB3aXRoIHRoZSBnaXZlbiBwZW5hbHRpZXMuCiAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgbGVuKHYpKzEpOgogICAgICAgIFNbaV1bMF0gPSAtaSpzaWdtYQogICAgZm9yIGogaW4geHJhbmdlKDEsIGxlbih3KSsxKToKICAgICAgICBTWzBdW2pdID0gLWoqc2lnbWEKCiAgICAjIEZpbGwgaW4gdGhlIFNjb3JlIGFuZCBCYWNrdHJhY2sgbWF0cmljZXMuCiAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgbGVuKHYpKzEpOgogICAgICAgIGZvciBqIGluIHhyYW5nZSgxLCBsZW4odykrMSk6CiAgICAgICAgICAgIHNjb3JlcyA9IFtTW2ktMV1bal0gLSBzaWdtYSwgU1tpXVtqLTFdIC0gc2lnbWEsIFNbaS0xXVtqLTFdICsgc2NvcmluZ19tYXRyaXhbdltpLTFdLCB3W2otMV1dXQogICAgICAgICAgICBTW2ldW2pdID0gbWF4KHNjb3JlcykKCiAgICByZXR1cm4gU1tsZW4odildW2xlbih3KV0KCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBmcm9tIHNjcmlwdHMgaW1wb3J0IEJMT1NVTTYyLCBSZWFkRkFTVEEKCiAgICAjIFBhcnNlIHRoZSB0d28gaW5wdXQgcHJvdGVpbiBzdHJpbmdzLgogICAgcywgdCA9IFtmYXN0YVsxXSBmb3IgZmFzdGEgaW4gUmVhZEZBU1RBKCdyb3NhbGluZF9maWJkLnR4dCcpXQoKICAgICMgR2V0IHRoZSBhbGlnbm1lbnQgc2NvcmUuCiAgICBzY29yZSA9IHN0cihnbG9iYWxfYWxpZ25tZW50X3Njb3JlKHMsIHQsIEJMT1NVTTYyKCksIDUpKQoKICAgICMgUHJpbnQgYW5kIHNhdmUgdGhlIGFuc3dlci4KICAgIHByaW50IHNjb3JlCiAgICB3aXRoIG9wZW4oJzAxMV9GSUJELnR4dCcsICd3JykgYXMgb3V0cHV0X2RhdGE6CiAgICAgIG91dHB1dF9kYXRhLndyaXRlKHNjb3JlKQogICAgICA=