Mercurial > repos > fubar > jbrowse2
comparison jbrowse2.py @ 85:3b2ff9864995 draft
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 264a3d6c7a29f396d359f33164ddf2cb1d9903f8-dirty
author | fubar |
---|---|
date | Tue, 09 Apr 2024 00:26:49 +0000 |
parents | 746eae952c18 |
children | 408781c080fc |
comparison
equal
deleted
inserted
replaced
84:5c295cc220ed | 85:3b2ff9864995 |
---|---|
473 } | 473 } |
474 | 474 |
475 if trackDict.get("displays", None): # use first if multiple like bed | 475 if trackDict.get("displays", None): # use first if multiple like bed |
476 style_data["type"] = trackDict["displays"][0]["type"] | 476 style_data["type"] = trackDict["displays"][0]["type"] |
477 style_data["displayId"] = trackDict["displays"][0]["displayId"] | 477 style_data["displayId"] = trackDict["displays"][0]["displayId"] |
478 wstyle = { | 478 return style_data |
479 "displays": [ | |
480 style_data, | |
481 ] | |
482 } | |
483 return wstyle | |
484 | 479 |
485 def getNrow(self, url): | 480 def getNrow(self, url): |
486 useuri = url.startswith("https://") or url.startswith("http://") | 481 useuri = url.startswith("https://") or url.startswith("http://") |
487 if not useuri: | 482 if not useuri: |
488 fl = open(url, "r").readlines() | 483 fl = open(url, "r").readlines() |
679 uri: 'https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/fasta/GRCh38.fa.gz.gzi', | 674 uri: 'https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/fasta/GRCh38.fa.gz.gzi', |
680 Cool will not be likely to be a good fit - see discussion at https://github.com/GMOD/jbrowse-components/issues/2438 | 675 Cool will not be likely to be a good fit - see discussion at https://github.com/GMOD/jbrowse-components/issues/2438 |
681 | 676 |
682 """ | 677 """ |
683 tId = trackData["label"] | 678 tId = trackData["label"] |
679 wasCool = trackData["wasCool"] | |
684 # can be served - if public. | 680 # can be served - if public. |
685 # dsId = trackData["metadata"]["dataset_id"] | 681 # dsId = trackData["metadata"]["dataset_id"] |
686 # url = "%s/api/datasets/%s/display?to_ext=hic " % (self.giURL, dsId) | 682 # url = "%s/api/datasets/%s/display?to_ext=hic " % (self.giURL, dsId) |
687 useuri = trackData["useuri"].lower() == "yes" | 683 useuri = trackData["useuri"].lower() == "yes" |
684 logging.debug("wasCool=%s, data=%s, tId=%s" % (wasCool, data, tId)) | |
688 if useuri: | 685 if useuri: |
689 uri = data | 686 uri = data |
690 else: | 687 else: |
691 uri = tId | 688 uri = tId + ".hic" |
692 # slashes in names cause path trouble | 689 if not wasCool: |
693 dest = os.path.join(self.outdir, uri) | 690 dest = os.path.join(self.outdir, uri) |
694 cmd = ["cp", data, dest] | 691 if not os.path.exists(dest): |
695 self.subprocess_check_call(cmd) | 692 cmd = ["cp", data, dest] |
693 self.subprocess_check_call(cmd) | |
694 else: | |
695 logging.error("not wasCool but %s exists" % dest) | |
696 categ = trackData["category"] | 696 categ = trackData["category"] |
697 trackDict = { | 697 trackDict = { |
698 "type": "HicTrack", | 698 "type": "HicTrack", |
699 "trackId": tId, | 699 "trackId": tId, |
700 "name": trackData["name"], | 700 "name": trackData["name"], |
852 style_json = self._prepare_track_style(trackDict) | 852 style_json = self._prepare_track_style(trackDict) |
853 trackDict["style"] = style_json | 853 trackDict["style"] = style_json |
854 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 854 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) |
855 self.trackIdlist.append(tId) | 855 self.trackIdlist.append(tId) |
856 | 856 |
857 def add_bam(self, data, trackData, bam_index=None, **kwargs): | 857 def add_bam(self, data, trackData, bam_indexes=None, **kwargs): |
858 tId = trackData["label"] | 858 tId = trackData["label"] |
859 realFName = trackData["key"] | |
859 useuri = trackData["useuri"].lower() == "yes" | 860 useuri = trackData["useuri"].lower() == "yes" |
860 bindex = bam_index | |
861 categ = trackData["category"] | 861 categ = trackData["category"] |
862 if useuri: | 862 if useuri: |
863 url = data | 863 url = data |
864 else: | 864 else: |
865 fname = tId | 865 fname = tId |
866 dest = "%s/%s" % (self.outdir, fname) | 866 dest = "%s/%s" % (self.outdir, fname) |
867 url = fname | 867 url = fname |
868 bindex = fname + ".bai" | 868 bindex = fname + ".bai" |
869 self.subprocess_check_call(["cp", data, dest]) | 869 self.subprocess_check_call(["cp", data, dest]) |
870 bi = bam_indexes.split() | |
871 bam_index = [ | |
872 x.split(",")[1].strip() | |
873 for x in bi | |
874 if "," in x and x.split(",")[0].strip() == realFName | |
875 ] | |
876 if len(bam_index) > 0: | |
877 bam_index = bam_index[0] | |
878 else: | |
879 bam_index = None | |
880 logging.debug( | |
881 "===realFName=%s got %s as bi, %s for bam_index" | |
882 % (realFName, bi, bam_index) | |
883 ) | |
870 if bam_index is not None and os.path.exists(bam_index): | 884 if bam_index is not None and os.path.exists(bam_index): |
871 if not os.path.exists(bindex): | 885 if not os.path.exists(bindex): |
872 # bai most probably made by galaxy and stored in galaxy dirs, need to copy it to dest | 886 # bai most probably made by galaxy and stored in galaxy dirs, need to copy it to dest |
873 self.subprocess_check_call(["cp", bam_index, bindex]) | 887 self.subprocess_check_call(["cp", bam_index, bindex]) |
874 else: | 888 else: |
907 style_json = self._prepare_track_style(trackDict) | 921 style_json = self._prepare_track_style(trackDict) |
908 trackDict["style"] = style_json | 922 trackDict["style"] = style_json |
909 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 923 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) |
910 self.trackIdlist.append(tId) | 924 self.trackIdlist.append(tId) |
911 | 925 |
912 def add_cram(self, data, trackData, cram_index=None, **kwargs): | 926 def add_cram(self, data, trackData, cram_indexes=None, **kwargs): |
913 tId = trackData["label"] | 927 tId = trackData["label"] |
928 realFName = trackData["key"] | |
914 categ = trackData["category"] | 929 categ = trackData["category"] |
915 useuri = trackData["useuri"].lower() == "yes" | 930 useuri = trackData["useuri"].lower() == "yes" |
916 gsa = self.assmeta.get(trackData["assemblyNames"], None) | 931 gsa = self.assmeta.get(trackData["assemblyNames"], None) |
917 if gsa: | 932 if gsa: |
918 genseqad = gsa[0]["genome_sequence_adapter"] | 933 genseqad = gsa[0]["genome_sequence_adapter"] |
924 else: | 939 else: |
925 fname = tId | 940 fname = tId |
926 dest = os.path.join(self.outdir, fname) | 941 dest = os.path.join(self.outdir, fname) |
927 url = fname | 942 url = fname |
928 self.subprocess_check_call(["cp", data, dest]) | 943 self.subprocess_check_call(["cp", data, dest]) |
929 if cram_index is not None and os.path.exists(cram_index): | 944 ci = cram_indexes.split() |
945 cram_index = [ | |
946 x.split(",")[1].strip() | |
947 for x in ci | |
948 if "," in x and x.split(",")[0] == realFName | |
949 ] | |
950 if len(cram_index) > 0: | |
951 cram_index = cram_index[0] | |
952 else: | |
953 cram_index = None | |
954 logging.debug( | |
955 "=== for %s got %s as cram_indexes, %s for cram_index" | |
956 % (realFName, cram_indexes, cram_index) | |
957 ) | |
958 if cram_index and os.path.exists(cram_index): | |
930 if not os.path.exists(dest + ".crai"): | 959 if not os.path.exists(dest + ".crai"): |
931 # most probably made by galaxy and stored in galaxy dirs, need to copy it to dest | 960 # most probably made by galaxy and stored in galaxy dirs, need to copy it to dest |
932 self.subprocess_check_call( | 961 self.subprocess_check_call( |
933 ["cp", os.path.realpath(cram_index), dest + ".crai"] | 962 ["cp", os.path.realpath(cram_index), dest + ".crai"] |
934 ) | 963 ) |
1086 categ = trackData["category"] | 1115 categ = trackData["category"] |
1087 useuri = trackData["useuri"].lower() == "yes" | 1116 useuri = trackData["useuri"].lower() == "yes" |
1088 if useuri: | 1117 if useuri: |
1089 url = data | 1118 url = data |
1090 else: | 1119 else: |
1091 url = tId + '.gz' | 1120 url = tId + ".gz" |
1092 dest = "%s/%s" % (self.outdir, url) | 1121 dest = "%s/%s" % (self.outdir, url) |
1093 self._sort_bed(data, dest) | 1122 self._sort_bed(data, dest) |
1094 trackDict = { | 1123 trackDict = { |
1095 "type": "FeatureTrack", | 1124 "type": "FeatureTrack", |
1096 "trackId": tId, | 1125 "trackId": tId, |
1201 "type": "LinearBasicDisplay", | 1230 "type": "LinearBasicDisplay", |
1202 "displayId": "%s-LinearSyntenyDisplay" % tId, | 1231 "displayId": "%s-LinearSyntenyDisplay" % tId, |
1203 }, | 1232 }, |
1204 ], | 1233 ], |
1205 } | 1234 } |
1206 if nrow > 20000: | 1235 if nrow > 10000: |
1207 style_json = { | 1236 style_json = { |
1208 "displays": [ | 1237 "type": "LGVSyntenyDisplay", |
1209 { | 1238 "displayId": "%s-LGVSyntenyDisplay" % tId, |
1210 "type": "LGVSyntenyDisplay", | |
1211 "displayId": "%s-LGVSyntenyDisplay" % tId, | |
1212 } | |
1213 ] | |
1214 } | 1239 } |
1215 else: | 1240 else: |
1216 style_json = { | 1241 style_json = { |
1217 "displays": [ | 1242 "type": "LinearBasicDisplay", |
1218 { | 1243 "displayId": "%s-LinearBasicDisplay" % tId, |
1219 "type": "LinearBasicDisplay", | |
1220 "displayId": "%s-LinearBasicDisplay" % tId, | |
1221 } | |
1222 ] | |
1223 } | 1244 } |
1224 | |
1225 trackDict["style"] = style_json | 1245 trackDict["style"] = style_json |
1226 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1246 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) |
1227 self.trackIdlist.append(tId) | 1247 self.trackIdlist.append(tId) |
1228 | 1248 |
1229 def process_annotations(self, track): | 1249 def process_annotations(self, track): |
1264 self.add_gff( | 1284 self.add_gff( |
1265 dataset_path, | 1285 dataset_path, |
1266 outputTrackConfig, | 1286 outputTrackConfig, |
1267 ) | 1287 ) |
1268 elif dataset_ext in ("hic", "juicebox_hic"): | 1288 elif dataset_ext in ("hic", "juicebox_hic"): |
1289 outputTrackConfig["wasCool"] = False | |
1269 self.add_hic( | 1290 self.add_hic( |
1270 dataset_path, | 1291 dataset_path, |
1271 outputTrackConfig, | 1292 outputTrackConfig, |
1272 ) | 1293 ) |
1273 elif dataset_ext in ("cool", "mcool", "scool"): | 1294 elif dataset_ext in ("cool", "mcool", "scool"): |
1274 hic_url = outputTrackConfig["label"] | 1295 hic_url = outputTrackConfig["label"] |
1275 hic_path = os.path.join(self.outdir, hic_url) | 1296 hic_path = os.path.join(self.outdir, hic_url) + ".hic" |
1297 outputTrackConfig["wasCool"] = True | |
1276 self.subprocess_check_call( | 1298 self.subprocess_check_call( |
1277 [ | 1299 [ |
1278 "hictk", | 1300 "hictk", |
1279 "convert", | 1301 "convert", |
1280 "-f", | 1302 "-f", |
1282 "hic", | 1304 "hic", |
1283 dataset_path, | 1305 dataset_path, |
1284 hic_path, | 1306 hic_path, |
1285 ] | 1307 ] |
1286 ) | 1308 ) |
1309 logging.debug( | |
1310 "### ext=cool: wasCool=%s, hic_path=%s" | |
1311 % (outputTrackConfig["wasCool"], hic_path) | |
1312 ) | |
1287 self.add_hic( | 1313 self.add_hic( |
1288 hic_url, | 1314 hic_path, |
1289 outputTrackConfig, | 1315 outputTrackConfig, |
1290 ) | 1316 ) |
1291 elif dataset_ext in ("bed",): | 1317 elif dataset_ext in ("bed",): |
1292 self.add_bed( | 1318 self.add_bed( |
1293 dataset_path, | 1319 dataset_path, |
1304 dataset_path, | 1330 dataset_path, |
1305 outputTrackConfig, | 1331 outputTrackConfig, |
1306 ) | 1332 ) |
1307 elif dataset_ext == "bam": | 1333 elif dataset_ext == "bam": |
1308 real_indexes = track["conf"]["options"]["bam"]["bam_index"] | 1334 real_indexes = track["conf"]["options"]["bam"]["bam_index"] |
1335 logging.debug("**** add bam got %s for indexes" % real_indexes) | |
1309 self.add_bam( | 1336 self.add_bam( |
1310 dataset_path, | 1337 dataset_path, |
1311 outputTrackConfig, | 1338 outputTrackConfig, |
1312 bam_index=real_indexes, | 1339 bam_indexes=real_indexes, |
1313 ) | 1340 ) |
1314 elif dataset_ext == "cram": | 1341 elif dataset_ext == "cram": |
1315 real_indexes = track["conf"]["options"]["cram"]["cram_index"] | 1342 real_indexes = track["conf"]["options"]["cram"]["cram_index"] |
1343 logging.debug("**** add cram got %s for indexes" % real_indexes) | |
1316 self.add_cram( | 1344 self.add_cram( |
1317 dataset_path, | 1345 dataset_path, |
1318 outputTrackConfig, | 1346 outputTrackConfig, |
1319 cram_index=real_indexes, | 1347 cram_indexes=real_indexes, |
1320 ) | 1348 ) |
1321 elif dataset_ext == "blastxml": | 1349 elif dataset_ext == "blastxml": |
1322 self.add_blastxml( | 1350 self.add_blastxml( |
1323 dataset_path, | 1351 dataset_path, |
1324 outputTrackConfig, | 1352 outputTrackConfig, |
1353 session_json = config_json["defaultSession"] | 1381 session_json = config_json["defaultSession"] |
1354 session_views = [] | 1382 session_views = [] |
1355 else: | 1383 else: |
1356 session_json = {} | 1384 session_json = {} |
1357 session_views = [] | 1385 session_views = [] |
1358 for gnome in self.genome_names: | 1386 for gnome in self.assmeta.keys(): # assemblies have their own tracks |
1359 tracks_data = [] | 1387 tracks_data = [] |
1360 for track_conf in self.tracksToAdd[gnome]: | 1388 for track_conf in self.tracksToAdd[gnome]: |
1361 tId = track_conf["trackId"] | 1389 tId = track_conf["trackId"] |
1362 track_types[tId] = track_conf["type"] | 1390 if tId in default_data[gnome]["visibility"]["default_on"]: |
1363 style_data = default_data[gnome]["style"].get(tId, None) | 1391 track_types[tId] = track_conf["type"] |
1364 if not style_data: | 1392 style_data = default_data[gnome]["style"].get(tId, None) |
1365 logging.debug( | 1393 if not style_data: |
1366 "### No style data in default data %s for %s" | 1394 logging.debug( |
1367 % (default_data, tId) | 1395 "### No style data for %s in available default data %s" |
1396 % (tId, default_data) | |
1397 ) | |
1398 style_data = {"type": "LinearBasicDisplay"} | |
1399 if "displays" in track_conf: | |
1400 disp = track_conf["displays"][0]["type"] | |
1401 style_data["type"] = disp | |
1402 if track_conf.get("style_labels", None): | |
1403 # TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work | |
1404 # TODO move this to per track displays? | |
1405 style_data["labels"] = track_conf["style_labels"] | |
1406 tracks_data.append( | |
1407 { | |
1408 "type": track_types[tId], | |
1409 "configuration": tId, | |
1410 "displays": [style_data], | |
1411 } | |
1368 ) | 1412 ) |
1369 style_data = {"type": "LinearBasicDisplay"} | 1413 view_json = { |
1370 if "displays" in track_conf: | 1414 "type": "LinearGenomeView", |
1371 disp = track_conf["displays"][0]["type"] | 1415 "offsetPx": 0, |
1372 style_data["type"] = disp | 1416 "minimized": False, |
1373 if track_conf.get("style_labels", None): | 1417 "tracks": tracks_data, |
1374 # TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work | 1418 } |
1375 # TODO move this to per track displays? | 1419 logging.debug( |
1376 style_data["labels"] = track_conf["style_labels"] | 1420 "Looking for %s in self.ass_ %s" % (gnome, self.ass_first_contigs) |
1377 tracks_data.append( | 1421 ) |
1378 { | 1422 first = [x for x in self.ass_first_contigs if x[0] == gnome] |
1379 "type": track_types[tId], | 1423 if len(first) > 0: |
1380 "configuration": tId, | 1424 [gnome, refName, end] = first[0] |
1381 "displays": [style_data], | 1425 start = 0 |
1382 } | 1426 end = int(end) |
1427 drdict = { | |
1428 "refName": refName, | |
1429 "start": start, | |
1430 "end": end, | |
1431 "reversed": False, | |
1432 "assemblyName": gnome, | |
1433 } | |
1434 else: | |
1435 ddl = default_data.get("defaultLocation", None) | |
1436 if ddl: | |
1437 loc_match = re.search(r"^([^:]+):([\d,]*)\.*([\d,]*)$", ddl) | |
1438 # allow commas like 100,000 but ignore as integer | |
1439 if loc_match: | |
1440 refName = loc_match.group(1) | |
1441 drdict["refName"] = refName | |
1442 if loc_match.group(2) > "": | |
1443 drdict["start"] = int(loc_match.group(2).replace(",", "")) | |
1444 if loc_match.group(3) > "": | |
1445 drdict["end"] = int(loc_match.group(3).replace(",", "")) | |
1446 else: | |
1447 logging.info( | |
1448 "@@@ regexp could not match contig:start..end in the supplied location %s - please fix" | |
1449 % ddl | |
1450 ) | |
1451 if drdict.get("refName", None): | |
1452 # TODO displayedRegions is not just zooming to the region, it hides the rest of the chromosome | |
1453 view_json["displayedRegions"] = [ | |
1454 drdict, | |
1455 ] | |
1456 logging.info("@@@ defaultlocation %s for default session" % drdict) | |
1457 else: | |
1458 logging.info( | |
1459 "@@@ no track location for default session - please add one!" | |
1383 ) | 1460 ) |
1384 # paf genomes have no tracks associated so nothing for the view | 1461 session_views.append(view_json) |
1385 if len(tracks_data) > 0: | |
1386 view_json = { | |
1387 "type": "LinearGenomeView", | |
1388 "offsetPx": 0, | |
1389 "minimized": False, | |
1390 "tracks": tracks_data, | |
1391 } | |
1392 logging.debug( | |
1393 "Looking for %s in self.ass_ %s" % (gnome, self.ass_first_contigs) | |
1394 ) | |
1395 first = [x for x in self.ass_first_contigs if x[0] == gnome] | |
1396 if len(first) > 0: | |
1397 [gnome, refName, end] = first[0] | |
1398 start = 0 | |
1399 end = int(end) | |
1400 drdict = { | |
1401 "refName": refName, | |
1402 "start": start, | |
1403 "end": end, | |
1404 "reversed": False, | |
1405 "assemblyName": gnome, | |
1406 } | |
1407 else: | |
1408 ddl = default_data.get("defaultLocation", None) | |
1409 if ddl: | |
1410 loc_match = re.search(r"^([^:]+):([\d,]*)\.*([\d,]*)$", ddl) | |
1411 # allow commas like 100,000 but ignore as integer | |
1412 if loc_match: | |
1413 refName = loc_match.group(1) | |
1414 drdict["refName"] = refName | |
1415 if loc_match.group(2) > "": | |
1416 drdict["start"] = int( | |
1417 loc_match.group(2).replace(",", "") | |
1418 ) | |
1419 if loc_match.group(3) > "": | |
1420 drdict["end"] = int(loc_match.group(3).replace(",", "")) | |
1421 else: | |
1422 logging.info( | |
1423 "@@@ regexp could not match contig:start..end in the supplied location %s - please fix" | |
1424 % ddl | |
1425 ) | |
1426 if drdict.get("refName", None): | |
1427 # TODO displayedRegions is not just zooming to the region, it hides the rest of the chromosome | |
1428 view_json["displayedRegions"] = [ | |
1429 drdict, | |
1430 ] | |
1431 logging.info("@@@ defaultlocation %s for default session" % drdict) | |
1432 else: | |
1433 logging.info( | |
1434 "@@@ no track location for default session - please add one!" | |
1435 ) | |
1436 session_views.append(view_json) | |
1437 session_name = default_data.get("session_name", "New session") | 1462 session_name = default_data.get("session_name", "New session") |
1438 for key, value in mapped_chars.items(): | 1463 for key, value in mapped_chars.items(): |
1439 session_name = session_name.replace(value, key) | 1464 session_name = session_name.replace(value, key) |
1440 session_json["name"] = session_name | 1465 session_json["name"] = session_name |
1441 | 1466 |
1453 def add_defsess_to_index(self, data): | 1478 def add_defsess_to_index(self, data): |
1454 """ | 1479 """ |
1455 Included on request of the new codeowner, from Anthony's IUC PR. | 1480 Included on request of the new codeowner, from Anthony's IUC PR. |
1456 Had to be fixed to keep each assembly with the associated tracks for a default view. | 1481 Had to be fixed to keep each assembly with the associated tracks for a default view. |
1457 Originally used only the first assembly, putting all tracks there and so breaking some | 1482 Originally used only the first assembly, putting all tracks there and so breaking some |
1458 when tested with 2 or more. Seems ironic that this vital feature could not have ever been tested | 1483 when tested with 2 or more. |
1459 given that my declining to add it was the basis for a reviewer's rejection of my original IUC PR. | |
1460 A simple 2 line diff apparently. | |
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. | |
1469 | 1484 |
1470 ---------------------------------------------------------- | 1485 ---------------------------------------------------------- |
1471 Add some default session settings: set some assemblies/tracks on/off | 1486 Add some default session settings: set some assemblies/tracks on/off |
1472 | 1487 |
1473 This allows to select a default view: | 1488 This allows to select a default view: |
1646 except KeyError: | 1661 except KeyError: |
1647 pass | 1662 pass |
1648 | 1663 |
1649 trackfiles = track.findall("files/trackFile") | 1664 trackfiles = track.findall("files/trackFile") |
1650 if trackfiles: | 1665 if trackfiles: |
1651 for x in track.findall("files/trackFile"): | 1666 for x in trackfiles: |
1652 track_conf["label"] = x.attrib["label"] | 1667 track_conf["label"] = x.attrib["label"] |
1653 track_conf["useuri"] = x.attrib["useuri"] | 1668 track_conf["useuri"] = x.attrib["useuri"] |
1654 if is_multi_bigwig: | 1669 if is_multi_bigwig: |
1655 multi_bigwig_paths.append( | 1670 multi_bigwig_paths.append( |
1656 ( | 1671 ( |
1696 ) | 1711 ) |
1697 | 1712 |
1698 track_conf["category"] = track.attrib["cat"] | 1713 track_conf["category"] = track.attrib["cat"] |
1699 track_conf["format"] = track.attrib["format"] | 1714 track_conf["format"] = track.attrib["format"] |
1700 track_conf["conf"] = etree_to_dict(track.find("options")) | 1715 track_conf["conf"] = etree_to_dict(track.find("options")) |
1701 track_conf["category"] = track.attrib["cat"] | |
1702 track_conf["format"] = track.attrib["format"] | |
1703 keys = jc.process_annotations(track_conf) | 1716 keys = jc.process_annotations(track_conf) |
1704 | 1717 |
1705 if keys: | 1718 if keys: |
1706 for key in keys: | 1719 for key in keys: |
1707 vis = track.attrib.get("visibility", "default_off") | 1720 vis = track.attrib.get("visibility", "default_off") |
1708 if not vis: | 1721 if not vis: |
1709 vis = "default_off" | 1722 vis = "default_off" |
1710 default_session_data[assref_name]["visibility"][vis].append(key) | 1723 default_session_data[assref_name]["visibility"][vis].append(key) |
1711 if track.find("options/style"): | 1724 trakdat = jc.tracksToAdd[assref_name] |
1712 default_session_data[assref_name]["style"][key] = { | 1725 stile = {} |
1713 item.tag: parse_style_conf(item) | 1726 for trak in trakdat: |
1714 for item in track.find("options/style") | 1727 if trak["trackId"] == key: |
1715 } | 1728 stile = trak.get("style", {}) |
1716 else: | 1729 if track.find("options/style"): |
1717 default_session_data[assref_name]["style"][key] = {} | 1730 supdate = { |
1718 logging.debug("no options/style found for %s" % (key)) | 1731 item.tag: parse_style_conf(item) |
1719 | 1732 for item in track.find("options/style") |
1720 if track.find("options/style_labels"): | 1733 } |
1721 default_session_data[assref_name]["style_labels"][key] = { | 1734 stile.update(supdate) |
1722 item.tag: parse_style_conf(item) | 1735 default_session_data[assref_name]["style"][key] = stile |
1723 for item in track.find("options/style_labels") | 1736 logging.debug("@@@ for %s got style=%s" % (key, stile)) |
1724 } | 1737 if track.find("options/style_labels"): |
1738 default_session_data[assref_name]["style_labels"][key] = { | |
1739 item.tag: parse_style_conf(item) | |
1740 for item in track.find("options/style_labels") | |
1741 } | |
1725 default_session_data[assref_name]["tracks"].append(key) | 1742 default_session_data[assref_name]["tracks"].append(key) |
1726 default_session_data["defaultLocation"] = root.find( | 1743 default_session_data["defaultLocation"] = root.find( |
1727 "metadata/general/defaultLocation" | 1744 "metadata/general/defaultLocation" |
1728 ).text | 1745 ).text |
1729 default_session_data["session_name"] = root.find( | 1746 default_session_data["session_name"] = root.find( |