Skip to content
Snippets Groups Projects

run computation when opening the project, not when creating it.

Merged Bryan BRANCOTTE requested to merge project-can-be-restarted into master
Files
8
+ 49
5
@@ -7,6 +7,7 @@ import abc
@@ -7,6 +7,7 @@ import abc
import shutil
import shutil
from datetime import datetime
from datetime import datetime
from pathlib import Path
from pathlib import Path
 
from celery import states
import json
import json
from typing import List, Optional, Union, Dict
from typing import List, Optional, Union, Dict
try:
try:
@@ -38,6 +39,7 @@ from jass.models.worktable import (
@@ -38,6 +39,7 @@ from jass.models.worktable import (
get_worktable_phenolist,
get_worktable_phenolist,
create_worktable_file,
create_worktable_file,
create_genome_full_csv,
create_genome_full_csv,
 
create_genome_full_csv_lock_file,
)
)
from jass.config import config
from jass.config import config
@@ -66,6 +68,14 @@ def call_with_tb(status_key):
@@ -66,6 +68,14 @@ def call_with_tb(status_key):
return inner_dec
return inner_dec
 
def get_project_update_progress_callback(project_id):
 
def __update_progress(progress: int):
 
p = load_project(project_id)
 
p.update_progress(progress)
 
p.save()
 
return __update_progress
 
 
class ProjectStatusEnum(str, Enum):
class ProjectStatusEnum(str, Enum):
does_not_exist = "DOES_NOT_EXIST"
does_not_exist = "DOES_NOT_EXIST"
creating = "CREATING"
creating = "CREATING"
@@ -86,6 +96,7 @@ class Project(BaseModel, abc.ABC):
@@ -86,6 +96,7 @@ class Project(BaseModel, abc.ABC):
delayed_gen_csv_file: Optional[bool] = True
delayed_gen_csv_file: Optional[bool] = True
status: Optional[Dict[str,ProjectStatusEnum]] = {}
status: Optional[Dict[str,ProjectStatusEnum]] = {}
progress: Optional[int] = 0
progress: Optional[int] = 0
 
celery_id: Optional[str] = None
def get_hash(self):
def get_hash(self):
m = hashlib.md5()
m = hashlib.md5()
@@ -124,6 +135,17 @@ class Project(BaseModel, abc.ABC):
@@ -124,6 +135,17 @@ class Project(BaseModel, abc.ABC):
def create_id(self):
def create_id(self):
return self.get_hash().hexdigest()
return self.get_hash().hexdigest()
 
def has_computation_going_on(self):
 
if self.celery_id is None:
 
return False
 
from jass.tasks import celery
 
celery_task = celery.AsyncResult(self.celery_id)
 
print(self.celery_id, celery_task.status)
 
if celery_task.status in [states.FAILURE, states.SUCCESS, states.PENDING]:
 
# PENDING means "unknown task" for celery
 
return False
 
return True
 
@classmethod
@classmethod
def get_folder_path_from_id(cls, project_id):
def get_folder_path_from_id(cls, project_id):
return os.path.join(config["PROJECTS_DIR"], f"project_{project_id}")
return os.path.join(config["PROJECTS_DIR"], f"project_{project_id}")
@@ -219,6 +241,27 @@ class Project(BaseModel, abc.ABC):
@@ -219,6 +241,27 @@ class Project(BaseModel, abc.ABC):
def create_worktable_file(self):
def create_worktable_file(self):
pass
pass
 
def delete_large_files(self):
 
# delete the worktable file
 
project_hdf_path = self.get_worktable_path()
 
if os.path.exists(project_hdf_path):
 
os.remove(project_hdf_path)
 
# as a consequence, its creation will have to be redone, so set progress to 0 and remove is status.
 
self.progress = 0
 
try:
 
del self.status['worktable']
 
except KeyError:
 
# worktable not in status
 
pass
 
self.save()
 
 
if self.delayed_gen_csv_file:
 
# Delete the full csv file if it exists, and re-set the lock file indicating that it should be generated
 
create_genome_full_csv_lock_file(project_hdf_path)
 
csv_path = self.get_csv_path()
 
if os.path.exists(csv_path):
 
os.remove(csv_path)
 
@call_with_tb('global_manhattan')
@call_with_tb('global_manhattan')
def create_global_manhattan_plot(self):
def create_global_manhattan_plot(self):
return create_global_plot(
return create_global_plot(
@@ -258,8 +301,8 @@ class GlobalProject(Project):
@@ -258,8 +301,8 @@ class GlobalProject(Project):
chunk_size=self.chunk_size,
chunk_size=self.chunk_size,
significance_treshold=self.significance_threshold,
significance_treshold=self.significance_threshold,
post_filtering=self.post_filtering,
post_filtering=self.post_filtering,
delayed_gen_csv_file=self.delayed_gen_csv_file
delayed_gen_csv_file=self.delayed_gen_csv_file,
,callback_report= self.update_progress
callback_report=get_project_update_progress_callback(self.id),
)
)
@@ -296,11 +339,11 @@ class LocalProject(Project):
@@ -296,11 +339,11 @@ class LocalProject(Project):
chromosome=self.chromosome,
chromosome=self.chromosome,
pos_Start=self.start,
pos_Start=self.start,
pos_End=self.end,
pos_End=self.end,
callback_report= self.update_progress
callback_report=get_project_update_progress_callback(self.id),
)
)
def load_project(project_id):
def load_project(project_id, flag_as_visited: bool = True):
path = os.path.join(Project.get_folder_path_from_id(project_id), "meta.json")
path = os.path.join(Project.get_folder_path_from_id(project_id), "meta.json")
with open(path, "r") as fp:
with open(path, "r") as fp:
project = parse_raw_as(
project = parse_raw_as(
@@ -310,7 +353,8 @@ def load_project(project_id):
@@ -310,7 +353,8 @@ def load_project(project_id):
],
],
"".join(fp.readlines()),
"".join(fp.readlines()),
)
)
flag_project_as_visited(project_id)
if flag_as_visited:
 
flag_project_as_visited(project_id)
return project
return project
Loading