Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
qim3d
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
QIM
Tools
qim3d
Commits
5b7082bb
Commit
5b7082bb
authored
1 year ago
by
Felipe Delestro Matos
Browse files
Options
Downloads
Patches
Plain Diff
Data explorer with basic viz
parent
0b24d0e1
No related branches found
No related tags found
1 merge request
!9
Data explorer with basic viz
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
qim3d/gui/data_explorer.py
+67
-46
67 additions, 46 deletions
qim3d/gui/data_explorer.py
with
67 additions
and
46 deletions
qim3d/gui/data_explorer.py
+
67
−
46
View file @
5b7082bb
...
...
@@ -2,12 +2,13 @@ import gradio as gr
import
numpy
as
np
import
os
from
qim3d.utils
import
internal_tools
from
qim3d.io
import
DataL
oad
er
from
qim3d.io
import
l
oad
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
()
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment