112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Fri May 27 13:10:59 2022
|
|
|
|
@author: elena
|
|
"""
|
|
|
|
import pandas as pd
|
|
import numpy as np
|
|
from .loggers import LoggingMixin
|
|
from django.conf import settings
|
|
|
|
class LinearAlignment(LoggingMixin):
|
|
logging_name = "receipeServer.alignment"
|
|
|
|
def __init__(self, logging_group, progress_callback=None):
|
|
super().__init__()
|
|
#self.logging_group = logging_group
|
|
|
|
self.FMatrix = []
|
|
self.distance = 0
|
|
|
|
self.compareString = ''
|
|
self.searchString = ''
|
|
|
|
#self.charIndex = {'A':0, 'B':1, 'C':2, 'D':3, 'E':4, 'F':5, 'G':6, 'H':7, 'I':8,
|
|
# 'J': 9, 'K': 10, 'L':11, 'M':12, 'N':13, 'O':14, 'P':15, 'Q':16, 'R':17,
|
|
# 'S': 18, 'T': 19, 'U':20, 'V':21, 'W':22, 'X':23, 'Y':24, 'Z':25,
|
|
# '1':26, '2': 27, '3': 28, '4':29, '5':30, '6':31, '7':32,
|
|
# '8':33, '9':34, '0':35, ':':36, '.': 37, '!':38, ' ':39, '%':40}
|
|
|
|
self.scoreMatrix = pd.read_csv(settings.BASE_DIR+'/receipe/score_matrix.csv',sep=';',index_col=0,header=0)
|
|
self.scoreMatrix.fillna(0,inplace=True)
|
|
|
|
def setStrings(self, compareString, searchString):
|
|
self.FMatrix = []
|
|
self.compareString = compareString
|
|
self.searchString = searchString
|
|
|
|
def scoring(self):
|
|
#Zeilen
|
|
compareStringSize = len(self.compareString)
|
|
line = []
|
|
|
|
for idx in range(0,compareStringSize + 1):
|
|
line.append(-self.distance*idx)
|
|
|
|
self.FMatrix.append(line)
|
|
|
|
#Spalten
|
|
for idy in range(1,len(self.searchString) + 1) :
|
|
for idx in range(0, compareStringSize):
|
|
if idx == 0:
|
|
line[idx] = -self.distance*idy
|
|
else:
|
|
line[idx] = 0
|
|
|
|
self.FMatrix.append(line)
|
|
|
|
|
|
|
|
for idy in range(1, len(self.FMatrix)):
|
|
for idx in range(1, len(self.FMatrix[0])):
|
|
elements = np.array([])
|
|
|
|
elements = np.append(elements,self.FMatrix[idy-1][idx-1] + self.scoreMatrix[self.searchString[idy-1]][self.compareString[idx-1]])
|
|
elements = np.append(elements,self.FMatrix[idy][idx-1] - self.distance);
|
|
elements = np.append(elements,self.FMatrix[idy-1][idx] - self.distance);
|
|
|
|
biggest = np.max(elements)
|
|
self.FMatrix[idy][idx] = biggest
|
|
|
|
|
|
return self.FMatrix[len(self.FMatrix)-1][len(self.FMatrix[0])-1] / np.max([len(self.compareString),len(self.searchString)]) / 10
|
|
|
|
def backTrace(self):
|
|
if len(self.FMatrix) == 0:
|
|
print('Run scoring before backTrace!')
|
|
return 0
|
|
alignmentA = "";
|
|
alignmentB = "";
|
|
|
|
idx = len(self.compareString)
|
|
idy = len(self.searchString)
|
|
|
|
while (idx > 0 or idy > 0) :
|
|
if (idx > 0) and (idy > 0) and (self.FMatrix[idy][idx] == self.FMatrix[idy-1][idx-1] + self.scoreMatrix[self.searchString[idy-1]][self.compareString[idx-1]]):
|
|
alignmentA = alignmentA + self.compareString[idx-1]
|
|
alignmentB = alignmentB + self.searchString[idy-1]
|
|
idx = idx - 1
|
|
idy = idy - 1
|
|
|
|
elif (idx > 0) and (self.FMatrix[idy][idx-1] - self.distance) :
|
|
alignmentA = alignmentA + self.compareString[idx-1]
|
|
alignmentB = alignmentB + '-'
|
|
idx = idx - 1
|
|
|
|
else:
|
|
alignmentA = alignmentA + '-'
|
|
alignmentB = alignmentB + self.searchString[idy-1]
|
|
idy = idy - 1
|
|
|
|
|
|
|
|
alignmentA = alignmentA[::-1]
|
|
alignmentB = alignmentB[::-1]
|
|
|
|
|
|
return alignmentA,alignmentB
|
|
|