minor performance improvements
%% Cell type:code id: tags: | ||
``` python | ||
import os | ||
import os.path as osp | ||
import pickle | ||
import napari | ||
from skimage import io | ||
from skimage.color import rgb2gray | ||
import matplotlib.pyplot as plt | ||
from matplotlib import cm | ||
import numpy as np | ||
import seaborn as sns | ||
import pandas as pd | ||
import warnings | ||
import ipywidgets as widgets | ||
from ipywidgets import HBox, VBox, interact, interact_manual, TwoByTwoLayout, GridspecLayout, Label, AppLayout | ||
from ipyfilechooser import FileChooser | ||
from IPython.display import HTML, Markdown, display, clear_output | ||
from traitlets import traitlets | ||
from track_analyzer import prepare as tpr | ||
from track_analyzer import plotting as tpl | ||
from track_analyzer import calculate as tca | ||
from track_analyzer.scripts.analyze_tracks import traj_analysis | ||
from track_analyzer.scripts.analyze_maps import map_analysis | ||
from track_analyzer.scripts.compare_datasets import compare_datasets | ||
from napari.settings import get_settings | ||
get_settings().application.ipy_interactive = False # disable interactive usage of Napari viewer (necessary for tpr.get_coordinates) | ||
warnings.filterwarnings('ignore') | ||
%matplotlib inline | ||
def printmd(string): | ||
display(Markdown(string)) | ||
cwd = os.getcwd() # working directory | ||
plot_param = tpl.make_plot_config() # some config parameters | ||
color_list = plot_param['color_list'] # a list of colors often used | ||
# Hide code | ||
HTML('''<script> | ||
code_show=true; | ||
function code_toggle() { | ||
if (code_show){ | ||
$('div.input').hide(); | ||
} else { | ||
$('div.input').show(); | ||
} | ||
code_show = !code_show | ||
} | ||
$( document ).ready(code_toggle); | ||
</script> | ||
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>''') | ||
``` | ||
%% Output | ||
_ _ _ | ||
| |_ _ __ __ _ ___| | __ __ _ _ __ __ _| |_ _ _______ _ __ | ||
| __| '__/ _` |/ __| |/ / / _` | '_ \ / _` | | | | |_ / _ \ '__| | ||
| |_| | | (_| | (__| < | (_| | | | | (_| | | |_| |/ / __/ | | ||
\__|_| \__,_|\___|_|\_\ \__,_|_| |_|\__,_|_|\__, /___\___|_| | ||
|___/ | ||
Track Analyzer - Quantification and visualization of tracking data. | ||
Developed and maintained by Arthur Michaut: arthur.michaut@gmail.com | ||
<IPython.core.display.HTML object> | ||
%% Cell type:markdown id: tags: | ||
# Preparation module | ||
## Loading data | ||
%% Cell type:code id: tags: | ||
``` python | ||
#choose positions file | ||
fc_table = FileChooser(cwd) | ||
fc_table.use_dir_icons = True | ||
fc_table.title = '<b>Tracking data file</b>' | ||
sep_wid = widgets.Dropdown(options=[',',';', 'tab', ' '],value=',',description='column separator:',style={'description_width': 'initial'}) | ||
header_wid = widgets.Dropdown(options=['yes','no'],value='yes',description='first row = column names?',style={'description_width': 'initial'}) | ||
printmd("""**Browse your file system to the table of tracked data (only .txt and .csv are supported)**""") | ||
display(fc_table,sep_wid,header_wid) | ||
``` | ||
%% Output | ||
**Browse your file system to the table of tracked data (only .txt and .csv are supported)** | ||
%% Cell type:code id: tags: | ||
``` python | ||
# get position file path | ||
data_dir = fc_table.selected_path | ||
data_file = fc_table.selected | ||
if data_file is None: | ||
raise Exception("**ERROR: no data table has been selected**") | ||
# choose image file | ||
printmd("""**(Optional) Browse your file system to the image file** | ||
You can plot your data on your image. The image can be a single image or a stack (a 2D time series or a 3D time series). | ||
Only tif images are supported. """) | ||
fc_im = FileChooser(data_dir) | ||
fc_im.use_dir_icons = True | ||
fc_im.title = '<b>Image file</b>' | ||
display(fc_im) | ||
``` | ||
%% Output | ||
**(Optional) Browse your file system to the image file** | ||
You can plot your data on your image. The image can be a single image or a stack (a 2D time series or a 3D time series). | ||
Only tif images are supported. | ||
%% Cell type:code id: tags: | ||
``` python | ||
# get image file path | ||
im_file = fc_im.selected | ||
#im_file = "/Users/amichaut/Desktop/Fluo-N3DH-CE/stack.tif" | ||
# analyze image | ||
y_size,x_size = [512,512] #default size of an image to inialize the make info widget | ||
image = tpr.get_image(data_dir,filename=im_file,verbose=True) | ||
if image['image_size'] is not None: | ||
y_size,x_size = image['image_size'] | ||
get_image_size = False | ||
else: | ||
get_image_size = True # to call get_image again after info.txt is generated | ||
# swap z and t dimensions if needed | ||
check_swap_wid = False # bool to retrieve swap_wid value if necessary | ||
if image['t_dim'] is not None and image['z_dim'] is not None: | ||
check_swap_wid=True | ||
printmd("If there is an error between t and z dimension, you can swap these dimensions") | ||
swap_wid = widgets.ToggleButton(value=False,description='Swap z and t') | ||
display(swap_wid) | ||
# refresh database and info if needed | ||
database_fn=osp.join(data_dir,'data_base.p') | ||
info_fn=osp.join(data_dir,'info.txt') | ||
printmd("---") | ||
if osp.exists(database_fn): | ||
printmd('The database already exists, do you want to refresh it?') | ||
refresh_db_wid=widgets.ToggleButton(value=False,description='Refresh database') | ||
display(refresh_db_wid) | ||
if osp.exists(info_fn): | ||
printmd("The info.txt file already exists, do you want to refresh it?") | ||
refresh_info_wid=widgets.ToggleButton(value=False,description='Refresh info') | ||
display(refresh_info_wid) | ||
``` | ||
%% Output | ||
--- | ||
The database already exists, do you want to refresh it? | ||
The info.txt file already exists, do you want to refresh it? | ||
%% Cell type:code id: tags: | ||
``` python | ||
printmd("**Don't forget to run this cell!**") # no output cell, make it visible | ||
#swap z and t | ||
if check_swap_wid: | ||
if swap_wid.value: | ||
t_dim = image['t_dim'] | ||
z_dim = image['z_dim'] | ||
image['t_dim'] = z_dim | ||
image['z_dim'] = t_dim | ||
printmd("**z and t swapped!**") | ||
im = io.imread(image['image_fn']) | ||
printmd("4D image with {} time steps and {} z slices".format(im.shape[image['t_dim']],im.shape[image['z_dim']])) | ||
del im # free memory | ||
# retrieve refresh widgets values | ||
refresh_db=refresh_db_wid.value if osp.exists(database_fn) else True | ||
refresh_info=refresh_info_wid.value if osp.exists(info_fn) else True | ||
# get info | ||
if refresh_info: | ||
length_unit_wid=widgets.Dropdown(options=['um', 'mm', 'au'],value='um',description='Length unit:',style={'description_width': 'initial'}) | ||
time_unit_wid=widgets.Dropdown(options=['min', 's', 'hr', 'au'],value='min',description='Time unit:',style={'description_width': 'initial'}) | ||
length_sc_wid=widgets.BoundedFloatText(value=1.0,min=0,max=1e4,description='Pixel size:',style={'description_width': 'initial'}) | ||
z_sc_wid=widgets.BoundedFloatText(value=0,min=0,max=1e4,description='z step:',style={'description_width': 'initial'}) | ||
time_sc_wid=widgets.BoundedFloatText(value=1.0,min=0,max=1e4,description='Frame interval:',style={'description_width': 'initial'}) | ||
width_wid=widgets.BoundedIntText(value=x_size,min=0,max=1e4,description='Image width (px):',style={'description_width': 'initial'}) | ||
height_wid=widgets.BoundedIntText(value=y_size,min=0,max=1e4,description='Image height (px):',style={'description_width': 'initial'}) | ||
left_box = VBox([length_unit_wid, time_unit_wid,width_wid]) | ||
right_box = VBox([length_sc_wid, time_sc_wid,height_wid]) | ||
box = HBox([left_box, right_box]) | ||
printmd("**Information about the data**") | ||
display(box) | ||
printmd("In the data table, are the positions given in pixels or in the length unit (given above)?") | ||
table_unit_wid=widgets.Dropdown(options=['px', 'unit'],value='px',description='Data unit:',style={'description_width': 'initial'}) | ||
display(table_unit_wid) | ||
printmd("If the lengthscale in z is different from the xy lengthscale, enter the z step (in length unit). If not, leave it to zero.") | ||
display(z_sc_wid) | ||
wid_list = [length_unit_wid,time_unit_wid,length_sc_wid,time_sc_wid,width_wid,height_wid,table_unit_wid,z_sc_wid] | ||
param_names = ['length_unit','time_unit','lengthscale','timescale','image_width','image_height','table_unit','z_step'] | ||
``` | ||
%% Output | ||
**Don't forget to run this cell!** | ||
%% Cell type:code id: tags: | ||
``` python | ||
printmd("**Don't forget to run this cell!**") # no output cell, make it visible | ||
# save info as txt file | ||
if refresh_info: | ||
info = {} | ||
with open(info_fn,'w+') as f: | ||
for couple in zip(param_names,wid_list): | ||
info[couple[0]]=couple[1].value | ||
f.write('{}:{}\n'.format(couple[0],couple[1].value)) | ||
else: | ||
info = tpr.get_info(data_dir) | ||
image = tpr.get_image(data_dir,filename=im_file,verbose=True) | ||
``` | ||
%% Output | ||
**Don't forget to run this cell!** | ||
%% Cell type:code id: tags: | ||
``` python | ||
printmd("**Don't forget to run this cell!**") # no output cell, make it visible | ||
# Set columns identity | ||
if refresh_db: | ||
sep = sep_wid.value if sep_wid.value !='tab' else '\t' | ||
header = None if header_wid.value=='no' else 0 | ||
df = pd.read_csv(data_file,sep=sep,header=header) | ||
printmd("**Here are the first rows of the input data table**") | ||
display(df.head(10)) | ||
``` | ||
%% Output | ||
**Don't forget to run this cell!** | ||
%% Cell type:code id: tags: | ||
``` python | ||
printmd("**Don't forget to run this cell!**") # no output cell, make it visible | ||
if refresh_db: | ||
col_wid_list = [] | ||
left_list=[] | ||
right_list=[] | ||
param_list = ['discard','x','y','z','frame','track'] | ||
var_list = [] | ||
var_wid_dict = {} | ||
custom_var_num = df.shape[1] - 5 # number of columns apart from 'x','y','z','frame','track' | ||
for i in range(custom_var_num): | ||
param_list.append('var_{}'.format(i+1)) | ||
var_list.append('var_{}'.format( |