From 76932776a3e428bfbc60909cd707298ea6b37fd8 Mon Sep 17 00:00:00 2001
From: George Marchment <georgemarchment@yahoo.fr>
Date: Mon, 8 Apr 2024 11:31:35 +0200
Subject: [PATCH] update

---
 src/nextflow_building_blocks.py |  3 +++
 src/nextflow_file.py            | 10 +++++++++-
 src/process.py                  | 12 ++++++++++++
 src/workflow.py                 | 33 +++++++++++++++++++++++++++++----
 4 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/src/nextflow_building_blocks.py b/src/nextflow_building_blocks.py
index ce5144c..9aced55 100644
--- a/src/nextflow_building_blocks.py
+++ b/src/nextflow_building_blocks.py
@@ -38,6 +38,9 @@ class Nextflow_Building_Blocks:
     def get_DSL(self):
         return self.origin.get_DSL()
     
+    def get_processes_annotation(self):
+        return self.origin.get_processes_annotation()
+    
     def get_file_address(self):
         return self.origin.get_file_address()
 
diff --git a/src/nextflow_file.py b/src/nextflow_file.py
index 9c393db..007503d 100644
--- a/src/nextflow_file.py
+++ b/src/nextflow_file.py
@@ -21,7 +21,8 @@ from .bioflowinsighterror import BioFlowInsightError
 
 
 class Nextflow_File(Nextflow_Building_Blocks):
-    def __init__(self, address, duplicate = True, DSL="", author = None, name = None, origin=None, output_dir='./results', display_info = True):
+    def __init__(self, address, duplicate = True, DSL="", author = None, name = None, origin=None, output_dir='./results', display_info = True,
+                 workflow = None):
         self.file = address 
         if(self.get_file_address().find('/')==-1):
             raise BioFlowInsightError(f"BioFlow-Insight cannot directly analyse a workflow from its directory. Please analyse the workflow from the parent directory instead.", num = -1)
@@ -40,6 +41,7 @@ class Nextflow_File(Nextflow_Building_Blocks):
         self.duplicate = duplicate
         self.origin = origin
         self.DSL = ""
+        self.workflow = workflow
         self.first_file = DSL==""
         self.graph = None
         self.display_info = display_info
@@ -95,6 +97,12 @@ class Nextflow_File(Nextflow_Building_Blocks):
                 return self.output_dir 
             else:
                 return self.origin.get_output_dir()
+            
+    def get_processes_annotation(self):
+        if(self.first_file):
+            return self.workflow.get_processes_annotation()
+        else:
+            return self.origin.get_processes_annotation()
         
     def get_display_info(self):
         if (self.first_file):
diff --git a/src/process.py b/src/process.py
index 51acddc..10dc1e9 100644
--- a/src/process.py
+++ b/src/process.py
@@ -20,6 +20,8 @@ class Process(Nextflow_Building_Blocks):
         self.when_code = ""
         self.script_code = ""
         self.tools = []
+        self.modules = []
+        self.commands = []
         self.initialise()
         self.initialised = True
 
@@ -203,6 +205,11 @@ class Process(Nextflow_Building_Blocks):
     def get_output_code(self):
         return self.output_code
 
+    def get_modules(self):
+        return self.modules
+    
+    def get_commands(self):
+        return self.commands
 
 
 
@@ -271,6 +278,11 @@ class Process(Nextflow_Building_Blocks):
         self.initialise_name()
         self.initialise_parts()
         self.initialise_inputs_outputs()
+        annotations = self.get_processes_annotation()
+        if(annotations!=None):
+            self.tools = annotations[self.get_code()]["tools"]
+            self.commands = annotations[self.get_code()]["commands"]
+            self.modules = annotations[self.get_code()]["modules"]
 
     def add_2_rocrate(self, dico, parent_key):
         process_key = self.get_rocrate_key(dico)
diff --git a/src/workflow.py b/src/workflow.py
index 3d2021d..57c8686 100644
--- a/src/workflow.py
+++ b/src/workflow.py
@@ -18,7 +18,8 @@ class Workflow:
                  name = None, datePublished=None, description=None,
                  license = None, creativeWorkStatus = None, authors = None, 
                  version = None, keywords = None, producer = None,
-                 publisher = None, processes_2_remove = None):
+                 publisher = None, processes_2_remove = None,
+                 processes_annotation = None):
 
         if(not os.path.isfile(file)):
             nextflow_files = glob.glob(f'{file}/*.nf')
@@ -31,12 +32,14 @@ class Workflow:
             except:
                 file =nextflow_files[0]
 
+        self.processes_annotation = processes_annotation
 
         self.nextflow_file = Nextflow_File(
             file,
             duplicate=duplicate,
             display_info=display_info,
-            output_dir=output_dir
+            output_dir=output_dir,
+            workflow = self
         )
         self.output_dir = Path(output_dir)
         self.rocrate = None
@@ -67,7 +70,9 @@ class Workflow:
             repo = current_directory
         return repo
 
-    
+    def get_processes_annotation(self):
+        return self.processes_annotation
+
     def fill_log(self):
         current_directory = os.getcwd()
         os.chdir(self.get_repo_adress())
@@ -231,13 +236,33 @@ class Workflow:
     def get_processes_called(self):
         return self.nextflow_file.get_processes_called()
 
-
+    def get_tools(self):
+        processes = self.get_processes_called()
+        tab = []
+        for p in processes:
+            tab+=p.get_tools()
+        return list(set(tab))
+    
+    def get_commands(self):
+        processes = self.get_processes_called()
+        tab = []
+        for p in processes:
+            tab+=p.get_commands()
+        return list(set(tab))
+    
+    def get_modules(self):
+        processes = self.get_processes_called()
+        tab = []
+        for p in processes:
+            tab+=p.get_modules()
+        return list(set(tab))
 
     def initialise_rocrate(self):
         self.rocrate = RO_Crate(self)
         self.rocrate.initialise()
 
 
+
     def initialise(self, create_rocrate = True):
         self.nextflow_file.initialise()
         if(create_rocrate):
-- 
GitLab