Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
BioFlow-Insight
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
1
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
shareFAIR
BioFlow-Insight
Commits
f335b0f8
Commit
f335b0f8
authored
10 months ago
by
George Marchment
Browse files
Options
Downloads
Patches
Plain Diff
started implementing user view
parent
a1312160
No related branches found
No related tags found
No related merge requests found
Pipeline
#14033
passed with stage
in 2 minutes and 10 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
src/graph.py
+68
-49
68 additions, 49 deletions
src/graph.py
src/nextflow_file.py
+4
-1
4 additions, 1 deletion
src/nextflow_file.py
src/outils_graph.py
+109
-1
109 additions, 1 deletion
src/outils_graph.py
src/workflow.py
+8
-0
8 additions, 0 deletions
src/workflow.py
with
189 additions
and
51 deletions
src/graph.py
+
68
−
49
View file @
f335b0f8
...
@@ -27,55 +27,55 @@ class Graph():
...
@@ -27,55 +27,55 @@ class Graph():
def
initialise
(
self
,
processes_2_remove
=
[]):
def
initialise
(
self
,
processes_2_remove
=
[]):
if
(
not
self
.
is_initialised
()):
def
get_node_id
(
dico
,
process
):
for
node
in
dico
[
"
nodes
"
]:
if
(
node
[
'
name
'
]
==
process
):
return
node
[
'
id
'
]
for
sub
in
dico
[
'
subworkflows
'
]:
res
=
get_node_id
(
dico
[
'
subworkflows
'
][
sub
],
process
)
if
(
res
!=-
1
):
return
res
return
-
1
#This function removes the process -> by the simpliest way -> it doesn't create new links
def
remove_node
(
dico
,
node_id
):
#Remove nodes
nodes_to_remove
=
[]
for
node
in
dico
[
"
nodes
"
]:
if
(
node
[
'
id
'
]
==
node_id
):
nodes_to_remove
.
append
(
node
)
for
node
in
nodes_to_remove
:
dico
[
"
nodes
"
].
remove
(
node
)
#Remove edges
edges_to_remove
=
[]
for
edge
in
dico
[
"
edges
"
]:
if
(
edge
[
'
A
'
]
==
node_id
):
edges_to_remove
.
append
(
edge
)
if
(
edge
[
'
B
'
]
==
node_id
):
edges_to_remove
.
append
(
edge
)
for
edge
in
edges_to_remove
:
dico
[
"
edges
"
].
remove
(
edge
)
for
sub
in
dico
[
'
subworkflows
'
]:
remove_node
(
dico
[
'
subworkflows
'
][
sub
],
node_id
)
for
process
in
processes_2_remove
:
node_id
=
get_node_id
(
self
.
full_dico
,
process
)
remove_node
(
self
.
full_dico
,
node_id
)
self
.
get_dependency_graph
()
self
.
get_process_dependency_graph
()
def
get_node_id
(
dico
,
process
):
for
node
in
dico
[
"
nodes
"
]:
#self.networkX_wo_operations = self.get_networkx_graph(self.dico_process_dependency_graph, self.networkX_wo_operations)
if
(
node
[
'
name
'
]
==
process
):
self
.
dico_flattened
[
"
nodes
"
]
=
[]
return
node
[
'
id
'
]
self
.
dico_flattened
[
"
edges
"
]
=
[]
for
sub
in
dico
[
'
subworkflows
'
]:
#This will stay empty -> it's just so we can use the same function
res
=
get_node_id
(
dico
[
'
subworkflows
'
][
sub
],
process
)
self
.
dico_flattened
[
"
subworkflows
"
]
=
[]
if
(
res
!=-
1
):
self
.
initialised
=
True
return
res
return
-
1
#This function removes the process -> by the simpliest way -> it doesn't create new links
def
remove_node
(
dico
,
node_id
):
#Remove nodes
nodes_to_remove
=
[]
for
node
in
dico
[
"
nodes
"
]:
if
(
node
[
'
id
'
]
==
node_id
):
nodes_to_remove
.
append
(
node
)
for
node
in
nodes_to_remove
:
dico
[
"
nodes
"
].
remove
(
node
)
#Remove edges
edges_to_remove
=
[]
for
edge
in
dico
[
"
edges
"
]:
if
(
edge
[
'
A
'
]
==
node_id
):
edges_to_remove
.
append
(
edge
)
if
(
edge
[
'
B
'
]
==
node_id
):
edges_to_remove
.
append
(
edge
)
for
edge
in
edges_to_remove
:
dico
[
"
edges
"
].
remove
(
edge
)
for
sub
in
dico
[
'
subworkflows
'
]:
remove_node
(
dico
[
'
subworkflows
'
][
sub
],
node_id
)
for
process
in
processes_2_remove
:
node_id
=
get_node_id
(
self
.
full_dico
,
process
)
remove_node
(
self
.
full_dico
,
node_id
)
self
.
get_dependency_graph
()
self
.
get_process_dependency_graph
()
#self.networkX_wo_operations = self.get_networkx_graph(self.dico_process_dependency_graph, self.networkX_wo_operations)
self
.
dico_flattened
[
"
nodes
"
]
=
[]
self
.
dico_flattened
[
"
edges
"
]
=
[]
#This will stay empty -> it's just so we can use the same function
self
.
dico_flattened
[
"
subworkflows
"
]
=
[]
self
.
initialised
=
True
def
is_initialised
(
self
):
def
is_initialised
(
self
):
return
self
.
initialised
return
self
.
initialised
...
@@ -286,12 +286,31 @@ class Graph():
...
@@ -286,12 +286,31 @@ class Graph():
generate_graph
(
self
.
get_output_dir
()
/
'
graphs
'
/
filename
,
graph_dico_wo_orphan_operations
(
self
.
dico_wo_branch_operation
),
label_edge
=
False
,
label_node
=
False
,
render_graphs
=
render_graphs
)
generate_graph
(
self
.
get_output_dir
()
/
'
graphs
'
/
filename
,
graph_dico_wo_orphan_operations
(
self
.
dico_wo_branch_operation
),
label_edge
=
False
,
label_node
=
False
,
render_graphs
=
render_graphs
)
#============================
#GENERATE USER VIEW
#============================
def
generate_user_view
(
self
,
relevant_processes
=
[],
render_graphs
=
True
):
#For now i'm only gonna work from the flattened dico
self
.
initialise_flattened_dico
(
self
.
dico_process_dependency_graph
)
dico
=
self
.
dico_flattened
relev_user_view_builder
(
dico
,
relevant_modules
=
relevant_processes
)
generate_graph
(
self
.
get_output_dir
()
/
'
graphs
'
/
"
temp
"
,
dico
,
label_edge
=
True
,
label_node
=
True
,
render_graphs
=
render_graphs
)
#============================
#============================
#METADATA FROM GRAPH
#METADATA FROM GRAPH
#============================
#============================
def
initialise_flattened_dico
(
self
,
dico
):
def
initialise_flattened_dico
(
self
,
dico
):
self
.
dico_flattened
=
{}
self
.
dico_flattened
[
"
nodes
"
]
=
[]
self
.
dico_flattened
[
"
edges
"
]
=
[]
#This will stay empty -> it's just so we can use the same function
self
.
dico_flattened
[
"
subworkflows
"
]
=
[]
flatten_dico
(
dico
,
self
.
dico_flattened
)
flatten_dico
(
dico
,
self
.
dico_flattened
)
#for node in dico["nodes"]:
#for node in dico["nodes"]:
# self.dico_flattened["nodes"].append(node)
# self.dico_flattened["nodes"].append(node)
...
...
This diff is collapsed.
Click to expand it.
src/nextflow_file.py
+
4
−
1
View file @
f335b0f8
...
@@ -693,13 +693,16 @@ class Nextflow_File(Nextflow_Building_Blocks):
...
@@ -693,13 +693,16 @@ class Nextflow_File(Nextflow_Building_Blocks):
self
.
graph
.
get_dependency_graph_wo_labels
(
render_graphs
=
render_graphs
)
self
.
graph
.
get_dependency_graph_wo_labels
(
render_graphs
=
render_graphs
)
self
.
graph
.
get_dependency_graph_wo_orphan_operations
(
render_graphs
=
render_graphs
)
self
.
graph
.
get_dependency_graph_wo_orphan_operations
(
render_graphs
=
render_graphs
)
self
.
graph
.
get_dependency_graph_wo_orphan_operations_wo_labels
(
render_graphs
=
render_graphs
)
self
.
graph
.
get_dependency_graph_wo_orphan_operations_wo_labels
(
render_graphs
=
render_graphs
)
#Generate the different metadata associated with the graphs
#Generate the different metadata associated with the graphs
self
.
graph
.
get_metadata_specification_graph
()
self
.
graph
.
get_metadata_specification_graph
()
self
.
graph
.
get_metadata_dependency_graph
()
self
.
graph
.
get_metadata_dependency_graph
()
self
.
graph
.
get_metadata_process_dependency_graph
()
self
.
graph
.
get_metadata_process_dependency_graph
()
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
)
def
get_graph
(
self
):
def
get_graph
(
self
):
return
self
.
graph
return
self
.
graph
#def get_metadata_graph_wo_operations(self):
#def get_metadata_graph_wo_operations(self):
...
...
This diff is collapsed.
Click to expand it.
src/outils_graph.py
+
109
−
1
View file @
f335b0f8
...
@@ -343,4 +343,112 @@ def flatten_dico(dico, dico_flattened):
...
@@ -343,4 +343,112 @@ def flatten_dico(dico, dico_flattened):
dico_flattened
[
"
edges
"
].
append
(
edge
)
dico_flattened
[
"
edges
"
].
append
(
edge
)
for
subworkflow
in
dico
[
"
subworkflows
"
]:
for
subworkflow
in
dico
[
"
subworkflows
"
]:
flatten_dico
(
dico
[
"
subworkflows
"
][
subworkflow
],
dico_flattened
)
flatten_dico
(
dico
[
"
subworkflows
"
][
subworkflow
],
dico_flattened
)
return
dico_flattened
return
dico_flattened
\ No newline at end of file
#==================================================
#Get user view
#Je suppose que c'est un dico flatten (avec que des processes) -> process dependency graph
def
get_id_from_name
(
dico
,
name
):
ids
=
[]
for
n
in
dico
[
"
nodes
"
]:
if
(
n
[
'
name
'
]
==
name
):
ids
.
append
(
n
[
'
id
'
])
return
ids
def
get_name_from_id
(
dico
,
ID
):
names
=
[]
for
n
in
dico
[
"
nodes
"
]:
if
(
n
[
'
id
'
]
==
ID
):
names
.
append
(
n
[
'
name
'
])
return
names
def
get_output_nodes
(
dico
):
N
=
[]
for
n
in
dico
[
"
nodes
"
]:
N
.
append
(
n
[
'
id
'
])
none_outputs
=
[]
for
e
in
dico
[
"
edges
"
]:
none_outputs
.
append
(
e
[
'
A
'
])
outputs
=
list
(
set
(
N
)
-
set
(
none_outputs
))
outputs_names
=
[]
for
o
in
outputs
:
outputs_names
+=
get_name_from_id
(
dico
=
dico
,
ID
=
o
)
return
outputs_names
def
remove_edges_with_node
(
edges
,
nodes
):
edges_without_node
=
[]
for
e
in
edges
:
if
(
e
[
'
A
'
]
not
in
nodes
and
e
[
'
B
'
]
not
in
nodes
):
edges_without_node
.
append
(
e
)
return
edges_without_node
def
get_nodes_from_edges
(
edges
):
N
=
[]
for
e
in
edges
:
N
.
append
(
e
[
'
A
'
])
N
.
append
(
e
[
'
B
'
])
return
list
(
set
(
N
))
def
get_neighbors
(
edges
,
A
):
Bs
=
[]
for
e
in
edges
:
if
(
e
[
'
A
'
]
==
A
):
Bs
.
append
(
e
[
'
B
'
])
return
Bs
def
exist_path
(
A
,
B
,
edges
):
N
=
get_nodes_from_edges
(
edges
=
edges
)
visited
=
{}
for
n
in
N
:
visited
[
n
]
=
False
visited
[
A
]
=
True
if
(
A
==
B
):
return
True
for
neigh
in
get_neighbors
(
edges
,
A
):
if
(
exist_path
(
neigh
,
B
,
edges
)):
return
True
return
False
def
nr_path
(
n
,
r
,
dico
,
R
,
outputs
):
rest_of_R
=
set
(
R
)
-
set
([
r
])
rest_of_R_ids
=
[]
for
r_p
in
rest_of_R
:
rest_of_R_ids
+=
get_id_from_name
(
dico
,
r_p
)
edges
=
remove_edges_with_node
(
dico
[
"
edges
"
],
rest_of_R_ids
)
for
n_ids
in
get_id_from_name
(
dico
,
n
):
for
r_ids
in
get_id_from_name
(
dico
,
r
):
if
(
exist_path
(
n_ids
,
r_ids
,
edges
)):
return
True
return
False
def
rSucc
(
n
,
dico
,
R
,
outputs
):
tab
=
[]
for
r
in
set
(
R
).
union
(
set
(
outputs
)):
if
(
nr_path
(
n
,
r
,
dico
,
R
,
outputs
)):
tab
.
append
(
r
)
return
tab
def
relev_user_view_builder
(
dico
,
relevant_modules
):
R
=
relevant_modules
outputs
=
get_output_nodes
(
dico
)
U
=
[]
markes_statues
=
{}
N
=
[]
for
n
in
dico
[
"
nodes
"
]:
# markes_statues[n['name']] = "marked"
N
.
append
(
n
[
'
name
'
])
N_minus_R
=
set
(
N
)
-
set
(
R
)
for
n
in
N_minus_R
:
markes_statues
[
n
]
=
"
unmarked
"
#print(N_minus_R)
for
r
in
R
:
in_r
=
[]
for
n
in
set
(
N
)
-
set
(
R
):
if
(
rSucc
(
n
,
dico
,
R
,
outputs
)
==
[
r
]):
in_r
.
append
(
n
)
print
(
r
,
in_r
)
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/workflow.py
+
8
−
0
View file @
f335b0f8
...
@@ -525,3 +525,11 @@ George Marchment, Bryan Brancotte, Marie Schmit, Frédéric Lemoine, Sarah Cohen
...
@@ -525,3 +525,11 @@ George Marchment, Bryan Brancotte, Marie Schmit, Frédéric Lemoine, Sarah Cohen
for
t
in
temp
:
for
t
in
temp
:
tab_processes_2_remove
.
append
(
t
.
strip
())
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
.
nextflow_file
.
generate_all_graphs
(
render_graphs
=
render_graphs
,
processes_2_remove
=
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
)
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment