def change_enzyme(): selected_node = request.form['selected_node'] selected_enzyme = request.form['selected_enzyme'] task_id = request.form['task_id'] data = json.loads(current_app.redis.get(task_id)) graph_dict = json.loads(data['graph_dict']) attr_dict = json.loads(data['attr_dict']) target_smiles = data['target_smiles'] network_options = json.loads(data['network_options']) graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph) network = Network(graph=graph, target_smiles=target_smiles) network.settings = network_options network.add_attributes(attr_dict) network.calculate_scores() network.graph.nodes[selected_node]['attributes']['selected_enzyme'] = selected_enzyme data['attr_dict'] = json.dumps(network.attributes_dict()) current_app.redis.mset({task_id: json.dumps(data)}) time_to_expire = 15 * 60 # 15 mins * 60 seconds current_app.redis.expire(task_id, time_to_expire) successors = list(network.graph.successors(selected_node)) predecessors = list(network.graph.predecessors(selected_node)) subgraph = network.graph.subgraph([selected_node]+successors+predecessors) nodes, edges = network.get_visjs_nodes_and_edges(graph=subgraph) result = {'nodes': nodes, 'edges': edges} return jsonify(result=result)
def test_product_against_rules(): target_smiles = request.form['target_smiles'] smarts = request.form['smarts'] try: smarts_list = yaml.load(smarts, Loader=yaml.FullLoader) except: return jsonify(result={'status': 'fail'}) try: rxn_list = [] for sma in smarts_list: rxn_list.append(rdchiralReaction(sma)) except: return jsonify(result={'status': 'fail'}) try: network = Network() if request.form['combine_enantiomers'] == 'true': network.settings['combine_enantiomers'] = True else: network.settings['combine_enantiomers'] = False network.rxn_obj.rxns = {'test_smarts': rxn_list} network.rxns = {'test_smarts': rxn_list} network.generate(target_smiles, 1) nodes, edges = network.get_visjs_nodes_and_edges() print(nodes) result = {'status': 'success', 'nodes': nodes, 'edges': edges} except: result = {'status': 'fail'} return jsonify(result=result)
def change_network_options(): reaction_colours = request.form['reaction_colours'] edge_colours = request.form['edge_colours'] task_id = request.form['task_id'] data = json.loads(current_app.redis.get(task_id)) graph_dict = json.loads(data['graph_dict']) attr_dict = json.loads(data['attr_dict']) target_smiles = data['target_smiles'] network_options = json.loads(data['network_options']) graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph) network = Network(graph=graph, target_smiles=target_smiles) network.update_settings(network_options) network.add_attributes(attr_dict) network.settings['colour_reactions'] = reaction_colours network.settings["colour_arrows"] = edge_colours nodes, edges = network.get_visjs_nodes_and_edges() data['nodes'] = add_new(data['nodes'], nodes) data['edges'] = add_new(data['edges'], edges) data['network_options'] = json.dumps(network.settings) current_app.redis.mset({task_id: json.dumps(data)}) time_to_expire = 15 * 60 #15 mins * 60 seconds current_app.redis.expire(task_id, time_to_expire) result = { 'nodes': nodes, 'edges': edges, } return jsonify(result=result)
def aizynth_step(): clicked_node = request.form['smiles'] x = request.form['x'] y = request.form['y'] task_id = request.form['task_id'] max_reactions = request.form['max_reactions'] aizynth_reaction_mode = request.form['aizynth_reaction_mode'] data = json.loads(current_app.redis.get(task_id)) graph_dict = json.loads(data['graph_dict']) attr_dict = json.loads(data['attr_dict']) target_smiles = data['target_smiles'] network_options = json.loads(data['network_options']) graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph) network = Network(graph=graph, target_smiles=target_smiles, print_log=not current_app.config['PRODUCTION']) network.update_settings(network_options) network.add_attributes(attr_dict) network.update_settings({ 'max_reactions': int(max_reactions), 'aizynth_reaction_mode': aizynth_reaction_mode }) new_substrate_nodes, new_reaction_nodes = network.add_chemical_step( clicked_node) all_new_nodes = [clicked_node] + new_substrate_nodes + new_reaction_nodes subgraph = network.graph.subgraph(all_new_nodes) nodes, edges = network.get_visjs_nodes_and_edges(graph=subgraph) for i, node in enumerate(nodes): nodes[i].update({'x': x, 'y': y}) result = {'nodes': nodes, 'edges': edges} data['graph_dict'] = json.dumps(nx.to_dict_of_lists(network.graph)) data['attr_dict'] = json.dumps(network.attributes_dict()) nodes = add_new(data['nodes'], nodes) edges = add_new(data['edges'], edges) nodes, edges = delete_nodes_and_edges([], nodes, edges) data['nodes'] = nodes data['edges'] = edges current_app.redis.mset({task_id: json.dumps(data)}) time_to_expire = 15 * 60 #15 mins * 60 seconds current_app.redis.expire(task_id, time_to_expire) return jsonify(result=result)
def task_add_retrorule_step(form_data, network_id): job = get_current_job() job.meta['progress'] = 'started' job.save_meta() clicked_node = form_data['smiles'] x = form_data['x'] y = form_data['y'] data = json.loads(current_app.redis.get(network_id)) graph_dict = json.loads(data['graph_dict']) attr_dict = json.loads(data['attr_dict']) target_smiles = data['target_smiles'] network_options = json.loads(data['network_options']) graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph) network = Network(graph=graph, target_smiles=target_smiles) network.update_settings(network_options) network.add_attributes(attr_dict) network.retrorules.retrorules_rxns = current_app.retrorules_rxns network.retrorules.retrorule_db = current_app.retrorules_db new_substrate_nodes, new_reaction_nodes = network.retrorules.add_step( clicked_node) all_new_nodes = [clicked_node] + new_substrate_nodes + new_reaction_nodes subgraph = network.graph.subgraph(all_new_nodes) nodes, edges = network.get_visjs_nodes_and_edges(graph=subgraph) for i, node in enumerate(nodes): nodes[i].update({'x': x, 'y': y}) result = { 'nodes': nodes, 'edges': edges, 'to_delete': [], } data['graph_dict'] = json.dumps(nx.to_dict_of_lists(network.graph)) data['attr_dict'] = json.dumps(network.attributes_dict()) data['nodes'] = add_new(data['nodes'], nodes) data['edges'] = add_new(data['edges'], edges) current_app.redis.mset({network_id: json.dumps(data)}) current_app.redis.expire(network_id, 5 * 60) return result
def custom_reaction(): product_smiles = str(request.form['product']) substrate_smiles = str(request.form['substrate']) reaction_name = str(request.form['name']) task_id = request.form['task_id'] data = json.loads(current_app.redis.get(task_id)) graph_dict = json.loads(data['graph_dict']) attr_dict = json.loads(data['attr_dict']) target_smiles = data['target_smiles'] network_options = json.loads(data['network_options']) graph = nx.from_dict_of_lists(graph_dict, create_using=nx.DiGraph) network = Network(graph=graph, target_smiles=target_smiles) network.update_settings(network_options) network.add_attributes(attr_dict) new_substrate_nodes, new_reaction_nodes = network.custom_reaction( product_smiles, substrate_smiles, reaction_name) all_new_nodes = new_substrate_nodes + new_reaction_nodes subgraph = network.graph.subgraph(all_new_nodes) nodes, edges = network.get_visjs_nodes_and_edges(graph=subgraph) result = { 'nodes': nodes, 'edges': edges, } data['graph_dict'] = json.dumps(nx.to_dict_of_lists(network.graph)) data['attr_dict'] = json.dumps(network.attributes_dict()) nodes = add_new(data['nodes'], nodes) edges = add_new(data['edges'], edges) data['nodes'] = nodes data['edges'] = edges current_app.redis.mset({task_id: json.dumps(data)}) current_app.redis.expire(task_id, 5 * 60) return jsonify(result=result)
def task_make_network(form_data): job = get_current_job() job.meta['progress'] = 'started' job.save_meta() network = Network(include_experimental=bool(form_data['include_experimental']), include_two_step=bool(form_data['include_two_step']), include_requires_absence_of_water=bool(form_data['include_requires_absence_of_water']), print_log=not current_app.config['PRODUCTION']) network.update_settings({"allow_backwards_steps": bool(form_data['allow_backwards']), "remove_simple": bool(form_data['remove_small']), "similarity_score_threshold": float(form_data['sub_thres']), "combine_enantiomers" : bool(form_data['combine_enantiomers']), "num_enzymes": 1, "calculate_complexities": bool(form_data['calc_complexity']), "calculate_substrate_specificity": bool(form_data['sub_sim']), "max_nodes": int(form_data['max_initial_nodes'],), "colour_reactions" : form_data['colour_reactions'], "colour_arrows": form_data['colour_edges'], "show_negative_enzymes" : form_data['show_neg_enz'], "only_postitive_enzyme_data" : not form_data['show_neg_enz'], "max_reactions": form_data["max_reactions"], 'only_reviewed_activity_data': bool(form_data["only_reviewed"])}) if form_data["specificity_scoring_mode"] == 'Product + substrates (slower)': network.update_settings({'specificity_score_substrates' : True}) #print(f"include_experimental = {network.settings['include_experimental']}") #print(f"include_two_step = {network.settings['include_two_step']}") network.generate(form_data['target_smiles'], form_data['number_steps'], calculate_scores=False) job.meta['progress'] = 'network_generated' job.save_meta() network.calculate_scores() job.meta['progress'] = 'scores_calculated' job.save_meta() nodes, edges = network.get_visjs_nodes_and_edges() #options = {'interaction': {'multiselect': 'true',}} options = {} default_network_name = 'Network for ' + str(network.target_smiles) result = {'save_id':str(uuid.uuid4()), 'save_links' : [], 'save_name' : default_network_name, 'nodes':nodes, 'edges':edges, 'options':json.dumps(options), 'graph_dict':json.dumps(nx.to_dict_of_lists(network.graph)), 'target_smiles':str(network.target_smiles), 'network_options':json.dumps(network.settings), 'attr_dict':json.dumps(network.attributes_dict()), 'max_reactions' : int(network.settings['max_reactions'])} current_app.redis.mset({job.id: json.dumps(result)}) time_to_expire = 15*60 #15 mins * 60 seconds current_app.redis.expire(job.id, time_to_expire) return result