Mercurial > repos > fubar > jbrowse2
comparison jbrowse2.py @ 80:dff27c9f6d72 draft
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 7bb0fa234bdbc42768b30e426472a47b2523297f
| author | fubar |
|---|---|
| date | Wed, 03 Apr 2024 01:00:21 +0000 |
| parents | 14ecbe46ae9f |
| children | e9bcbed05108 |
comparison
equal
deleted
inserted
replaced
| 79:14ecbe46ae9f | 80:dff27c9f6d72 |
|---|---|
| 18 | 18 |
| 19 logging.basicConfig(level=logging.DEBUG) | 19 logging.basicConfig(level=logging.DEBUG) |
| 20 log = logging.getLogger("jbrowse") | 20 log = logging.getLogger("jbrowse") |
| 21 | 21 |
| 22 JB2VER = "v2.10.3" | 22 JB2VER = "v2.10.3" |
| 23 # version pinned for cloning | 23 # version pinned if cloning - but not cloning now |
| 24 | 24 |
| 25 TODAY = datetime.datetime.now().strftime("%Y-%m-%d") | 25 TODAY = datetime.datetime.now().strftime("%Y-%m-%d") |
| 26 SELF_LOCATION = os.path.dirname(os.path.realpath(__file__)) | 26 SELF_LOCATION = os.path.dirname(os.path.realpath(__file__)) |
| 27 GALAXY_INFRASTRUCTURE_URL = None | 27 GALAXY_INFRASTRUCTURE_URL = None |
| 28 mapped_chars = { | 28 mapped_chars = { |
| 399 return metadata | 399 return metadata |
| 400 | 400 |
| 401 | 401 |
| 402 class JbrowseConnector(object): | 402 class JbrowseConnector(object): |
| 403 def __init__(self, outdir, jbrowse2path): | 403 def __init__(self, outdir, jbrowse2path): |
| 404 self.trackCounter = 0 # to avoid name clashes | |
| 404 self.assemblies = [] # these require more than a few line diff. | 405 self.assemblies = [] # these require more than a few line diff. |
| 405 self.assmeta = {} | 406 self.assmeta = {} |
| 406 self.ass_first_contigs = ( | 407 self.ass_first_contigs = ( |
| 407 [] | 408 [] |
| 408 ) # for default session - these are read as first line of the assembly .fai | 409 ) # for default session - these are read as first line of the assembly .fai |
| 479 style_data, | 480 style_data, |
| 480 ] | 481 ] |
| 481 } | 482 } |
| 482 return wstyle | 483 return wstyle |
| 483 | 484 |
| 484 def urllib_get_2018(): | 485 def getNrow(self, url): |
| 485 # Using a protected member like this is not any more fragile | 486 useuri = url.startswith("https://") or url.startswith("http://") |
| 486 # than extending the class and using it. I would use it. | 487 if not useuri: |
| 487 url = "https://localhost:6667/my-endpoint" | 488 fl = open(url, "r").readlines() |
| 488 ssl._create_default_https_context = ssl._create_unverified_context | 489 nrow = len(fl) |
| 489 with urllib.request.urlopen(url=url) as f: | 490 else: |
| 490 print(f.read().decode("utf-8")) | 491 try: |
| 491 | 492 scontext = ssl.SSLContext(ssl.PROTOCOL_TLS) |
| 492 def urllib_get_2022(): | 493 scontext.verify_mode = ssl.VerifyMode.CERT_NONE |
| 493 # Finally! Able to use the publice API. Happy happy! | 494 with urllib.request.urlopen(url, context=scontext) as f: |
| 494 url = "https://localhost:6667/my-endpoint" | 495 fl = f.readlines() |
| 495 scontext = ssl.SSLContext(ssl.PROTOCOL_TLS) | 496 nrow = len(fl) |
| 496 scontext.verify_mode = ssl.VerifyMode.CERT_NONE | 497 except Exception: |
| 497 with urllib.request.urlopen(url=url, context=scontext) as f: | 498 nrow = 0 |
| 498 print(f.read().decode("utf-8")) | 499 logging.debug("### getNrow returning %d" % nrow) |
| 500 return nrow | |
| 499 | 501 |
| 500 def process_genomes(self, genomes): | 502 def process_genomes(self, genomes): |
| 501 assembly = [] | 503 assembly = [] |
| 502 assmeta = [] | 504 assmeta = [] |
| 503 useuri = False | 505 useuri = False |
| 505 for i, genome_node in enumerate(genomes): | 507 for i, genome_node in enumerate(genomes): |
| 506 this_genome = {} | 508 this_genome = {} |
| 507 if genome_node["useuri"] == "yes": | 509 if genome_node["useuri"] == "yes": |
| 508 useuri = True | 510 useuri = True |
| 509 genome_name = genome_node["label"].strip() | 511 genome_name = genome_node["label"].strip() |
| 512 if len(genome_name) == 0: | |
| 513 genome_name = os.path.splitext(os.path.basename(genome_node["path"]))[0] | |
| 510 if len(genome_name.split()) > 1: | 514 if len(genome_name.split()) > 1: |
| 511 genome_name = genome_name.split()[0] | 515 genome_name = genome_name.split()[0] |
| 512 # spaces and cruft break scripts when substituted | 516 # spaces and cruft break scripts when substituted |
| 513 if genome_name not in genome_names: | 517 if genome_name not in genome_names: |
| 514 # pafs with shared references | 518 # pafs with shared references |
| 682 # url = "%s/api/datasets/%s/display?to_ext=hic " % (self.giURL, dsId) | 686 # url = "%s/api/datasets/%s/display?to_ext=hic " % (self.giURL, dsId) |
| 683 useuri = trackData["useuri"].lower() == "yes" | 687 useuri = trackData["useuri"].lower() == "yes" |
| 684 if useuri: | 688 if useuri: |
| 685 uri = data | 689 uri = data |
| 686 else: | 690 else: |
| 687 uri = "%s.hic" % trackData["label"] | 691 uri = tId |
| 688 # slashes in names cause path trouble | 692 # slashes in names cause path trouble |
| 689 dest = os.path.join(self.outdir, uri) | 693 dest = os.path.join(self.outdir, uri) |
| 690 cmd = ["cp", data, dest] | 694 cmd = ["cp", data, dest] |
| 691 self.subprocess_check_call(cmd) | 695 self.subprocess_check_call(cmd) |
| 692 categ = trackData["category"] | 696 categ = trackData["category"] |
| 718 "url": "https://unpkg.com/jbrowse-plugin-mafviewer/dist/jbrowse-plugin-mafviewer.umd.production.min.js", | 722 "url": "https://unpkg.com/jbrowse-plugin-mafviewer/dist/jbrowse-plugin-mafviewer.umd.production.min.js", |
| 719 } | 723 } |
| 720 ] | 724 ] |
| 721 } | 725 } |
| 722 categ = trackData["category"] | 726 categ = trackData["category"] |
| 723 fname = "%s" % tId | 727 fname = tId |
| 724 dest = "%s/%s" % (self.outdir, fname) | 728 dest = "%s/%s" % (self.outdir, fname) |
| 725 gname = trackData["assemblyNames"] | 729 gname = trackData["assemblyNames"] |
| 726 | 730 |
| 727 cmd = [ | 731 cmd = [ |
| 728 "bash", | 732 "bash", |
| 809 logging.debug("### gff3rebase cmd = %s" % " ".join(cmd)) | 813 logging.debug("### gff3rebase cmd = %s" % " ".join(cmd)) |
| 810 gff3_rebased.close() | 814 gff3_rebased.close() |
| 811 # Replace original gff3 file | 815 # Replace original gff3 file |
| 812 shutil.copy(gff3_rebased.name, gff3) | 816 shutil.copy(gff3_rebased.name, gff3) |
| 813 os.unlink(gff3_rebased.name) | 817 os.unlink(gff3_rebased.name) |
| 814 url = "%s.gff3.gz" % trackData["label"] | 818 self.add_gff(gff3, trackData, **kwargs) |
| 815 dest = "%s/%s" % (self.outdir, url) | 819 |
| 816 self._sort_gff(gff3, dest) | 820 def add_bigwig(self, data, trackData): |
| 817 tId = trackData["label"] | 821 tId = trackData["label"] |
| 818 categ = trackData["category"] | |
| 819 trackDict = { | |
| 820 "type": "FeatureTrack", | |
| 821 "trackId": tId, | |
| 822 "name": trackData["name"], | |
| 823 "assemblyNames": [trackData["assemblyNames"]], | |
| 824 "category": [ | |
| 825 categ, | |
| 826 ], | |
| 827 "adapter": { | |
| 828 "type": "Gff3TabixAdapter", | |
| 829 "gffGzLocation": { | |
| 830 "uri": url, | |
| 831 }, | |
| 832 "index": { | |
| 833 "location": { | |
| 834 "uri": url + ".tbi", | |
| 835 } | |
| 836 }, | |
| 837 }, | |
| 838 "displays": [ | |
| 839 { | |
| 840 "type": "LinearBasicDisplay", | |
| 841 "displayId": "%s-LinearBasicDisplay" % tId, | |
| 842 }, | |
| 843 { | |
| 844 "type": "LinearArcDisplay", | |
| 845 "displayId": "%s-LinearArcDisplay" % tId, | |
| 846 }, | |
| 847 ], | |
| 848 } | |
| 849 style_json = self._prepare_track_style(trackDict) | |
| 850 trackDict["style"] = style_json | |
| 851 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | |
| 852 self.trackIdlist.append(tId) | |
| 853 os.unlink(gff3) | |
| 854 | |
| 855 def add_bigwig(self, data, trackData): | |
| 856 useuri = trackData["useuri"].lower() == "yes" | 822 useuri = trackData["useuri"].lower() == "yes" |
| 857 if useuri: | 823 if useuri: |
| 858 url = data | 824 url = data |
| 859 else: | 825 else: |
| 860 url = "%s.bigwig" % trackData["label"] | 826 url = tId |
| 861 # slashes in names cause path trouble | 827 # slashes in names cause path trouble |
| 862 dest = os.path.join(self.outdir, url) | 828 dest = os.path.join(self.outdir, url) |
| 863 cmd = ["cp", data, dest] | 829 cmd = ["cp", data, dest] |
| 864 self.subprocess_check_call(cmd) | 830 self.subprocess_check_call(cmd) |
| 865 bwloc = {"uri": url} | 831 bwloc = {"uri": url} |
| 866 tId = trackData["label"] | |
| 867 categ = trackData["category"] | 832 categ = trackData["category"] |
| 868 trackDict = { | 833 trackDict = { |
| 869 "type": "QuantitativeTrack", | 834 "type": "QuantitativeTrack", |
| 870 "trackId": tId, | 835 "trackId": tId, |
| 871 "name": trackData["name"], | 836 "name": trackData["name"], |
| 895 bindex = bam_index | 860 bindex = bam_index |
| 896 categ = trackData["category"] | 861 categ = trackData["category"] |
| 897 if useuri: | 862 if useuri: |
| 898 url = data | 863 url = data |
| 899 else: | 864 else: |
| 900 fname = "%s.bam" % trackData["label"] | 865 fname = tId |
| 901 dest = "%s/%s" % (self.outdir, fname) | 866 dest = "%s/%s" % (self.outdir, fname) |
| 902 url = fname | 867 url = fname |
| 903 bindex = fname + ".bai" | 868 bindex = fname + ".bai" |
| 904 self.subprocess_check_call(["cp", data, dest]) | 869 self.subprocess_check_call(["cp", data, dest]) |
| 905 if bam_index is not None and os.path.exists(bam_index): | 870 if bam_index is not None and os.path.exists(bam_index): |
| 955 genseqad = "Not found" | 920 genseqad = "Not found" |
| 956 logging.warn("No adapter found for cram %s in gsa=%s" % (tId, gsa)) | 921 logging.warn("No adapter found for cram %s in gsa=%s" % (tId, gsa)) |
| 957 if useuri: | 922 if useuri: |
| 958 url = data | 923 url = data |
| 959 else: | 924 else: |
| 960 fname = "%s.cram" % trackData["label"] | 925 fname = tId |
| 961 dest = "%s/%s" % (self.outdir, fname) | 926 dest = os.path.join(self.outdir, fname) |
| 962 url = fname | 927 url = fname |
| 963 self.subprocess_check_call(["cp", data, dest]) | 928 self.subprocess_check_call(["cp", data, dest]) |
| 964 if cram_index is not None and os.path.exists(cram_index): | 929 if cram_index is not None and os.path.exists(cram_index): |
| 965 if not os.path.exists(dest + ".crai"): | 930 if not os.path.exists(dest + ".crai"): |
| 966 # most probably made by galaxy and stored in galaxy dirs, need to copy it to dest | 931 # most probably made by galaxy and stored in galaxy dirs, need to copy it to dest |
| 1008 categ = trackData["category"] | 973 categ = trackData["category"] |
| 1009 useuri = trackData["useuri"].lower() == "yes" | 974 useuri = trackData["useuri"].lower() == "yes" |
| 1010 if useuri: | 975 if useuri: |
| 1011 url = data | 976 url = data |
| 1012 else: | 977 else: |
| 1013 url = "%s.vcf.gz" % tId | 978 url = tId |
| 1014 dest = "%s/%s" % (self.outdir, url) | 979 dest = "%s/%s" % (self.outdir, url) |
| 1015 cmd = "bgzip -c %s > %s" % (data, dest) | 980 cmd = "bgzip -c %s > %s" % (data, dest) |
| 1016 self.subprocess_popen(cmd) | 981 self.subprocess_popen(cmd) |
| 1017 cmd = ["tabix", "-f", "-p", "vcf", dest] | 982 cmd = ["tabix", "-f", "-p", "vcf", dest] |
| 1018 self.subprocess_check_call(cmd) | 983 self.subprocess_check_call(cmd) |
| 1057 # Only index if not already done | 1022 # Only index if not already done |
| 1058 if not os.path.exists(dest): | 1023 if not os.path.exists(dest): |
| 1059 cmd = "jbrowse sort-gff '%s' | bgzip -c > '%s'" % ( | 1024 cmd = "jbrowse sort-gff '%s' | bgzip -c > '%s'" % ( |
| 1060 data, | 1025 data, |
| 1061 dest, | 1026 dest, |
| 1062 ) # "gff3sort.pl --precise '%s' | grep -v \"^$\" > '%s'" | 1027 ) |
| 1063 self.subprocess_popen(cmd) | 1028 self.subprocess_popen(cmd) |
| 1064 self.subprocess_check_call(["tabix", "-f", "-p", "gff", dest]) | 1029 self.subprocess_check_call(["tabix", "-f", "-p", "gff", dest]) |
| 1065 | 1030 |
| 1066 def _sort_bed(self, data, dest): | 1031 def _sort_bed(self, data, dest): |
| 1067 # Only index if not already done | 1032 # Only index if not already done |
| 1069 cmd = "sort -k1,1 -k2,2n '%s' | bgzip -c > '%s'" % (data, dest) | 1034 cmd = "sort -k1,1 -k2,2n '%s' | bgzip -c > '%s'" % (data, dest) |
| 1070 self.subprocess_popen(cmd) | 1035 self.subprocess_popen(cmd) |
| 1071 cmd = ["tabix", "-f", "-p", "bed", dest] | 1036 cmd = ["tabix", "-f", "-p", "bed", dest] |
| 1072 self.subprocess_check_call(cmd) | 1037 self.subprocess_check_call(cmd) |
| 1073 | 1038 |
| 1074 def add_gff(self, data, ext, trackData): | 1039 def add_gff(self, data, trackData): |
| 1040 tId = trackData["label"] | |
| 1075 useuri = trackData["useuri"].lower() == "yes" | 1041 useuri = trackData["useuri"].lower() == "yes" |
| 1076 if useuri: | 1042 if useuri: |
| 1077 url = trackData["path"] | 1043 url = trackData["path"] |
| 1078 else: | 1044 else: |
| 1079 url = "%s.%s.gz" % (trackData["label"], ext) | 1045 url = tId + ".gz" |
| 1080 dest = "%s/%s" % (self.outdir, url) | 1046 dest = "%s/%s" % (self.outdir, url) |
| 1081 self._sort_gff(data, dest) | 1047 self._sort_gff(data, dest) |
| 1082 tId = trackData["label"] | |
| 1083 categ = trackData["category"] | 1048 categ = trackData["category"] |
| 1084 trackDict = { | 1049 trackDict = { |
| 1085 "type": "FeatureTrack", | 1050 "type": "FeatureTrack", |
| 1086 "trackId": tId, | 1051 "trackId": tId, |
| 1087 "name": trackData["name"], | 1052 "name": trackData["name"], |
| 1121 categ = trackData["category"] | 1086 categ = trackData["category"] |
| 1122 useuri = trackData["useuri"].lower() == "yes" | 1087 useuri = trackData["useuri"].lower() == "yes" |
| 1123 if useuri: | 1088 if useuri: |
| 1124 url = data | 1089 url = data |
| 1125 else: | 1090 else: |
| 1126 url = "%s.%s.gz" % (trackData["label"], ext) | 1091 url = tId |
| 1127 dest = "%s/%s" % (self.outdir, url) | 1092 dest = "%s/%s" % (self.outdir, url) |
| 1128 self._sort_bed(data, dest) | 1093 self._sort_bed(data, dest) |
| 1129 trackDict = { | 1094 trackDict = { |
| 1130 "type": "FeatureTrack", | 1095 "type": "FeatureTrack", |
| 1131 "trackId": tId, | 1096 "trackId": tId, |
| 1166 self.trackIdlist.append(tId) | 1131 self.trackIdlist.append(tId) |
| 1167 | 1132 |
| 1168 def add_paf(self, data, trackData, pafOpts, **kwargs): | 1133 def add_paf(self, data, trackData, pafOpts, **kwargs): |
| 1169 tname = trackData["name"] | 1134 tname = trackData["name"] |
| 1170 tId = trackData["label"] | 1135 tId = trackData["label"] |
| 1171 url = "%s.paf" % tId | 1136 url = tId |
| 1172 useuri = data.startswith("http://") or data.startswith("https://") | 1137 useuri = data.startswith("http://") or data.startswith("https://") |
| 1173 if not useuri: | 1138 if not useuri: |
| 1174 dest = "%s/%s" % (self.outdir, url) | 1139 dest = "%s/%s" % (self.outdir, url) |
| 1175 self.symlink_or_copy(os.path.realpath(data), dest) | 1140 self.symlink_or_copy(os.path.realpath(data), dest) |
| 1141 nrow = self.getNrow(dest) | |
| 1176 else: | 1142 else: |
| 1177 url = data | 1143 url = data |
| 1144 nrow = self.getNrow(url) | |
| 1178 categ = trackData["category"] | 1145 categ = trackData["category"] |
| 1179 pgnames = [ | 1146 pgnames = [x.strip() for x in pafOpts["genome_label"].split(",")] |
| 1180 x.strip() for x in pafOpts["genome_label"].split(",") if len(x.strip()) > 0 | |
| 1181 ] | |
| 1182 pgpaths = [ | 1147 pgpaths = [ |
| 1183 x.strip() for x in pafOpts["genome"].split(",") if len(x.strip()) > 0 | 1148 x.strip() for x in pafOpts["genome"].split(",") if len(x.strip()) > 0 |
| 1184 ] | 1149 ] |
| 1185 passnames = [trackData["assemblyNames"]] # always first | 1150 passnames = [trackData["assemblyNames"]] # always first |
| 1151 for i, gp in enumerate(pgpaths): | |
| 1152 if len(pgnames[i].strip()) == 0: | |
| 1153 # user may have left it blank - cannot make non-optional if want optional tracks. | |
| 1154 gn = os.path.basename(gp) | |
| 1155 pgnames[i] = os.path.splitext(gn)[0] | |
| 1186 logging.debug( | 1156 logging.debug( |
| 1187 "### add_paf got pafOpts=%s, pgnames=%s, pgpaths=%s for %s" | 1157 "### add_paf got pafOpts=%s, pgnames=%s, pgpaths=%s for %s" |
| 1188 % (pafOpts, pgnames, pgpaths, tId) | 1158 % (pafOpts, pgnames, pgpaths, tId) |
| 1189 ) | 1159 ) |
| 1190 for i, gname in enumerate(pgnames): | 1160 for i, gp in enumerate(pgpaths): |
| 1161 gname = pgnames[i] | |
| 1191 if len(gname.split()) > 1: | 1162 if len(gname.split()) > 1: |
| 1192 gname = gname.split()[0] | 1163 gname = gname.split()[0] |
| 1193 passnames.append(gname) | 1164 passnames.append(gname) |
| 1194 # trouble from spacey names in command lines avoidance | 1165 # trouble from spacey names in command lines avoidance |
| 1195 useuri = pgpaths[i].startswith("http://") or pgpaths[i].startswith( | 1166 useuri = gp.startswith("http://") or gp.startswith("https://") |
| 1196 "https://" | |
| 1197 ) | |
| 1198 | 1167 |
| 1199 if gname not in self.genome_names: | 1168 if gname not in self.genome_names: |
| 1200 # ignore if already there - eg for duplicates among pafs. | 1169 # ignore if already there - eg for duplicates among pafs. |
| 1201 asstrack, first_contig = self.make_assembly(pgpaths[i], gname, useuri) | 1170 asstrack, first_contig = self.make_assembly(gp, gname, useuri) |
| 1202 self.genome_names.append(gname) | 1171 self.genome_names.append(gname) |
| 1203 self.tracksToAdd[gname] = [] | 1172 self.tracksToAdd[gname] = [] |
| 1204 self.assemblies.append(asstrack) | 1173 self.assemblies.append(asstrack) |
| 1205 trackDict = { | 1174 trackDict = { |
| 1206 "type": "SyntenyTrack", | 1175 "type": "SyntenyTrack", |
| 1227 { | 1196 { |
| 1228 "type": "LinearComparativeDisplay", | 1197 "type": "LinearComparativeDisplay", |
| 1229 "displayId": "%s-LinearComparativeDisplay" % tId, | 1198 "displayId": "%s-LinearComparativeDisplay" % tId, |
| 1230 }, | 1199 }, |
| 1231 { | 1200 { |
| 1232 "type": "LinearSyntenyDisplay", | 1201 "type": "LinearBasicDisplay", |
| 1233 "displayId": "%s-LinearSyntenyDisplay" % tId, | 1202 "displayId": "%s-LinearSyntenyDisplay" % tId, |
| 1234 }, | 1203 }, |
| 1235 ], | 1204 ], |
| 1236 } | 1205 } |
| 1237 style_json = { | 1206 if nrow > 50000: |
| 1238 "displays": [ | 1207 style_json = { |
| 1239 { | 1208 "displays": [ |
| 1240 "type": "LGVSyntenyDisplay", | 1209 { |
| 1241 "displayId": "%s-LGVSyntenyDisplay" % tId, | 1210 "type": "LGVSyntenyDisplay", |
| 1242 } | 1211 "displayId": "%s-LGVSyntenyDisplay" % tId, |
| 1243 ] | 1212 } |
| 1244 } | 1213 ] |
| 1214 } | |
| 1215 else: | |
| 1216 style_json = { | |
| 1217 "displays": [ | |
| 1218 { | |
| 1219 "type": "LinearBasicDisplay", | |
| 1220 "displayId": "%s-LinearBasicDisplay" % tId, | |
| 1221 } | |
| 1222 ] | |
| 1223 } | |
| 1224 | |
| 1245 trackDict["style"] = style_json | 1225 trackDict["style"] = style_json |
| 1246 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1226 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) |
| 1247 self.trackIdlist.append(tId) | 1227 self.trackIdlist.append(tId) |
| 1248 | 1228 |
| 1249 def process_annotations(self, track): | 1229 def process_annotations(self, track): |
| 1250 category = track["category"].replace("__pd__date__pd__", TODAY) | 1230 category = track["category"].replace("__pd__date__pd__", TODAY) |
| 1251 for i, ( | 1231 for trackIndex, ( |
| 1252 dataset_path, | 1232 dataset_path, |
| 1253 dataset_ext, | 1233 dataset_ext, |
| 1254 useuri, | 1234 useuri, |
| 1255 track_human_label, | 1235 track_human_label, |
| 1256 extra_metadata, | 1236 extra_metadata, |
| 1262 track_human_label = track_human_label.replace(" ", "_") | 1242 track_human_label = track_human_label.replace(" ", "_") |
| 1263 outputTrackConfig = { | 1243 outputTrackConfig = { |
| 1264 "category": category, | 1244 "category": category, |
| 1265 "style": {}, | 1245 "style": {}, |
| 1266 } | 1246 } |
| 1267 | |
| 1268 outputTrackConfig["assemblyNames"] = track["assemblyNames"] | 1247 outputTrackConfig["assemblyNames"] = track["assemblyNames"] |
| 1269 outputTrackConfig["key"] = track_human_label | 1248 outputTrackConfig["key"] = track_human_label |
| 1270 outputTrackConfig["useuri"] = useuri | 1249 outputTrackConfig["useuri"] = useuri |
| 1271 outputTrackConfig["path"] = dataset_path | 1250 outputTrackConfig["path"] = dataset_path |
| 1272 outputTrackConfig["ext"] = dataset_ext | 1251 outputTrackConfig["ext"] = dataset_ext |
| 1273 | 1252 |
| 1274 outputTrackConfig["trackset"] = track.get("trackset", {}) | 1253 outputTrackConfig["trackset"] = track.get("trackset", {}) |
| 1275 outputTrackConfig["label"] = "%s_%i_%s" % ( | 1254 outputTrackConfig["label"] = "%s_%d.%s" % ( |
| 1255 track_human_label, | |
| 1256 self.trackCounter, | |
| 1276 dataset_ext, | 1257 dataset_ext, |
| 1277 i, | |
| 1278 track_human_label, | |
| 1279 ) | 1258 ) |
| 1259 self.trackCounter += 1 | |
| 1280 outputTrackConfig["metadata"] = extra_metadata | 1260 outputTrackConfig["metadata"] = extra_metadata |
| 1281 outputTrackConfig["name"] = track_human_label | 1261 outputTrackConfig["name"] = track_human_label |
| 1282 | 1262 |
| 1283 if dataset_ext in ("gff", "gff3"): | 1263 if dataset_ext in ("gff", "gff3"): |
| 1284 self.add_gff( | 1264 self.add_gff( |
| 1285 dataset_path, | 1265 dataset_path, |
| 1286 dataset_ext, | |
| 1287 outputTrackConfig, | 1266 outputTrackConfig, |
| 1288 ) | 1267 ) |
| 1289 elif dataset_ext in ("hic", "juicebox_hic"): | 1268 elif dataset_ext in ("hic", "juicebox_hic"): |
| 1290 self.add_hic( | 1269 self.add_hic( |
| 1291 dataset_path, | 1270 dataset_path, |
| 1292 outputTrackConfig, | 1271 outputTrackConfig, |
| 1293 ) | 1272 ) |
| 1294 elif dataset_ext in ("cool", "mcool", "scool"): | 1273 elif dataset_ext in ("cool", "mcool", "scool"): |
| 1295 hic_url = "%s_%d.hic" % (track_human_label, i) | 1274 hic_url = outputTrackConfig["label"] |
| 1296 hic_path = os.path.join(self.outdir, hic_url) | 1275 hic_path = os.path.join(self.outdir, hic_url) |
| 1297 self.subprocess_check_call( | 1276 self.subprocess_check_call( |
| 1298 [ | 1277 [ |
| 1299 "hictk", | 1278 "hictk", |
| 1300 "convert", | 1279 "convert", |
| 1386 logging.debug( | 1365 logging.debug( |
| 1387 "### No style data in default data %s for %s" | 1366 "### No style data in default data %s for %s" |
| 1388 % (default_data, tId) | 1367 % (default_data, tId) |
| 1389 ) | 1368 ) |
| 1390 style_data = {"type": "LinearBasicDisplay"} | 1369 style_data = {"type": "LinearBasicDisplay"} |
| 1391 if "displays" in track_conf: | 1370 if "displays" in track_conf: |
| 1392 disp = track_conf["displays"][0]["type"] | 1371 disp = track_conf["displays"][0]["type"] |
| 1393 style_data["type"] = disp | 1372 style_data["type"] = disp |
| 1394 if track_conf.get("style_labels", None): | 1373 if track_conf.get("style_labels", None): |
| 1395 # TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work | 1374 # TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work |
| 1396 # TODO move this to per track displays? | 1375 # TODO move this to per track displays? |
| 1397 style_data["labels"] = track_conf["style_labels"] | 1376 style_data["labels"] = track_conf["style_labels"] |
| 1398 tracks_data.append( | 1377 tracks_data.append( |
| 1416 first = [x for x in self.ass_first_contigs if x[0] == gnome] | 1395 first = [x for x in self.ass_first_contigs if x[0] == gnome] |
| 1417 if len(first) > 0: | 1396 if len(first) > 0: |
| 1418 [gnome, refName, end] = first[0] | 1397 [gnome, refName, end] = first[0] |
| 1419 start = 0 | 1398 start = 0 |
| 1420 end = int(end) | 1399 end = int(end) |
| 1421 refName = self.assmeta[gnome][0].get("genome_firstcontig", None) | |
| 1422 drdict = { | 1400 drdict = { |
| 1423 "refName": refName, | 1401 "refName": refName, |
| 1424 "start": start, | 1402 "start": start, |
| 1425 "end": end, | 1403 "end": end, |
| 1426 "reversed": False, | 1404 "reversed": False, |
| 1472 with open(self.config_json_file, "w") as config_file: | 1450 with open(self.config_json_file, "w") as config_file: |
| 1473 json.dump(self.config_json, config_file, indent=2) | 1451 json.dump(self.config_json, config_file, indent=2) |
| 1474 | 1452 |
| 1475 def add_defsess_to_index(self, data): | 1453 def add_defsess_to_index(self, data): |
| 1476 """ | 1454 """ |
| 1477 This was included on request of the new codeowner from Anthony's IUC PR. | 1455 Included on request of the new codeowner, from Anthony's IUC PR. |
| 1478 Now fixed to deal with each assembly and tracks separately. | 1456 Had to be fixed to keep each assembly with the associated tracks for a default view. |
| 1479 Originally used only the first assembly, putting all tracks there and | 1457 Originally used only the first assembly, putting all tracks there and so breaking some |
| 1480 generally falling apart when tested with 2 or more. Seems ironic that | 1458 when tested with 2 or more. Seems ironic that this vital feature could not have ever been tested |
| 1481 this vital feature was never tested given the rejection of my original IUC PR | 1459 given that my declining to add it was the basis for a reviewer's rejection of my original IUC PR. |
| 1482 because it was not there. And no, reviewer, I do not want this important piece of history | 1460 A simple 2 line diff apparently. |
| 1483 removed. I prefer that it remain here since it has caused me considerable discomfort. | 1461 |
| 1462 The technical problem is that this index.html hack breaks the promise of all the form fields | |
| 1463 for track controls such as visibility default that were working mostly. They need to be removed from the form by whoever | |
| 1464 thought this method was a good solution to the JB2 bug breaking config.json style default | |
| 1465 view coordinates. | |
| 1466 | |
| 1467 And no, dear reviewer of this code, please leave this piece of history. | |
| 1468 It is true and I prefer that it remain here to document my considerable discomfort at this unfair treatment. | |
| 1484 | 1469 |
| 1485 ---------------------------------------------------------- | 1470 ---------------------------------------------------------- |
| 1486 Add some default session settings: set some assemblies/tracks on/off | 1471 Add some default session settings: set some assemblies/tracks on/off |
| 1487 | 1472 |
| 1488 This allows to select a default view: | 1473 This allows to select a default view: |
| 1624 GALAXY_INFRASTRUCTURE_URL = "http://" + GALAXY_INFRASTRUCTURE_URL | 1609 GALAXY_INFRASTRUCTURE_URL = "http://" + GALAXY_INFRASTRUCTURE_URL |
| 1625 | 1610 |
| 1626 jc = JbrowseConnector(outdir=args.outdir, jbrowse2path=args.jbrowse2path) | 1611 jc = JbrowseConnector(outdir=args.outdir, jbrowse2path=args.jbrowse2path) |
| 1627 | 1612 |
| 1628 default_session_data = {} | 1613 default_session_data = {} |
| 1629 | |
| 1630 for ass in root.findall("assembly"): | 1614 for ass in root.findall("assembly"): |
| 1631 genomes = [ | 1615 genomes = [ |
| 1632 { | 1616 { |
| 1633 "path": x.attrib["path"], | 1617 "path": x.attrib["path"], |
| 1634 "label": x.attrib["label"], | 1618 "label": x.attrib["label"], |
| 1664 | 1648 |
| 1665 trackfiles = track.findall("files/trackFile") | 1649 trackfiles = track.findall("files/trackFile") |
| 1666 if trackfiles: | 1650 if trackfiles: |
| 1667 for x in track.findall("files/trackFile"): | 1651 for x in track.findall("files/trackFile"): |
| 1668 track_conf["label"] = x.attrib["label"] | 1652 track_conf["label"] = x.attrib["label"] |
| 1669 trackkey = track_conf["label"] | |
| 1670 track_conf["useuri"] = x.attrib["useuri"] | 1653 track_conf["useuri"] = x.attrib["useuri"] |
| 1671 if is_multi_bigwig: | 1654 if is_multi_bigwig: |
| 1672 multi_bigwig_paths.append( | 1655 multi_bigwig_paths.append( |
| 1673 ( | 1656 ( |
| 1674 x.attrib["label"], | 1657 x.attrib["label"], |
| 1764 assconf = jc.config_json.get("assemblies", []) | 1747 assconf = jc.config_json.get("assemblies", []) |
| 1765 assconf += jc.assemblies | 1748 assconf += jc.assemblies |
| 1766 jc.config_json["assemblies"] = assconf | 1749 jc.config_json["assemblies"] = assconf |
| 1767 logging.debug("assemblies=%s, gnames=%s" % (assconf, jc.genome_names)) | 1750 logging.debug("assemblies=%s, gnames=%s" % (assconf, jc.genome_names)) |
| 1768 jc.write_config() | 1751 jc.write_config() |
| 1769 # jc.add_default_session(default_session_data) | 1752 jc.add_default_session(default_session_data) |
| 1770 # note that this can be left in the config.json but has NO EFFECT if add_defsess_to_index is called. | 1753 # note that this can be left in the config.json but has NO EFFECT if add_defsess_to_index is called. |
| 1771 jc.add_defsess_to_index(default_session_data) | 1754 # jc.add_defsess_to_index(default_session_data) |
| 1772 # jc.text_index() not sure what broke here. | 1755 # jc.text_index() not sure what broke here. |
