import os
from Tkinter import *
import tkFileDialog
import tkSimpleDialog
from jade.RAbD.AnalyzeAntibodyDesigns import *
[docs]class AntibodyDesignAnalysisMenu(object):
def __init__(self, main, compare_designs, main_gui):
"""
:type main: Tk
:type compare_designs: rabd.CompareAntibodyDesignStrategies
:type main_gui:
"""
self._tk_ = main
self.compare_designs = compare_designs
self.main_gui = main_gui
[docs] def sho_tk(self):
self._tk_.config(menu=self.main_menu)
###Tracers###
self.compare_designs.is_camelid.trace_variable('w', self.camelid_tracer)
[docs] def set_tk(self):
self.main_menu = Menu(self._tk_)
## File Menu ##
self.file_menu = Menu(self.main_menu, tearoff=0)
self.file_menu.add_checkbutton(label="Camelid Antibody", variable=self.compare_designs.is_camelid)
# self.dtypes_menu = Menu(self.main_menu, tearoff = 0)
# self.dtypes_menu.add_checkbutton(label = "Group by dG", variable = self.compare_designs.group_dG)
self.file_menu.add_command(label="Filter Models",
command=lambda: self.main_gui.filter_settings_window.setup_sho_gui(Toplevel(self._tk_)))
self.file_menu.add_command(label="Read Strategies from DB DIR",
command=lambda: self.read_from_db_dir_set_strategies())
self.file_menu.add_command(label="Add Strategy", command=lambda: self.main_gui.compare_frame.add_main_strategy())
self.file_menu.add_separator()
self.file_menu.add_command(label="Set Reference Native", command=lambda: self.set_native_path())
self.file_menu.add_command(label="Set Reference Database", command=lambda: self.set_reference_db())
self.file_menu.add_separator()
self.file_menu.add_command(label="Set PyIgClassify Directory", command = lambda: self.set_pyigclassify_dir)
# self.file_menu.add_command(label = "Set Scorefunction", command = lambda: self.set_scorefunction())
self.file_menu.add_command(label="Set top N", command=lambda: self.set_top_n())
self.file_menu.add_command(label="Set top N For Combined", command=lambda: self.set_top_n_combined())
self.file_menu.add_separator()
self.file_menu.add_command(label="Change Root Dir", command=lambda: self.change_root())
self.file_menu.add_command(label = "Print current threads", command = lambda: self.print_threads())
self.file_menu.add_separator()
self.file_menu.add_checkbutton(label="Reload Query Data", variable=self.compare_designs.reload_scores)
self.file_menu.add_checkbutton(label="Backround Features", variable=self.compare_designs.backround_features)
self.file_menu.add_separator()
for name in sorted(self.compare_designs.scores_on.keys()):
self.file_menu.add_checkbutton(label=name, variable=self.compare_designs.scores_on[name])
self.main_menu.add_cascade(label="File", menu=self.file_menu)
## Score Menu ##
self.main_pymol_menu = Menu(self.main_menu, tearoff=0)
self.pymol_menu = Menu(self.main_menu, tearoff=0)
self.pymol_menu.add_command(label="Top Models",
command=lambda: self.compare_designs.copy_top())
self.pymol_menu.add_command(label="All Models",
command=lambda: self.compare_designs.copy_all_models())
self.main_pymol_menu.add_cascade(label="Create PyMol Sessions", menu=self.pymol_menu)
self.main_pymol_menu.add_separator()
self.main_pymol_menu.add_checkbutton(label="Align Origin CDRs", variable=self.compare_designs.load_origin_pdbs)
self.main_menu.add_cascade(label="PyMol", menu=self.main_pymol_menu)
## Clustal Menu ##
self.clustal_menu = Menu(self.main_menu, tearoff=0)
#self.clustal_menu.add_command(label="Set Max Processors", command=lambda: self.set_max_clustal_procs()) - Requires OpenMP support
self.clustal_menu.add_command(label="Set Output format", command=lambda: self.set_clustal_output_format())
self.clustal_menu.add_command(label="Set Soft Wrap", command=lambda: self.set_clustal_soft_wrap())
self.clustal_menu.add_separator()
self.clustal_menu.add_command(label="Run Clustal Omega on Top Decoys",
command=lambda: self.run_clustal_omega())
self.clustal_menu.add_command(label="Run Clustal Omega on ALL Combined Decoys",
command=lambda: self.run_clustal_on_all_combined())
#self.main_menu.add_cascade(label="Clustal", menu=self.clustal_menu)
## Alignment ##
self.per_model_menu = Menu(self.main_menu, tearoff=0)
'''
self.per_model_menu.add_command(label="Output Length Alignments",
command=lambda: self.compare_designs.output_len_or_clus_alignment('length', 'antibody'))
self.per_model_menu.add_command(label="Output Cluster Alignments",
command=lambda: self.compare_designs.output_len_or_clus_alignment('cluster', 'antibody'))
self.per_model_menu.add_command(label="Output CDR Sequence Alignments",
command=lambda: self.compare_designs.output_len_or_clus_alignment('aligned_sequence', 'antibody'))
self.per_model_menu.add_separator()
'''
self.per_model_menu.add_command(label="Output to CSV (Top)", command = lambda: self.compare_designs.output_csv_data(top = True))
self.per_model_menu.add_command(label="Output to CSV (ALL)", command = lambda: self.compare_designs.output_csv_data(top = False))
self.per_model_menu.add_separator()
self.per_model_menu.add_cascade(label="Clustal", menu = self.clustal_menu)
self.main_menu.add_cascade(label="Model Data", menu=self.per_model_menu)
## Recovery ##
self.per_strategy_menu = Menu(self.main_menu, tearoff = 0)
self.recovery_menu = Menu(self.main_menu, tearoff=0)
self.recovery_menu.add_command(label="Output Length Recovery",
command=lambda: self.compare_designs.output_len_or_clus_recovery('length', 'antibody'))
self.recovery_menu.add_command(label="Output Cluster Recovery",
command=lambda: self.compare_designs.output_len_or_clus_recovery('cluster', 'antibody'))
## Enrichment ##
self.enrichment_menu = Menu(self.main_menu, tearoff=0)
self.enrichment_menu.add_command(label="Output Length Enrichments",
command = lambda: self.compare_designs.output_len_or_clus_enrichment("length"))
self.enrichment_menu.add_command(label="Output Cluster Enrichments",
command = lambda: self.compare_designs.output_len_or_clus_enrichment("cluster"))
self.per_strategy_menu.add_command(label="Output Score Summaries to CSV (Top)", command=lambda: self.compare_designs.output_csv_data(top=True, summary=True))
self.per_strategy_menu.add_command(label="Output Score Summaries to CSV (All)", command=lambda: self.compare_designs.output_csv_data(top=False, summary=True))
self.per_strategy_menu.add_cascade(label = "Recovery", menu = self.recovery_menu)
self.per_strategy_menu.add_cascade(label = "Enrichment", menu = self.enrichment_menu)
self.main_menu.add_cascade(label="Strategy Data", menu=self.per_strategy_menu)
self.subset_menu = Menu(self.main_menu, tearoff=0)
# Have to do this manually:
# for score_name in :
# x = copy.deepcopy(score_name)
# self.subset_menu.add_command(label = "Create DB of Top Subset: "+score_name, command = lambda: self.create_subset_databases(x))
score_names = self.compare_designs._get_score_names()
self.subset_menu.add_command(label="Create DB of Top Subset: " + score_names[0],
command=lambda: self.create_subset_databases(score_names[0]))
self.subset_menu.add_command(label="Create DB of Top Subset: " + score_names[1],
command=lambda: self.create_subset_databases(score_names[1]))
self.subset_menu.add_command(label="Create DB of Top Subset: " + score_names[2],
command=lambda: self.create_subset_databases(score_names[2]))
self.subset_menu.add_command(label="Create DB of Top Subset: " + "Top N dG of Top Total",
command=lambda: self.create_subset_databases(score_names[3]))
self.main_menu.add_cascade(label="Features Subsets", menu=self.subset_menu)
self._tk_.config(menu=self.main_menu)
########### Callbacks ############
[docs] def print_threads(self):
print "Total running threads: "+repr(threads.n_alive())
for pid in range(0, len(threads)):
if threads.is_alive(pid):
print "Thread "+repr(pid)+" is alive."
######### Tracers ##############
[docs] def camelid_tracer(self, name, index, mode):
varValue = self.compare_designs.is_camelid.get()
if varValue == 1:
self.compare_designs.cdrs["L1"].set(0)
self.compare_designs.cdrs["L2"].set(0)
self.compare_designs.cdrs["L3"].set(0)
return
######### Auxilliary Functions ###########
[docs] def open_sequence_logo(self):
pass
[docs] def change_root(self):
root = tkFileDialog.askdirectory(initialdir=self.current_dir, title="Root Directory")
if not root:
return
self.current_dir = root
os.chdir(root)
print "Root directory changed to: " + root
[docs] def read_from_db_dir_set_strategies(self):
self.compare_designs.strategies = []
if not self.compare_designs.db_dir.get() or not os.path.exists(self.compare_designs.db_dir.get()):
db_dir = tkFileDialog.askdirectory(initialdir=self.current_dir, title="Database DIR")
if not db_dir:
return
self.current_dir = db_dir
self.compare_designs.db_dir.set(db_dir)
self.compare_designs.set_strategies_from_databases()
self.main_gui.compare_frame.populate_all_strategies()
strategies = self.get_full_strategy_list()
self.compare_designs.set_strategies(strategies)
[docs] def get_full_strategy_list(self):
strategies = self.main_gui.compare_frame.current_strategies_listbox.get(0, END)
return strategies
[docs] def set_reference_db(self):
d = tkFileDialog.askopenfilename(title="Reference DB", initialdir=self.compare_designs.db_dir.get())
if not d: return
self.current_dir = os.path.dirname(d)
self.compare_designs.reference_db.set(d)
[docs] def set_top_n(self):
top = tkSimpleDialog.askinteger(title="Top N", prompt="Number of top scoring",
initialvalue=self.compare_designs.top_n.get())
if not top: return
self.compare_designs.top_n.set(top)
[docs] def set_top_n_combined(self):
top = tkSimpleDialog.askinteger(title="Top N Combined", prompt="Number of top scoring Combined",
initialvalue=self.compare_designs.top_n_combined.get())
if not top: return
self.compare_designs.top_n_combined.set(top)
[docs] def set_max_clustal_procs(self):
max = tkSimpleDialog.askinteger(title="Max P", prompt="Max NP. Clustal by default uses all.",
initialvalue=self.main_gui.clustal_procs.get())
if not max: return
self.main_gui.clustal_procs.set(max)
[docs] def set_clustal_output_format(self):
f = tkSimpleDialog.askstring(title="Clustal output format", initialvalue=self.main_gui.clustal_output_format.get())
if not f:
return
if not f in self.main_gui.clustal_output_formats:
print "Format " + f + " not recognized. Available formats are: \n" + repr(self.main_gui.clustal_output_formats)
return
self.main_gui.clustal_output_format.set(f)
[docs] def set_clustal_soft_wrap(self):
wrap = tkSimpleDialog.askinteger(title="Wrap", prompt="Set Soft Wrap",
initialvalue=self.compare_designs.clustal_soft_wrap.get())
if not wrap:
return
self.compare_designs.clustal_soft_wrap.set(wrap)
# def set_scorefunction(self):
# score = tkSimpleDialog.askstring(title="Score", prompt = "Set Scorefunction", initialvalue = self.compare_designs.scorefunction.get())
# if not score:
# return
# self.compare_designs.scorefunction.set(score)
[docs] def set_native_path(self):
native_path = tkFileDialog.askopenfilename(title="Native path", initialdir=self.current_dir)
if not native_path:
return
else:
self.current_dir = os.path.dirname(native_path)
self.compare_designs.native_path = native_path
[docs] def set_pyigclassify_dir(self):
origin_path = tkFileDialog.askopenfilename(title = "PyIgClassify Directory", inititaldir = self.current_dir)
if not origin_path:
return
else:
self.current_dir = os.path.dirname(origin_path)
self.compare_designs.pyigclassify_dir.set(origin_path)
######## Main Analysis ############
[docs] def run_copy_all(self):
self.compare_designs.copy_all_models()
[docs] def run_clustal_on_all_combined(self):
extra_options = tkSimpleDialog.askstring(title="Extra Options", prompt="Clustal Extra Options",
initialvalue=self.main_gui.base_clustal_options)
if not extra_options:
return
self.compare_designs.run_clustal_omega_on_all_combined(self.main_gui.clustal_procs.get(),
self.main_gui.clustal_output_format.get(),
extra_options=extra_options)
[docs] def run_clustal_omega(self):
extra_options = tkSimpleDialog.askstring(title="Extra Options", prompt="Clustal Extra Options",
initialvalue=self.main_gui.base_clustal_options)
if not extra_options:
return
self.compare_designs.run_clustal_omega(self.main_gui.clustal_procs.get(),
self.main_gui.clustal_output_format.get(),
extra_options=extra_options)
[docs] def create_subset_databases(self, score_name):
rosetta_extension = tkSimpleDialog.askstring(title="Rosetta Extension",
prompt="Please set the Rosetta Extension",
initialvalue=self.compare_designs.rosetta_extension.get())
if not rosetta_extension:
return
self.compare_designs.rosetta_extension.set(rosetta_extension)
prefix = tkSimpleDialog.askstring(title="Prefix",
prompt="Please set the prefix that will be used for the new databases",
initialvalue=score_name)
if not prefix:
print "The prefix needs to be set"
return
self.compare_designs.create_score_subset_database(score_name, prefix)
# self.read_from_main_set_strategies()