Mercurial > repos > fubar > jbrowse2
comparison jbrowse2.py @ 104:9e3f69d9fed1 draft
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit a1537aea75fc902d0e38c0b7c698830a939648b1-dirty
author | fubar |
---|---|
date | Sun, 23 Jun 2024 00:13:57 +0000 |
parents | 099370690407 |
children | a074cd6b5905 |
comparison
equal
deleted
inserted
replaced
103:dc3fe98e7b37 | 104:9e3f69d9fed1 |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 import argparse | 3 import argparse |
4 import binascii | 4 import binascii |
5 import copy | |
5 import datetime | 6 import datetime |
6 # import hashlib | 7 # import hashlib |
7 import json | 8 import json |
8 import logging | 9 import logging |
9 import os | 10 import os |
677 "category": [ | 678 "category": [ |
678 categ, | 679 categ, |
679 ], | 680 ], |
680 "adapter": {"type": "HicAdapter", "hicLocation": {"uri": uri}}, | 681 "adapter": {"type": "HicAdapter", "hicLocation": {"uri": uri}}, |
681 } | 682 } |
682 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 683 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
683 self.trackIdlist.append(tId) | 684 self.trackIdlist.append(copy.copy(tId)) |
684 | 685 |
685 def add_maf(self, data, trackData): | 686 def add_maf(self, data, trackData): |
686 """ | 687 """ |
687 from https://github.com/cmdcolin/maf2bed | 688 from https://github.com/cmdcolin/maf2bed |
688 Note: Both formats start with a MAF as input, and note that your MAF file should contain the species name and chromosome name | 689 Note: Both formats start with a MAF as input, and note that your MAF file should contain the species name and chromosome name |
751 {"type": "LinearArcDisplay", "displayId": "%s-LinearArcDisplay" % tId}, | 752 {"type": "LinearArcDisplay", "displayId": "%s-LinearArcDisplay" % tId}, |
752 ], | 753 ], |
753 } | 754 } |
754 style_json = self._prepare_track_style(trackDict) | 755 style_json = self._prepare_track_style(trackDict) |
755 trackDict["style"] = style_json | 756 trackDict["style"] = style_json |
756 self.tracksToAdd[gname].append(trackDict) | 757 self.tracksToAdd[gname].append(copy.copy(trackDict)) |
757 self.trackIdlist.append(tId) | 758 self.trackIdlist.append(copy.copy(tId)) |
758 if self.config_json.get("plugins", None): | 759 if self.config_json.get("plugins", None): |
759 self.config_json["plugins"].append(mafPlugin[0]) | 760 self.config_json["plugins"].append(mafPlugin[0]) |
760 else: | 761 else: |
761 self.config_json.update(mafPlugin) | 762 self.config_json.update(mafPlugin) |
762 | 763 |
825 } | 826 } |
826 ], | 827 ], |
827 } | 828 } |
828 style_json = self._prepare_track_style(trackDict) | 829 style_json = self._prepare_track_style(trackDict) |
829 trackDict["style"] = style_json | 830 trackDict["style"] = style_json |
830 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 831 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
831 self.trackIdlist.append(tId) | 832 self.trackIdlist.append(copy.copy(tId)) |
832 | 833 |
833 def add_bam(self, data, trackData, bam_indexes=None, **kwargs): | 834 def add_bam(self, data, trackData, bam_indexes=None, **kwargs): |
834 tId = trackData["label"] | 835 tId = trackData["label"] |
835 realFName = trackData["path"] | 836 realFName = trackData["path"] |
836 useuri = trackData["useuri"].lower() == "yes" | 837 useuri = trackData["useuri"].lower() == "yes" |
882 }, | 883 }, |
883 ], | 884 ], |
884 } | 885 } |
885 style_json = self._prepare_track_style(trackDict) | 886 style_json = self._prepare_track_style(trackDict) |
886 trackDict["style"] = style_json | 887 trackDict["style"] = style_json |
887 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 888 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
888 self.trackIdlist.append(tId) | 889 self.trackIdlist.append(copy.copy(tId)) |
889 | 890 |
890 def add_cram(self, data, trackData, cram_indexes=None, **kwargs): | 891 def add_cram(self, data, trackData, cram_indexes=None, **kwargs): |
891 tId = trackData["label"] | 892 tId = trackData["label"] |
892 realFName = trackData["path"] | 893 realFName = trackData["path"] |
893 categ = trackData["category"] | 894 categ = trackData["category"] |
948 }, | 949 }, |
949 ], | 950 ], |
950 } | 951 } |
951 style_json = self._prepare_track_style(trackDict) | 952 style_json = self._prepare_track_style(trackDict) |
952 trackDict["style"] = style_json | 953 trackDict["style"] = style_json |
953 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 954 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
954 self.trackIdlist.append(tId) | 955 self.trackIdlist.append(copy.copy(tId)) |
955 | 956 |
956 def add_vcf(self, data, trackData): | 957 def add_vcf(self, data, trackData): |
957 tId = trackData["label"] | 958 tId = trackData["label"] |
958 categ = trackData["category"] | 959 categ = trackData["category"] |
959 useuri = trackData["useuri"].lower() == "yes" | 960 useuri = trackData["useuri"].lower() == "yes" |
998 }, | 999 }, |
999 ], | 1000 ], |
1000 } | 1001 } |
1001 style_json = self._prepare_track_style(trackDict) | 1002 style_json = self._prepare_track_style(trackDict) |
1002 trackDict["style"] = style_json | 1003 trackDict["style"] = style_json |
1003 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1004 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
1004 self.trackIdlist.append(tId) | 1005 self.trackIdlist.append(copy.copy(tId)) |
1005 | 1006 |
1006 def _sort_gff(self, data, dest): | 1007 def _sort_gff(self, data, dest): |
1007 # Only index if not already done | 1008 # Only index if not already done |
1008 if not os.path.exists(dest): | 1009 if not os.path.exists(dest): |
1009 cmd = "jbrowse sort-gff '%s' | bgzip -c > '%s'" % ( | 1010 cmd = "jbrowse sort-gff '%s' | bgzip -c > '%s'" % ( |
1061 }, | 1062 }, |
1062 ], | 1063 ], |
1063 } | 1064 } |
1064 style_json = self._prepare_track_style(trackDict) | 1065 style_json = self._prepare_track_style(trackDict) |
1065 trackDict["style"] = style_json | 1066 trackDict["style"] = style_json |
1066 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1067 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
1067 self.trackIdlist.append(tId) | 1068 self.trackIdlist.append(copy.copy(tId)) |
1068 | 1069 |
1069 def add_bed(self, data, ext, trackData): | 1070 def add_bed(self, data, ext, trackData): |
1070 tId = trackData["label"] | 1071 tId = trackData["label"] |
1071 categ = trackData["category"] | 1072 categ = trackData["category"] |
1072 useuri = trackData["useuri"].lower() == "yes" | 1073 useuri = trackData["useuri"].lower() == "yes" |
1110 }, | 1111 }, |
1111 ], | 1112 ], |
1112 } | 1113 } |
1113 style_json = self._prepare_track_style(trackDict) | 1114 style_json = self._prepare_track_style(trackDict) |
1114 trackDict["style"] = style_json | 1115 trackDict["style"] = style_json |
1115 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1116 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
1116 self.trackIdlist.append(tId) | 1117 self.trackIdlist.append(copy.copy(tId)) |
1117 | 1118 |
1118 def add_paf(self, data, trackData, pafOpts, **kwargs): | 1119 def add_paf(self, data, trackData, pafOpts, **kwargs): |
1119 tname = trackData["name"] | 1120 tname = trackData["name"] |
1120 tId = trackData["label"] | 1121 tId = trackData["label"] |
1121 url = tId | 1122 url = tId |
1145 passnames.append(gname) | 1146 passnames.append(gname) |
1146 useuri = pafOpts["useuri"] == "true" | 1147 useuri = pafOpts["useuri"] == "true" |
1147 if gname not in self.genome_names: | 1148 if gname not in self.genome_names: |
1148 # ignore if already there - eg for duplicates among pafs. | 1149 # ignore if already there - eg for duplicates among pafs. |
1149 asstrack, first_contig = self.make_assembly(gpath, gname, useuri) | 1150 asstrack, first_contig = self.make_assembly(gpath, gname, useuri) |
1150 self.genome_names.append(gname) | 1151 self.genome_names.append(copy.copy(gname)) |
1151 self.tracksToAdd[gname] = [] | 1152 self.tracksToAdd[gname] = [] |
1152 self.assemblies.append(asstrack) | 1153 self.assemblies.append(copy.copy(asstrack)) |
1153 self.ass_first_contigs.append(first_contig) | 1154 self.ass_first_contigs.append(copy.copy(first_contig)) |
1154 trackDict = { | 1155 trackDict = { |
1155 "type": "SyntenyTrack", | 1156 "type": "SyntenyTrack", |
1156 "trackId": tId, | 1157 "trackId": tId, |
1157 "assemblyNames": passnames, | 1158 "assemblyNames": passnames, |
1158 "category": [ | 1159 "category": [ |
1192 style_json = { | 1193 style_json = { |
1193 "type": "LinearBasicDisplay", | 1194 "type": "LinearBasicDisplay", |
1194 "displayId": "%s-LinearBasicDisplay" % tId, | 1195 "displayId": "%s-LinearBasicDisplay" % tId, |
1195 } | 1196 } |
1196 trackDict["style"] = style_json | 1197 trackDict["style"] = style_json |
1197 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1198 self.tracksToAdd[trackData["assemblyNames"]].append(copy.copy(trackDict)) |
1198 self.trackIdlist.append(tId) | 1199 self.trackIdlist.append(copy.copy(tId)) |
1199 | 1200 |
1200 def process_annotations(self, track): | 1201 def process_annotations(self, track): |
1201 category = track["category"].replace("__pd__date__pd__", TODAY) | 1202 category = track["category"].replace("__pd__date__pd__", TODAY) |
1202 tt1 = ",/ :;\\" | 1203 tt1 = ",/ :;\\" |
1203 tt2 = "______" | 1204 tt2 = "______" |
1309 track["conf"]["options"]["paf"], | 1310 track["conf"]["options"]["paf"], |
1310 ) | 1311 ) |
1311 else: | 1312 else: |
1312 logging.warning("Do not know how to handle %s", dataset_ext) | 1313 logging.warning("Do not know how to handle %s", dataset_ext) |
1313 # Return non-human label for use in other fields | 1314 # Return non-human label for use in other fields |
1315 logging.debug("### processanno ext=%s trackstoadd = %s" % (dataset_ext, self.tracksToAdd)) | |
1314 yield outputTrackConfig["label"] | 1316 yield outputTrackConfig["label"] |
1315 | 1317 |
1316 def add_default_session(self, default_data): | 1318 def add_default_session(self, default_data): |
1317 """ | 1319 """ |
1318 default session settings are hard and fragile. | 1320 default session settings are hard and fragile. |
1336 tracks_data = [] | 1338 tracks_data = [] |
1337 for track_conf in self.tracksToAdd[gnome]: | 1339 for track_conf in self.tracksToAdd[gnome]: |
1338 tId = track_conf["trackId"] | 1340 tId = track_conf["trackId"] |
1339 if tId in default_data[gnome]["visibility"]["default_on"]: | 1341 if tId in default_data[gnome]["visibility"]["default_on"]: |
1340 track_types[tId] = track_conf["type"] | 1342 track_types[tId] = track_conf["type"] |
1341 style_data = default_data[gnome]["style"].get(tId, None) | 1343 style_data = default_data[gnome]["style"].get(tId, {}) |
1342 if not style_data: | 1344 if not style_data: |
1343 logging.debug( | 1345 logging.debug( |
1344 "### No style data for %s in available default data %s" | 1346 "No style data for %s in available default data %s" |
1345 % (tId, default_data) | 1347 % (tId, default_data) |
1346 ) | 1348 ) |
1347 style_data = {"type": "LinearBasicDisplay"} | 1349 else: |
1348 if "displays" in track_conf: | 1350 logging.debug( |
1349 disp = track_conf["displays"][0]["type"] | 1351 "style data for %s = %s" |
1350 style_data["type"] = disp | 1352 % (tId, style_data) |
1353 ) | |
1354 | |
1355 if style_data.get('type',None): | |
1356 style_data["type"] = "LinearBasicDisplay" | |
1357 if "displays" in track_conf: | |
1358 disp = track_conf["displays"][0]["type"] | |
1359 style_data["type"] = disp | |
1351 if track_conf.get("style_labels", None): | 1360 if track_conf.get("style_labels", None): |
1352 # TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work | 1361 # TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work |
1353 # TODO move this to per track displays? | 1362 # TODO move this to per track displays? |
1354 style_data["labels"] = track_conf["style_labels"] | 1363 style_data["labels"] = track_conf["style_labels"] |
1355 tracks_data.append( | 1364 tracks_data.append( |
1549 | 1558 |
1550 | 1559 |
1551 def parse_style_conf(item): | 1560 def parse_style_conf(item): |
1552 if item.text.lower() in ["false", "true", "yes", "no"]: | 1561 if item.text.lower() in ["false", "true", "yes", "no"]: |
1553 return item.text.lower in ("yes", "true") | 1562 return item.text.lower in ("yes", "true") |
1554 else: | 1563 elif item.text.isdigit(): |
1555 return item.text | 1564 return int(item.text) |
1565 return item.text | |
1556 | 1566 |
1557 | 1567 |
1558 if __name__ == "__main__": | 1568 if __name__ == "__main__": |
1559 parser = argparse.ArgumentParser(description="", epilog="") | 1569 parser = argparse.ArgumentParser(description="", epilog="") |
1560 parser.add_argument("--xml", help="Track Configuration") | 1570 parser.add_argument("--xml", help="Track Configuration") |
1630 track_conf["useuri"], | 1640 track_conf["useuri"], |
1631 os.path.realpath(x.attrib["path"]), | 1641 os.path.realpath(x.attrib["path"]), |
1632 ) | 1642 ) |
1633 ) | 1643 ) |
1634 else: | 1644 else: |
1635 if trackfiles: | 1645 metadata = metadata_from_node(x.find("metadata")) |
1636 metadata = metadata_from_node(x.find("metadata")) | 1646 track_conf["dataset_id"] = metadata.get( |
1637 track_conf["dataset_id"] = metadata.get( | 1647 "dataset_id", "None" |
1638 "dataset_id", "None" | 1648 ) |
1649 if x.attrib["useuri"].lower() == "yes": | |
1650 tfa = ( | |
1651 x.attrib["path"], | |
1652 x.attrib["ext"], | |
1653 x.attrib["useuri"], | |
1654 track_conf["label"], | |
1655 metadata, | |
1639 ) | 1656 ) |
1640 if x.attrib["useuri"].lower() == "yes": | 1657 else: |
1641 tfa = ( | 1658 tfa = ( |
1642 x.attrib["path"], | 1659 os.path.realpath(x.attrib["path"]), |
1643 x.attrib["ext"], | 1660 x.attrib["ext"], |
1644 x.attrib["useuri"], | 1661 x.attrib["useuri"], |
1645 track_conf["label"], | 1662 track_conf["label"], |
1646 metadata, | 1663 metadata, |
1647 ) | 1664 ) |
1648 else: | 1665 track_conf["trackfiles"].append(tfa) |
1649 tfa = ( | |
1650 os.path.realpath(x.attrib["path"]), | |
1651 x.attrib["ext"], | |
1652 x.attrib["useuri"], | |
1653 track_conf["label"], | |
1654 metadata, | |
1655 ) | |
1656 track_conf["trackfiles"].append(tfa) | |
1657 | 1666 |
1658 if is_multi_bigwig: | 1667 if is_multi_bigwig: |
1659 metadata = metadata_from_node(x.find("metadata")) | 1668 metadata = metadata_from_node(x.find("metadata")) |
1660 | 1669 |
1661 track_conf["trackfiles"].append( | 1670 track_conf["trackfiles"].append( |
1668 ) | 1677 ) |
1669 | 1678 |
1670 track_conf["category"] = track.attrib["cat"] | 1679 track_conf["category"] = track.attrib["cat"] |
1671 track_conf["format"] = track.attrib["format"] | 1680 track_conf["format"] = track.attrib["format"] |
1672 track_conf["conf"] = etree_to_dict(track.find("options")) | 1681 track_conf["conf"] = etree_to_dict(track.find("options")) |
1673 logging | |
1674 keys = jc.process_annotations(track_conf) | 1682 keys = jc.process_annotations(track_conf) |
1675 if keys: | 1683 if keys: |
1676 for key in keys: | 1684 for key in keys: |
1677 vis = track.attrib.get("visibility", "default_off") | 1685 vis = track.attrib.get("visibility", "default_off") |
1678 if not vis: | 1686 if not vis: |
1682 stile = {} | 1690 stile = {} |
1683 for trak in trakdat: | 1691 for trak in trakdat: |
1684 if trak["trackId"] == key: | 1692 if trak["trackId"] == key: |
1685 stile = trak.get("style", {}) | 1693 stile = trak.get("style", {}) |
1686 if track.find("options/style"): | 1694 if track.find("options/style"): |
1687 supdate = { | 1695 for item in track.find("options/style"): |
1688 item.tag: parse_style_conf(item) | 1696 if item.text: |
1689 for item in track.find("options/style") | 1697 stile[item.tag] = parse_style_conf(item) |
1690 } | 1698 logging.debug("stile=%s" % stile) |
1691 stile.update(supdate) | |
1692 default_session_data[primaryGenome]["style"][key] = stile | 1699 default_session_data[primaryGenome]["style"][key] = stile |
1693 if track.find("options/style_labels"): | 1700 if track.find("options/style_labels"): |
1694 default_session_data[primaryGenome]["style_labels"][key] = { | 1701 default_session_data[primaryGenome]["style_labels"][key] = { |
1695 item.tag: parse_style_conf(item) | 1702 item.tag: parse_style_conf(item) |
1696 for item in track.find("options/style_labels") | 1703 for item in track.find("options/style_labels") |
1712 "tertiary_color": root.find("metadata/general/tertiary_color").text, | 1719 "tertiary_color": root.find("metadata/general/tertiary_color").text, |
1713 "quaternary_color": root.find("metadata/general/quaternary_color").text, | 1720 "quaternary_color": root.find("metadata/general/quaternary_color").text, |
1714 "font_size": root.find("metadata/general/font_size").text, | 1721 "font_size": root.find("metadata/general/font_size").text, |
1715 } | 1722 } |
1716 jc.add_general_configuration(general_data) | 1723 jc.add_general_configuration(general_data) |
1724 jc.add_default_session(default_session_data) | |
1717 trackconf = jc.config_json.get("tracks", []) | 1725 trackconf = jc.config_json.get("tracks", []) |
1718 for gnome in jc.genome_names: | 1726 for gnome in jc.genome_names: |
1719 gtracks = jc.tracksToAdd[gnome] | 1727 gtracks = jc.tracksToAdd[gnome] |
1720 if len(gtracks) > 0: | 1728 if len(gtracks) > 0: |
1721 logging.debug( | 1729 logging.debug( |
1737 jc.trackIdlist, | 1745 jc.trackIdlist, |
1738 json.dumps(trackconf, indent=2), | 1746 json.dumps(trackconf, indent=2), |
1739 ) | 1747 ) |
1740 ) | 1748 ) |
1741 jc.write_config() | 1749 jc.write_config() |
1742 jc.add_default_session(default_session_data) | |
1743 # note that this can be left in the config.json but has NO EFFECT if add_defsess_to_index is called. | 1750 # note that this can be left in the config.json but has NO EFFECT if add_defsess_to_index is called. |
1744 # jc.add_defsess_to_index(default_session_data) | 1751 # jc.add_defsess_to_index(default_session_data) |
1745 # jc.text_index() not sure what broke here. | 1752 # jc.text_index() not sure what broke here. |