2023-11-09 18:47:11 +01:00

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