From 682f375b1c329013c988969d09944237d9d91bfc Mon Sep 17 00:00:00 2001 From: Arthur Le Bars <arthur.le-bars@sb-roscoff.fr> Date: Thu, 11 Mar 2021 17:00:51 +0100 Subject: [PATCH] datasets import and detection depending on organism, version and history now working correctly --- misc/banner.png | Bin 429858 -> 429851 bytes run_workflow_phaeoexplorer.py | 202 ++++++++------------- speciesData.py | 4 + templates/gspecies_compose_template.yml.j2 | 4 +- 4 files changed, 80 insertions(+), 130 deletions(-) diff --git a/misc/banner.png b/misc/banner.png index 06f7b085b4ede50ea7d91dfde8e30a2a88ff821a..2be0af67b7bd67b76a4f7d13eee392d4bd6f6bf7 100644 GIT binary patch delta 12682 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 Tm+=qvRk2XcMFshp^2GlG=u_Rf delta 12658 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%0Ami|$PAg}?q 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 S#{b7xr6f5Wg)>&j)Bgu_&ejG1 diff --git a/run_workflow_phaeoexplorer.py b/run_workflow_phaeoexplorer.py index f3fd8e7..2857feb 100644 --- a/run_workflow_phaeoexplorer.py +++ b/run_workflow_phaeoexplorer.py @@ -447,7 +447,7 @@ class RunWorkflow(speciesData.SpeciesData): try: blast_diamond_analysis_output = json.loads(blast_diamond_analysis_json_output)[0] self.blast_diamond_analysis_id = str(blast_diamond_analysis_output["analysis_id"]) - except IndexErro as exc: + except IndexError as exc: logging.critical("No matching InterproScan analysis exists in the instance's chado database") sys.exit(exc) @@ -551,83 +551,89 @@ class RunWorkflow(speciesData.SpeciesData): instance_source_data_folders = self.instance.libraries.get_folders(library_id=str(library_id)) folders_ids = {} - current_folder_name = "" + folder_name = "" + # Loop over the folders in the library and map folders names to their IDs for i in instance_source_data_folders: - for k, v in i.items(): - if k == "name": - folders_ids[v] = 0 - current_folder_name = v - if k == "id": - folders_ids[current_folder_name] = v + folders_ids[i["name"]] = i["id"] - history_datasets_li = self.instance.datasets.get_datasets() - genome_dataset_hda_id, gff_dataset_hda_id, transcripts_dataset_hda_id, proteins_datasets_hda_id = None, None, None, None - interproscan_dataset_hda_id, blast_diamond_dataset_hda_id = None, None - - # Store datasets that are in the history already in a dict - hda_ids = self.get_datasets_hda_ids() # Iterating over the folders to find datasets and map datasets to their IDs logging.debug("Datasets IDs: ") for k, v in folders_ids.items(): - if k == "/genome": + # print(self.full_name) + # print(self.species_folder_name) + # print(k) + # print(v) + if k == "/genome/{0}/v{1}".format(self.species_folder_name, self.genome_version): sub_folder_content = self.instance.folders.show_folder(folder_id=v, contents=True) - final_sub_folder_content = self.instance.folders.show_folder(folder_id=sub_folder_content["folder_contents"][0]["id"], contents=True) - for k2, v2 in final_sub_folder_content.items(): + for k2, v2 in sub_folder_content.items(): for e in v2: if type(e) == dict: + # print(e) if e["name"].endswith(".fa"): self.datasets["genome_file"] = e["ldda_id"] - logging.debug("Genome file:\t" + e["name"] + ": " + e["ldda_id"]) - if k == "/annotation": + self.datasets_name["genome_file"] = e["name"] + logging.debug("\tGenome file:\t" + e["name"] + ": " + e["ldda_id"]) + # print("Genome file:\t" + e["name"] + ": " + e["ldda_id"]) + + # print(self.species_folder_name) + if k == "/annotation/{0}/OGS{1}".format(self.species_folder_name, self.ogs_version): sub_folder_content = self.instance.folders.show_folder(folder_id=v, contents=True) - final_sub_folder_content = self.instance.folders.show_folder(folder_id=sub_folder_content["folder_contents"][0]["id"], contents=True) - for k2, v2 in final_sub_folder_content.items(): + for k2, v2 in sub_folder_content.items(): for e in v2: if type(e) == dict: if "transcripts" in e["name"]: self.datasets["transcripts_file"] = e["ldda_id"] - logging.debug("Transcripts file:\t" + e["name"] + ": " + e["ldda_id"]) + self.datasets_name["transcripts_file"] = e["name"] + logging.debug("\tTranscripts file:\t" + e["name"] + ": " + e["ldda_id"]) elif "proteins.fa" in e["name"]: self.datasets["proteins_file"] = e["ldda_id"] - logging.debug("Proteins file:\t" + e["name"] + ": " + e["ldda_id"]) + self.datasets_name["proteins_file"] = e["name"] + logging.debug("\tProteins file:\t" + e["name"] + ": " + e["ldda_id"]) elif "gff" in e["name"]: self.datasets["gff_file"] = e["ldda_id"] - logging.debug("GFF file:\t" + e["name"] + ": " + e["ldda_id"]) + self.datasets_name["gff_file"] = e["name"] + logging.debug("\tGFF file:\t" + e["name"] + ": " + e["ldda_id"]) elif "Interpro" in e["name"]: self.datasets["interproscan_file"] = e["ldda_id"] - logging.debug("Interproscan file:\t" + e["name"] + ": " + e["ldda_id"]) + self.datasets_name["interproscan_file"] = e["name"] + logging.debug("\tInterproscan file:\t" + e["name"] + ": " + e["ldda_id"]) elif "diamond-blastp" in e["name"]: self.datasets["blast_diamond_file"] = e["ldda_id"] - logging.debug("Blastp diamond file:\t" + e["name"] + ": " + e["ldda_id"]) + self.datasets_name["blast_diamond_file"] = e["name"] + logging.debug("\tBlastp diamond file:\t" + e["name"] + ": " + e["ldda_id"]) logging.debug("Uploading datasets into history %s" % self.history_id) # Import each dataset into history if it is not imported - if hda_ids["genome_hda_id"] is None: + + first_hda_ids = self.get_datasets_hda_ids() + + if first_hda_ids["genome_hda_id"] is None: self.instance.histories.upload_dataset_from_library(history_id=self.history_id, lib_dataset_id=self.datasets["genome_file"]) - if hda_ids["gff_hda_id"] is None: + if first_hda_ids["gff_hda_id"] is None: self.instance.histories.upload_dataset_from_library(history_id=self.history_id, lib_dataset_id=self.datasets["gff_file"]) - if hda_ids["transcripts_hda_id"] is None: + if first_hda_ids["transcripts_hda_id"] is None: self.instance.histories.upload_dataset_from_library(history_id=self.history_id, lib_dataset_id=self.datasets["transcripts_file"]) - if hda_ids["proteins_hda_id"] is None: + if first_hda_ids["proteins_hda_id"] is None: self.instance.histories.upload_dataset_from_library(history_id=self.history_id, lib_dataset_id=self.datasets["proteins_file"]) - if hda_ids["interproscan_hda_id"] is None: + if first_hda_ids["interproscan_hda_id"] is None: try: self.instance.histories.upload_dataset_from_library(history_id=self.history_id, lib_dataset_id=self.datasets["interproscan_file"]) except Exception as exc: - logging.debug("Interproscan file not found in library (history: {0})\n{1}".format(self.history_id, exc)) - if hda_ids["blast_diamond_hda_id"] is None: + logging.debug("Interproscan file not found in library (history: {0})".format(self.history_id)) + if first_hda_ids["blast_diamond_hda_id"] is None: try: self.instance.histories.upload_dataset_from_library(history_id=self.history_id, lib_dataset_id=self.datasets["blast_diamond_file"]) except Exception as exc: - logging.debug("Blastp file not found in library (history: {0})\n{1}".format(self.history_id, exc)) + logging.debug("Blastp file not found in library (history: {0})".format(self.history_id)) # _datasets = self.instance.datasets.get_datasets() # with open(os.path.join(self.main_dir, "datasets_ids.json"), "w") as datasets_ids_outfile: # datasets_ids_outfile.write(str(_datasets)) - return {"history_id": self.history_id, "library_id": library_id, "datasets": self.datasets} + # Return a dict made of the hda ids + return self.get_datasets_hda_ids() def get_datasets_hda_ids(self): @@ -641,109 +647,46 @@ class RunWorkflow(speciesData.SpeciesData): :return: """ - # Create an object of the galaxy instance - gio = GalaxyInstance(url=self.instance_url, - email=self.config["galaxy_default_admin_email"], - password=self.config["galaxy_default_admin_password"]) - - prj_lib = gio.libraries.get_previews(name="Project Data") - library_id = prj_lib[0].id - - instance_source_data_folders = self.instance.libraries.get_folders(library_id=str(library_id)) - - folders_ids = {} - current_folder_name = "" - # Loop over the folders in the library and map folders names to their IDs - for i in instance_source_data_folders: - for k, v in i.items(): - if k == "name": - folders_ids[v] = 0 - current_folder_name = v - if k == "id": - folders_ids[current_folder_name] = v - - history_datasets_li = self.instance.datasets.get_datasets() - genome_dataset_hda_id, gff_dataset_hda_id, transcripts_dataset_hda_id, proteins_datasets_hda_id = None, None, None, None - interproscan_dataset_hda_id, blast_diamond_dataset_hda_id = None, None - - # Iterating over the folders to find datasets and map datasets to their IDs - # TODO: Add a required matching of the version (genome/ogs) - logging.debug("Datasets IDs: ") - for k, v in folders_ids.items(): - if k == "/genome": - sub_folder_content = self.instance.folders.show_folder(folder_id=v, contents=True) - final_sub_folder_content = self.instance.folders.show_folder(folder_id=sub_folder_content["folder_contents"][0]["id"], contents=True) - for k2, v2 in final_sub_folder_content.items(): - for e in v2: - if type(e) == dict: - if e["name"].endswith(".fa"): - self.datasets["genome_file"] = e["ldda_id"] - self.datasets_name["genome_file"] = e["name"] - logging.debug("Genome file:\t" + e["name"] + ": " + e["ldda_id"]) - if k == "/annotation": - sub_folder_content = self.instance.folders.show_folder(folder_id=v, contents=True) - final_sub_folder_content = self.instance.folders.show_folder(folder_id=sub_folder_content["folder_contents"][0]["id"], contents=True) - for k2, v2 in final_sub_folder_content.items(): - for e in v2: - if type(e) == dict: - if "transcripts" in e["name"]: - self.datasets["transcripts_file"] = e["ldda_id"] - self.datasets_name["transcripts_file"] = e["name"] - logging.debug("Transcripts file:\t" + e["name"] + ": " + e["ldda_id"]) - elif "proteins.fa" in e["name"]: - self.datasets["proteins_file"] = e["ldda_id"] - self.datasets_name["proteins_file"] = e["name"] - logging.debug("Proteins file:\t" + e["name"] + ": " + e["ldda_id"]) - elif "gff" in e["name"]: - self.datasets["gff_file"] = e["ldda_id"] - self.datasets_name["gff_file"] = e["name"] - logging.debug("GFF file:\t" + e["name"] + ": " + e["ldda_id"]) - elif "Interpro" in e["name"]: - self.datasets["interproscan_file"] = e["ldda_id"] - self.datasets_name["interproscan_file"] = e["name"] - logging.debug("Interproscan file:\t" + e["name"] + ": " + e["ldda_id"]) - elif "diamond-blastp" in e["name"]: - self.datasets["blast_diamond_file"] = e["ldda_id"] - self.datasets_name["blast_diamond_file"] = e["name"] - logging.debug("Blastp diamond file:\t" + e["name"] + ": " + e["ldda_id"]) - # List of all datasets in the instance (including outputs from jobs) # "limit" and "offset" options *may* be used to restrict search to specific datasets but since # there is no way to know which imported datasets are the correct ones depending on history content # it's not currently used history_datasets_li = self.instance.datasets.get_datasets() + print(history_datasets_li) genome_dataset_hda_id, gff_dataset_hda_id, transcripts_dataset_hda_id, proteins_datasets_hda_id = None, None, None, None interproscan_dataset_hda_id, blast_diamond_dataset_hda_id = None, None - # Match files imported in history names vs library datasets names to assign their respective hda_id + # Match files imported in history names vs library datasets names to assign their respective hda_id for dataset_dict in history_datasets_li: - if dataset_dict["name"] == self.datasets_name["genome_file"]: - genome_dataset_hda_id = dataset_dict["id"] - logging.debug("Genome dataset hda id: %s" % genome_dataset_hda_id) - elif dataset_dict["name"] == self.datasets_name["proteins_file"]: - proteins_datasets_hda_id = dataset_dict["id"] - logging.debug("Proteins dataset hda ID: %s" % proteins_datasets_hda_id) - elif dataset_dict["name"] == self.datasets_name["transcripts_file"]: - transcripts_dataset_hda_id = dataset_dict["id"] - logging.debug("Transcripts dataset hda ID: %s" % transcripts_dataset_hda_id) - elif dataset_dict["name"] == self.datasets_name["gff_file"]: - gff_dataset_hda_id = dataset_dict["id"] - logging.debug("gff dataset hda ID: %s" % gff_dataset_hda_id) - - if "interproscan_file" in self.datasets_name.keys(): - if dataset_dict["name"] == self.datasets_name["interproscan_file"]: - interproscan_dataset_hda_id = dataset_dict["id"] - logging.debug("InterproScan dataset hda ID: %s" % gff_dataset_hda_id) - if "blast_diamond_file" in self.datasets_name.keys(): - if dataset_dict["name"] == self.datasets_name["blast_diamond_file"]: - blast_diamond_dataset_hda_id = dataset_dict["id"] - logging.debug("Blast Diamond dataset hda ID: %s" % gff_dataset_hda_id) + if dataset_dict["history_id"] == self.history_id: + if dataset_dict["name"] == self.datasets_name["genome_file"]: + genome_dataset_hda_id = dataset_dict["id"] + logging.debug("Genome dataset hda id: %s" % genome_dataset_hda_id) + elif dataset_dict["name"] == self.datasets_name["proteins_file"]: + proteins_datasets_hda_id = dataset_dict["id"] + logging.debug("Proteins dataset hda ID: %s" % proteins_datasets_hda_id) + elif dataset_dict["name"] == self.datasets_name["transcripts_file"]: + transcripts_dataset_hda_id = dataset_dict["id"] + logging.debug("Transcripts dataset hda ID: %s" % transcripts_dataset_hda_id) + elif dataset_dict["name"] == self.datasets_name["gff_file"]: + gff_dataset_hda_id = dataset_dict["id"] + logging.debug("GFF dataset hda ID: %s" % gff_dataset_hda_id) + + if "interproscan_file" in self.datasets_name.keys(): + if dataset_dict["name"] == self.datasets_name["interproscan_file"]: + interproscan_dataset_hda_id = dataset_dict["id"] + logging.debug("InterproScan dataset hda ID: %s" % gff_dataset_hda_id) + if "blast_diamond_file" in self.datasets_name.keys(): + if dataset_dict["name"] == self.datasets_name["blast_diamond_file"]: + blast_diamond_dataset_hda_id = dataset_dict["id"] + logging.debug("Blast Diamond dataset hda ID: %s" % gff_dataset_hda_id) # Return a dict made of the hda ids - return{"genome_hda_id": genome_dataset_hda_id, "transcripts_hda_id": transcripts_dataset_hda_id, - "proteins_hda_id": proteins_datasets_hda_id, "gff_hda_id": gff_dataset_hda_id, - "interproscan_hda_id": interproscan_dataset_hda_id, "blast_diamond_hda_id": blast_diamond_dataset_hda_id} + return {"genome_hda_id": genome_dataset_hda_id, "transcripts_hda_id": transcripts_dataset_hda_id, + "proteins_hda_id": proteins_datasets_hda_id, "gff_hda_id": gff_dataset_hda_id, + "interproscan_hda_id": interproscan_dataset_hda_id, + "blast_diamond_hda_id": blast_diamond_dataset_hda_id} def get_organism_id(self): """ @@ -753,9 +696,9 @@ class RunWorkflow(speciesData.SpeciesData): :return: """ + tool_version = "2.3.3" time.sleep(3) - # Get the ID for the current organism in chado org = self.instance.tools.run_tool( tool_id="toolshed.g2.bx.psu.edu/repos/gga/chado_organism_get_organisms/organism_get_organisms/2.3.3", @@ -925,8 +868,7 @@ if __name__ == "__main__": run_workflow_for_current_organism.get_instance_attributes() # Import datasets into history and retrieve their hda IDs - run_workflow_for_current_organism.import_datasets_into_history() - hda_ids = run_workflow_for_current_organism.get_datasets_hda_ids() + hda_ids = run_workflow_for_current_organism.import_datasets_into_history() # DEBUG # run_workflow_for_current_organism.get_invocation_report(workflow_name="Chado load Tripal synchronize") @@ -976,6 +918,8 @@ if __name__ == "__main__": # run_workflow_for_current_organism.datamap[GFF_FILE] = {"src": "hda", # "id": hda_ids["gff_hda_id"]} + # Ensures galaxy has time to retrieve + time.sleep(60) # Run the Chado load Tripal sync workflow with the parameters set above run_workflow_for_current_organism.run_workflow(workflow_path=workflow, workflow_parameters=workflow_parameters, diff --git a/speciesData.py b/speciesData.py index a52b0e5..dc6d2a4 100644 --- a/speciesData.py +++ b/speciesData.py @@ -51,6 +51,10 @@ class SpeciesData: self.genus_uppercase = self.genus[0].upper() + self.genus[1:] self.chado_species_name = "{0} {1}".format(self.species, self.sex) self.full_name = ' '.join(utilities.filter_empty_not_empty_items([self.genus_uppercase, self.species, self.strain, self.sex])["not_empty"]) + self.full_name = self.full_name.replace("__", "_").replace("_ ", "_").replace(" _", "_") + if self.full_name.endswith("_") or self.full_name.endswith(" "): + self.full_name = self.full_name[0:-2] + self.full_name_lowercase = self.full_name.lower() self.abbreviation = "_".join(utilities.filter_empty_not_empty_items([self.genus_lowercase[0], self.species, self.strain, self.sex])["not_empty"]) self.genus_species = self.genus_lowercase + "_" + self.species diff --git a/templates/gspecies_compose_template.yml.j2 b/templates/gspecies_compose_template.yml.j2 index c943c27..d6ca429 100644 --- a/templates/gspecies_compose_template.yml.j2 +++ b/templates/gspecies_compose_template.yml.j2 @@ -50,7 +50,9 @@ services: TRIPAL_ENABLE_MODULES: "tripal_analysis_blast tripal_analysis_interpro tripal_analysis_go tripal_rest_api tripal_elasticsearch" SITE_NAME: "{{ Genus_species }}" ELASTICSEARCH_HOST: elasticsearch.{{ genus_species }} - ENABLE_JBROWSE: /jbrowse/?data=data/{{ genus_species_sex }} # WARNING --> the variable "sex" shouldn't be in the compose file (all strains/sex are supposed to be in the same jbrowse) + ENABLE_JBROWSE: /jbrowse/?data=data/{{ genus_species_sex }} + # This ENABLE_JBROWSE variable should point to the "best assembly" by default --> tag it in the input file and use it to define this variable correctly (also called + # unique id in the jbrowse tool parameters == both have to be identical) ENABLE_APOLLO: 0 ENABLE_BLAST: 1 ENABLE_DOWNLOAD: 1 -- GitLab