diff --git a/callbacks/lift_over/util.py b/callbacks/lift_over/util.py index d003be2e..21dcc0d6 100644 --- a/callbacks/lift_over/util.py +++ b/callbacks/lift_over/util.py @@ -8,6 +8,8 @@ from ..general_util import * from ..links_util import * +import regex as re + Genomic_interval = namedtuple('Genomic_interval', ['chrom', 'start', 'stop']) @@ -122,6 +124,12 @@ def to_genomic_interval(genomic_interval_str): if is_one_digit_chromosome(chrom): chrom = pad_one_digit_chromosome(chrom) + # Change 'chr' to 'Chr' + chrom = re.sub(r'chr', 'Chr', chrom, flags=re.IGNORECASE) + + if not chrom.startswith('Chr') or not chrom[3].isdigit(): + return errors['NO_CHROM_INTERVAL_SEP'].code, genomic_interval_str + except ValueError: return errors['NO_CHROM_INTERVAL_SEP'].code, genomic_interval_str diff --git a/pages/analysis/co_expr.py b/pages/analysis/co_expr.py index 9d9c1a95..4a2a7148 100644 --- a/pages/analysis/co_expr.py +++ b/pages/analysis/co_expr.py @@ -4,73 +4,90 @@ from callbacks.constants import Constants from callbacks.coexpression.util import * +# ============================ +# Module Detection Algorithms +# ============================ -coach = html.Li( - [html.B('COACH'), - html.Span( + +coach = html.Li([ + html.B('COACH'), + html.Span( ' Detects highly connected gene subnetworks (referred to as "cores") and expands them by including closely associated genes', className='algo-desc'), - html.Div([ - html.Span( + html.Div([ + html.Span( 'Wu, M., Li, X., Kwoh, C. K., & Ng, S. K. (2009). A core-attachment based method to detect protein complexes in PPI networks. '), - html.I('BMC Bioinformatics, 10'), - html.Span('(169). '), - html.A('https://doi.org/10.1186/1471-2105-10-169', - href='https://doi.org/10.1186/1471-2105-10-169', - target='_blank')], - className='reference' - )] -) + html.I('BMC Bioinformatics, 10'), + html.Span('(169). '), + html.A( + 'https://doi.org/10.1186/1471-2105-10-169', + href='https://doi.org/10.1186/1471-2105-10-169', + target='_blank') + ], className='reference') +]) -demon = html.Li( - [html.B('DEMON'), - html.Span( +demon = html.Li([ + html.B('DEMON'), + html.Span( ' Adopts a bottom-up approach where genes "vote" to determine the subnetwork to which connected genes belong', className='algo-desc'), - html.Div([ - html.Span( + html.Div([ + html.Span( 'Coscia, M., Rossetti, G., Giannotti, F., & Pedreschi, D. (2012). DEMON: A local-first discovery method for overlapping communities. In '), - html.I('KDD\'12: Proceedings of the 18th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining '), - html.Span('(pp. 615–623). Association for Computing Machinery. '), - html.A('https://doi.org/10.1145/2339530.2339630', - href='https://doi.org/10.1145/2339530.2339630', - target='_blank')], - className='reference' - )] -) + html.I('KDD\'12: Proceedings of the 18th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining '), + html.Span('(pp. 615–623). Association for Computing Machinery. '), + html.A( + 'https://doi.org/10.1145/2339530.2339630', + href='https://doi.org/10.1145/2339530.2339630', + target='_blank') + ], className='reference') +]) -clusterone = html.Li( - [html.B('ClusterONE'), - html.Span( +clusterone = html.Li([ + html.B('ClusterONE'), + html.Span( ' Forms cohesive gene subnetworks from an initial set of seed genes. ', className='algo-desc'), - html.Div([ - html.Span( + html.Div([ + html.Span( 'Nepusz, T., Yu, H., & Paccanaro, A. (2012). Detecting overlapping protein complexes in protein-protein interaction networks. '), - html.I('Nature Methods, 9, '), - html.Span('471–472. '), - html.A('https://doi.org/10.1038/nmeth.1938', - href='https://doi.org/10.1038/nmeth.1938', - target='_blank')], - className='reference' - )], -) + html.I('Nature Methods, 9, '), + html.Span('471–472. '), + html.A( + 'https://doi.org/10.1038/nmeth.1938', + href='https://doi.org/10.1038/nmeth.1938', + target='_blank') + ], className='reference') +]) -fox = html.Li([html.B('FOX'), - html.Span( - ' Determines the membership of a gene to a subnetwork by counting the number of triangles formed by the gene with other genes in the subnetwork', - className='algo-desc'), +fox = html.Li([ + html.B('FOX'), + html.Span( + ' Determines the membership of a gene to a subnetwork by counting the number of triangles formed by the gene with other genes in the subnetwork', + className='algo-desc'), html.Div([ html.Span( - 'Lyu, T., Bing, L., Zhang, Z., & Zhang, Y. (2020). FOX: Fast overlapping community detection algorithm in big weighted networks. '), + 'Lyu, T., Bing, L., Zhang, Z., & Zhang, Y. (2020). FOX: Fast overlapping community detection algorithm in big weighted networks. '), html.I('ACM Transactions on Social Computing, 3'), html.Span('(3), 1–23. '), - html.A('https://doi.org/10.1145/3404970', - href='https://doi.org/10.1145/3404970', - target='_blank')], - className='reference mb-3', - ), - html.Span('RicePilaf uses LazyFox for a parallelized implementation of FOX') + html.A( + 'https://doi.org/10.1145/3404970', + href='https://doi.org/10.1145/3404970', + target='_blank') + ], className='reference mb-3'), + html.Span( + 'RicePilaf uses LazyFox for a parallelized implementation of FOX. LazyFox is run with the queue size and thread count set to 20.', + className='algo-desc'), + html.Div([ + html.Span( + 'Garrels, T., Khodabakhsh, A., Renard, B. Y., & Baum, K. (2023). LazyFox: Fast and parallelized overlapping community detection in large graphs. '), + html.I('PeerJ Computer Science, 9, '), + html.Span('e1291. '), + html.A( + 'https://doi.org/10.7717/peerj-cs.1291', + href='https://doi.org/10.7717/peerj-cs.1291', + target='_blank') + ], className='reference mb-3') ]) module_detection_algo_modal = dbc.Modal([ @@ -86,13 +103,18 @@ ])], id='coexpression-clustering-algo-modal', is_open=False, - size='xl' + size='xl', + scrollable=True ) +# ====================== +# Coexpression Networks +# ====================== + coexpression_network_modal = dbc.Modal([ dbc.ModalHeader( - dbc.ModalTitle('Module Detection Algorithms') + dbc.ModalTitle('Coexpression Networks') ), dbc.ModalBody([ html.P( @@ -123,19 +145,19 @@ html.Div([ html.P( [ - 'In this page, you can search for modules (a.k.a. communities, clusters) in rice co-expression networks, ' - 'which are significantly enriched in the genes implicated by your GWAS. ' - 'Likely functions of the modules are inferred by enrichment analysis against several ontologies and pathway databases. Click ', - dcc.Link( - ['here ', html.I( - id='demo-link', - className='fa-solid fa-up-right-from-square fa-2xs' - )], - href='https://github.com/bioinfodlsu/rice-pilaf/wiki/2.3-Co%E2%80%90expression-Network-Analysis', - target='_blank', - className='top-navbar-item' - ), - ' for user guide.' + 'In this page, you can search for modules (a.k.a. communities, clusters) in rice co-expression networks, ' + 'which are significantly enriched in the genes implicated by your GWAS. ' + 'Likely functions of the modules are inferred by enrichment analysis against several ontologies and pathway databases. Click ', + dcc.Link( + ['here ', html.I( + id='demo-link', + className='fa-solid fa-up-right-from-square fa-2xs' + )], + href='https://github.com/bioinfodlsu/rice-pilaf/wiki/2.3-Co%E2%80%90expression-Network-Analysis', + target='_blank', + className='top-navbar-item' + ), + ' for user guide.' ] ) diff --git a/pages/homepage.py b/pages/homepage.py index d70ef634..e0e6674d 100644 --- a/pages/homepage.py +++ b/pages/homepage.py @@ -20,16 +20,14 @@ html.Span('Enter genomic intervals like so: '), html.Span( 'Chr01:100000-200000', className='text-muted'), html.Br(), - html.Span( - 'Multiple intervals should be separated by a semicolon like so: '), - html.Span('Chr01:100000-200000;Chr02:300000-400000', - className='text-muted'), - html.Br(), - html.Span( + html.P([ + html.Span( + 'Multiple intervals should be separated by a semicolon like so: '), + html.Span('Chr01:100000-200000;Chr02:300000-400000', + className='text-muted') + ]), + html.P( 'These intervals are obtained from LD-based clumping of significant GWAS SNPs or from QTL mapping studies.'), - html.Br(), - html.Br(), - html.P( 'We also provide some sample genomic intervals, taken from the following GWAS/QTL analyses:'), html.Ul([ @@ -65,7 +63,8 @@ ])], id='genomic-interval-modal', is_open=False, - size='xl' + size='xl', + scrollable=True ) # ======