diff jbrowse2.py @ 60:81d535970196 draft

planemo upload for repository https://github.com/usegalaxy-eu/temporary-tools/tree/master/jbrowse2 commit 403a35e1245fa5e62f4be6116a725b9e4d9c353a
author fubar
date Mon, 25 Mar 2024 02:10:05 +0000
parents f807e219cec3
children e7a6f7a7148d
line wrap: on
line diff
--- a/jbrowse2.py	Fri Mar 22 22:04:08 2024 +0000
+++ b/jbrowse2.py	Mon Mar 25 02:10:05 2024 +0000
@@ -1,5 +1,5 @@
  #!/usr/bin/env python
-# change to accumulating all configuration for config.json based on the default from the clone
+
 import argparse
 import binascii
 import datetime
@@ -24,8 +24,6 @@
 TODAY = datetime.datetime.now().strftime("%Y-%m-%d")
 GALAXY_INFRASTRUCTURE_URL = None
 
-# version pinned for cloning
-
 mapped_chars = {
     ">": "__gt__",
     "<": "__lt__",
@@ -458,7 +456,7 @@
                 genome_name = genome_name.split()[0]
                 # spaces and cruft break scripts when substituted
             if genome_name not in self.genome_names:
-                # ignore dupes - can have multiple pafs with same references?
+                # pafs with shared references
                 fapath = genome_node["path"]
                 if not useuri:
                     fapath = os.path.realpath(fapath)
@@ -467,7 +465,7 @@
                 self.genome_names.append(genome_name)
                 if self.genome_name is None:
                     self.genome_name = (
-                        genome_name  # first one for all tracks - other than paf
+                        genome_name  # first one for all tracks
                     )
                     self.genome_sequence_adapter = assem["sequence"]["adapter"]
                     self.genome_firstcontig = None
@@ -481,11 +479,16 @@
                             else:
                                 self.genome_firstcontig = fl
                     else:
-                        fl = urllib.request.urlopen(fapath + ".fai").readline()
+                        try:
+                            fl = urllib.request.urlopen(fapath + ".fai").readline()
+                        except:
+                            fl = None
                         if fl:  # is first row of the text fai so the first contig name
                             self.genome_firstcontig = (
                                 fl.decode("utf8").strip().split()[0]
                             )
+                        else:
+                            self.genome_firstcontig = None
         if self.config_json.get("assemblies", None):
             self.config_json["assemblies"] += assemblies
         else:
@@ -606,6 +609,8 @@
             gziLocation:
             uri: 'https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/fasta/GRCh38.fa.gz.gzi',
         Cool will not be likely to be a good fit - see discussion at https://github.com/GMOD/jbrowse-components/issues/2438
+
+
         """
         tId = trackData["label"]
         # can be served - if public.
@@ -615,29 +620,25 @@
         if useuri:
             uri = data
         else:
-            uri = trackData["hic_url"]
+            uri = "%s.hic" % trackData["label"]
+            # slashes in names cause path trouble
+            dest = os.path.join(self.outdir, uri)
+            cmd = ["cp", data, dest]
+            self.subprocess_check_call(cmd)
         categ = trackData["category"]
         trackDict = {
             "type": "HicTrack",
             "trackId": tId,
-            "name": uri,
+            "name":  trackData["name"],
             "assemblyNames": [self.genome_name],
             "category": [
                 categ,
             ],
             "adapter": {
                 "type": "HicAdapter",
-                "hicLocation": uri,
-            },
-            "displays": [
-                {
-                    "type": "LinearHicDisplay",
-                    "displayId": "%s-LinearHicDisplay" % tId,
-                },
-            ],
+                "hicLocation": { "uri": uri }
+            }
         }
-        style_json = self._prepare_track_style(trackDict)
-        trackDict["style"] = style_json
         self.tracksToAdd.append(trackDict)
         self.trackIdlist.append(tId)
 
@@ -793,14 +794,6 @@
         os.unlink(gff3)
 
     def add_bigwig(self, data, trackData):
-        """ "type": "LinearWiggleDisplay",
-        "configuration": {},
-        "selectedRendering": "",
-        "resolution": 1,
-        "posColor": "rgb(228, 26, 28)",
-        "negColor": "rgb(255, 255, 51)",
-        "constraints": {}
-        """
         useuri = trackData["useuri"].lower() == "yes"
         if useuri:
             url = data
@@ -1278,26 +1271,23 @@
 
     def add_default_session(self, default_data):
         """
-        Add some default session settings: set some assemblies/tracks on/off
+        default session settings are hard and fragile.
+        .add_default_view() and other configuration code adapted from
+         https://github.com/abretaud/tools-iuc/blob/jbrowse2/tools/jbrowse2/jbrowse2.py
         """
         tracks_data = []
-
         # TODO using the default session for now, but check out session specs in the future https://github.com/GMOD/jbrowse-components/issues/2708
-
-        # We need to know the track type from the config.json generated just before
         track_types = {}
         with open(self.config_json_file, "r") as config_file:
             config_json = json.load(config_file)
         if self.config_json:
             config_json.update(self.config_json)
-
         for track_conf in self.tracksToAdd:
-            track_types[track_conf["trackId"]] = track_conf["type"]
             tId = track_conf["trackId"]
-            #if tId in data["visibility"]["default_on"]:
+            track_types[tId] = track_conf["type"]
             style_data = default_data["style"].get(tId,  None)
             if not style_data:
-                logging.warn("### No style data in default data for %s" % tId)
+                logging.warn("### No style data in default data %s for %s" % (default_data, tId))
                 style_data = {"type": "LinearBasicDisplay"}
             if "displays" in track_conf:
                 disp = track_conf["displays"][0]["type"]
@@ -1315,7 +1305,7 @@
             )
         # The view for the assembly we're adding
         view_json = {"type": "LinearGenomeView", "tracks": tracks_data}
-
+        logging.warn("### view_json=%s" % view_json)
         refName = None
         drdict = {
             "reversed": False,
@@ -1408,8 +1398,10 @@
         with open(config_path, "w") as config_file:
             json.dump(self.config_json, config_file, indent=2)
 
-    def clone_jbrowse(self, realclone=True):
-        """Clone a JBrowse directory into a destination directory. This also works in Biocontainer testing now"""
+    def clone_jbrowse(self, realclone=False):
+        """Clone a JBrowse directory into a destination directory. This also works in Biocontainer testing now
+        Leave as True between version updates on temporary tools - requires manual conda trigger :(
+        """
         dest = self.outdir
         if realclone:
             self.subprocess_check_call(
@@ -1472,7 +1464,6 @@
     )
     jc.process_genomes()
 
-    # .add_default_view() replace from https://github.com/abretaud/tools-iuc/blob/jbrowse2/tools/jbrowse2/jbrowse2.py
     default_session_data = {
         "visibility": {
             "default_on": [],
@@ -1500,6 +1491,7 @@
         if trackfiles:
             for x in track.findall("files/trackFile"):
                 track_conf["label"] = x.attrib["label"]
+                trackkey = track_conf["label"]
                 track_conf["useuri"] = x.attrib["useuri"]
                 if is_multi_bigwig:
                     multi_bigwig_paths.append(
@@ -1544,18 +1536,6 @@
             )
         track_conf["category"] = track.attrib["cat"]
         track_conf["format"] = track.attrib["format"]
-        if track.find("options/style"):
-            track_conf["style"] = {
-                item.tag: parse_style_conf(item) for item in track.find("options/style")
-            }
-        else:
-            track_conf["style"] = {}
-        if track.find("options/style_labels"):
-            track_conf["style_labels"] = {
-                item.tag: parse_style_conf(item)
-                for item in track.find("options/style_labels")
-            }
-
         track_conf["conf"] = etree_to_dict(track.find("options"))
         track_conf["category"] = track.attrib["cat"]
         track_conf["format"] = track.attrib["format"]
@@ -1566,12 +1546,20 @@
                 default_session_data["visibility"][
                     track.attrib.get("visibility", "default_off")
                 ].append(key)
-                if track_conf.get("style", None):
-                    default_session_data["style"][key] = track_conf["style"]
-                if track_conf.get("style_lables", None):
-                    default_session_data["style_labels"][key] = track_conf.get(
-                        "style_labels", None
-                    )
+            if track.find("options/style"):
+                default_session_data["style"][key] = {
+                    item.tag: parse_style_conf(item) for item in track.find("options/style")
+                }
+                logging.warn("### added %s to defsess %s for %s" % (trackkey, default_session_data, key ))
+            else:
+                default_session_data["style"][key] = {}
+                logging.warn("@@@@ no options/style found for %s" % (key))
+
+            if track.find("options/style_labels"):
+                default_session_data["style_labels"][key] = {
+                    item.tag: parse_style_conf(item)
+                    for item in track.find("options/style_labels")
+                }
     default_session_data["defaultLocation"] = root.find(
         "metadata/general/defaultLocation"
     ).text