Revision f6c855ef4a7ce63f72dba6b34e9d0e9edd9200ce authored by ctboughter on 01 December 2020, 17:23:16 UTC, committed by ctboughter on 01 December 2020, 17:23:16 UTC
1 parent 73e84d3
AIMS.py
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.factory import Factory
from kivy.properties import ObjectProperty, StringProperty, AliasProperty
from kivy.uix.popup import Popup
from kivy.uix.checkbox import CheckBox
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.scrollview import ScrollView
from kivy.uix.textinput import TextInput
from kivy.clock import Clock
from kivy.event import EventDispatcher
# Loading this in is slow here, so might be nice to put elsewhere...
# Can I bring up over python programs to laod this in?
import numpy as np
from matplotlib import cm
import matplotlib.pyplot as pl
from matplotlib import rcParams
from matplotlib import rc
import pandas
from time import time
import aims_loader as aimsLoad
import aims_analysis as aims
import aims_classification as classy
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import Screen
from os.path import dirname, join
from kivy.lang import Builder
from kivy.properties import NumericProperty, StringProperty, BooleanProperty,\
ListProperty
import os
import re
# Evidently these lines will remove a weird multi-touch emulator from kivy:
from kivy.config import Config
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
# Jesus, this thing really was built for phone apps...
class Root(Screen):
# REALLY Sucks to use global variables, but I'm unsure how else to
# pass all of these across functions
global N; N = 4
global LFile; LFile = ['']
fullscreen = BooleanProperty(False)
def on_pre_enter(self):
global loadLabel
global loadButton
if 'loadLabel' not in globals():
global LFile; LFile = ['']
N = 4
a=0
# Need to re-read through this shit to see what's going on...
for j in np.arange(int(N)):
# No idea what this lambda function does, but it lets us bind show load to the button
if molecule == 'ig':
xxname = 'File '
xname = ''
else:
xxname = 'FASTA '
xname = 'FASTA '
button = Button(text='Load '+ xxname + str(j+1), size_hint=(0.2, 0.075),
pos_hint={'center_x':.15, 'center_y':.75-int(a)*0.6/N},
on_release=lambda x = int(j):self.show_load(win = x),
background_down='app_data/butt_down.png', background_normal='app_data/butt_up.png',
color=(0, 0.033, 0.329, 1),border=(0,0,0,0))
# What an absolute fucking nightmare solution the line above... works though
# Need to make sure we don't overwrite the labels every time we load shit in
if j >= len(LFile):
label = Label(text=xname +'File ' + str(j+1) + ' Path', size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
else:
if LFile[int(j)] != '':
label = Label(text=LFile[int(j)], size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
else:
label = Label(text=xname+'File ' + str(j+1) + ' Path', size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
if a == 0:
loadButton = [button]
loadLabel = [label]
else:
loadButton = loadButton + [button]
loadLabel = loadLabel + [label]
a = a + 1
for i in loadButton:
FloatLayout.add_widget(self, i)
for k in loadLabel:
FloatLayout.add_widget(self, k)
def get_path(self):
return(os.getcwd())
def dismiss_popup(self):
self._popup.dismiss()
# This is getting more and more confusing. Apologies for whoever has to go through this.
# this is basically just a dummy function to keep track of which FASTA file is where...
def do_thing(self,win2 = 1):
global FASTA_L
# What a wild way for all of this to work... BUT IT DOES
if str(type(win2)) == "<class 'kivy.uix.button.Button'>":
FASTA_L = int(win2.text[-1])-1
else:
FASTA_L = win2
# win is how we will try to keep track of using the right button...
def show_load(self, win = 2):
content = LoadDialog(load=self.load, cancel=self.dismiss_popup, fas1 = self.do_thing(win2 = win))
self._popup = Popup(title="Load file", content=content,
size_hint=(0.9, 0.9))
self._popup.open()
def load(self, path, filename):
global LFile
path1 = os.path.join(path, filename[0])
# So FASTA_L should tell you WHERE
# The loadfile is coming from
while FASTA_L+1 > len(LFile):
LFile = LFile + ['']
LFile[FASTA_L] = path1
# Need to have two separate options because we move from Kivy defined buttons to
# python defined buttons. I handle those slightly differently.
loadLabel[FASTA_L].text = path1
if len(LFile) >= 2:
self.next1_1.disabled = False
self.dismiss_popup()
def make_path(self):
global dir_name
self.text1 = self.v_input1.text
dir_name = self.text1
# Basically just recreate the entire screen every time we want to
# add more fastas. Kind of a pain, but it works.
def reset_loadScrn(self):
# need to do something to let people know they need to re-enter everything...
global N
global loadButton
global loadLabel
global LFile
self.lessF.disabled = True
self.next1_1.disabled = True
for i in loadButton:
FloatLayout.remove_widget(self,i)
for j in loadLabel:
FloatLayout.remove_widget(self,j)
# Remove any extra entries, just in case...
while len(LFile) > N:
LFile = LFile[:-1]
def more_fastas(self):
global N
global loadButton
global loadLabel
# Alright so this works...
self.lessF.disabled = False
N = N + 1
a = 0
for i in loadButton:
FloatLayout.remove_widget(self,i)
for j in loadLabel:
FloatLayout.remove_widget(self,j)
for j in np.arange(int(N)):
# No idea what this lambda function does, but it lets us bind show load to the button
if molecule == 'ig':
xxname = 'File '
xname = ''
else:
xxname = 'FASTA '
xname = 'FASTA '
button = Button(text='Load '+ xxname + str(j+1), size_hint=(0.2, 0.075),
pos_hint={'center_x':.15, 'center_y':.75-int(a)*0.6/N},
on_release=lambda x = int(j):self.show_load(win = x),
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
# What an absolute fucking nightmare solution the line above... works though
# Need to make sure we don't overwrite the labels every time we load shit in
if j >= len(LFile):
label = Label(text=xname +'File ' + str(j+1) + ' Path', size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
else:
if LFile[int(j)] != '':
label = Label(text=LFile[int(j)], size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
else:
label = Label(text=xname+'File ' + str(j+1) + ' Path', size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
if a == 0:
loadButton = [button]
loadLabel = [label]
else:
loadButton = loadButton + [button]
loadLabel = loadLabel + [label]
a = a + 1
for i in loadButton:
FloatLayout.add_widget(self, i)
for k in loadLabel:
FloatLayout.add_widget(self, k)
def less_fastas(self):
global N
global loadButton
global loadLabel
# Alright so this works...
N = N - 1
a = 0
# WHAT A MESS THIS IS, BUT IT WORKS!
if N == 4:
self.lessF.disabled = True
for i in loadButton:
FloatLayout.remove_widget(self,i)
for j in loadLabel:
FloatLayout.remove_widget(self,j)
for j in np.arange(int(N)):
# No idea what this lambda function does, but it lets us bind show load to the button
if molecule == 'ig':
xxname = 'File '
xname = ''
else:
xxname = 'FASTA '
xname = 'FASTA '
button = Button(text='Load '+ xxname + str(j+1), size_hint=(0.2, 0.075),
pos_hint={'center_x':.15, 'center_y':.75-int(a)*0.6/N},
on_release=lambda x = int(j):self.show_load(win = x),background_down='app_data/butt_down.png',
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0,0,0,0))
# What an absolute fucking nightmare solution the line above... works though
# Need to make sure we don't overwrite the labels every time we load shit in
if j >= len(LFile):
label = Label(text=xname +'File ' + str(j+1) + ' Path', size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
else:
if LFile[int(j)] != '':
label = Label(text=LFile[int(j)], size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
else:
label = Label(text=xname+'File ' + str(j+1) + ' Path', size_hint=(0.2, 0.075),
pos_hint={'center_x':.62, 'center_y':.75-int(a)*0.6/N},font_name='app_data/Poppins-Light.ttf')
if a == 0:
loadButton = [button]
loadLabel = [label]
else:
loadButton = loadButton + [button]
loadLabel = loadLabel + [label]
a = a + 1
for i in loadButton:
FloatLayout.add_widget(self, i)
for k in loadLabel:
FloatLayout.add_widget(self, k)
def add_widget(self, *args):
if 'content' in self.ids:
return self.ids.content.add_widget(*args)
return super(Root, self).add_widget(*args)
# Alright for our alignment entries, let's try breaking all of
# this code up into another class...
class aligner(Screen):
# Need to redefine a different type of loading from the wild one above.
def dismiss_popup(self):
self._popup.dismiss()
def show_load(self, *args):
content = LoadDialog(load=self.load, cancel=self.dismiss_popup)
self._popup = Popup(title="Load file", content=content,size_hint=(0.9, 0.9))
self._popup.open()
def drop_buts(self):
x = self.align_button1; FloatLayout.remove_widget(self, x)
x = self.align_button2; FloatLayout.remove_widget(self, x)
global align_label
global alignEnt
global thing_loaded
align_label = Label(text = '')
alignEnt = ''
thing_loaded = False
# This is our special load function just for this page, so
# do everything inside this one function
#... probably if I did this more often, I wouldn't need to assign so many
# global variables... whoops.
def load(self, path, filename):
global align_label
global alignEnt
global thing_loaded
pos_path = os.path.join(path, filename[0])
matPos = pandas.read_csv(pos_path,header=0).values
# Check that they have at least two entries
if len(matPos) < 2:
if align_label.text == 'ERROR: Matrix only has 1 row. Must have at least 2':
FloatLayout.remove_widget(self,align_label)
align_label = Label(text='ERROR: Matrix only has 1 row. Must have at least 2', size_hint=(0.4, 0.2),
pos_hint={'center_x':.5, 'center_y':.5}, color = (1, 0, 0, 1))
FloatLayout.add_widget(self, align_label)
button_moved = Button(text='Load Matrix', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.4, 'center_y':0.1}, on_release=self.show_load,
background_down='app_data/butt_down.png',background_normal='app_data/butt_up.png',
color=(0, 0.033, 0.329, 1), border=(0, 0, 0, 0))
button2_moved = Button(text='Resize Entries', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.6, 'center_y':0.1}, on_release=self.load_aligners,
background_down='app_data/butt_down.png',background_normal='app_data/butt_up.png',
color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
FloatLayout.add_widget(self, button2_moved)
FloatLayout.add_widget(self, button_moved)
# Check that they have the right number of columns, or else the program will crash
# LEAVE THIS BE FOR NOW, BUT ACTUALLY IMPLEMENT ASAP
#elif len(matPos[0]) != 6:
# if align_label.text == 'ERROR: Matrix only has 1 row. Must have at least 2':
# FloatLayout.remove_widget(self,align_label)
# align_label = Label(text='ERROR: Matrix only has 1 row. Must have at least 2', size_hint=(0.4, 0.2),
# pos_hint={'center_x':.5, 'center_y':.5}, color = (1, 0, 0, 1))
else:
if align_label.text == 'ERROR: Matrix only has 1 row. Must have at least 2':
FloatLayout.remove_widget(self,align_label)
align_label.text = ''
# REALIZING NOW I DONT HAVE ANY FUNCTIONS TO REMOVE THESE BUTTONS,
# PROBABLY DOESN'T MATTER, BUT THEORETICALLY COULD CAUSE A CRASH?
button_moved = Button(text='Load Matrix', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.4, 'center_y':0.1}, on_release=self.show_load,
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
button2_moved = Button(text='Resize Entries', size_hint=(None, None),background_down='app_data/butt_down.png',
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0),
size =('150dp','48dp'),pos_hint={'center_x':.6, 'center_y':0.1}, on_release=self.load_aligners)
FloatLayout.add_widget(self, button2_moved)
FloatLayout.add_widget(self, button_moved)
# If we're running this script again, we've almost certainly gotta remove it...
if alignEnt != '':
for entry in alignEnt:
for j in entry:
FloatLayout.remove_widget(self, j)
for j in np.arange(len(matPos)):
if matPos[j,0] != '':
name = matPos[j,0]
else:
name = 'FASTA ' + str(j+1)
textinput0 = TextInput(text=name, multiline=False, size_hint = (None, None),write_tab =False,
pos_hint = {'center_x': 0.1, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='125dp')
textinput1 = TextInput(text=str(matPos[j,1]), multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.25, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput2 = TextInput(text=str(matPos[j,2]), multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.4, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput3 = TextInput(text=str(matPos[j,3]), multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.55, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput4 = TextInput(text=str(matPos[j,4]), multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.7, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput5 = TextInput(text=str(matPos[j,5]), multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.85, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
if int(j) == 0:
alignEnt = [[textinput0,textinput1,textinput2,textinput3,textinput4,textinput5]]
else:
alignEnt = alignEnt + [[textinput0,textinput1,textinput2,textinput3,textinput4,textinput5]]
# Before adding in all of the new ones
for entry in alignEnt:
for j in entry:
FloatLayout.add_widget(self, j)
thing_loaded = True
self.dismiss_popup()
def load_aligners(self, *args):
global align_label
global alignEnt
global thing_loaded
# Literally just here so we can have these messages or not
if len(LFile) < 2:
if align_label.text == 'ERROR: MUST LOAD AT LEAST TWO FILES':
FloatLayout.remove_widget(self,align_label)
align_label = Label(text='ERROR: MUST LOAD AT LEAST TWO FILES', size_hint=(0.4, 0.2),
pos_hint={'center_x':.5, 'center_y':.5}, color = (1, 0, 0, 1))
FloatLayout.add_widget(self, align_label)
button_moved = Button(text='Load Matrix', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.4, 'center_y':0.1}, on_release=self.show_load,
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
button2_moved = Button(text='Resize Entries', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.6, 'center_y':0.1}, on_release=self.load_aligners,
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
FloatLayout.add_widget(self, button2_moved)
FloatLayout.add_widget(self, button_moved)
else:
if align_label.text == 'ERROR: MUST LOAD AT LEAST TWO FILES':
FloatLayout.remove_widget(self,align_label)
align_label.text = ''
button_moved = Button(text='Load Matrix', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.4, 'center_y':0.1}, on_release=self.show_load,
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
button2_moved = Button(text='Resize Entries', size_hint=(None, None),
size =('150dp','48dp'),pos_hint={'center_x':.6, 'center_y':0.1}, on_release=self.load_aligners,
background_normal='app_data/butt_up.png',color=(0, 0.033, 0.329, 1),border=(0, 0, 0, 0))
FloatLayout.add_widget(self, button2_moved)
FloatLayout.add_widget(self, button_moved)
# If we're running this script again, we've almost certainly gotta remove it...
if alignEnt != '':
for entry in alignEnt:
for j in entry:
FloatLayout.remove_widget(self, j)
for j in np.arange(len(LFile)):
if LFile[j] != '':
startname = [y.end() for y in re.finditer('/',LFile[j])]
endname = [y.start() for y in re.finditer('.fasta',LFile[j])]
if len(endname) == 0:
endname = [int(len(LFile[j])-1)]
name = LFile[j][int(startname[len(startname)-1]):int(endname[0])]
else:
name = 'File ' + str(j+1)
textinput0 = TextInput(text=name, multiline=False, size_hint = (None, None),write_tab =False,
pos_hint = {'center_x': 0.1, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='125dp')
textinput1 = TextInput(text='', multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.25, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput2 = TextInput(text='', multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.4, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput3 = TextInput(text='', multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.55, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput4 = TextInput(text='', multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.7, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
textinput5 = TextInput(text='', multiline=False, size_hint = (None, None),write_tab = False,
pos_hint = {'center_x': 0.85, 'center_y': 0.60-int(j)*0.5/N}, height = '32dp',width='42dp')
if int(j) == 0:
alignEnt = [[textinput0,textinput1,textinput2,textinput3,textinput4,textinput5]]
else:
alignEnt = alignEnt + [[textinput0,textinput1,textinput2,textinput3,textinput4,textinput5]]
# Before adding in all of the new ones
for entry in alignEnt:
for j in entry:
FloatLayout.add_widget(self, j)
thing_loaded = True
# So now we're done with our loading stuff, let's wrap things up and get ready to move on...
def make_path(self):
global dir_name
self.text1 = self.input1.text
dir_name = self.text1
def check_aligns(self):
global mat_coords
global labels
global check_run
# Really idiot-proof this thing, in case someone is just buzzing through the screens
if 'thing_loaded' in globals():
if thing_loaded:
# Convert our weird little kivy objects into a numpy array
x,y = np.shape(alignEnt)
for row in np.arange(x):
for column in np.arange(y):
if column == 0:
mat_pre = alignEnt[row][column].text
else:
mat_pre = np.hstack((mat_pre,alignEnt[row][column].text))
if row == 0:
mat_coords = mat_pre
else:
mat_coords = np.vstack((mat_coords,mat_pre))
labels = mat_coords[:,0]
# When you go back this far, make sure we recreate the checkbox screen
if 'check_run' in globals():
# So intelligently, if you define something as a global variable
# but don't "fill" it, it won't register as being in globals.
del check_run
class LoadDialog(FloatLayout):
load = ObjectProperty(None)
cancel = ObjectProperty(None)
fas1 = ObjectProperty(None)
def get_path(self):
return(os.getcwd())
# let's try to have all of my nice python functions in
# the "analysis" screen instance:
class Analysis(Screen):
def get_matrix(self):
# Ok so here is where I will actually call my python code
# For now, print all the shit
#########################################
# DEFINE PLOT PARAMETERS:
font = {'family' : 'Arial',
'weight' : 'bold',
'size' : 16}
COLOR = 'black'
rcParams['text.color'] = 'black'
rcParams['axes.labelcolor'] = COLOR
rcParams['xtick.color'] = COLOR
rcParams['ytick.color'] = COLOR
rc('font', **font)
##########################################
global seq_MIf
global seqNameF
global seq_final
global labels
this_dir = os.getcwd()
paths = LFile
# mat_coords is predefined from above function
######### PRE LOAD DATA SO TESTING CAN GO FASTER!!!! #############
# x1 = np.array(['cd1','HLA-A','UFA','UAA','UDA']); x2 = np.array(['124','170','22','2','2'])
# x3 = np.array(['167','210','66','49','49']); x4 = np.array(['209','260','105','93','93'])
# x5 = np.array(['262','306','158','152','152']); x6 = np.array(['303','348','199','193','193'])
# mat_coords = np.transpose(np.vstack((x1,x2,x3,x4,x5,x6)))
# paths = ['/Users/boughter/Desktop/AIMS/gui/AIMS/mhc_testData/cd1_seqs.fasta',
# '/Users/boughter/Desktop/AIMS/gui/AIMS/mhc_testData/hlaA_seqs.fasta',
# '/Users/boughter/Desktop/AIMS/gui/AIMS/mhc_testData/cd1_ufa_genes.fasta',
# '/Users/boughter/Desktop/AIMS/gui/AIMS/mhc_testData/UAA_seqs.fasta',
# '/Users/boughter/Desktop/AIMS/gui/AIMS/mhc_testData/UDA_seqs.fasta']
#################### DEBUG VERSION ONLY #########################
if len(paths) < 2:
self.img1.source = this_dir + '/app_data/error_load.png'
return()
AA_num_key = aims.get_props()[1]
# Labels will always be predefined for Abs
# Predefined, but poorly formatted... reformat here
global labels
global LOOPnum
global exp_drop
global mat_size
if molecule == 'mhc':
data = mat_coords[:,1:]
if len(labels) != len(paths):
# need to make a new error message for this.
self.img1.source = this_dir + '/app_data/error_load.png'
return()
for i in np.arange(len(paths)):
if molecule == 'mhc':
#if any(data[:,i] == ['','','','','']):
# self.img1.source = this_dir + '/app_data/error_pos.png'
# return()
# turn data into an integer.
int_dat = [int(x) for x in data[i]]
seq,seq_key = aimsLoad.mhc_loader(paths[i],int_dat,labels[i])
else:
seq = aimsLoad.Ig_loader(paths[i],labels[i],loops=LOOPnum,drop_degens=exp_drop)
if i == 0:
seq_final = seq
seq_size = np.shape(seq)[1]
seqNameF = labels[i]
if molecule == 'mhc':
seq_keyF = seq_key
mat_size = aims.get_sequence_dimension(np.array(seq))[0]
else:
seq_final = pandas.concat([seq_final,seq],axis = 1)
seqNameF = np.vstack((seqNameF,labels[i]))
seq_size = np.vstack((seq_size,np.shape(seq)[1]))
if molecule == 'mhc':
seq_keyF = np.hstack((seq_keyF,seq_key))
mat_size2 = aims.get_sequence_dimension(np.array(seq))[0]
if type(mat_size) != int:
max_lenp=np.zeros(len(mat_size))
for i in np.arange(len(mat_size)):
max_lenp[i]=int(max(mat_size[i],mat_size2[i]))
else:
max_lenp = int(max(mat_size,mat_size2))
mat_size = max_lenp
seq_MI = aims.gen_tcr_matrix(np.array(seq_final),key = AA_num_key, giveSize = mat_size)
# Convert our MI matrix to a pandas dataframe
seq_MIf = pandas.DataFrame(np.transpose(seq_MI),columns = seq_final.columns)
fig, ax = pl.subplots(1, 1,squeeze=False,figsize=(16,8))
ax[0,0].imshow(seq_MI, interpolation='nearest', aspect='auto',cmap=cm.jet)
# Need to try to draw lines separating the distinct groups...
seq_locs = 0
for i in np.arange(len(seq_size)-1):
seq_locs = seq_locs + seq_size[i]
ax[0,0].plot(np.arange(len(np.transpose(seq_MI))),np.ones(len(np.transpose(seq_MI)))*seq_locs,'white',linewidth = 3)
# Alright now we want to change xlabel to actually talk about the features...
ax[0,0].set_ylabel('Sequence Number')
global xtick_loc
if type(mat_size) != int:
for i in np.arange(len(mat_size)):
if i == 0:
xtick_loc = [mat_size[i]/2]
else:
pre_loc = sum(mat_size[:i])
xtick_loc = xtick_loc + [mat_size[i]/2 + pre_loc]
ax[0,0].set_xticks(xtick_loc)
else:
xtick_loc = [mat_size/2]
ax[0,0].set_xticks(xtick_loc)
if molecule == 'mhc':
ax[0,0].set_xticklabels(['Strand 1','Helix 1','Strand 2','Helix 2'])
else:
if LOOPnum == 6:
ax[0,0].set_xticklabels(['CDR1L','CDR2L','CDR3L','CDR1H','CDR2H','CDR3H'])
elif LOOPnum == 2:
ax[0,0].set_xticklabels(['CDR3H','CDR3L'])
elif LOOPnum == 3:
ax[0,0].set_xticklabels(['CDR1','CDR2','CDR3'])
elif LOOPnum == 1:
ax[0,0].set_xticklabels(['CDR Loop'])
# NOTE need to make sure that I do something so that files are not overwritten...
if os.path.exists(this_dir +'/' + dir_name):
None
else:
os.mkdir(this_dir +'/' + dir_name)
fig.savefig(this_dir + '/' + dir_name + '/matrix.pdf',format='pdf',dpi=500)
fig.savefig(this_dir + '/' + dir_name + '/matrix.png',format='png',dpi=500)
# save raw data at all steps now...
np.savetxt(this_dir + '/' + dir_name + '/raw_matrix.dat',seq_MIf,fmt='%.3f')
if molecule == 'mhc':
np.savetxt(this_dir + '/' + dir_name + '/sequence_key.txt',seq_keyF,fmt='%s')
self.img1.source = this_dir + '/' + dir_name + '/matrix.png'
def get_props(self):
global pcaF
pca_props = aims.gen_clone_props(np.array(np.transpose(seq_MIf)))
pcaF = pandas.DataFrame(pca_props,columns = seq_MIf.columns)
fig, ax = pl.subplots(1, 1,squeeze=False,figsize=(16,8))
x_axis = x_axis = np.array([-0.2,0.9,2,3.1])
# Need to have some kind of color wheel to replace this...
#colors = ['purple','green','black','orange']
for i in np.arange(len(seqNameF)):
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
plotThis = np.array(pcaF[index])
# Specifically plot the first 5 properties here... Make sure that I
# have some way soon to actually select these...
ax[0,0].bar(x_axis+i*1/len(seqNameF), np.average(plotThis[1:5,:],axis = 1),
yerr = np.std(plotThis[1:5,:],axis = 1),alpha = 0.5, width = 1/len(seqNameF))
ax[0,0].legend(labels)
ax[0,0].set_xticks([0.2,1.3,2.4,3.5])
ax[0,0].set_xticklabels(['Charge','Hydrophobicity','Flexibility','Bulkiness'])
ax[0,0].set_xlabel('Biophysical Property')
ax[0,0].set_ylabel('Normalized Property Value')
this_dir = os.getcwd()
fig.savefig(this_dir + '/' + dir_name + '/physical_props.pdf',format='pdf',dpi=500)
fig.savefig(this_dir + '/' + dir_name + '/physical_props.png',format='png',dpi=500)
np.savetxt(this_dir + '/' + dir_name + '/property_masks.dat',pcaF,fmt='%.3f')
#NOTE DELETE THIS BELOW LINE ASAP
self.img4.source = this_dir + '/' + dir_name + '/physical_props.png'
def do_pca(self):
from sklearn.decomposition import PCA
global checked
this_dir = os.getcwd()
# The "things" are here to track number of entries in PCA groups
thing1 = True
for i in np.arange(len(seqNameF)):
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
# Alright so our new matrix, checked is "i" rows by three
if checked[i,0]:
if thing1:
pg1 = np.array(pcaF[index])
thing1 = False
else:
pg1 = np.hstack((pg1,pcaF[index]))
pca_Doit = np.transpose(pg1)
pca = PCA(n_components=3, svd_solver='full')
pca.fit(pca_Doit)
explain_var = pca.explained_variance_ratio_
comps1=pca.components_[0]
comps2=pca.components_[1]
comps3=pca.components_[2]
prop_names = pandas.read_csv('app_data/property_names.txt',header=None).values
all_comps = np.vstack((prop_names.reshape(len(prop_names)),comps1,comps2,comps3))
# Alrightn now we need to sort on the pca components
indices_topProps = np.argsort(abs(comps1))
compile_Props = np.vstack((prop_names.reshape(len(prop_names)),comps1))
final_pc1 = compile_Props[:,indices_topProps[-10:]]
self.exp1.text = str(round(explain_var[0],3))
self.exp2.text = str(round(explain_var[1],3))
self.exp3.text = str(round(explain_var[2],3))
# We square the weights so that they then sum to 1.
self.name10.text = str(final_pc1[0,0]); self.weight10.text = str(round(final_pc1[1,0]**2,4))
self.name9.text = str(final_pc1[0,1]); self.weight9.text = str(round(final_pc1[1,1]**2,4))
self.name8.text = str(final_pc1[0,2]); self.weight8.text = str(round(final_pc1[1,2]**2,4))
self.name7.text = str(final_pc1[0,3]); self.weight7.text = str(round(final_pc1[1,3]**2,4))
self.name6.text = str(final_pc1[0,4]); self.weight6.text = str(round(final_pc1[1,4]**2,4))
self.name5.text = str(final_pc1[0,5]); self.weight5.text = str(round(final_pc1[1,5]**2,4))
self.name4.text = str(final_pc1[0,6]); self.weight4.text = str(round(final_pc1[1,6]**2,4))
self.name3.text = str(final_pc1[0,7]); self.weight3.text = str(round(final_pc1[1,7]**2,4))
self.name2.text = str(final_pc1[0,8]); self.weight2.text = str(round(final_pc1[1,8]**2,4))
self.name1.text = str(final_pc1[0,9]); self.weight1.text = str(round(final_pc1[1,9]**2,4))
# Alright so let me try to have labels encoded in to the MHC_6 kivy file
# and then just populate them with things every time we run this function
# THIS SECTION IS WHERE YOU WOULD PUT PLOTS THAT YOU WANNA SEE
from mpl_toolkits import mplot3d
fig3d = pl.figure(figsize = (10, 10))
ax3d = fig3d.add_subplot(111, projection='3d')
legName = []
for i in np.arange(len(seqNameF)):
# What a dumb way to do this but I'm unsure how else to reverse this...
if len(seqNameF) > 2:
if checked[i,2] == False:
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
group_transform = pca.transform(np.transpose(pcaF[index]))
legName = legName + [labels[i]]
ax3d.scatter(group_transform[:,0],group_transform[:,1],group_transform[:,2],marker='o',alpha=0.5,s=50)
else:
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
group_transform = pca.transform(np.transpose(pcaF[index]))
legName = legName + [labels[i]]
ax3d.scatter(group_transform[:,0],group_transform[:,1],group_transform[:,2],marker='o',alpha=0.5,s=50)
#pl.legend(['seq1','seq2','seq3'])
ax3d.set_xlabel('PC1',labelpad=20)
ax3d.set_ylabel('PC2',labelpad=20)
ax3d.set_zlabel('PC3',labelpad=10)
ax3d.legend(legName)
fig3d.savefig(this_dir + '/' + dir_name + '/pca_3D.pdf',format='pdf',dpi=500)
fig3d.savefig(this_dir + '/' + dir_name + '/pca_3D.png',format='png',dpi=500)
fig, ax2 = pl.subplots(1, 1,squeeze=False,figsize=(10,10))
for i in np.arange(len(seqNameF)):
if len(seqNameF) > 2:
if checked[i,2] == False:
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
group_transform = pca.transform(np.transpose(pcaF[index]))
pl.scatter(group_transform[:,0],group_transform[:,1])
else:
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
group_transform = pca.transform(np.transpose(pcaF[index]))
pl.scatter(group_transform[:,0],group_transform[:,1])
ax2[0,0].set_xlabel('PC1')
ax2[0,0].set_ylabel('PC2')
fig.legend(legName)
fig.savefig(this_dir + '/' + dir_name + '/pca_2D.pdf',format='pdf',dpi=500)
# And save the raw data
np.savetxt(this_dir + '/' + dir_name + '/pca_transformed_data.dat',group_transform,fmt='%.3f')
np.savetxt(this_dir + '/' + dir_name + '/pca_component_weights.dat',all_comps,fmt='%s')
np.savetxt(this_dir + '/' + dir_name + '/pca_explained_variance.dat',explain_var,fmt='%.3f')
self.img6.source = this_dir + '/' + dir_name + '/pca_3D.png'
def get_pos_props(self):
this_dir = os.getcwd()
global lda_checked
# The "things" are here to track number of entries in PCA groups
thing1 = True
thing2 = True
for i in np.arange(len(seqNameF)):
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
# Alright so our new matrix, checked is "i" rows by three
# 0 is the "group 1", 1 is the "group 2"
if lda_checked[i,0]:
if thing1:
pg1 = np.array(seq_MIf[index])
thing1 = False
else:
pg1 = np.hstack((pg1,seq_MIf[index]))
elif lda_checked[i,1]:
if thing2:
pg2 = np.array(seq_MIf[index])
thing2 = False
else:
pg2 = np.hstack((pg2,seq_MIf[index]))
pos_sens1=aims.gen_dset_props(np.array(np.transpose(pg1)),stdev=False)
pos_sens2=aims.gen_dset_props(np.array(np.transpose(pg2)),stdev=False)
fig, ax = pl.subplots(2, 1,squeeze=False,figsize=(16,8))
global LOOPnum
global xtick_loc
for prop in np.arange(2):
if prop == 0:
x = 0; y = 0
elif prop == 1:
x = 1; y = 0
plotThis1 = pos_sens1[prop+2]
plotThis2 = pos_sens2[prop+2]
# Specifically plot the first 5 properties here... Make sure that I
# have some way soon to actually select these...
ax[x,y].plot(np.arange(len(plotThis1)), plotThis1)
ax[x,y].plot(np.arange(len(plotThis2)), plotThis2)
ax[x,y].legend(['Group1', 'Group2'])
if molecule == 'mhc':
ax[x,y].set_xticks(xtick_loc)
ax[0,0].set_xticklabels(['Strand 1','Helix 1','Strand 2','Helix 2'])
else:
if LOOPnum == 6:
ax[x,y].set_xticks(xtick_loc)
ax[x,y].set_xticklabels(['CDR1L','CDR2L','CDR3L','CDR1H','CDR2H','CDR3H'])
elif LOOPnum == 3:
ax[x,y].set_xticks(xtick_loc)
ax[x,y].set_xticklabels(['CDR1','CDR2','CDR3'])
elif LOOPnum == 2:
ax[x,y].set_xticks(xtick_loc)
ax[x,y].set_xticklabels(['CDR3H','CDR3L'])
elif LOOPnum == 1:
ax[x,y].set_xticks(xtick_loc)
ax[x,y].set_xticklabels(['CDR Loop'])
# Since there's only two now, just easier to hard code these...
ax[0,0].set_ylabel('Normalized Charge')
ax[1,0].set_ylabel('Normalized Hydrophobicity')
fig.savefig(this_dir + '/' + dir_name + '/pos_prop.pdf',format='pdf',dpi=500)
fig.savefig(this_dir + '/' + dir_name + '/pos_prop.png',format='png',dpi=500)
# And save the raw data
np.savetxt(this_dir + '/' + dir_name + '/position_sensitive_mat1.dat',pos_sens1,fmt='%.3f')
np.savetxt(this_dir + '/' + dir_name + '/position_sensitive_mat2.dat',pos_sens2,fmt='%.3f')
self.img8.source = this_dir + '/' + dir_name + '/pos_prop.png'
def do_lda(self):
this_dir = os.getcwd()
# The "things" are here to track number of entries in PCA groups
thing1 = True
thing2 = True
for i in np.arange(len(seqNameF)):
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
# Alright so our new matrix, checked is "i" rows by three
# 0 is the "group 1", 1 is the "group 2"
if lda_checked[i,0]:
if thing1:
pg1 = np.array(seq_final[index])
thing1 = False
else:
pg1 = np.hstack((pg1,seq_final[index]))
elif lda_checked[i,1]:
if thing2:
pg2 = np.array(seq_final[index])
thing2 = False
else:
pg2 = np.hstack((pg2,seq_final[index]))
# Should probably make NumVects an option you can change...
numVects = int(self.inputLDA.text)
# Here we also need to get a pre-defined matrix size...
num1 = np.shape(pg1)[1]
num2 = np.shape(pg2)[1]
#x,y,MatrixSize = aims.gen_tcr_matrix(pg1,pre_mono=pg2,binary=True,return_Size=True)
acc_all,weights,cols,indices,mda_all,dropped = classy.do_linear_split(pg1, pg2, matSize = numVects)
# Seaborn plots look nicer for these LDA figures
import seaborn as sns
fig = pl.figure(figsize = (12, 12))
dset = ["Linear Discriminant Analysis" for x in range(num1+num2)]
reacts = ["Group 1" for x in range(num1)] + ["Group 2" for x in range(num2)]
d1 = {'Dataset': dset, 'Linear Discriminant 1': mda_all.reshape(len(mda_all)),
'Reactivity' : reacts}
df1 = pandas.DataFrame(data=d1)
sns.set(style="white", color_codes=True,font_scale=1.5)
sns.swarmplot(x="Dataset", y="Linear Discriminant 1", data=df1, hue = 'Reactivity', palette = "Dark2")
fig.savefig(this_dir + '/' + dir_name + '/lda.pdf',format='pdf',dpi=500)
fig.savefig(this_dir + '/' + dir_name + '/lda.png',format='png',dpi=500)
# And save the raw data
np.savetxt(this_dir + '/' + dir_name + '/lda_data.dat',mda_all,fmt='%.3f')
# Need to put acc_all somewhere on the screen
indices_topProps = np.argsort(abs(weights))
compile_Props = np.vstack((cols[indices],weights))
final_pc1 = compile_Props[:,indices_topProps[0][-10:]]
np.savetxt(this_dir + '/' + dir_name + '/lda_weights.dat',compile_Props,fmt='%s')
# For running multiple times with vectors less than 10, need to reset screen...
self.aname10.text = ''; self.aname9.text = ''; self.aname8.text = ''; self.aname7.text = ''
self.aname6.text = ''; self.aname5.text = ''; self.aname4.text = ''; self.aname3.text = ''
self.aname2.text = ''; self.aname1.text = '';
self.aweight10.text = ''; self.aweight9.text = ''; self.aweight8.text = ''; self.aweight7.text = ''
self.aweight6.text = ''; self.aweight5.text = ''; self.aweight4.text = ''; self.aweight3.text = ''
self.aweight2.text = ''; self.aweight1.text = '';
# Update the weights and labels onto the screen:
self.aname10.text =str(final_pc1[0,0]); self.aweight10.text= str(round(final_pc1[1,0],4))
if numVects > 1:
self.aname9.text = str(final_pc1[0,1]); self.aweight9.text = str(round(final_pc1[1,1],4))
if numVects > 2:
self.aname8.text = str(final_pc1[0,2]); self.aweight8.text = str(round(final_pc1[1,2],4))
if numVects > 3:
self.aname7.text = str(final_pc1[0,3]); self.aweight7.text = str(round(final_pc1[1,3],4))
if numVects > 4:
self.aname6.text = str(final_pc1[0,4]); self.aweight6.text = str(round(final_pc1[1,4],4))
if numVects > 5:
self.aname5.text = str(final_pc1[0,5]); self.aweight5.text = str(round(final_pc1[1,5],4))
if numVects > 6:
self.aname4.text = str(final_pc1[0,6]); self.aweight4.text = str(round(final_pc1[1,6],4))
if numVects > 7:
self.aname3.text = str(final_pc1[0,7]); self.aweight3.text = str(round(final_pc1[1,7],4))
if numVects > 8:
self.aname2.text = str(final_pc1[0,8]); self.aweight2.text = str(round(final_pc1[1,8],4))
if numVects > 9:
self.aname1.text = str(final_pc1[0,9]); self.aweight1.text = str(round(final_pc1[1,9],4))
self.img9.source = this_dir + '/' + dir_name + '/lda.png'
def get_freq(self):
this_dir = os.getcwd()
global freq1,freq2
global mat_size
AA_key=['A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V']
fig, ax = pl.subplots(1, 1,squeeze=False,figsize=(16,8))
x=ax[0,0].pcolormesh(freq1[:,1:]-freq2[:,1:],cmap=cm.PiYG)
pl.colorbar(x)
xax=pl.setp(ax,xticks=np.arange(20)+0.5,xticklabels=AA_key)
place=0
for i in mat_size:
place += i
pl.plot(np.arange(21),place*np.ones(21),'black')
ax[0,0].legend(['Group1', 'Group2'])
# Since there's only two now, just easier to hard code these...
fig.savefig(this_dir + '/' + dir_name + '/frequency.pdf',format='pdf',dpi=500)
fig.savefig(this_dir + '/' + dir_name + '/frequency.png',format='png',dpi=500)
# And save the raw data
np.savetxt(this_dir + '/' + dir_name + '/frequency_mat1.dat',freq1,fmt='%.3f')
np.savetxt(this_dir + '/' + dir_name + '/frequency_mat2.dat',freq2,fmt='%.3f')
self.img11.source = this_dir + '/' + dir_name + '/frequency.png'
def get_shannon(self):
this_dir = os.getcwd()
global lda_checked
# The "things" are here to track number of entries in PCA groups
thing1 = True
thing2 = True
for i in np.arange(len(seqNameF)):
index = [column for column in pcaF.columns if seqNameF[i][0] in column]
# Alright so our new matrix, checked is "i" rows by three
# 0 is the "group 1", 1 is the "group 2"
if lda_checked[i,0]:
if thing1:
pg1 = np.array(seq_MIf[index])
thing1 = False
else:
pg1 = np.hstack((pg1,seq_MIf[index]))
elif lda_checked[i,1]:
if thing2:
pg2 = np.array(seq_MIf[index])
thing2 = False
else:
pg2 = np.hstack((pg2,seq_MIf[index]))
global freq1
global freq2
shannon1,freq1=aims.calculate_shannon(np.array(np.transpose(pg1)))
shannon2,freq2=aims.calculate_shannon(np.array(np.transpose(pg2)))
fig, ax = pl.subplots(1, 1,squeeze=False,figsize=(16,8))
global LOOPnum
global xtick_loc
ax[0,0].plot(shannon1)
ax[0,0].plot(shannon2)
ax[0,0].legend(['Group1', 'Group2'])
# Since there's only two now, just easier to hard code these...
pl.ylabel('Shannon Entropy (Bits)')
fig.savefig(this_dir + '/' + dir_name + '/shannon.pdf',format='pdf',dpi=500)
fig.savefig(this_dir + '/' + dir_name + '/shannon.png',format='png',dpi=500)
# And save the raw data
np.savetxt(this_dir + '/' + dir_name + '/shannon_mat1.dat',shannon1,fmt='%.3f')
np.savetxt(this_dir + '/' + dir_name + '/shannon_mat2.dat',shannon2,fmt='%.3f')
self.img10.source = this_dir + '/' + dir_name + '/shannon.png'
class checker(Screen):
# Need to redefine a different type of loading from the wild one above.
def on_pre_enter(self, *args):
global check_status
if 'check_run' not in globals():
check_L1 = Label(text='Include in PCA',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.6},font_name='app_data/Poppins-Medium.ttf')
FloatLayout.add_widget(self, check_L1)
# only add in these you have MORE than 2 options
if len(labels) > 2:
check_L2 = Label(text='Exclude from PCA',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.45},font_name='app_data/Poppins-Medium.ttf')
FloatLayout.add_widget(self, check_L2)
check_L3 = Label(text='Exclude from Plot',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.3},font_name='app_data/Poppins-Medium.ttf')
check_L4 = Label(text='(Optional)',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.25},font_name='app_data/Poppins-Medium.ttf')
FloatLayout.add_widget(self, check_L3)
FloatLayout.add_widget(self, check_L4)
for j in np.arange(len(labels)):
names = Label(text=labels[j], size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.70},font_name='app_data/Poppins-Medium.ttf')
if len(labels) > 2:
box1 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j),state = 'down',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.6})
box2 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j),
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.45})
box3 = CheckBox(size_hint = (None,None), height = '48dp',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.3})
else:
box1 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j),state = 'down',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.6})
if int(j) == 0:
if len(labels) > 2:
check_status = [[names,box1,box2,box3]]
else:
check_status = [[names,box1]]
else:
if len(labels) > 2:
check_status = check_status + [[names,box1,box2,box3]]
else:
check_status = check_status + [[names,box1]]
# Before adding in all of the new ones
for entry in check_status:
for j in entry:
FloatLayout.add_widget(self, j)
# Make sure these boxes are deleted and recreated...
global check_run
check_run = True
def check_checks(self):
global checked
global check_status
# Convert our weird little kivy objects into a numpy array
x,y = np.shape(check_status)
for row in np.arange(x):
for column in np.arange(y):
# Exclude the name column
if column == 0:
continue
if column == 1:
check_pre = check_status[row][column].active
else:
check_pre = np.hstack((check_pre,check_status[row][column].active))
if row == 0:
checked = check_pre
else:
checked = np.vstack((checked,check_pre))
class aligner_ab(Screen):
def make_path(self):
global dir_name
self.text1 = self.input1.text
dir_name = self.text1
def on_pre_enter(self, *args):
global ab_check
global alignAb
global labels
if 'ab_check' not in globals():
for j in np.arange(len(LFile)):
name = 'File '+str(j)
y_val = float(0.50 - 0.1*np.floor(int(j)/5))
x_val = float(0.1 + int(j)%5*0.9/(5))
textinputAb = TextInput(text=name, multiline=False, size_hint = (None, None),write_tab =False,
pos_hint = {'center_x': x_val, 'center_y': y_val}, height = '32dp',width='125dp')
if int(j) == 0:
alignAb = [textinputAb]
else:
alignAb = alignAb + [textinputAb]
# Before adding in all of the new ones
for entry in alignAb:
FloatLayout.add_widget(self, entry)
else:
for entry in alignAb:
FloatLayout.remove_widget(self, entry)
# HERE, why are we going back to "File" when clearly this page
# has already been run? change this to read in "labels" or something
for j in np.arange(len(LFile)):
if 'labels' in globals():
if len(labels) > j:
name = labels[j]
else:
name = 'File '+str(j)
else:
name = 'File '+str(j)
y_val = float(0.50 - 0.1*np.floor(int(j)/5))
x_val = float(0.1 + int(j)%5*0.9/(5))
textinputAb = TextInput(text=name, multiline=False, size_hint = (None, None),write_tab =False,
pos_hint = {'center_x': x_val, 'center_y': y_val }, height = '32dp',width='125dp')
if int(j) == 0:
alignAb = [textinputAb]
else:
alignAb = alignAb + [textinputAb]
# Before adding in all of the new ones
for entry in alignAb:
FloatLayout.add_widget(self, entry)
# Make sure these boxes are deleted and recreated...
global ab_check
ab_check = True
def check_aligns(self):
global labels
global ab_check
x = len(alignAb)
for row in np.arange(x):
if row == 0:
labels = alignAb[row].text
else:
labels = np.vstack((labels,alignAb[row].text))
# Get labels out of the GD weird format.
labels = [i[0] for i in labels]
# Figure out what number of loops we are doing
global LOOPnum
if self.cdr1.active == True:
LOOPnum = 1
elif self.cdr2.active == True:
LOOPnum = 2
elif self.cdr3.active == True:
LOOPnum = 3
elif self.cdr6.active == True:
LOOPnum = 6
global exp_drop
exp_drop = self.degen_drop.active
################## NOW WE MOVE INTO THE LDA/BINARY COMPARISON SECTION ###############
class lda_binary(Screen):
# Need to redefine a different type of loading from the wild one above.
def on_pre_enter(self, *args):
global lda_status
if 'check_lda' not in globals():
lda_L1 = Label(text='Binary Class 1',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.6},font_name='app_data/Poppins-Medium.ttf')
lda_L2 = Label(text='Binary Class 2',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.45},font_name='app_data/Poppins-Medium.ttf')
FloatLayout.add_widget(self, lda_L1)
FloatLayout.add_widget(self, lda_L2)
if len(labels) > 2:
lda_L3 = Label(text='Exclude from',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.3},font_name='app_data/Poppins-Medium.ttf')
lda_L4 = Label(text='Binary Analysis',size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.15, 'center_y': 0.25},font_name='app_data/Poppins-Medium.ttf')
FloatLayout.add_widget(self, lda_L3)
FloatLayout.add_widget(self, lda_L4)
for j in np.arange(len(labels)):
names = Label(text=labels[j], size_hint = (None, None), height = '48dp',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.70},font_name='app_data/Poppins-Medium.ttf')
if j == 0:
box1 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j+50),state = 'down',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.6})
box2 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j+50),
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.45})
else:
box1 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j+50),
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.6})
box2 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j+50),state = 'down',
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.45})
if len(labels) > 2:
box3 = CheckBox(size_hint = (None,None), height = '48dp', group = 'g'+str(j+50),
pos_hint = {'center_x': 0.3+int(j)*0.6/N, 'center_y': 0.3})
if int(j) == 0:
if len(labels) > 2:
lda_status = [[names,box1,box2,box3]]
else:
lda_status = [[names,box1,box2]]
else:
if len(labels) > 2:
lda_status = lda_status + [[names,box1,box2,box3]]
else:
lda_status = lda_status + [[names,box1,box2]]
# Before adding in all of the new ones
for entry in lda_status:
for j in entry:
FloatLayout.add_widget(self, j)
# Make sure these boxes are deleted and recreated...
global check_lda
check_lda = True
def check_checks(self):
global lda_checked
# Convert our weird little kivy objects into a numpy array
x,y = np.shape(lda_status)
for row in np.arange(x):
for column in np.arange(y):
# Exclude the name column
if column == 0:
continue
if column == 1:
check_pre_l = lda_status[row][column].active
else:
check_pre_l = np.hstack((check_pre_l,lda_status[row][column].active))
if row == 0:
lda_checked = check_pre_l
else:
lda_checked = np.vstack((lda_checked,check_pre_l))
class intro(Screen):
def junk(self):
x=1
#################### THEN THE APP, CLOSE OUT ANY ANALYSIS #######################
class AIMSApp(App):
# ALRIGHT FINALLY MAYBE GETTING THIS
#v_label2 = StringProperty('')
#v_label3 = StringProperty('')
#v_label4 = StringProperty('')
index = NumericProperty(-1)
current_title = StringProperty()
time = NumericProperty(0)
screen_names = ListProperty([])
hierarchy = ListProperty([])
def build(self):
self.title = 'AIMS - Automated Immune Molecule Separator'
# Alright since we
Clock.schedule_interval(self._update_clock, 1 / 60.)
self.screens = {}
# Honestly we can probably just hardcode this... That way we can control order for now.
self.available_screens = ['app_data/screens/main_screen.kv','app_data/screens/mhc_1.kv',
'app_data/screens/mhc_2.kv','app_data/screens/mhc_3.kv','app_data/screens/mhc_4.kv',
'app_data/screens/mhc_5.kv','app_data/screens/mhc_6.kv','app_data/screens/mhc_7.kv',
'app_data/screens/mhc_8.kv','app_data/screens/mhc_9.kv','app_data/screens/mhc_10.kv',
'app_data/screens/mhc_11.kv',
'app_data/screens/ab_1.kv','app_data/screens/ab_2.kv','app_data/screens/ab_3.kv',
'app_data/screens/ab_4.kv','app_data/screens/ab_5.kv','app_data/screens/ab_6.kv',
'app_data/screens/ab_7.kv','app_data/screens/ab_8.kv','app_data/screens/ab_9.kv',
'app_data/screens/ab_10.kv','app_data/screens/ab_11.kv']
global molecule
molecule = ''
self.go_next_screen(num = 0)
def go_main_screen(self,num = 0):
self.index = num
screen = self.load_screen(self.index)
sm = self.root.ids.sm
sm.switch_to(screen, direction='right')
self.current_title = screen.name
def go_next_screen(self,num = 0):
global molecule
if molecule == 'ig':
# somewhat janky way to do this, but should work.
# Basically "skip" the mhc screens
num = num + 11
self.index = num
screen = self.load_screen(self.index)
sm = self.root.ids.sm
sm.switch_to(screen, direction='left')
self.current_title = screen.name
def go_mhc(self):
# Need to make and delete lots of shit when
# we get back to this main screen. HARD restart
global N; N = 4
global LFile; LFile = ['']
# Delete some global variables so we have a HARD reset.
global check_run
if 'check_run' in globals():
# So intelligently, if you define something as a global variable
# but don't "fill" it, it won't register as being in globals.
del check_run
global check_lda
if 'check_lda' in globals():
del check_lda
global loadLabel
if 'loadLabel' in globals():
del loadLabel
# Needed to delete and define everything BEFORE loading screen
global molecule
molecule = 'mhc'
self.index = 1
screen = self.load_screen(self.index)
sm = self.root.ids.sm
sm.switch_to(screen, direction='left')
self.current_title = screen.name
def go_Ig(self):
# Need to make and delete lots of shit when
# we get back to this main screen. HARD restart
global N; N = 4
global LFile; LFile = ['']
# Delete some global variables so we have a HARD reset.
global check_run
if 'check_run' in globals():
# So intelligently, if you define something as a global variable
# but don't "fill" it, it won't register as being in globals.
del check_run
global check_lda
if 'check_lda' in globals():
del check_lda
global loadLabel
if 'loadLabel' in globals():
del loadLabel
# Needed to delete and define everything BEFORE loading screen
global molecule
molecule = 'ig'
self.index = 12
screen = self.load_screen(self.index)
sm = self.root.ids.sm
sm.switch_to(screen, direction='left')
self.current_title = screen.name
def go_prev_screen(self,num = 0):
global molecule
if molecule == 'ig':
# somewhat janky way to do this, but should work.
# Basically "skip" the mhc screens
num = num + 11
self.index = num
screen = self.load_screen(self.index)
sm = self.root.ids.sm
sm.switch_to(screen, direction='right')
self.current_title = screen.name
def load_screen(self, index):
if index in self.screens:
return self.screens[index]
screen = Builder.load_file(self.available_screens[index])
self.screens[index] = screen
return screen
def _update_clock(self, dt):
self.time = time()
Factory.register('Root', cls=Root)
Factory.register('intro', cls=intro)
Factory.register('aligner', cls=aligner)
Factory.register('aligner_ab', cls=aligner_ab)
Factory.register('Analysis', cls=Analysis)
Factory.register('checker', cls=checker)
if __name__ == '__main__':
AIMSApp().run()

Computing file changes ...