diff --git a/conekt/controllers/ecc.py b/conekt/controllers/ecc.py index e974801..e248820 100644 --- a/conekt/controllers/ecc.py +++ b/conekt/controllers/ecc.py @@ -82,6 +82,26 @@ def ecc_graph_pair_json(ecc_id): """ network, family = SequenceSequenceECCAssociation.get_ecc_pair_network(ecc_id) + network_cytoscape = CytoscapeHelper.parse_network(network) + network_cytoscape = CytoscapeHelper.add_descriptions_nodes(network_cytoscape) + network_cytoscape = CytoscapeHelper.add_family_data_nodes(network_cytoscape, family) + network_cytoscape = CytoscapeHelper.add_lc_data_nodes(network_cytoscape) + network_cytoscape = CytoscapeHelper.add_species_data_nodes(network_cytoscape) + network_cytoscape = CytoscapeHelper.connect_homologs(network_cytoscape) + + return json.dumps(network_cytoscape) + + +@ecc.route('/multi_json/') +def ecc_graph_multi_json(): + """ + Returns a JSON object compatible with cytoscape.js that contains the ECC graph for a specific pair of sequences + + :param ecc_id: internal ID of the sequence to sequence ECC relationship + :return: JSON object compatible with cytoscape.js + """ + network, family = SequenceSequenceECCAssociation.get_ecc_multi_network(2, [230458, 35796, 162930]) + network_cytoscape = CytoscapeHelper.parse_network(network) network_cytoscape = CytoscapeHelper.add_descriptions_nodes(network_cytoscape) network_cytoscape = CytoscapeHelper.add_family_data_nodes(network_cytoscape, family) diff --git a/conekt/helpers/cytoscape.py b/conekt/helpers/cytoscape.py index eeff254..57aead8 100644 --- a/conekt/helpers/cytoscape.py +++ b/conekt/helpers/cytoscape.py @@ -251,6 +251,28 @@ def add_depth_data_nodes(network): return colored_network + @staticmethod + def connect_homologs(network): + connected_network = deepcopy(network) + """ + Add edges between homologous genes from different targets, family_id needs to be specified ! + """ + + for i in range(len(connected_network['nodes']) - 1): + for j in range(i + 1, len(connected_network['nodes'])): + if connected_network['nodes'][i]['data']['family_id'] == connected_network['nodes'][j]['data']['family_id'] and connected_network['nodes'][i]['data']['family_id'] is not None: + connected_network['edges'].append({ + 'data': {'source': connected_network['nodes'][i]['data']['id'], + 'target': connected_network['nodes'][j]['data']['id'], + 'color': "#33D", + 'homology_color': "#33D", + 'edge_type': 'homology', + 'ecc_pair_color': "#33D", + 'homology': True} + }) + + return connected_network + @staticmethod def add_connection_data_nodes(network): """ diff --git a/conekt/models/relationships/sequence_sequence_ecc.py b/conekt/models/relationships/sequence_sequence_ecc.py index 7363aa6..c1bf778 100644 --- a/conekt/models/relationships/sequence_sequence_ecc.py +++ b/conekt/models/relationships/sequence_sequence_ecc.py @@ -201,32 +201,47 @@ def get_ecc_pair_network(ecc_id): "edge_type": "expression", 'ecc_pair_color': "#3D3"}) - """ - Add gene families to sequences - """ - seq_fams = SequenceFamilyAssociation.query.filter(and_(SequenceFamilyAssociation.sequence_id.in_(sequences), - SequenceFamilyAssociation.family.has(method_id=association.gene_family_method_id) - )).all() - - seq_to_fam = {sf.sequence_id: sf.gene_family_id for sf in seq_fams} + return {"nodes": nodes, "edges": edges}, association.gene_family_method_id - for i, node in enumerate(nodes): - nodes[i]['family_id'] = seq_to_fam[node['gene_id']] if node['gene_id'] in seq_to_fam.keys() else None - - """ - Add edges between homologous genes from different targets - """ - - for i in range(len(nodes) - 1): - for j in range(i + 1, len(nodes)): - if nodes[i]['family_id'] == nodes[j]['family_id'] and nodes[i]['family_id'] is not None: - edges.append( - {'source': nodes[i]['id'], - 'target': nodes[j]['id'], - 'homology_color': "#33D", - 'edge_type': 'homology', - 'ecc_pair_color': "#33D", - 'homology': True} - ) - - return {"nodes": nodes, "edges": edges}, association.gene_family_method_id \ No newline at end of file + @staticmethod + def get_ecc_multi_network(gf_method_id, sequence_ids): + associations = SequenceSequenceECCAssociation.query.\ + filter(SequenceSequenceECCAssociation.gene_family_method_id == gf_method_id).\ + filter(and_(SequenceSequenceECCAssociation.query_id.in_(sequence_ids), + SequenceSequenceECCAssociation.target_id.in_(sequence_ids))).\ + all() + + nodes = [] + edges = [] + node_sequence_ids = [] + + for a in associations: + if a.query_id not in node_sequence_ids: + node_sequence_ids.append(a.query_id) + nodes.append({"id": a.query_sequence.name, + "name": a.query_sequence.name, + "species_id": a.query_sequence.species_id, + "species_name": a.query_sequence.species.name, + "gene_id": a.query_id, + "gene_name": a.query_sequence.name, + "network_method_id": a.query_network_method_id, + "node_type": "query"}) + + if a.target_id not in node_sequence_ids: + node_sequence_ids.append(a.target_id) + nodes.append({"id": a.target_sequence.name, + "name": a.target_sequence.name, + "species_id": a.target_sequence.species_id, + "species_name": a.target_sequence.species.name, + "gene_id": a.target_id, + "gene_name": a.target_sequence.name, + "network_method_id": a.target_network_method_id, + "node_type": "query"}) + + edges.append({"source": a.query_sequence.name, + "target": a.target_sequence.name, + "ecc_score": a.ecc, + 'ecc_pair_color': "#D33", + "edge_type": "ecc"}) + + return {"nodes": nodes, "edges": edges}, gf_method_id diff --git a/conekt/templates/expression_graph.html b/conekt/templates/expression_graph.html index e8f930c..ea5d569 100644 --- a/conekt/templates/expression_graph.html +++ b/conekt/templates/expression_graph.html @@ -111,7 +111,7 @@

ECC pair

{% if sequence %}
  • ECC
  • {% endif %} - {% if not sequence %} + {% if not sequence and not ecc_pair %}

  • Cutoff: {{cutoff}}