[docs]
def add_centroid_plots(project, datasource, split_by, ignore_values=[], scale=0.5):
col = project.get_column_metadata(datasource, split_by)
md = project.get_datasource_metadata(datasource)
val_to_region = {x: set() for x in col["values"] if x not in ignore_values}
for sp_val, r_val in zip(
project.get_column(datasource, split_by),
project.get_column(datasource, md["regions"]["region_field"]),
):
regions = val_to_region.get(sp_val)
if regions is None:
continue
regions.add(r_val)
for val, regions in val_to_region.items():
regions = sorted(list(regions))
if len(regions) > 16:
hlf = int(len(regions) / 2)
all_regions = [regions[:hlf], regions[hlf:]]
region_names = [f"{val} centroid plots {x}" for x in ["1", "2"]]
else:
all_regions = [regions]
region_names = [f"{val} centroid plots"]
for c, regions in enumerate(all_regions):
charts = []
max_y = 0
x = 5
y = 5
for region in regions:
chart = project.get_centroid_plot(datasource, region, scale=scale)
chart["position"] = [x, y]
x += chart["size"][0] + 5
max_y = max(max_y, chart["size"][1])
if x > 1000:
x = 5
y += max_y + 5
max_y = 0
charts.append(chart)
project.set_view(
region_names[c],
{
"initialCharts": {
datasource: charts,
}
},
)
[docs]
def create_interaction_matrix_view(
project,
interaction_datasource,
exclude_groups=[],
name="interaction view",
cells_datasource="cells",
interaction_metrics=["gr20"],
square_size=20,
images="pcf charts",
selections=[
{"column": "MH_FDR", "filter": [None, 0.05]},
{"column": "MH_PC", "filter": [0, None]},
],
):
md = project.get_datasource_metadata(interaction_datasource)
i = md.get("interactions")
if not i:
raise ValueError(
f"Datasource {interaction_datasource} does not have interaction data"
)
col = project.get_column_metadata(interaction_datasource, i["pivot_column"])
groups = col["values"]
charts = []
y = 5
x = 5
for metric in interaction_metrics:
x = 5
chart = {} # for pyright - not ideal.
for group in groups:
if group not in exclude_groups:
chart = project.get_interaction_matrix(
interaction_datasource, group, metric, square_size=square_size
)
chart["position"] = [x, y]
charts.append(chart)
x += chart["size"][1] + 5
y += chart["size"][0] + 5
im_chart = project.get_image_plot(interaction_datasource, images)
im_chart["position"] = [x, 5]
im_chart["size"] = [300, 300]
charts.append(im_chart)
sel_dialog = project.get_selection_dialog(interaction_datasource, selections)
sel_dialog["position"] = [x, 310]
sel_dialog["size"] = [250, 250]
charts.append(sel_dialog)
project.set_view(
name,
{
"initialCharts": {cells_datasource: [], interaction_datasource: charts},
"dataSources": {
cells_datasource: {"panelWidth": 20},
interaction_datasource: {"panelWidth": 80},
},
},
)
[docs]
def create_roi_interaction_view(
project,
datasource,
lchm=None,
pcfs="pcf charts",
cells_datasource="cells",
extra_filters=[],
table_metrics=["gr20"],
name="roi interaction view",
):
md = project.get_datasource_metadata(datasource)
i = md.get("interactions")
if not i:
raise ValueError(f"Datasource {datasource} does not have interaction data")
charts = []
x = 5
y = 5
if lchm:
chart = project.get_image_plot(datasource, lchm)
chart["position"] = [x, y]
chart["size"] = [300, 300]
x += chart["size"][0] + 5
charts.append(chart)
if pcfs:
chart = project.get_image_plot(datasource, pcfs)
chart["position"] = [x, y]
chart["size"] = [300, 300]
charts.append(chart)
x += chart["size"][0] + 5
cols = i["interaction_columns"] + [i["pivot_column"]]
filters = [{"column": x} for x in cols]
filters += extra_filters
sel = project.get_selection_dialog(datasource, filters)
sel["position"] = [x, 5]
sel["size"] = [250, 250]
charts.append(sel)
table = {
"type": "table_chart",
"param": cols + table_metrics,
"column_widths": {
i["interaction_columns"][0]: 200,
i["interaction_columns"][1]: 200,
},
"size": [800, 200],
"position": [5, 310],
}
charts.append(table)
project.set_view(
name,
{
"initialCharts": {cells_datasource: [], datasource: charts},
"dataSources": {
cells_datasource: {"panelWidth": 20},
datasource: {"panelWidth": 80},
},
},
)