Spaces:
Runtime error
Runtime error
import gradio as gr | |
import numpy as np | |
import pandas as pd | |
import plotly.graph_objects as go | |
from fcsparser import parse | |
from matplotlib.path import Path | |
def parse_fcs(file): | |
_, data = parse(file.name, reformat_meta=True) | |
return data | |
def update_params(data): | |
if data is None: | |
return [gr.Dropdown.update(choices=[])] * 2 | |
return [gr.Dropdown.update(choices=data.columns.tolist())] * 2 | |
def create_plot(data, x_param, y_param): | |
if data is None or not x_param or not y_param: | |
return None | |
fig = go.Figure(data=go.Scattergl( | |
x=data[x_param], | |
y=data[y_param], | |
mode='markers', | |
marker=dict(size=2, opacity=0.5) | |
)) | |
fig.update_layout( | |
title=f"{x_param} vs {y_param}", | |
dragmode='drawclosedpath', | |
width=800, | |
height=600 | |
) | |
return fig | |
def apply_gate(data, x_param, y_param, fig): | |
if data is None or fig is None: | |
return "Önce veri yükleyin ve grafik oluşturun", None | |
# Plotly şekil verisini çıkar | |
shapes = fig.get('layout', {}).get('shapes', []) | |
if not shapes: | |
return "Lütfen önce polygon çizin", None | |
# Son çizilen şekli al | |
last_shape = shapes[-1] | |
path = last_shape.get('path', '') | |
# Path verisini işle (M=move, L=line, Z=close) | |
vertices = [] | |
for part in path.split(' '): | |
if part.startswith('M') or part.startswith('L'): | |
x, y = part[1:].split(',') | |
vertices.append((float(x), float(y))) | |
if len(vertices) < 3: | |
return "Geçerli bir polygon çizilmedi", None | |
# Matplotlib Path oluştur | |
polygon = Path(vertices) | |
points = np.vstack([data[x_param], data[y_param]]).T | |
# İçerde kalan noktaları bul | |
mask = polygon.contains_points(points) | |
gated_data = data[mask] | |
# Sonuçları hazırla | |
stats = f""" | |
Toplam Hücre: {len(data):,} | |
Geçitlenen Hücre: {len(gated_data):,} (%{len(gated_data)/len(data)*100:.1f}) | |
İlk 10 Hücre İndeksi: {gated_data.index[:10].tolist()} | |
""" | |
return stats, gated_data | |
with gr.Blocks(title="FCS Analiz Uygulaması") as demo: | |
gr.Markdown("## FCS Dosya Analizi ve Hücre Geçitleme") | |
with gr.Row(): | |
with gr.Column(): | |
file_input = gr.File(label="FCS Dosyası Yükle", type="file") | |
x_param = gr.Dropdown(label="X Parametresi") | |
y_param = gr.Dropdown(label="Y Parametresi") | |
plot_btn = gr.Button("Grafik Oluştur") | |
with gr.Column(): | |
plot_output = gr.Plot(label="Dağılım Grafiği") | |
gate_btn = gr.Button("Geçitlemeyi Uygula") | |
result_output = gr.Textbox(label="Sonuçlar") | |
data_output = gr.DataFrame(label="Geçitlenen Veriler", visible=False) | |
# State management | |
data_state = gr.State() | |
fig_state = gr.State() | |
# Event handlers | |
file_input.change( | |
fn=parse_fcs, | |
inputs=file_input, | |
outputs=data_state | |
).then( | |
fn=update_params, | |
inputs=data_state, | |
outputs=[x_param, y_param] | |
) | |
plot_btn.click( | |
fn=create_plot, | |
inputs=[data_state, x_param, y_param], | |
outputs=[plot_output] | |
).then( | |
lambda fig: fig, | |
inputs=plot_output, | |
outputs=fig_state | |
) | |
gate_btn.click( | |
fn=apply_gate, | |
inputs=[data_state, x_param, y_param, fig_state], | |
outputs=[result_output, data_output] | |
) | |
if __name__ == "__main__": | |
demo.launch() |