Skip to content
Snippets Groups Projects
Commit 5b7082bb authored by Felipe Delestro Matos's avatar Felipe Delestro Matos
Browse files

Data explorer with basic viz

parent 0b24d0e1
No related branches found
No related tags found
1 merge request!9Data explorer with basic viz
......@@ -2,12 +2,13 @@ import gradio as gr
import numpy as np
import os
from qim3d.utils import internal_tools
from qim3d.io import DataLoader
from qim3d.io import load
from qim3d.io.logger import log
import tifffile
import outputformat as ouf
import datetime
import matplotlib
# matplotlib.use("Agg")
import matplotlib.pyplot as plt
......@@ -31,17 +32,29 @@ class Interface:
def create_interface(self):
with gr.Blocks(css=self.css_path) as gradio_interface:
gr.Markdown("# Data Explorer \n Quick insights from large datasets")
gr.Markdown("# Data Explorer")
with gr.Row():
with gr.Column(scale=0.75):
data_path = gr.Textbox(
value="/home/fima/Downloads/MarineGatropod_1.tif",
value="/home/fima/reconstructor-main/small_foram.h5",
max_lines=1,
label="Path to the 3D volume",
)
with gr.Column(scale=0.25):
dataset_name = gr.Textbox(
label="Dataset name (in case of H5 files, for example)"
)
with gr.Row(elem_classes="w-256"):
cmap = gr.Dropdown(
value="viridis",
choices=plt.colormaps(),
label="Colormap",
interactive=True,
)
with gr.Row(elem_classes="w-128"):
btn_run = gr.Button(value="Load & Run", elem_classes="btn btn-run")
# Outputs
with gr.Row():
gr.Markdown("## Data overview")
......@@ -85,24 +98,10 @@ class Interface:
pipeline.verbose = self.verbose
session = gr.State([])
with gr.Row():
gr.Markdown("## Local thickness")
with gr.Row():
gr.Plot()
gr.Plot()
gr.Plot()
with gr.Row():
gr.Markdown("## Structure tensor")
with gr.Row():
gr.Plot()
gr.Plot()
gr.Plot()
### Gradio objects lists
# Inputs
inputs = [zpos, ypos, xpos]
inputs = [zpos, ypos, xpos, cmap, dataset_name]
# Outputs
outputs = [
data_summary,
......@@ -156,6 +155,8 @@ class Interface:
session.zpos = args[0]
session.ypos = args[1]
session.xpos = args[2]
session.cmap = args[3]
session.dataset_name = args[4]
return session
......@@ -191,7 +192,6 @@ class Interface:
else:
quiet = True
interface.launch(
quiet=quiet,
height=self.height,
......@@ -208,6 +208,9 @@ class Session:
self.zpos = 0.5
self.ypos = 0.5
self.xpos = 0.5
self.cmap = "viridis"
self.dataset_name = None
self.error_message = None
# Volume info
self.zsize = None
......@@ -229,28 +232,35 @@ class Session:
def get_data_info(self):
# Open file
tif = tifffile.TiffFile(self.data_path)
first_slice = tif.pages[0]
try:
vol = load(
self.data_path, virtual_stack=True, dataset_name=self.dataset_name
)
except Exception as error_message:
self.error_message = error_message
return
first_slice = vol[0]
# Get info
self.zsize = len(tif.pages)
self.zsize = len(vol)
self.ysize, self.xsize = first_slice.shape
self.data_type = first_slice.dtype
self.axes = tif.series[0].axes
self.data_type = str(first_slice.dtype)
self.last_modified = datetime.datetime.fromtimestamp(
os.path.getmtime(self.data_path)
).strftime("%Y-%m-%d %H:%M")
self.file_size = os.path.getsize(self.data_path)
# Close file
tif.close()
def create_summary_dict(self):
# Create dictionary
if self.error_message:
self.summary_dict = {"error_mesage": self.error_message}
else:
self.summary_dict = {
"Last modified": self.last_modified,
"File size": internal_tools.sizeof(self.file_size),
"Axes": self.axes,
"Z-size": str(self.zsize),
"Y-size": str(self.ysize),
"X-size": str(self.xsize),
......@@ -261,6 +271,10 @@ class Session:
}
def summary_str(self):
if "error_mesage" in self.summary_dict:
error_box = ouf.boxtitle("ERROR", return_str=True)
return f"{error_box}\n{self.summary_dict['error_mesage']}"
else:
display_dict = {k: v for k, v in self.summary_dict.items() if v is not None}
return ouf.showdict(display_dict, return_str=True, title="Data summary")
......@@ -295,7 +309,13 @@ class Pipeline:
session.create_summary_dict()
# Memory map data as a virtual stack
session.vol = DataLoader().load_tiff(session.data_path)
try:
session.vol = load(
session.data_path, virtual_stack=True, dataset_name=session.dataset_name
)
except:
return session
if self.verbose:
log.info(ouf.br(3, return_str=True) + session.summary_str())
......@@ -324,6 +344,7 @@ class Pipeline:
def create_slice_fig(self, axis, session):
plt.close()
vol = session.vol
plt.set_cmap(session.cmap)
zslice = session.zslice_from_zpos()
yslice = session.yslice_from_ypos()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment