From 2cb08b6b9075ea698341f3b10a6a83bed172db8e Mon Sep 17 00:00:00 2001 From: George Marchment <georgemarchment@yahoo.fr> Date: Thu, 10 Oct 2024 16:36:32 +0200 Subject: [PATCH] added subworkflows to user view --- src/graph.py | 7 +++++++ src/nextflow_file.py | 8 ++++++++ src/outils_graph.py | 25 +++++++++++++++++++++++++ src/workflow.py | 34 ++++++++++++++++++++++------------ 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/graph.py b/src/graph.py index 925f15f..e4910e4 100644 --- a/src/graph.py +++ b/src/graph.py @@ -300,7 +300,14 @@ class Graph(): with open(self.get_output_dir()/ "graphs/user_view.json", 'w') as output_file : json.dump(user_view, output_file, indent=4) + + user_view_with_subworkflows = add_subworkflows_2_dico(self.dico_process_dependency_graph, user_view) + with open(self.get_output_dir()/ "graphs/user_view_with_subworkflows.json", 'w') as output_file : + json.dump(user_view_with_subworkflows, output_file, indent=4) + generate_graph(self.get_output_dir()/'graphs'/"user_view", user_view, label_edge=True, label_node=True, render_graphs = render_graphs) + generate_graph(self.get_output_dir()/'graphs'/"user_view_with_subworkflows", user_view_with_subworkflows, label_edge=True, label_node=True, render_graphs = render_graphs) + diff --git a/src/nextflow_file.py b/src/nextflow_file.py index 87dd9c2..a90e4bb 100644 --- a/src/nextflow_file.py +++ b/src/nextflow_file.py @@ -699,6 +699,14 @@ class Nextflow_File(Nextflow_Building_Blocks): self.graph.get_metadata_dependency_graph() self.graph.get_metadata_process_dependency_graph() + def generate_specification_graph(self, render_graphs = True, processes_2_remove = []): + self.graph.initialise(processes_2_remove = processes_2_remove) + self.graph.get_specification_graph(render_graphs = render_graphs) + + def generate_process_dependency_graph(self, render_graphs = True, processes_2_remove = []): + self.graph.initialise(processes_2_remove = processes_2_remove) + self.graph.render_graph_wo_operations(render_graphs = render_graphs) + def generate_user_view(self, relevant_processes = [], render_graphs = True, processes_2_remove = []): self.graph.initialise(processes_2_remove = processes_2_remove) self.graph.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs) diff --git a/src/outils_graph.py b/src/outils_graph.py index 3ba0f6d..3d75e09 100644 --- a/src/outils_graph.py +++ b/src/outils_graph.py @@ -748,4 +748,29 @@ def relev_user_view_builder(dico, relevant_modules): new_dico["edges"].append({'A':"input", 'B':input, "label": ""}) return new_dico +#This function fills the new_dico with the flattened_dico but +#reintegrates the subworkflows (from the full workflow) +def add_subworkflows_2_dico(full_dico, flattened_dico, add_root_nodes = True): + #Add nodes with subworkflows + def add_nodes(full_dico, flattened_dico): + new_dico = {} + new_dico['nodes'] = [] + new_dico['edges'] = [] + new_dico['subworkflows'] = {} + for n1 in full_dico["nodes"]: + for n2 in flattened_dico["nodes"]: + if(n1['id'][1:-1] in n2['id'] and n1['name'] == n2['name']): + new_dico["nodes"].append(n2) + for sub in full_dico["subworkflows"]: + new_dico['subworkflows'][sub] = add_nodes(full_dico["subworkflows"][sub], flattened_dico) + return new_dico + + new_dico = add_nodes(full_dico, flattened_dico) + new_dico["edges"] = flattened_dico["edges"] + if(add_root_nodes): + new_dico["nodes"].append({"id": "input","name": "i","shape": "triangle", "fillcolor":"#ffffff"}) + new_dico["nodes"].append({"id": "output","name": "o","shape": "triangle", "fillcolor":"#ffffff"}) + return new_dico + + diff --git a/src/workflow.py b/src/workflow.py index 3fa3c1f..03e0146 100644 --- a/src/workflow.py +++ b/src/workflow.py @@ -83,6 +83,7 @@ class Workflow: self.keywords = keywords self.producer = producer self.publisher = publisher + self.tab_processes_2_remove = None self.personnal_acces_token = personnal_acces_token self.processes_2_tools = processes_2_tools if(processes_2_remove==""): @@ -515,26 +516,35 @@ George Marchment, Bryan Brancotte, Marie Schmit, Frédéric Lemoine, Sarah Cohen print() print(citation) + def iniatilise_tab_processes_2_remove(self): + if(self.tab_processes_2_remove==None): + tab_processes_2_remove = [] + if(self.processes_2_remove!=None): + temp = self.processes_2_remove.split(",") + for t in temp: + tab_processes_2_remove.append(t.strip()) + self.tab_processes_2_remove = tab_processes_2_remove + def generate_all_graphs(self, render_graphs = True): """Method that generates all graphs representing the workflow Keyword arguments: """ - tab_processes_2_remove = [] - if(self.processes_2_remove!=None): - temp = self.processes_2_remove.split(",") - for t in temp: - tab_processes_2_remove.append(t.strip()) - self.nextflow_file.generate_all_graphs(render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove) + self.iniatilise_tab_processes_2_remove() + self.nextflow_file.generate_all_graphs(render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove) + + def generate_specification_graph(self, render_graphs = True): + self.iniatilise_tab_processes_2_remove() + self.nextflow_file.generate_specification_graph(render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove) + + def generate_process_dependency_graph(self, render_graphs = True): + self.iniatilise_tab_processes_2_remove() + self.nextflow_file.generate_process_dependency_graph(render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove) def generate_user_view(self, relevant_processes = [], render_graphs = True): - tab_processes_2_remove = [] - if(self.processes_2_remove!=None): - temp = self.processes_2_remove.split(",") - for t in temp: - tab_processes_2_remove.append(t.strip()) - self.nextflow_file.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove) + self.iniatilise_tab_processes_2_remove() + self.nextflow_file.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove) def build_processes_2_tools(self): -- GitLab