Skip to content

Instantly share code, notes, and snippets.

@alexpreynolds
Last active February 25, 2021 21:17
Show Gist options
  • Save alexpreynolds/7813fab82849b35d5667e3bcc6019f7d to your computer and use it in GitHub Desktop.
Save alexpreynolds/7813fab82849b35d5667e3bcc6019f7d to your computer and use it in GitHub Desktop.
Pyranges equivalent via subprocess + BEDOPS bedmap
#!/usr/bin/env python
import sys
import subprocess
import json
a = sys.argv[1]
b = sys.argv[2]
class SetEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, set):
return list(obj)
return json.JSONEncoder.default(self, obj)
m = {}
p = subprocess.Popen(['bedmap', '--echo', '--echo-map-id-uniq', '--mean', a, b], stdout=subprocess.PIPE)
for l in iter(p.stdout.readline, b''):
e = l.decode().rstrip().split('\t')
(a_k, a_v) = e[3].split('-')
if a_k not in m:
m[a_k] = {}
if a_v not in m[a_k]:
m[a_k][a_v] = {}
(a_s, b_kvps, ab_mean) = e[4].split('|')
b_kvs = [x.split('-') for x in b_kvps.split(';')]
for b_kv in b_kvs:
if len(b_kv[0]) > 0:
if b_kv[0] not in m[a_k][a_v]:
m[a_k][a_v][b_kv[0]] = { 'average_signal' : ab_mean , 'elements' : set() }
m[a_k][a_v][b_kv[0]]['elements'].add(b_kv[1])
sys.stdout.write(json.dumps(m, cls=SetEncoder, sort_keys=True, indent=2))
@alexpreynolds
Copy link
Author

alexpreynolds commented Feb 25, 2021

$ ./pyranges-mimic.py pr2.bed pr1.bed
{
  "pr2": {
    "1": {
      "pr1": {
        "average_signal": "133.333333",
        "elements": [
          "3",
          "1",
          "2"
        ]
      }
    },
    "2": {
      "pr1": {
        "average_signal": "175.000000",
        "elements": [
          "3",
          "4"
        ]
      }
    },
    "3": {}
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment