File size: 3,792 Bytes
b53e5c3
 
 
 
0dab632
b53e5c3
 
 
0dab632
b53e5c3
 
6756e43
b53e5c3
0dab632
 
 
 
 
b53e5c3
 
 
 
 
 
 
0dab632
b53e5c3
 
 
 
 
 
0dab632
 
 
 
 
 
 
 
 
 
 
d3eee8e
6756e43
0dab632
 
 
b53e5c3
 
 
 
 
 
 
0dab632
6756e43
0dab632
 
 
 
 
d3eee8e
6756e43
 
 
0dab632
 
 
 
 
 
 
 
b53e5c3
 
6756e43
b53e5c3
 
 
 
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

import gradio as gr
from tifffile import imread
from PIL import Image
from path_analysis.analyse import analyse_paths
import numpy as np


# Function to preview the imported image
def preview_image(file1):
    if file1:
        print('Uploading image', file1.name)
        im = imread(file1.name)
        print(im.ndim, im.shape)
        if im.ndim>2:
            return Image.fromarray(np.max(im, axis=0))
        else:
            return Image.fromarray(im)
    else:
        return None


with gr.Blocks() as demo:
    with gr.Row():
        with gr.Column():
            # Inputs for cell ID, image, and path
            cellid_input = gr.Textbox(label="Cell ID", placeholder="Image_1")
            image_input = gr.File(label="Input foci image")
            image_preview = gr.Image(label="Max projection of foci image")
            image_input.change(fn=preview_image, inputs=image_input, outputs=image_preview)
            path_input = gr.File(label="SNT traces file")

            # Additional options wrapped in an accordion for better UI experience
            with gr.Accordion("Additional options ..."):
                sphere_radius = gr.Number(label="Trace sphere radius (um)", value=0.1984125, interactive=True)
                peak_threshold = gr.Number(label="Peak relative threshold", value=0.4, interactive=True)
                # Resolutions for xy and z axis
                with gr.Row():
                    xy_res = gr.Number(label='xy-yesolution (um)', value=0.0396825, interactive=True)
                    z_res = gr.Number(label='z resolution (um)', value=0.0909184, interactive=True)
                # Resolutions for xy and z axis

                threshold_type = gr.Radio(["per-trace", "per-cell"], label="Threshold-type", value="per-trace", interactive=True)
                use_corrected_positions = gr.Checkbox(label="Correct foci position measurements", value=True, interactive=True)
                screening_distance = gr.Number(label='Screening distance (voxels)', value=10, interactive=True)

                 
        # The output column showing the result of processing            
        with gr.Column():
            trace_output = gr.Image(label="Overlayed paths")
            image_output=gr.Gallery(label="Traced paths")
            plot_output=gr.Plot(label="Foci intensity traces")
            data_output=gr.DataFrame(label="Detected peak data")#, "Peak 1 pos", "Peak 1 int"])
            data_file_output=gr.File(label="Output data file (.csv)")


    def process(cellid_input, image_input, path_input, sphere_radius, peak_threshold, xy_res, z_res, threshold_type, use_corrected_positions, screening_distance):

        config = { 'sphere_radius': sphere_radius,
                   'peak_threshold': peak_threshold,
                   'xy_res': xy_res,
                   'z_res': z_res,
                   'threshold_type': threshold_type,
                   'use_corrected_positions': use_corrected_positions,
                   'screening_distance': screening_distance,
                  }
                   
        
        paths, traces, fig, extracted_peaks = analyse_paths(cellid_input, image_input.name, path_input.name, config)
        extracted_peaks.to_csv('output.csv')
        print('extracted', extracted_peaks)
        return paths, [Image.fromarray(im) for im in traces], fig, extracted_peaks, 'output.csv'

            
    with gr.Row():
        greet_btn = gr.Button("Process")
        greet_btn.click(fn=process, inputs=[cellid_input, image_input, path_input, sphere_radius, peak_threshold, xy_res, z_res, threshold_type, use_corrected_positions, screening_distance], outputs=[trace_output, image_output, plot_output, data_output, data_file_output], api_name="process")


if __name__ == "__main__":
    demo.launch()