comparison jbrowse2.py @ 15:cce8dacb240f draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 1a20cf06627d429a211427753f223467188dbe7f-dirty
author fubar
date Thu, 25 Jan 2024 07:39:41 +0000
parents 7c2e28e144f3
children 4c201a3d4755
comparison
equal deleted inserted replaced
14:7c2e28e144f3 15:cce8dacb240f
16 from collections import defaultdict 16 from collections import defaultdict
17 17
18 logging.basicConfig(level=logging.INFO) 18 logging.basicConfig(level=logging.INFO)
19 log = logging.getLogger("jbrowse") 19 log = logging.getLogger("jbrowse")
20 20
21 JB2VER = "v2.10.0" 21 JB2VER = "v2.10.1"
22 # version pinned for cloning 22 # version pinned for cloning
23 23
24 TODAY = datetime.datetime.now().strftime("%Y-%m-%d") 24 TODAY = datetime.datetime.now().strftime("%Y-%m-%d")
25 GALAXY_INFRASTRUCTURE_URL = None 25 GALAXY_INFRASTRUCTURE_URL = None
26 JB2REL = "v2.10.0" 26 JB2REL = "v2.10.0"
456 self.genome_names.append(genome_name) 456 self.genome_names.append(genome_name)
457 if self.genome_name is None: 457 if self.genome_name is None:
458 self.genome_name = ( 458 self.genome_name = (
459 genome_name # first one for all tracks - other than paf 459 genome_name # first one for all tracks - other than paf
460 ) 460 )
461 if self.config_json.get("assemblies", None): 461 if self.config_json.get("assemblies", None):
462 self.config_json["assemblies"] += assemblies 462 self.config_json["assemblies"] += assemblies
463 else: 463 else:
464 self.config_json["assemblies"] = assemblies 464 self.config_json["assemblies"] = assemblies
465 465
466 def make_assembly(self, fapath, gname): 466 def make_assembly(self, fapath, gname):
467 hashData = [ 467 hashData = [
468 fapath, 468 fapath,
469 gname, 469 gname,
725 self.tracksToAdd.append(trackDict) 725 self.tracksToAdd.append(trackDict)
726 self.trackIdlist.append(tId) 726 self.trackIdlist.append(tId)
727 os.unlink(gff3) 727 os.unlink(gff3)
728 728
729 def add_bigwig(self, data, trackData): 729 def add_bigwig(self, data, trackData):
730 """ "type": "LinearWiggleDisplay",
731 "configuration": {},
732 "selectedRendering": "",
733 "resolution": 1,
734 "posColor": "rgb(228, 26, 28)",
735 "negColor": "rgb(255, 255, 51)",
736 "constraints": {}
737 """
730 url = "%s.bigwig" % trackData["label"] 738 url = "%s.bigwig" % trackData["label"]
731 # slashes in names cause path trouble 739 # slashes in names cause path trouble
732 dest = os.path.join(self.outdir, url) 740 dest = os.path.join(self.outdir, url)
733 cmd = ["cp", data, dest] 741 cmd = ["cp", data, dest]
734 self.subprocess_check_call(cmd) 742 self.subprocess_check_call(cmd)
754 } 762 }
755 style_json = self._prepare_track_style(trackDict) 763 style_json = self._prepare_track_style(trackDict)
756 trackDict["style"] = style_json 764 trackDict["style"] = style_json
757 self.tracksToAdd.append(trackDict) 765 self.tracksToAdd.append(trackDict)
758 self.trackIdlist.append(tId) 766 self.trackIdlist.append(tId)
759 logging.debug("#### wig trackData=%s" % str(trackData)) 767 logging.info("#### wig trackData=%s" % str(trackData))
760 768
761 def add_bam(self, data, trackData, bamOpts, bam_index=None, **kwargs): 769 def add_bam(self, data, trackData, bamOpts, bam_index=None, **kwargs):
762 tId = trackData["label"] 770 tId = trackData["label"]
763 fname = "%s.bam" % trackData["label"] 771 fname = "%s.bam" % trackData["label"]
764 dest = "%s/%s" % (self.outdir, fname) 772 dest = "%s/%s" % (self.outdir, fname)
947 955
948 def add_paf(self, data, trackData, pafOpts, **kwargs): 956 def add_paf(self, data, trackData, pafOpts, **kwargs):
949 tname = trackData["name"] 957 tname = trackData["name"]
950 tId = trackData["label"] 958 tId = trackData["label"]
951 pgname = pafOpts["genome_label"] 959 pgname = pafOpts["genome_label"]
952 if len(pgname.split() > 1): 960 if len(pgname.split()) > 1:
953 pgname = pgname.split()[ 961 pgname = pgname.split()[
954 0 962 0
955 ] # trouble from spacey names in command lines avoidance 963 ] # trouble from spacey names in command lines avoidance
956 asstrack, gname = self.make_assembly(pafOpts["genome"], pgname) 964 asstrack = self.make_assembly(pafOpts["genome"], pgname)
957 self.genome_names.append(pgname) 965 self.genome_names.append(pgname)
958 if self.config_json.get("assemblies", None): 966 if self.config_json.get("assemblies", None):
959 self.config_json["assemblies"].append(asstrack) 967 self.config_json["assemblies"].append(asstrack)
960 else: 968 else:
961 self.config_json["assemblies"] = [ 969 self.config_json["assemblies"] = [
962 asstrack, 970 asstrack,
963 ] 971 ]
964
965 url = "%s.paf" % (trackData["label"]) 972 url = "%s.paf" % (trackData["label"])
966 dest = "%s/%s" % (self.outdir, url) 973 dest = "%s/%s" % (self.outdir, url)
967 self.symlink_or_copy(os.path.realpath(data), dest) 974 self.symlink_or_copy(os.path.realpath(data), dest)
968 trackDict = { 975 trackDict = {
969 "type": "SyntenyTrack", 976 "type": "SyntenyTrack",
973 "adapter": { 980 "adapter": {
974 "type": "PAFAdapter", 981 "type": "PAFAdapter",
975 "pafLocation": {"uri": url}, 982 "pafLocation": {"uri": url},
976 "assemblyNames": [self.genome_name, pgname], 983 "assemblyNames": [self.genome_name, pgname],
977 }, 984 },
985 # "displays": [
986 # {
987 # "type": "LinearSyntenyDisplay",
988 # "displayId": "%s-LinearSyntenyDisplay" % tId,
989 # },
990 # {
991 # "type": "DotPlotDisplay",
992 # "displayId": "%s-DotPlotDisplay" % tId,
993 # },
994 # ],
978 } 995 }
979 style_json = self._prepare_track_style(trackDict) 996 style_json = self._prepare_track_style(trackDict)
980 trackDict["style"] = style_json 997 trackDict["style"] = style_json
981 self.tracksToAdd.append(trackDict) 998 self.tracksToAdd.append(trackDict)
982 self.trackIdlist.append(tId) 999 self.trackIdlist.append(tId)
1128 self.add_blastxml( 1145 self.add_blastxml(
1129 dataset_path, outputTrackConfig, track["conf"]["options"]["blast"] 1146 dataset_path, outputTrackConfig, track["conf"]["options"]["blast"]
1130 ) 1147 )
1131 elif dataset_ext == "vcf": 1148 elif dataset_ext == "vcf":
1132 self.add_vcf(dataset_path, outputTrackConfig) 1149 self.add_vcf(dataset_path, outputTrackConfig)
1150 elif dataset_ext == "paf":
1151 self.add_paf(
1152 dataset_path, outputTrackConfig, track["conf"]["options"]["synteny"]
1153 )
1133 else: 1154 else:
1134 log.warn("Do not know how to handle %s", dataset_ext) 1155 log.warn("Do not know how to handle %s", dataset_ext)
1135 # Return non-human label for use in other fields 1156 # Return non-human label for use in other fields
1136 yield outputTrackConfig["label"] 1157 yield outputTrackConfig["label"]
1137 1158
1175 refName = None 1196 refName = None
1176 if data.get("defaultLocation", ""): 1197 if data.get("defaultLocation", ""):
1177 ddl = data["defaultLocation"] 1198 ddl = data["defaultLocation"]
1178 loc_match = re.search( 1199 loc_match = re.search(
1179 r"^([^:]+):(\d+)\.+(\d+)$", ddl 1200 r"^([^:]+):(\d+)\.+(\d+)$", ddl
1180 ) # was re.search(r"^(\w.+):(\d+)\.+(\d+)$" 1201 )
1181 if loc_match: 1202 if loc_match:
1182 refName = loc_match.group(1) 1203 refName = loc_match.group(1)
1183 start = int(loc_match.group(2)) 1204 start = int(loc_match.group(2))
1184 end = int(loc_match.group(3)) 1205 end = int(loc_match.group(3))
1185 else: 1206 else:
1405 item.tag: parse_style_conf(item) 1426 item.tag: parse_style_conf(item)
1406 for item in track.find("options/style_labels") 1427 for item in track.find("options/style_labels")
1407 } 1428 }
1408 1429
1409 track_conf["conf"] = etree_to_dict(track.find("options")) 1430 track_conf["conf"] = etree_to_dict(track.find("options"))
1431 track_conf["category"] = track.attrib["cat"]
1432 track_conf["format"] = track.attrib["format"]
1433 try:
1434 # Only pertains to gff3 + blastxml. TODO?
1435 track_conf["style"] = {t.tag: t.text for t in track.find("options/style")}
1436 except TypeError:
1437 track_conf["style"] = {}
1438 pass
1439 track_conf["conf"] = etree_to_dict(track.find("options"))
1410 keys = jc.process_annotations(track_conf) 1440 keys = jc.process_annotations(track_conf)
1411 1441
1412 if keys: 1442 if keys:
1413 for key in keys: 1443 for key in keys:
1414 default_session_data["visibility"][ 1444 default_session_data["visibility"][
1420 ] # TODO do we need this anymore? 1450 ] # TODO do we need this anymore?
1421 if track_conf.get("style_lables", None): 1451 if track_conf.get("style_lables", None):
1422 default_session_data["style_labels"][key] = track_conf.get( 1452 default_session_data["style_labels"][key] = track_conf.get(
1423 "style_labels", None 1453 "style_labels", None
1424 ) 1454 )
1425 1455 default_session_data["defaultLocation"] = root.find(
1426 default_session_data["defaultLocation"] = root.find( 1456 "metadata/general/defaultLocation"
1427 "metadata/general/defaultLocation" 1457 ).text
1428 ).text 1458 default_session_data["session_name"] = root.find(
1429 default_session_data["session_name"] = root.find( 1459 "metadata/general/session_name"
1430 "metadata/general/session_name" 1460 ).text
1431 ).text 1461 general_data = {
1432 1462 "analytics": root.find("metadata/general/analytics").text,
1433 general_data = { 1463 "primary_color": root.find("metadata/general/primary_color").text,
1434 "analytics": root.find("metadata/general/analytics").text, 1464 "secondary_color": root.find("metadata/general/secondary_color").text,
1435 "primary_color": root.find("metadata/general/primary_color").text, 1465 "tertiary_color": root.find("metadata/general/tertiary_color").text,
1436 "secondary_color": root.find("metadata/general/secondary_color").text, 1466 "quaternary_color": root.find("metadata/general/quaternary_color").text,
1437 "tertiary_color": root.find("metadata/general/tertiary_color").text, 1467 "font_size": root.find("metadata/general/font_size").text,
1438 "quaternary_color": root.find("metadata/general/quaternary_color").text, 1468 }
1439 "font_size": root.find("metadata/general/font_size").text, 1469 jc.add_general_configuration(general_data)
1440 } 1470 trackconf = jc.config_json.get("tracks", None)
1441 track_conf["category"] = track.attrib["cat"] 1471 if trackconf:
1442 track_conf["format"] = track.attrib["format"] 1472 jc.config_json["tracks"].update(jc.tracksToAdd)
1443 try: 1473 else:
1444 # Only pertains to gff3 + blastxml. TODO? 1474 jc.config_json["tracks"] = jc.tracksToAdd
1445 track_conf["style"] = {t.tag: t.text for t in track.find("options/style")}
1446 except TypeError:
1447 track_conf["style"] = {}
1448 pass
1449 track_conf["conf"] = etree_to_dict(track.find("options"))
1450 jc.add_general_configuration(general_data)
1451 jc.config_json["tracks"] = jc.tracksToAdd
1452 jc.write_config() 1475 jc.write_config()
1453 jc.add_default_session(default_session_data) 1476 jc.add_default_session(default_session_data)
1454
1455 # jc.text_index() not sure what broke here. 1477 # jc.text_index() not sure what broke here.