-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathapp_components.py
159 lines (131 loc) · 5.37 KB
/
app_components.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import dash
from dash import html, dcc
import dash_bootstrap_components as dbc
import plotly.graph_objects as go
from xas.tiled_io import group_node_by_metadata_key, sort_nodes_by_metadata_key
def build_scangroup_interactable(scangroup_node, group_label):
select_all = html.Div([
dbc.Checkbox(id={"type": "select_all", "group": group_label}, style={"display": "inline-block"}),
html.Div("select all", style={"display": "inline-block", "padding": "3px"}),
])
scan_labels = [html.Div([
dbc.Checkbox(id={"type": "scan_check", "uid": k, "group": group_label}, style={"display": "inline-block"}),
html.Div(v.metadata["scan_id"],
style={"display": "inline-block", "padding": "3px"},),
html.Br(),
])
for k, v in scangroup_node.items_indexer
]
return [select_all] + scan_labels
# return scan_labels
def build_nested_accordion(base_node, groupby_keys: list[str], sort_key:str=None, reverse_order=False, _node_label=""):
current_key = groupby_keys[0]
next_level_keys = groupby_keys[1:]
next_nodes, next_labels = group_node_by_metadata_key(base_node, current_key, return_values=True)
if sort_key is not None:
next_nodes, next_labels = sort_nodes_by_metadata_key(next_nodes, sort_key, node_labels=next_labels)
if reverse_order:
next_nodes.reverse()
next_labels.reverse()
# reached final level of grouping
if len(next_level_keys) == 0:
accordion_items = [
dbc.AccordionItem(
build_scangroup_interactable(sg_node, group_label=(_node_label+sg_label)),
title=sg_label
)
for sg_node, sg_label in zip(next_nodes, next_labels)
]
# recursively build next level of structure
else:
accordion_items = [
dbc.AccordionItem(
build_nested_accordion(sub_node, next_level_keys, _node_label=(_node_label+sub_label)),
title=sub_label
)
for sub_node, sub_label in zip(next_nodes, next_labels)
]
return dbc.Accordion(accordion_items, start_collapsed=True, always_open=True,)
def build_proposal_accordion(proposal_node, groupby_keys, sort_key=None, reverse_order=False):
proposal_accordion = build_nested_accordion(proposal_node, groupby_keys, sort_key=sort_key, reverse_order=reverse_order)
return html.Div(proposal_accordion, style={"max-height": "700px", "overflow-y": "scroll"})
# class FilterInput:
# def __init__(self, filters=None) -> None:
# if filters is not None:
# self.filters = filters
# def build_new_input
def build_filter_input(filter_index):
key_input = dbc.Input(id={"type": "filter_key_input", "index": filter_index},
placeholder="metadata key")
value_input = dbc.Input(id={"type": "filter_value_input", "index": filter_index},
placeholder="value")
delete_button = dbc.Button("X",
id={"type": "filter_delete_btn", "index": filter_index},
color="light",)
key_value_inputgroup = dbc.InputGroup([
key_input,
dbc.InputGroupText(":"),
value_input,
])
return dbc.Row([
dbc.Col(key_value_inputgroup),
dbc.Col(delete_button, width=1),
],)
# ], id={"type": "filter_input_row", "index": filter_index})
visualization_tab = dbc.Tab([
dcc.Store(id="previous_plot_data"),
dbc.Row(dcc.Graph(figure=go.Figure(layout={"height": 800}), id="spectrum_plot")),
dbc.Row([
dbc.Col(
dbc.Button("plot", id="plot_btn", style={"width": "100%"}),
width=4,
),
dbc.Col(
dbc.Button("clear figure", id="clear_btn", style={"width": "100%"}),
width=4
)
], justify="center")
],
label="Visualization",
)
normalization_scheme_panel = dbc.Card([
html.Div("XAS Normalization Parameters", className="mb-3"),
html.Div([
dbc.InputGroup([
dbc.InputGroupText(["E", html.Sub("0")]),
dbc.Input(id="xas_e0_input", type="number"),
dbc.InputGroupText("[eV]"),
]),
html.Div("Pre-edge range"),
dbc.InputGroup([
dbc.Input(id="xas_pre_edge_start_input", type="number"),
dbc.InputGroupText("⮕"),
dbc.Input(id="xas_pre_edge_stop_input", type="number"),
dbc.InputGroupText("[eV]"),
]),
html.Div("Post-edge range"),
dbc.InputGroup([
dbc.Input(id="xas_post_edge_start_input", type="number"),
dbc.InputGroupText("⮕"),
dbc.Input(id="xas_post_edge_stop_input", type="number"),
dbc.InputGroupText("[eV]"),
], class_name="mb-2"),
dbc.InputGroup([
dbc.InputGroupText("Polynom order"),
dbc.Input(id="xas_polynom_order_input", type="number"),
]),
], style={"padding-bottom": "8px"}),
html.Div([
dbc.RadioItems(
options=[
{"label": "mu", "value": "mu"},
{"label": "normalized", "value": "normalized"},
{"label": "flattened", "value": "flattened"},
],
value="mu",
id="xas_normalization_radioitems",
),
]),
],
body=True,
id="norm_scheme_panel")