Skip to content

Commit 9e78e4c

Browse files
authored
Merge pull request #243 from Jhsmit/folding
Add folding/rfu app
2 parents 26dedfa + f4b80d8 commit 9e78e4c

File tree

12 files changed

+1208
-28
lines changed

12 files changed

+1208
-28
lines changed

MANIFEST.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif
1212
include versioneer.py
1313
include pyhdx/_version.py
1414
include pyhdx/web/*.html
15-
include pyhdx/web/*.yaml
15+
include pyhdx/web/apps/*.yaml
1616
include pyhdx/config.ini
1717

1818
graft pyhdx/web/static

dev/gui/dev_gui_rfu.py

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
"""
2+
Reload folding data and GUI
3+
Run local_cluster.py in anothor thread
4+
5+
"""
6+
7+
import sys
8+
from pathlib import Path
9+
10+
import pandas as pd
11+
import panel as pn
12+
import yaml
13+
14+
from pyhdx.batch_processing import yaml_to_hdxm
15+
from pyhdx.fileIO import csv_to_dataframe, load_fitresult
16+
from pyhdx.fileIO import csv_to_protein
17+
from pyhdx.web.apps import rfu_app
18+
from pyhdx.web.base import STATIC_DIR
19+
from pyhdx.web.utils import load_state, fix_multiindex_dtypes
20+
21+
sys._excepthook = sys.excepthook
22+
23+
import traceback as tb
24+
def my_exception_hook(exctype, value, traceback):
25+
# Print the error and traceback
26+
# https://stackoverflow.com/questions/43039048/pyqt5-fails-with-cryptic-message/43039363#43039363
27+
tb.print_tb(traceback, file=sys.stdout)
28+
print(exctype, value, traceback)
29+
30+
tb.print_stack()
31+
print(traceback.format_exc())
32+
# or
33+
print(sys.exc_info()[2])
34+
# Call the normal Exception hook after
35+
sys._excepthook(exctype, value, traceback)
36+
sys.exit(1)
37+
38+
39+
40+
# Set the exception hook to our wrapping function
41+
sys.excepthook = my_exception_hook
42+
43+
44+
ctrl, tmpl = rfu_app()
45+
46+
47+
cwd = Path(__file__).parent.resolve()
48+
# root_dir = cwd.parent.parent
49+
# test_dir = cwd / 'test_data'
50+
#
51+
# fpath_1 = root_dir / 'tests' / 'test_data' / 'ecSecB_apo.csv'
52+
# fpath_2 = root_dir / 'tests' / 'test_data' / 'ecSecB_dimer.csv'
53+
# fitresult_dir = root_dir / 'tests' / 'test_data' / 'output' / 'ecsecb_tetramer_dimer'
54+
#
55+
#
56+
# data_dir = root_dir / 'tests' / 'test_data' / 'input'
57+
# #data_dir = cwd / 'rinky_data'
58+
#
59+
# yaml_dict = yaml.safe_load(Path(data_dir / 'data_states.yaml').read_text())
60+
# pdb_string = (test_dir / '1qyn.pdb').read_text()
61+
62+
63+
64+
def reload_tables():
65+
test_dir = cwd / 'test_data'
66+
src = ctrl.sources['main']
67+
68+
df = csv_to_dataframe(test_dir / 'peptides.csv')
69+
# names = df.columns.names
70+
# df = df.convert_dtypes()
71+
# df.columns.names = names
72+
table_names = [
73+
'rfu_residues.csv',
74+
'rates.csv',
75+
'peptides.csv',
76+
'dG_fits.csv',
77+
'ddG_comparison.csv',
78+
'd_calc.csv',
79+
'loss.csv',
80+
'peptide_mse.csv'
81+
]
82+
for name in table_names:
83+
try:
84+
df = csv_to_dataframe(test_dir / name)
85+
df.columns = fix_multiindex_dtypes(df.columns)
86+
src.tables[name.split('.')[0]] = df
87+
except Exception as e:
88+
print(e)
89+
print('not loaded:', name)
90+
91+
src.param.trigger('updated')
92+
93+
94+
#ctrl.views['protein'].object = pdb_string
95+
96+
#ctrl.views['protein'].object = pdb_string
97+
98+
99+
def reload_dashboard():
100+
data_objs = {k: yaml_to_hdxm(v, data_dir=data_dir) for k, v in yaml_dict.items()}
101+
for k, v in data_objs.items():
102+
v.metadata['name'] = k
103+
104+
source = ctrl.sources['main']
105+
for ds in ['peptides', 'peptides_mse', 'd_calc', 'rfu', 'rates', 'global_fit', 'losses']:
106+
df = csv_to_protein(test_dir / f'{ds}.csv')
107+
source.add_df(df, ds)
108+
109+
#Temporary workaround for comment characters in csv files
110+
ds = 'colors'
111+
df = pd.read_csv(test_dir / f'{ds}.csv', header=[0, 1, 2], index_col=0,
112+
skiprows=3)
113+
source.add_df(df, ds)
114+
115+
116+
def init_dashboard():
117+
for k, v in yaml_dict.items():
118+
load_state(ctrl, v, data_dir=data_dir, name=k)
119+
120+
# k = next(iter(yaml_dict.keys()))
121+
# load_state(ctrl, yaml_dict[k], data_dir=data_dir, name=k)
122+
123+
src = ctrl.sources['main']
124+
fit_control = ctrl.control_panels['FitControl']
125+
126+
fit_control.r1 = 0.05
127+
fit_control.r2 = 0.1
128+
fit_control.epochs = 200
129+
fit_control.patience = 100
130+
131+
132+
# ngl = ctrl.views['protein']
133+
# ngl._ngl.pdb_string = Path(test_dir / '1qyn.pdb').read_text()
134+
fit_result = load_fitresult(fitresult_dir)
135+
136+
src.add(fit_result, 'gibbs_fit_1')
137+
138+
pdb_src = ctrl.sources['pdb']
139+
pdb_src.add_from_string(pdb_string, '1qyn')
140+
141+
diff = ctrl.control_panels['DifferentialControl']
142+
#diff._action_add_comparison()
143+
144+
# ctrl.views['protein'].object = pdb_string
145+
#
146+
# fit_result = load_fitresult(fitresult_dir)
147+
# src.add(fit_result, 'fit_1')
148+
149+
150+
#if __name__ == '__main__':
151+
#pn.state.onload(reload_dashboard)
152+
#pn.state.onload(reload_tables)
153+
#pn.state.onload(init_dashboard)
154+
155+
if __name__ == '__main__':
156+
157+
#init_dashboard()
158+
159+
pn.serve(tmpl, show=True, static_dirs={'pyhdx': STATIC_DIR})
160+
161+
elif __name__.startswith('bokeh_app'):
162+
tmpl.servable()
163+
164+
#ctrl.template.servable()
165+
166+
167+
# panel serve --show --autoreload --static-dirs pyhdx=C:\Users\jhsmi\pp\PyHDX\pyhdx\web\static

images/pyhdx_header.png

262 KB
Loading

pyhdx/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def main():
3535
print(f"Started new Dask LocalCluster at {scheduler_address}")
3636

3737
if args.serve:
38-
serve.run_main()
38+
serve.run_apps()
3939

4040

4141
if __name__ == '__main__':

pyhdx/web/apps.py

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,25 @@
1212

1313
#cache = HybridHDFCache(file_path ='test123.h5')
1414

15+
16+
fmt = {
17+
'header_color': '#ffffff', # this is the text
18+
'header_background': '#00407A',
19+
'accent_base_color': '#00407A',
20+
'theme_toggle': False
21+
}
22+
1523
@logger('pyhdx')
1624
def main_app():
1725
cwd = Path(__file__).parent.resolve()
18-
yaml_dict = yaml.safe_load((cwd / 'pyhdx_app.yaml').read_text(encoding='utf-8'))
26+
yaml_dict = yaml.safe_load((cwd / 'apps' / 'pyhdx_app.yaml').read_text(encoding='utf-8'))
1927

2028
ctr = AppConstructor(loggers={'pyhdx': main_app.logger}, cache=cache)
2129

2230
ctrl = ctr.parse(yaml_dict)
2331

2432
ctrl.start()
2533

26-
fmt = {
27-
'header_color': '#ffffff', # this is the text
28-
'header_background': '#00407A',
29-
'accent_base_color': '#00407A',
30-
'theme_toggle': False
31-
}
32-
3334
tmpl = pn.template.FastGridTemplate(title=f'{VERSION_STRING}', **fmt)
3435
controllers = ctrl.control_panels.values()
3536
controls = pn.Accordion(*[controller.panel for controller in controllers], toggle=True)
@@ -45,7 +46,6 @@ def main_app():
4546
'rates',
4647
'gibbs_overlay',
4748
'peptide_mse',
48-
#'peptide_scatter',
4949
'peptide_overlay',
5050
'loss_lines'
5151
]
@@ -85,4 +85,60 @@ def get_view(name):
8585
tmpl.main[3:5, 0:6] = log_tab
8686
tmpl.main[3:5, 6:12] = peptide_tab
8787

88+
return ctrl, tmpl
89+
90+
91+
@logger('pyhdx')
92+
def rfu_app():
93+
cwd = Path(__file__).parent.resolve()
94+
yaml_dict = yaml.safe_load((cwd / 'apps' / 'rfu_app.yaml').read_text(encoding='utf-8'))
95+
96+
ctr = AppConstructor(loggers={'pyhdx': rfu_app.logger}, cache=cache)
97+
98+
ctrl = ctr.parse(yaml_dict)
99+
100+
ctrl.start()
101+
102+
103+
104+
tmpl = pn.template.FastGridTemplate(title=f'{VERSION_STRING}', **fmt)
105+
controllers = ctrl.control_panels.values()
106+
controls = pn.Accordion(*[controller.panel for controller in controllers], toggle=True)
107+
tmpl.sidebar.append(controls)
108+
109+
views_names = [
110+
'rfu_scatter',
111+
'coverage',
112+
'logging_info',
113+
'logging_debug',
114+
'protein',
115+
]
116+
117+
views = {v: ctrl.views[v] for v in views_names}
118+
[v.update() for v in views.values()]
119+
120+
# this should be on the view intances probably
121+
def get_view(name):
122+
return pn.Column(views[name].panel, sizing_mode='stretch_both')
123+
124+
cov_tab = pn.Tabs(
125+
('Coverage', get_view('coverage')),
126+
('Protein', get_view('protein')),
127+
)
128+
129+
scatter_tab = pn.Tabs(
130+
('RFU', get_view('rfu_scatter')),
131+
)
132+
133+
log_tab = pn.Tabs(
134+
('Info log', views['logging_info'].panel),
135+
('Debug log', views['logging_debug'].panel)
136+
)
137+
138+
139+
tmpl.main[0:3, 0:6] = cov_tab
140+
tmpl.main[0:3, 6:12] = scatter_tab
141+
tmpl.main[3:5, 0:6] = log_tab
142+
#tmpl.main[3:5, 6:12] = peptide_tab
143+
88144
return ctrl, tmpl

0 commit comments

Comments
 (0)