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