From f26df8382ce4eefb1b10ec49f46364030e9f9550 Mon Sep 17 00:00:00 2001 From: memgonzales Date: Sun, 17 Dec 2023 20:37:20 +0800 Subject: [PATCH] Display parameters for summary table --- callbacks/coexpression/callbacks.py | 6 +- callbacks/summary/callbacks.py | 119 ++++++++++++++++++++++++++++ callbacks/summary/util.py | 2 + pages/analysis/summary.py | 64 ++++++++++++++- 4 files changed, 187 insertions(+), 4 deletions(-) diff --git a/callbacks/coexpression/callbacks.py b/callbacks/coexpression/callbacks.py index 0e215b7b..32542d74 100644 --- a/callbacks/coexpression/callbacks.py +++ b/callbacks/coexpression/callbacks.py @@ -229,6 +229,8 @@ def display_coexpression_submitted_input(coexpression_is_submitted, genes, netwo Output('coexpression-results-module-tabs-container', 'style'), Output('coexpression-module-stats', 'children'), + Output('summary-is-submitted', 'data'), + State('homepage-submitted-genomic-intervals', 'data'), Input('coexpression-combined-genes', 'data'), @@ -272,12 +274,12 @@ def perform_module_enrichment(genomic_intervals, combined_gene_ids, submitted_ad first_module = enriched_modules[0] module = first_module else: - return enriched_modules, first_module, {'display': 'none'}, stats + return enriched_modules, first_module, {'display': 'none'}, stats, False if module: first_module = module - return enriched_modules, first_module, {'display': 'block'}, stats + return enriched_modules, first_module, {'display': 'block'}, stats, False raise PreventUpdate diff --git a/callbacks/summary/callbacks.py b/callbacks/summary/callbacks.py index f6b3a816..bffc3222 100644 --- a/callbacks/summary/callbacks.py +++ b/callbacks/summary/callbacks.py @@ -91,6 +91,26 @@ def submit_summary_input(summary_submitted_n_clicks, homepage_is_submitted, raise PreventUpdate + @app.callback( + Output('summary-results-container', 'style'), + Input('summary-is-submitted', 'data'), + ) + def display_summary_output(summary_is_submitted): + if summary_is_submitted: + return {'display': 'block'} + + else: + return {'display': 'none'} + + # @app.callback( + # Output('summary-submit', 'disabled'), + + # Input('summary-submit', 'n_clicks'), + # Input('summary-results-table', 'data') + # ) + # def disable_summary_button_upon_run(n_clicks, *_): + # return ctx.triggered_id == 'summary-submit' and n_clicks > 0 + @app.callback( Output('summary-converter-modal', 'is_open'), Input('summary-converter-tooltip', 'n_clicks'), @@ -100,3 +120,102 @@ def open_modals(summary_converter_tooltip_n_clicks): return True raise PreventUpdate + + @app.callback( + Output('summary-input', 'children'), + + Input('summary-is-submitted', 'data'), + State('coexpression-is-submitted', 'data'), + State('summary-valid-addl-genes', 'data'), + State('coexpression-submitted-network', 'data'), + State('coexpression-submitted-clustering-algo', 'data'), + State('coexpression-submitted-parameter-slider', 'data') + ) + def display_summary_submitted_input(summary_is_submitted, coexpression_is_submitted, addl_genes, network, algo, submitted_parameter_slider): + if coexpression_is_submitted: + parameters = 0 + if submitted_parameter_slider and algo in submitted_parameter_slider: + parameters = submitted_parameter_slider[algo]['value'] + + else: + # Assume default coexpression network parameters + algo = 'clusterone' + network = 'OS-CX' + parameters = 30 + + if summary_is_submitted: + if not addl_genes: + addl_genes = 'None' + else: + addl_genes = '; '.join(set(addl_genes)) + + return [html.B('Additional Genes: '), addl_genes, + html.Br(), + html.B('Selected Co-Expression Network: '), coexpression_util.get_user_facing_network( + network), + html.Br(), + html.B('Selected Module Detection Algorithm: '), coexpression_util.get_user_facing_algo( + algo), + html.Br(), + html.B('Selected Algorithm Parameter: '), coexpression_util.get_user_facing_parameter(algo, parameters)] + + raise PreventUpdate + + # ================= + # Table-related + # ================= + + # @app.callback( + # Output('summary-results-table', 'data'), + # Output('summary-results-table', 'columns'), + + # State('homepage-submitted-genomic-intervals', 'data'), + + # Input('summary-combined-genes', 'data'), + # Input('summary-submitted-addl-genes', 'data'), + + # State('homepage-is-submitted', 'data'), + # State('tfbs-is-submitted', 'data') + # ) + # def display_enrichment_results(genomic_intervals, combined_genes, submitted_addl_genes, + # homepage_submitted, tfbs_is_submitted): + # # if homepage_submitted and tfbs_is_submitted: + + # # return enrichment_results_df.to_dict('records'), columns, stats + + # raise PreventUpdate + + @app.callback( + Output('summary-results-table', 'filter_query', allow_duplicate=True), + Output('summary-results-table', 'page_current', allow_duplicate=True), + + Input('summary-reset-table', 'n_clicks'), + prevent_initial_call=True + ) + def reset_table_filter_page(*_): + return '', 0 + + # @app.callback( + # Output('tfbs-download-df-to-csv', 'data'), + # Input('tfbs-export-table', 'n_clicks'), + # State('tfbs-results-table', 'data'), + # State('homepage-submitted-genomic-intervals', 'data') + # ) + # def download_tfbs_table_to_csv(download_n_clicks, tfbs_df, genomic_intervals): + # if download_n_clicks >= 1: + # df = pd.DataFrame(purge_html_export_table(tfbs_df)) + # return dcc.send_data_frame(df.to_csv, f'[{genomic_intervals}] Regulatory Feature Enrichment.csv', index=False) + + # raise PreventUpdate + + # ================= + # Session-related + # ================= + + # @app.callback( + # Output('summary-addl-genes', 'value'), + + # State('tfbs-submitted-addl-genes', 'data') + # ) + # def get_input_tfbs_session_state(addl_genes): + # return addl_genes diff --git a/callbacks/summary/util.py b/callbacks/summary/util.py index e69de29b..219a4688 100644 --- a/callbacks/summary/util.py +++ b/callbacks/summary/util.py @@ -0,0 +1,2 @@ +def get_liftover_summary(): + pass diff --git a/pages/analysis/summary.py b/pages/analysis/summary.py index fa5ab636..3ee2cd5f 100644 --- a/pages/analysis/summary.py +++ b/pages/analysis/summary.py @@ -1,4 +1,4 @@ -from dash import html +from dash import dash_table, dcc, html from callbacks.constants import Constants import dash_bootstrap_components as dbc @@ -89,5 +89,65 @@ n_clicks=0, className='page-button'), ], className='analysis-intro p-3'), - ] + + html.Br(), + + html.Div( + id='summary-results-container', + style={'display': 'none'}, + children=[ + dcc.Loading([ + html.Hr(className='mt-3 mb-3'), + + html.Br(), + + html.Div( + id='summary-input', + className='analysis-intro p-3', + ), + + html.Br(), + + html.P( + html.Div([ + html.P( + 'The table below summarizes the results of the different post-GWAS analyses.', + className='text-start' + ), + + dbc.Button([html.I( + className='bi bi-download me-2'), + 'Export to CSV'], + id='summary-export-table', + n_clicks=0, + color='light', size='sm', className='table-button'), + dcc.Download(id='tfbs-download-df-to-csv'), + dbc.Button([html.I( + className='bi bi-arrow-clockwise me-2'), + 'Reset Table'], + id='summary-reset-table', + color='light', size='sm', className='ms-3 table-button') + ], style={'textAlign': 'right'}) + ), + + html.Br(), + + dash_table.DataTable( + id='summary-results-table', + style_cell={ + 'whiteSpace': 'pre-line' + }, + markdown_options={'html': True}, + sort_action='native', + filter_action='native', + filter_options={'case': 'insensitive', + 'placeholder_text': '🔎︎ Search Column'}, + page_action='native', + page_size=15, + cell_selectable=False, + style_table={'overflowX': 'auto'} + ) + ]) + ]) + ], className='mt-2 mb-4' )