Mercurial > repos > fubar > jbrowse2
comparison jbrowse2.py @ 99:990291e918c7 draft
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit a1537aea75fc902d0e38c0b7c698830a939648b1-dirty
| author | fubar |
|---|---|
| date | Fri, 21 Jun 2024 23:34:31 +0000 |
| parents | b1260bca5fdc |
| children | e4ba5f1da6ef |
comparison
equal
deleted
inserted
replaced
| 98:b1260bca5fdc | 99:990291e918c7 |
|---|---|
| 18 from collections import defaultdict | 18 from collections import defaultdict |
| 19 | 19 |
| 20 logging.basicConfig(level=logging.DEBUG) | 20 logging.basicConfig(level=logging.DEBUG) |
| 21 log = logging.getLogger("jbrowse") | 21 log = logging.getLogger("jbrowse") |
| 22 | 22 |
| 23 JB2VER = "v2.11.0" | 23 JB2VER = "v2.11.1" |
| 24 # version pinned if cloning - but not used until now | 24 # version pinned if cloning - but not cloning now |
| 25 logCommands = True | 25 logCommands = True |
| 26 # useful for seeing what's being written but not for production setups | 26 # useful for seeing what's being written but not for production setups |
| 27 TODAY = datetime.datetime.now().strftime("%Y-%m-%d") | 27 TODAY = datetime.datetime.now().strftime("%Y-%m-%d") |
| 28 SELF_LOCATION = os.path.dirname(os.path.realpath(__file__)) | 28 SELF_LOCATION = os.path.dirname(os.path.realpath(__file__)) |
| 29 GALAXY_INFRASTRUCTURE_URL = None | 29 GALAXY_INFRASTRUCTURE_URL = None |
| 453 retcode = p.returncode | 453 retcode = p.returncode |
| 454 if retcode != 0: | 454 if retcode != 0: |
| 455 log.error(command) | 455 log.error(command) |
| 456 log.error(output) | 456 log.error(output) |
| 457 log.error(err) | 457 log.error(err) |
| 458 raise RuntimeError(f"Command ( {command} ) failed with exit code {retcode}") | 458 raise RuntimeError("Command failed with exit code %s" % (retcode)) |
| 459 | 459 |
| 460 def subprocess_check_output(self, command): | 460 def subprocess_check_output(self, command): |
| 461 if logCommands: | 461 if logCommands: |
| 462 log.debug(" ".join(command)) | 462 log.debug(" ".join(command)) |
| 463 return subprocess.check_output(command, cwd=self.outdir) | 463 return subprocess.check_output(command, cwd=self.outdir) |
| 696 "url": "https://unpkg.com/jbrowse-plugin-mafviewer/dist/jbrowse-plugin-mafviewer.umd.production.min.js", | 696 "url": "https://unpkg.com/jbrowse-plugin-mafviewer/dist/jbrowse-plugin-mafviewer.umd.production.min.js", |
| 697 } | 697 } |
| 698 ] | 698 ] |
| 699 } | 699 } |
| 700 categ = trackData["category"] | 700 categ = trackData["category"] |
| 701 fname = f"{tId}" | 701 fname = tId |
| 702 dest = os.path.join(self.outdir, fname) | 702 dest = "%s/%s" % (self.outdir, fname) |
| 703 gname = trackData["assemblyNames"] | 703 gname = trackData["assemblyNames"] |
| 704 | 704 |
| 705 cmd = [ | 705 cmd = [ |
| 706 "bash", | 706 "bash", |
| 707 os.path.join(INSTALLED_TO, "convertMAF.sh"), | 707 os.path.join(INSTALLED_TO, "convertMAF.sh"), |
| 1196 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) | 1196 self.tracksToAdd[trackData["assemblyNames"]].append(trackDict) |
| 1197 self.trackIdlist.append(tId) | 1197 self.trackIdlist.append(tId) |
| 1198 | 1198 |
| 1199 def process_annotations(self, track): | 1199 def process_annotations(self, track): |
| 1200 category = track["category"].replace("__pd__date__pd__", TODAY) | 1200 category = track["category"].replace("__pd__date__pd__", TODAY) |
| 1201 tt1 = ",/ :;\\" | |
| 1202 tt2 = "______" | |
| 1203 labttab = str.maketrans(tt1,tt2) | |
| 1201 for trackIndex, ( | 1204 for trackIndex, ( |
| 1202 dataset_path, | 1205 dataset_path, |
| 1203 dataset_ext, | 1206 dataset_ext, |
| 1204 useuri, | 1207 useuri, |
| 1205 track_human_label, | 1208 track_human_label, |
| 1207 ) in enumerate(track["trackfiles"]): | 1210 ) in enumerate(track["trackfiles"]): |
| 1208 if not dataset_path.strip().startswith("http"): | 1211 if not dataset_path.strip().startswith("http"): |
| 1209 # Unsanitize labels (element_identifiers are always sanitized by Galaxy) | 1212 # Unsanitize labels (element_identifiers are always sanitized by Galaxy) |
| 1210 for key, value in mapped_chars.items(): | 1213 for key, value in mapped_chars.items(): |
| 1211 track_human_label = track_human_label.replace(value, key) | 1214 track_human_label = track_human_label.replace(value, key) |
| 1212 track_human_label = track_human_label.replace(" ", "_") | 1215 track_human_label = track_human_label.translate(labttab) |
| 1213 outputTrackConfig = { | 1216 outputTrackConfig = { |
| 1214 "category": category, | 1217 "category": category, |
| 1215 "style": {}, | 1218 "style": {}, |
| 1216 } | 1219 } |
| 1217 | |
| 1218 # hashData = [ | |
| 1219 # str(dataset_path), | |
| 1220 # track_human_label, | |
| 1221 # track["category"], | |
| 1222 # ] | |
| 1223 # hashData = "|".join(hashData).encode("utf-8") | |
| 1224 # hash_string = hashlib.md5(hashData).hexdigest() | |
| 1225 | 1220 |
| 1226 outputTrackConfig["assemblyNames"] = track["assemblyNames"] | 1221 outputTrackConfig["assemblyNames"] = track["assemblyNames"] |
| 1227 outputTrackConfig["key"] = track_human_label | 1222 outputTrackConfig["key"] = track_human_label |
| 1228 outputTrackConfig["useuri"] = useuri | 1223 outputTrackConfig["useuri"] = useuri |
| 1229 outputTrackConfig["path"] = dataset_path | 1224 outputTrackConfig["path"] = dataset_path |
| 1230 outputTrackConfig["ext"] = dataset_ext | 1225 outputTrackConfig["ext"] = dataset_ext |
| 1231 outputTrackConfig["trackset"] = track.get("trackset", {}) | 1226 outputTrackConfig["trackset"] = track.get("trackset", {}) |
| 1232 outputTrackConfig["label"] = track["label"] | 1227 outputTrackConfig["label"] = track["label"] |
| 1233 # outputTrackConfig["label"] = "%s_%i_%s_%s" % ( | |
| 1234 # dataset_ext, | |
| 1235 # trackIndex, | |
| 1236 # track_human_label, | |
| 1237 # hash_string, | |
| 1238 # ) | |
| 1239 | |
| 1240 outputTrackConfig["metadata"] = extra_metadata | 1228 outputTrackConfig["metadata"] = extra_metadata |
| 1241 outputTrackConfig["name"] = track_human_label | 1229 outputTrackConfig["name"] = track_human_label |
| 1242 if track["label"] in self.trackIdlist: | 1230 if track["label"] in self.trackIdlist: |
| 1243 logging.error( | 1231 logging.error( |
| 1244 "### not adding %s already in %s" | 1232 "### not adding %s already in %s" |
| 1329 default session settings are hard and fragile. | 1317 default session settings are hard and fragile. |
| 1330 .add_default_view() and other configuration code adapted from | 1318 .add_default_view() and other configuration code adapted from |
| 1331 https://github.com/abretaud/tools-iuc/blob/jbrowse2/tools/jbrowse2/jbrowse2.py | 1319 https://github.com/abretaud/tools-iuc/blob/jbrowse2/tools/jbrowse2/jbrowse2.py |
| 1332 """ | 1320 """ |
| 1333 # TODO using the default session for now, but check out session specs in the future https://github.com/GMOD/jbrowse-components/issues/2708 | 1321 # TODO using the default session for now, but check out session specs in the future https://github.com/GMOD/jbrowse-components/issues/2708 |
| 1322 bpPerPx = 50 # this is tricky since browser window width is unknown - this seems a compromise that sort of works.... | |
| 1334 track_types = {} | 1323 track_types = {} |
| 1335 with open(self.config_json_file, "r") as config_file: | 1324 with open(self.config_json_file, "r") as config_file: |
| 1336 config_json = json.load(config_file) | 1325 config_json = json.load(config_file) |
| 1337 if self.config_json: | 1326 if self.config_json: |
| 1338 config_json.update(self.config_json) | 1327 config_json.update(self.config_json) |
| 1367 "type": track_types[tId], | 1356 "type": track_types[tId], |
| 1368 "configuration": tId, | 1357 "configuration": tId, |
| 1369 "displays": [style_data], | 1358 "displays": [style_data], |
| 1370 } | 1359 } |
| 1371 ) | 1360 ) |
| 1372 view_json = { | |
| 1373 "type": "LinearGenomeView", | |
| 1374 "offsetPx": 0, | |
| 1375 "minimized": False, | |
| 1376 "tracks": tracks_data, | |
| 1377 } | |
| 1378 first = [x for x in self.ass_first_contigs if x[0] == gnome] | 1361 first = [x for x in self.ass_first_contigs if x[0] == gnome] |
| 1379 if len(first) > 0: | 1362 drdict = { |
| 1380 [gnome, refName, end] = first[0] | |
| 1381 start = 0 | |
| 1382 end = int(end) | |
| 1383 drdict = { | |
| 1384 "refName": refName, | |
| 1385 "start": start, | |
| 1386 "end": end, | |
| 1387 "reversed": False, | 1363 "reversed": False, |
| 1388 "assemblyName": gnome, | 1364 "assemblyName": gnome, |
| 1389 } | 1365 } |
| 1366 if len(first) > 0: | |
| 1367 [gnome, refName, end] = first[0] | |
| 1368 drdict["refName"] = refName | |
| 1369 drdict["start"] = 0 | |
| 1370 end = int(end) | |
| 1371 drdict["end"] = end | |
| 1390 else: | 1372 else: |
| 1391 ddl = default_data.get("defaultLocation", None) | 1373 ddl = default_data.get("defaultLocation", None) |
| 1392 if ddl: | 1374 if ddl: |
| 1393 loc_match = re.search(r"^([^:]+):([\d,]*)\.*([\d,]*)$", ddl) | 1375 loc_match = re.search(r"^([^:]+):([\d,]*)\.*([\d,]*)$", ddl) |
| 1394 # allow commas like 100,000 but ignore as integer | 1376 # allow commas like 100,000 but ignore as integer |
| 1402 else: | 1384 else: |
| 1403 logging.info( | 1385 logging.info( |
| 1404 "@@@ regexp could not match contig:start..end in the supplied location %s - please fix" | 1386 "@@@ regexp could not match contig:start..end in the supplied location %s - please fix" |
| 1405 % ddl | 1387 % ddl |
| 1406 ) | 1388 ) |
| 1389 view_json = { | |
| 1390 "type": "LinearGenomeView", | |
| 1391 "offsetPx": 0, | |
| 1392 "bpPerPx" : bpPerPx, | |
| 1393 "minimized": False, | |
| 1394 "tracks": tracks_data | |
| 1395 } | |
| 1407 if drdict.get("refName", None): | 1396 if drdict.get("refName", None): |
| 1408 # TODO displayedRegions is not just zooming to the region, it hides the rest of the chromosome | 1397 # TODO displayedRegions is not just zooming to the region, it hides the rest of the chromosome |
| 1409 view_json["displayedRegions"] = [ | 1398 view_json["displayedRegions"] = [ |
| 1410 drdict, | 1399 drdict, |
| 1411 ] | 1400 ] |
| 1626 | 1615 |
| 1627 trackfiles = track.findall("files/trackFile") | 1616 trackfiles = track.findall("files/trackFile") |
| 1628 if trackfiles: | 1617 if trackfiles: |
| 1629 for x in trackfiles: | 1618 for x in trackfiles: |
| 1630 track_conf["label"] = "%s_%d" % ( | 1619 track_conf["label"] = "%s_%d" % ( |
| 1631 x.attrib["label"].replace(" ", "_").replace(",", ""), | 1620 x.attrib["label"].replace(" ", "_").replace(",", "_").replace("/","_"), |
| 1632 trackI, | 1621 trackI, |
| 1633 ) | 1622 ) |
| 1634 trackI += 1 | 1623 trackI += 1 |
| 1635 track_conf["useuri"] = x.attrib["useuri"] | 1624 track_conf["useuri"] = x.attrib["useuri"] |
| 1636 if is_multi_bigwig: | 1625 if is_multi_bigwig: |
