changeset 0:04ae2c3f7c77 draft

planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/proteogenomics/translate_bed commit c2ee45c526b705f367e4fe1a00363bbc9df5701d
author galaxyp
date Sun, 14 Jan 2018 13:52:49 -0500
parents
children d615767650a0
files bedutil.py digest.py ensembl_rest.py macros.xml test-data/GRCh38.1.2bit test-data/human_transcripts.bed test-data/human_transcripts_seq.bed translate_bed.py translate_bed.xml
diffstat 9 files changed, 1549 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bedutil.py	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,503 @@
+#!/usr/bin/env python
+"""
+#
+#------------------------------------------------------------------------------
+#                         University of Minnesota
+#         Copyright 2016, Regents of the University of Minnesota
+#------------------------------------------------------------------------------
+# Author:
+#
+#  James E Johnson
+#
+#------------------------------------------------------------------------------
+"""
+
+import sys
+
+from Bio.Seq import reverse_complement, translate
+
+
+def bed_from_line(line, ensembl=False, seq_column=None):
+    fields = line.rstrip('\r\n').split('\t')
+    if len(fields) < 12:
+        return None
+    (chrom, chromStart, chromEnd, name, score, strand,
+     thickStart, thickEnd, itemRgb,
+     blockCount, blockSizes, blockStarts) = fields[0:12]
+    bed_entry = BedEntry(chrom=chrom, chromStart=chromStart, chromEnd=chromEnd,
+                         name=name, score=score, strand=strand,
+                         thickStart=thickStart, thickEnd=thickEnd,
+                         itemRgb=itemRgb,
+                         blockCount=blockCount,
+                         blockSizes=blockSizes.rstrip(','),
+                         blockStarts=blockStarts.rstrip(','))
+    if seq_column is not None and -len(fields) <= seq_column < len(fields):
+        bed_entry.seq = fields[seq_column]
+    if ensembl and len(fields) >= 20:
+        bed_entry.second_name = fields[12]
+        bed_entry.cds_start_status = fields[13]
+        bed_entry.cds_end_status = fields[14]
+        bed_entry.exon_frames = fields[15].rstrip(',')
+        bed_entry.biotype = fields[16]
+        bed_entry.gene_name = fields[17]
+        bed_entry.second_gene_name = fields[18]
+        bed_entry.gene_type = fields[19]
+    return bed_entry
+
+
+class BedEntry(object):
+    def __init__(self, chrom=None, chromStart=None, chromEnd=None,
+                 name=None, score=None, strand=None,
+                 thickStart=None, thickEnd=None, itemRgb=None,
+                 blockCount=None, blockSizes=None, blockStarts=None):
+        self.chrom = chrom
+        self.chromStart = int(chromStart)
+        self.chromEnd = int(chromEnd)
+        self.name = name
+        self.score = int(score) if score is not None else 0
+        self.strand = '-' if str(strand).startswith('-') else '+'
+        self.thickStart = int(thickStart) if thickStart else self.chromStart
+        self.thickEnd = int(thickEnd) if thickEnd else self.chromEnd
+        self.itemRgb = str(itemRgb) if itemRgb is not None else r'100,100,100'
+        self.blockCount = int(blockCount)
+        if isinstance(blockSizes, str) or isinstance(blockSizes, unicode):
+            self.blockSizes = [int(x) for x in blockSizes.split(',')]
+        elif isinstance(blockSizes, list):
+            self.blockSizes = [int(x) for x in blockSizes]
+        else:
+            self.blockSizes = blockSizes
+        if isinstance(blockStarts, str) or isinstance(blockSizes, unicode):
+            self.blockStarts = [int(x) for x in blockStarts.split(',')]
+        elif isinstance(blockStarts, list):
+            self.blockStarts = [int(x) for x in blockStarts]
+        else:
+            self.blockStarts = blockStarts
+        self.second_name = None
+        self.cds_start_status = None
+        self.cds_end_status = None
+        self.exon_frames = None
+        self.biotype = None
+        self.gene_name = None
+        self.second_gene_name = None
+        self.gene_type = None
+        self.seq = None
+        self.cdna = None
+        self.pep = None
+        # T26C
+        self.aa_change = []
+        # p.Trp26Cys g.<pos><ref>><alt> # g.1304573A>G
+        self.variants = []
+
+    def __str__(self):
+        return '%s\t%d\t%d\t%s\t%d\t%s\t%d\t%d\t%s\t%d\t%s\t%s' % (
+            self.chrom, self.chromStart, self.chromEnd,
+            self.name, self.score, self.strand,
+            self.thickStart, self.thickEnd, str(self.itemRgb), self.blockCount,
+            ','.join([str(x) for x in self.blockSizes]),
+            ','.join([str(x) for x in self.blockStarts]))
+
+    def get_splice_junctions(self):
+        splice_juncs = []
+        for i in range(self.blockCount - 1):
+            splice_junc = "%s:%d_%d"\
+                % (self.chrom,
+                   self.chromStart + self.blockSizes[i],
+                   self.chromStart + self.blockStarts[i+1])
+            splice_juncs.append(splice_junc)
+        return splice_juncs
+
+    def get_exon_seqs(self):
+        if not self.seq:
+            return None
+        exons = []
+        for i in range(self.blockCount):
+            exons.append(self.seq[self.blockStarts[i]:self.blockStarts[i]
+                         + self.blockSizes[i]])
+        if self.strand == '-':  # reverse complement
+            exons.reverse()
+            for i, s in enumerate(exons):
+                exons[i] = reverse_complement(s)
+        return exons
+
+    def get_spliced_seq(self, strand=None):
+        if not self.seq:
+            return None
+        seq = ''.join(self.get_exon_seqs())
+        if strand and self.strand != strand:
+            seq = reverse_complement(seq)
+        return seq
+
+    def get_cdna(self):
+        if not self.cdna:
+            self.cdna = self.get_spliced_seq()
+        return self.cdna
+
+    def get_cds(self):
+        cdna = self.get_cdna()
+        if cdna:
+            if self.chromStart == self.thickStart\
+               and self.chromEnd == self.thickEnd:
+                return cdna
+            pos = [self.cdna_offset_of_pos(self.thickStart),
+                   self.cdna_offset_of_pos(self.thickEnd)]
+            if 0 <= min(pos) <= max(pos) <= len(cdna):
+                return cdna[min(pos):max(pos)]
+        return None
+
+    def set_cds(self, cdna_start, cdna_end):
+        cdna_len = sum(self.blockSizes)
+        if 0 <= cdna_start < cdna_end <= cdna_len:
+            cds_pos = [self.pos_of_cdna_offet(cdna_start),
+                       self.pos_of_cdna_offet(cdna_end)]
+            if all(cds_pos):
+                self.thickStart = min(cds_pos)
+                self.thickEnd = max(cds_pos)
+            return self
+        return None
+
+    def trim_cds(self, basepairs):
+        if self.chromStart <= self.thickStart < self.thickEnd <= self.chromEnd:
+            cds_pos = [self.cdna_offset_of_pos(self.thickStart),
+                       self.cdna_offset_of_pos(self.thickEnd)]
+            if basepairs > 0:
+                return self.set_cds(min(cds_pos) + basepairs, max(cds_pos))
+            else:
+                return self.set_cds(min(cds_pos), max(cds_pos) + basepairs)
+        return None
+
+    def get_cigar(self):
+        cigar = ''
+        r = range(self.blockCount)
+        xl = None
+        for x in r:
+            if xl is not None:
+                intronSize = abs(self.blockStarts[x] - self.blockSizes[xl]
+                                 - self.blockStarts[xl])
+                cigar += '%dN' % intronSize
+            cigar += '%dM' % self.blockSizes[x]
+            xl = x
+        return cigar
+
+    def get_cigar_md(self):
+        cigar = ''
+        md = ''
+        r = range(self.blockCount)
+        xl = None
+        for x in r:
+            if xl is not None:
+                intronSize = abs(self.blockStarts[x] - self.blockSizes[xl]
+                                 - self.blockStarts[xl])
+                cigar += '%dN' % intronSize
+            cigar += '%dM' % self.blockSizes[x]
+            xl = x
+        md = '%d' % sum(self.blockSizes)
+        return (cigar, md)
+
+    def get_translation(self, sequence=None):
+        translation = None
+        seq = sequence if sequence else self.get_spliced_seq()
+        if seq:
+            seqlen = len(seq) / 3 * 3
+            if seqlen >= 3:
+                translation = translate(seq[:seqlen])
+        return translation
+
+    def get_translations(self):
+        translations = []
+        seq = self.get_spliced_seq()
+        if seq:
+            for i in range(3):
+                translation = self.get_translation(sequence=seq[i:])
+                if translation:
+                    translations.append(translation)
+        return translations
+
+    def pos_of_cdna_offet(self, offset):
+        if offset is not None and 0 <= offset < sum(self.blockSizes):
+            r = range(self.blockCount)
+            rev = self.strand == '-'
+            if rev:
+                r.reverse()
+            nlen = 0
+            for x in r:
+                if offset < nlen + self.blockSizes[x]:
+                    if rev:
+                        return self.chromStart + self.blockStarts[x]\
+                               + self.blockSizes[x] - (offset - nlen)
+                    else:
+                        return self.chromStart + self.blockStarts[x]\
+                               + (offset - nlen)
+                nlen += self.blockSizes[x]
+        return None
+
+    def cdna_offset_of_pos(self, pos):
+        if not self.chromStart <= pos < self.chromEnd:
+            return -1
+        r = range(self.blockCount)
+        rev = self.strand == '-'
+        if rev:
+            r.reverse()
+        nlen = 0
+        for x in r:
+            bStart = self.chromStart + self.blockStarts[x]
+            bEnd = bStart + self.blockSizes[x]
+            if bStart <= pos < bEnd:
+                return nlen + (bEnd - pos if rev else pos - bStart)
+            nlen += self.blockSizes[x]
+
+    def apply_variant(self, pos, ref, alt):
+        pos = int(pos)
+        if not ref or not alt:
+            print >> sys.stderr, "variant requires ref and alt sequences"
+            return
+        if not self.chromStart <= pos <= self.chromEnd:
+            print >> sys.stderr, "variant not in entry %s: %s %d < %d < %d"\
+                % (self.name, self.strand, self.chromStart, pos, self.chromEnd)
+            print >> sys.stderr, "%s" % str(self)
+            return
+        if len(ref) != len(alt):
+            print >> sys.stderr, "variant only works for snp: %s  %s"\
+                % (ref, alt)
+            return
+        if not self.seq:
+            print >> sys.stderr, "variant entry %s has no seq" % self.name
+            return
+        """
+        if self.strand  == '-':
+            ref = reverse_complement(ref)
+            alt = reverse_complement(alt)
+        """
+        bases = list(self.seq)
+        offset = pos - self.chromStart
+        for i in range(len(ref)):
+            # offset = self.cdna_offset_of_pos(pos+i)
+            if offset is not None:
+                bases[offset+i] = alt[i]
+            else:
+                print >> sys.stderr,\
+                    "variant offset %s: %s %d < %d < %d"\
+                    % (self.name, self.strand, self.chromStart,
+                       pos+1, self.chromEnd)
+                print >> sys.stderr, "%s" % str(self)
+        self.seq = ''.join(bases)
+        self.variants.append("g.%d%s>%s" % (pos+1, ref, alt))
+
+    def get_variant_bed(self, pos, ref, alt):
+        pos = int(pos)
+        if not ref or not alt:
+            print >> sys.stderr, "variant requires ref and alt sequences"
+            return None
+        if not self.chromStart <= pos <= self.chromEnd:
+            print >> sys.stderr,\
+                "variant not in entry %s: %s %d < %d < %d"\
+                % (self.name, self.strand, self.chromStart, pos, self.chromEnd)
+            print >> sys.stderr, "%s" % str(self)
+            return None
+        if not self.seq:
+            print >> sys.stderr, "variant entry %s has no seq" % self.name
+            return None
+        tbed = BedEntry(chrom=self.chrom,
+                        chromStart=self.chromStart, chromEnd=self.chromEnd,
+                        name=self.name, score=self.score, strand=self.strand,
+                        thickStart=self.chromStart, thickEnd=self.chromEnd,
+                        itemRgb=self.itemRgb,
+                        blockCount=self.blockCount,
+                        blockSizes=self.blockSizes,
+                        blockStarts=self.blockStarts)
+        bases = list(self.seq)
+        offset = pos - self.chromStart
+        tbed.seq = ''.join(bases[:offset] + list(alt)
+                           + bases[offset+len(ref):])
+        if len(ref) != len(alt):
+            diff = len(alt) - len(ref)
+            rEnd = pos + len(ref)
+            # need to adjust blocks
+            #  change spans blocks,
+            for x in range(tbed.blockCount):
+                bStart = tbed.chromStart + tbed.blockStarts[x]
+                bEnd = bStart + tbed.blockSizes[x]
+                # change within a block or extends (last block)
+                #  adjust blocksize
+                #  seq:            GGGcatGGG
+                #  ref c alt tag:  GGGtagatGGG
+                #  ref cat alt a:  GGGaGGG
+                if bStart <= pos < rEnd < bEnd:
+                    tbed.blockSizes[x] += diff
+        return tbed
+
+    # (start, end)
+    def get_subrange(self, tstart, tstop, debug=False):
+        chromStart = self.chromStart
+        chromEnd = self.chromEnd
+        if debug:
+            print >> sys.stderr, "%s" % (str(self))
+        r = range(self.blockCount)
+        if self.strand == '-':
+            r.reverse()
+        bStart = 0
+        bEnd = 0
+        for x in r:
+            bEnd = bStart + self.blockSizes[x]
+            if bStart <= tstart < bEnd:
+                if self.strand == '+':
+                    chromStart = self.chromStart + self.blockStarts[x] +\
+                        (tstart - bStart)
+                else:
+                    chromEnd = self.chromStart + self.blockStarts[x] +\
+                        self.blockSizes[x] - (tstart - bStart)
+            if bStart <= tstop < bEnd:
+                if self.strand == '+':
+                    chromEnd = self.chromStart + self.blockStarts[x] +\
+                        (tstop - bStart)
+                else:
+                    chromStart = self.chromStart + self.blockStarts[x] +\
+                        self.blockSizes[x] - (tstop - bStart)
+            if debug:
+                print >> sys.stderr,\
+                    "%3d %s\t%d\t%d\t%d\t%d\t%d\t%d"\
+                    % (x, self.strand, bStart, bEnd,
+                       tstart, tstop, chromStart, chromEnd)
+            bStart += self.blockSizes[x]
+        return(chromStart, chromEnd)
+
+    # get the blocks for sub range
+    def get_blocks(self, chromStart, chromEnd):
+        tblockCount = 0
+        tblockSizes = []
+        tblockStarts = []
+        for x in range(self.blockCount):
+            bStart = self.chromStart + self.blockStarts[x]
+            bEnd = bStart + self.blockSizes[x]
+            if bStart > chromEnd:
+                break
+            if bEnd < chromStart:
+                continue
+            cStart = max(chromStart, bStart)
+            tblockStarts.append(cStart - chromStart)
+            tblockSizes.append(min(chromEnd, bEnd) - cStart)
+            tblockCount += 1
+        return (tblockCount, tblockSizes, tblockStarts)
+
+    def trim(self, tstart, tstop, debug=False):
+        (tchromStart, tchromEnd) =\
+            self.get_subrange(tstart, tstop, debug=debug)
+        (tblockCount, tblockSizes, tblockStarts) =\
+            self.get_blocks(tchromStart, tchromEnd)
+        tbed = BedEntry(
+            chrom=self.chrom, chromStart=tchromStart, chromEnd=tchromEnd,
+            name=self.name, score=self.score, strand=self.strand,
+            thickStart=tchromStart, thickEnd=tchromEnd, itemRgb=self.itemRgb,
+            blockCount=tblockCount,
+            blockSizes=tblockSizes, blockStarts=tblockStarts)
+        if self.seq:
+            ts = tchromStart-self.chromStart
+            te = tchromEnd - tchromStart + ts
+            tbed.seq = self.seq[ts:te]
+        return tbed
+
+    def get_filtered_translations(self, untrimmed=False, filtering=True,
+                                  ignore_left_bp=0, ignore_right_bp=0,
+                                  debug=False):
+        translations = [None, None, None]
+        seq = self.get_spliced_seq()
+        ignore = (ignore_left_bp if self.strand == '+'
+                  else ignore_right_bp) / 3
+        block_sum = sum(self.blockSizes)
+        exon_sizes = [x for x in self.blockSizes]
+        if self.strand == '-':
+            exon_sizes.reverse()
+        splice_sites = [sum(exon_sizes[:x]) / 3
+                        for x in range(1, len(exon_sizes))]
+        if debug:
+            print >> sys.stderr, "splice_sites: %s" % splice_sites
+        junc = splice_sites[0] if len(splice_sites) > 0 else exon_sizes[0]
+        if seq:
+            for i in range(3):
+                translation = self.get_translation(sequence=seq[i:])
+                if translation:
+                    tstart = 0
+                    tstop = len(translation)
+                    offset = (block_sum - i) % 3
+                    if debug:
+                        print >> sys.stderr,\
+                            "frame: %d\ttstart: %d  tstop: %d  offset: %d\t%s"\
+                            % (i, tstart, tstop, offset, translation)
+                    if not untrimmed:
+                        tstart = translation.rfind('*', 0, junc) + 1
+                        stop = translation.find('*', junc)
+                        tstop = stop if stop >= 0 else len(translation)
+                    offset = (block_sum - i) % 3
+                    trimmed = translation[tstart:tstop]
+                    if debug:
+                        print >> sys.stderr,\
+                            "frame: %d\ttstart: %d  tstop: %d  offset: %d\t%s"\
+                            % (i, tstart, tstop, offset, trimmed)
+                    if filtering and tstart > ignore:
+                        continue
+                    # get genomic locations for start and end
+                    if self.strand == '+':
+                        chromStart = self.chromStart + i + (tstart * 3)
+                        chromEnd = self.chromEnd - offset\
+                            - (len(translation) - tstop) * 3
+                    else:
+                        chromStart = self.chromStart + offset\
+                            + (len(translation) - tstop) * 3
+                        chromEnd = self.chromEnd - i - (tstart * 3)
+                    # get the blocks for this translation
+                    (tblockCount, tblockSizes, tblockStarts) =\
+                        self.get_blocks(chromStart, chromEnd)
+                    translations[i] = (chromStart, chromEnd, trimmed,
+                                       tblockCount, tblockSizes, tblockStarts)
+                    if debug:
+                        print >> sys.stderr,\
+                            "tblockCount: %d tblockStarts: %s tblockSizes: %s"\
+                            % (tblockCount, tblockStarts, tblockSizes)
+        return translations
+
+    def get_seq_id(self, seqtype='unk:unk', reference='', frame=None):
+        # Ensembl fasta ID format
+        # >ID SEQTYPE:STATUS LOCATION GENE TRANSCRIPT
+        # >ENSP00000328693 pep:splice chromosome:NCBI35:1:904515:910768:1\
+        #   gene:ENSG00000158815:transcript:ENST00000328693\
+        #    gene_biotype:protein_coding transcript_biotype:protein_coding
+        frame_name = ''
+        chromStart = self.chromStart
+        chromEnd = self.chromEnd
+        strand = 1 if self.strand == '+' else -1
+        if frame is not None:
+            block_sum = sum(self.blockSizes)
+            offset = (block_sum - frame) % 3
+            frame_name = '_' + str(frame + 1)
+            if self.strand == '+':
+                chromStart += frame
+                chromEnd -= offset
+            else:
+                chromStart += offset
+                chromEnd -= frame
+        location = "chromosome:%s:%s:%s:%s:%s"\
+            % (reference, self.chrom, chromStart, chromEnd, strand)
+        seq_id = "%s%s %s %s" % (self.name, frame_name, seqtype, location)
+        return seq_id
+
+    def get_line(self, start_offset=0, end_offset=0):
+        if start_offset or end_offset:
+            s_offset = start_offset if start_offset else 0
+            e_offset = end_offset if end_offset else 0
+            if s_offset > self.chromStart:
+                s_offset = self.chromStart
+            chrStart = self.chromStart - s_offset
+            chrEnd = self.chromEnd + e_offset
+            blkSizes = self.blockSizes
+            blkSizes[0] += s_offset
+            blkSizes[-1] += e_offset
+            blkStarts = self.blockStarts
+            for i in range(1, self.blockCount):
+                blkStarts[i] += s_offset
+            items = [str(x) for x in [self.chrom, chrStart, chrEnd, self.name,
+                                      self.score, self.strand, self.thickStart,
+                                      self.thickEnd, self.itemRgb,
+                                      self.blockCount,
+                                      ','.join([str(x) for x in blkSizes]),
+                                      ','.join([str(x) for x in blkStarts])]]
+            return '\t'.join(items) + '\n'
+        return self.line
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/digest.py	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,162 @@
+#   Copyright 2012 Anton Goloborodko, Lev Levitsky
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+import itertools as it
+import re
+from collections import deque
+
+
+def cleave(sequence, rule, missed_cleavages=0, min_length=None):
+    """Cleaves a polypeptide sequence using a given rule.
+
+    Parameters
+    ----------
+    sequence : str
+        The sequence of a polypeptide.
+
+        .. note::
+            The sequence is expected to be in one-letter uppercase notation.
+            Otherwise, some of the cleavage rules in :py:data:`expasy_rules`
+            will not work as expected.
+
+    rule : str or compiled regex
+        A regular expression describing the site of cleavage. It is recommended
+        to design the regex so that it matches only the residue whose
+        C-terminal bond is to be cleaved. All additional requirements should be
+        specified using `lookaround assertions
+        <http://www.regular-expressions.info/lookaround.html>`_.
+        :py:data:`expasy_rules` contains cleavage rules
+        for popular cleavage agents.
+    missed_cleavages : int, optional
+        Maximum number of allowed missed cleavages. Defaults to 0.
+    min_length : int or None, optional
+        Minimum peptide length. Defaults to :py:const:`None`.
+
+        ..note ::
+            This checks for string length, which is only correct for one-letter
+            notation and not for full *modX*. Use :py:func:`length` manually if
+            you know what you are doing and apply :py:func:`cleave` to *modX*
+            sequences.
+
+    Returns
+    -------
+    out : set
+        A set of unique (!) peptides.
+
+    Examples
+    --------
+    >>> cleave('AKAKBK', expasy_rules['trypsin'], 0) == {'AK', 'BK'}
+    True
+    >>> cleave('GKGKYKCK', expasy_rules['trypsin'], 2) == \
+    {'CK', 'GKYK', 'YKCK', 'GKGK', 'GKYKCK', 'GK', 'GKGKYK', 'YK'}
+    True
+
+    """
+    return set(_cleave(sequence, rule, missed_cleavages, min_length))
+
+
+def _cleave(sequence, rule, missed_cleavages=0, min_length=None):
+    """Like :py:func:`cleave`, but the result is a list. Refer to
+    :py:func:`cleave` for explanation of parameters.
+    """
+    peptides = []
+    ml = missed_cleavages+2
+    trange = range(ml)
+    cleavage_sites = deque([0], maxlen=ml)
+    cl = 1
+    for i in it.chain([x.end() for x in re.finditer(rule, sequence)],
+                      [None]):
+        cleavage_sites.append(i)
+        if cl < ml:
+            cl += 1
+        for j in trange[:cl-1]:
+            seq = sequence[cleavage_sites[j]:cleavage_sites[-1]]
+            if seq:
+                if min_length is None or len(seq) >= min_length:
+                    peptides.append(seq)
+    return peptides
+
+
+def num_sites(sequence, rule, **kwargs):
+    """Count the number of sites where `sequence` can be cleaved using
+    the given `rule` (e.g. number of miscleavages for a peptide).
+
+    Parameters
+    ----------
+    sequence : str
+        The sequence of a polypeptide.
+    rule : str or compiled regex
+        A regular expression describing the site of cleavage. It is recommended
+        to design the regex so that it matches only the residue whose
+        C-terminal bond is to be cleaved. All additional requirements should be
+        specified using `lookaround assertions
+        <http://www.regular-expressions.info/lookaround.html>`_.
+    labels : list, optional
+        A list of allowed labels for amino acids and terminal modifications.
+
+    Returns
+    -------
+    out : int
+        Number of cleavage sites.
+    """
+    return len(_cleave(sequence, rule, **kwargs)) - 1
+
+
+expasy_rules = {
+    'arg-c':         r'R',
+    'asp-n':         r'\w(?=D)',
+    'bnps-skatole': r'W',
+    'caspase 1':     r'(?<=[FWYL]\w[HAT])D(?=[^PEDQKR])',
+    'caspase 2':     r'(?<=DVA)D(?=[^PEDQKR])',
+    'caspase 3':     r'(?<=DMQ)D(?=[^PEDQKR])',
+    'caspase 4':     r'(?<=LEV)D(?=[^PEDQKR])',
+    'caspase 5':     r'(?<=[LW]EH)D',
+    'caspase 6':     r'(?<=VE[HI])D(?=[^PEDQKR])',
+    'caspase 7':     r'(?<=DEV)D(?=[^PEDQKR])',
+    'caspase 8':     r'(?<=[IL]ET)D(?=[^PEDQKR])',
+    'caspase 9':     r'(?<=LEH)D',
+    'caspase 10':    r'(?<=IEA)D',
+    'chymotrypsin high specificity': r'([FY](?=[^P]))|(W(?=[^MP]))',
+    'chymotrypsin low specificity':
+        r'([FLY](?=[^P]))|(W(?=[^MP]))|(M(?=[^PY]))|(H(?=[^DMPW]))',
+    'clostripain':   r'R',
+    'cnbr':          r'M',
+    'enterokinase':  r'(?<=[DE]{3})K',
+    'factor xa':     r'(?<=[AFGILTVM][DE]G)R',
+    'formic acid':   r'D',
+    'glutamyl endopeptidase': r'E',
+    'granzyme b':    r'(?<=IEP)D',
+    'hydroxylamine': r'N(?=G)',
+    'iodosobenzoic acid': r'W',
+    'lysc':          r'K',
+    'ntcb':          r'\w(?=C)',
+    'pepsin ph1.3':  r'((?<=[^HKR][^P])[^R](?=[FLWY][^P]))|'
+                     r'((?<=[^HKR][^P])[FLWY](?=\w[^P]))',
+    'pepsin ph2.0':  r'((?<=[^HKR][^P])[^R](?=[FL][^P]))|'
+                     r'((?<=[^HKR][^P])[FL](?=\w[^P]))',
+    'proline endopeptidase': r'(?<=[HKR])P(?=[^P])',
+    'proteinase k':  r'[AEFILTVWY]',
+    'staphylococcal peptidase i': r'(?<=[^E])E',
+    'thermolysin':   r'[^DE](?=[AFILMV])',
+    'thrombin':      r'((?<=G)R(?=G))|'
+                     r'((?<=[AFGILTVM][AFGILTVWA]P)R(?=[^DE][^DE]))',
+    'trypsin':       r'([KR](?=[^P]))|((?<=W)K(?=P))|((?<=M)R(?=P))'
+    }
+"""
+This dict contains regular expressions for cleavage rules of the most
+popular proteolytic enzymes. The rules were taken from the
+`PeptideCutter tool
+<http://ca.expasy.org/tools/peptidecutter/peptidecutter_enzymes.html>`_
+at Expasy.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ensembl_rest.py	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+"""
+#
+#------------------------------------------------------------------------------
+#                         University of Minnesota
+#         Copyright 2017, Regents of the University of Minnesota
+#------------------------------------------------------------------------------
+# Author:
+#
+#  James E Johnson
+#
+#------------------------------------------------------------------------------
+"""
+
+
+import sys
+
+from time import sleep
+
+import requests
+
+
+server = "https://rest.ensembl.org"
+ext = "/info/assembly/homo_sapiens?"
+max_region = 4000000
+debug = False
+
+
+def ensembl_rest(ext, headers):
+    if debug:
+        print >> sys.stderr, "%s" % ext
+    r = requests.get(server+ext, headers=headers)
+    if r.status_code == 429:
+        print >> sys.stderr, "response headers: %s\n" % r.headers
+        if 'Retry-After' in r.headers:
+            sleep(r.headers['Retry-After'])
+            r = requests.get(server+ext, headers=headers)
+    if not r.ok:
+        r.raise_for_status()
+    return r
+
+
+def get_species():
+    results = dict()
+    ext = "/info/species"
+    req_header = {"Content-Type": "application/json"}
+    r = ensembl_rest(ext, req_header)
+    for species in r.json()['species']:
+        results[species['name']] = species
+        print >> sys.stdout,\
+            "%s\t%s\t%s\t%s\t%s"\
+            % (species['name'], species['common_name'],
+               species['display_name'],
+               species['strain'],
+               species['taxon_id'])
+    return results
+
+
+def get_biotypes(species):
+    biotypes = []
+    ext = "/info/biotypes/%s?" % species
+    req_header = {"Content-Type": "application/json"}
+    r = ensembl_rest(ext, req_header)
+    for entry in r.json():
+        if 'biotype' in entry:
+            biotypes.append(entry['biotype'])
+    return biotypes
+
+
+def get_toplevel(species):
+    coord_systems = dict()
+    ext = "/info/assembly/%s?" % species
+    req_header = {"Content-Type": "application/json"}
+    r = ensembl_rest(ext, req_header)
+    toplevel = r.json()
+    for seq in toplevel['top_level_region']:
+        if seq['coord_system'] not in coord_systems:
+            coord_systems[seq['coord_system']] = dict()
+        coord_system = coord_systems[seq['coord_system']]
+        coord_system[seq['name']] = int(seq['length'])
+    return coord_systems
+
+
+def get_transcripts_bed(species, refseq, start, length, strand='',
+                        params=None):
+    bed = []
+    param = params if params else ''
+    req_header = {"Content-Type": "text/x-bed"}
+    regions = range(start, length, max_region)
+    if not regions or regions[-1] < length:
+        regions.append(length)
+    for end in regions[1:]:
+        ext = "/overlap/region/%s/%s:%d-%d%s?feature=transcript;%s"\
+            % (species, refseq, start, end, strand, param)
+        start = end + 1
+        r = ensembl_rest(ext, req_header)
+        if r.text:
+            bed += r.text.splitlines()
+    return bed
+
+
+def get_seq(id, seqtype, params=None):
+    param = params if params else ''
+    ext = "/sequence/id/%s?type=%s;%s" % (id, seqtype, param)
+    req_header = {"Content-Type": "text/plain"}
+    r = ensembl_rest(ext, req_header)
+    return r.text
+
+
+def get_cdna(id, params=None):
+    return get_seq(id, 'cdna', params=params)
+
+
+def get_cds(id, params=None):
+    return get_seq(id, 'cds', params=params)
+
+
+def get_genomic(id, params=None):
+    return get_seq(id, 'genomic', params=params)
+
+
+def get_transcript_haplotypes(species, transcript):
+    ext = "/transcript_haplotypes/%s/%s?aligned_sequences=1"\
+        % (species, transcript)
+    req_header = {"Content-Type": "application/json"}
+    r = ensembl_rest(ext, req_header)
+    decoded = r.json()
+    return decoded
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,125 @@
+<macros>
+    <xml name="bedutil_requirements">
+        <requirement type="package" version="1.62">biopython</requirement>
+    </xml>
+    <xml name="ensembl_requirements">
+        <requirement type="package" version="0.4.10">requests-cache</requirement>
+    </xml>
+    <xml name="twobit_requirements">
+        <requirement type="package" version="3.1.4">twobitreader</requirement>
+    </xml>
+    <xml name="species_options">
+            <option value="homo_sapiens">homo_sapiens  (Human) taxon_id: 9606</option>
+            <option value="mus_musculus">mus_musculus  (Mouse) taxon_id: 10090</option>
+            <option value="ailuropoda_melanoleuca">ailuropoda_melanoleuca  (Panda) taxon_id: 9646</option>
+            <option value="anas_platyrhynchos">anas_platyrhynchos  (Duck) taxon_id: 8839</option>
+            <option value="anolis_carolinensis">anolis_carolinensis  (Anole lizard) taxon_id: 28377</option>
+            <option value="astyanax_mexicanus">astyanax_mexicanus  (Cave fish) taxon_id: 7994</option>
+            <option value="bos_taurus">bos_taurus  (Cow) taxon_id: 9913</option>
+            <option value="caenorhabditis_elegans">caenorhabditis_elegans  (Caenorhabditis elegans) taxon_id: 6239</option>
+            <option value="callithrix_jacchus">callithrix_jacchus  (Marmoset) taxon_id: 9483</option>
+            <option value="canis_familiaris">canis_familiaris  (Dog) taxon_id: 9615</option>
+            <option value="carlito_syrichta">carlito_syrichta  (Tarsier) taxon_id: 1868482</option>
+            <option value="cavia_aperea">cavia_aperea  (Brazilian guinea pig) taxon_id: 37548</option>
+            <option value="cavia_porcellus">cavia_porcellus  (Guinea Pig) taxon_id: 10141</option>
+            <option value="chinchilla_lanigera">chinchilla_lanigera  (Long-tailed chinchilla) taxon_id: 34839</option>
+            <option value="chlorocebus_sabaeus">chlorocebus_sabaeus  (Vervet-AGM) taxon_id: 60711</option>
+            <option value="choloepus_hoffmanni">choloepus_hoffmanni  (Sloth) taxon_id: 9358</option>
+            <option value="ciona_intestinalis">ciona_intestinalis  (C.intestinalis) taxon_id: 7719</option>
+            <option value="ciona_savignyi">ciona_savignyi  (C.savignyi) taxon_id: 51511</option>
+            <option value="cricetulus_griseus_chok1gshd">cricetulus_griseus_chok1gshd  (Chinese hamster CHOK1GS) taxon_id: 10029</option>
+            <option value="cricetulus_griseus_crigri">cricetulus_griseus_crigri  (Chinese hamster CriGri) taxon_id: 10029</option>
+            <option value="danio_rerio">danio_rerio  (Zebrafish) taxon_id: 7955</option>
+            <option value="dasypus_novemcinctus">dasypus_novemcinctus  (Armadillo) taxon_id: 9361</option>
+            <option value="dipodomys_ordii">dipodomys_ordii  (Kangaroo rat) taxon_id: 10020</option>
+            <option value="drosophila_melanogaster">drosophila_melanogaster  (Fruitfly) taxon_id: 7227</option>
+            <option value="echinops_telfairi">echinops_telfairi  (Lesser hedgehog tenrec) taxon_id: 9371</option>
+            <option value="equus_caballus">equus_caballus  (Horse) taxon_id: 9796</option>
+            <option value="erinaceus_europaeus">erinaceus_europaeus  (Hedgehog) taxon_id: 9365</option>
+            <option value="felis_catus">felis_catus  (Cat) taxon_id: 9685</option>
+            <option value="ficedula_albicollis">ficedula_albicollis  (Flycatcher) taxon_id: 59894</option>
+            <option value="fukomys_damarensis">fukomys_damarensis  (Damara mole rat) taxon_id: 885580</option>
+            <option value="gadus_morhua">gadus_morhua  (Cod) taxon_id: 8049</option>
+            <option value="gallus_gallus">gallus_gallus  (Chicken) taxon_id: 9031</option>
+            <option value="gasterosteus_aculeatus">gasterosteus_aculeatus  (Stickleback) taxon_id: 69293</option>
+            <option value="gorilla_gorilla">gorilla_gorilla  (Gorilla) taxon_id: 9595</option>
+            <option value="heterocephalus_glaber_female">heterocephalus_glaber_female  (Naked mole-rat female) taxon_id: 10181</option>
+            <option value="heterocephalus_glaber_male">heterocephalus_glaber_male  (Naked mole-rat male) taxon_id: 10181</option>
+            <option value="ictidomys_tridecemlineatus">ictidomys_tridecemlineatus  (Squirrel) taxon_id: 43179</option>
+            <option value="jaculus_jaculus">jaculus_jaculus  (Lesser Egyptian jerboa) taxon_id: 51337</option>
+            <option value="latimeria_chalumnae">latimeria_chalumnae  (Coelacanth) taxon_id: 7897</option>
+            <option value="lepisosteus_oculatus">lepisosteus_oculatus  (Spotted gar) taxon_id: 7918</option>
+            <option value="loxodonta_africana">loxodonta_africana  (Elephant) taxon_id: 9785</option>
+            <option value="macaca_mulatta">macaca_mulatta  (Macaque) taxon_id: 9544</option>
+            <option value="meleagris_gallopavo">meleagris_gallopavo  (Turkey) taxon_id: 9103</option>
+            <option value="mesocricetus_auratus">mesocricetus_auratus  (Golden Hamster) taxon_id: 10036</option>
+            <option value="microcebus_murinus">microcebus_murinus  (Mouse Lemur) taxon_id: 30608</option>
+            <option value="microtus_ochrogaster">microtus_ochrogaster  (Prairie vole) taxon_id: 79684</option>
+            <option value="monodelphis_domestica">monodelphis_domestica  (Opossum) taxon_id: 13616</option>
+            <option value="mus_caroli">mus_caroli  (Ryukyu mouse) taxon_id: 10089</option>
+            <option value="mus_musculus_129s1svimj">mus_musculus_129s1svimj  (Mouse 129S1/SvImJ) taxon_id: 10090</option>
+            <option value="mus_musculus_aj">mus_musculus_aj  (Mouse A/J) taxon_id: 10090</option>
+            <option value="mus_musculus_akrj">mus_musculus_akrj  (Mouse AKR/J) taxon_id: 10090</option>
+            <option value="mus_musculus_balbcj">mus_musculus_balbcj  (Mouse BALB/cJ) taxon_id: 10090</option>
+            <option value="mus_musculus_c3hhej">mus_musculus_c3hhej  (Mouse C3H/HeJ) taxon_id: 10090</option>
+            <option value="mus_musculus_c57bl6nj">mus_musculus_c57bl6nj  (Mouse C57BL/6NJ) taxon_id: 10090</option>
+            <option value="mus_musculus_casteij">mus_musculus_casteij  (Mouse CAST/EiJ) taxon_id: 10091</option>
+            <option value="mus_musculus_cbaj">mus_musculus_cbaj  (Mouse CBA/J) taxon_id: 10090</option>
+            <option value="mus_musculus_dba2j">mus_musculus_dba2j  (Mouse DBA/2J) taxon_id: 10090</option>
+            <option value="mus_musculus_fvbnj">mus_musculus_fvbnj  (Mouse FVB/NJ) taxon_id: 10090</option>
+            <option value="mus_musculus_lpj">mus_musculus_lpj  (Mouse LP/J) taxon_id: 10090</option>
+            <option value="mus_musculus_nodshiltj">mus_musculus_nodshiltj  (Mouse NOD/ShiLtJ) taxon_id: 10090</option>
+            <option value="mus_musculus_nzohlltj">mus_musculus_nzohlltj  (Mouse NZO/HlLtJ) taxon_id: 10090</option>
+            <option value="mus_musculus_pwkphj">mus_musculus_pwkphj  (Mouse PWK/PhJ) taxon_id: 39442</option>
+            <option value="mus_musculus_wsbeij">mus_musculus_wsbeij  (Mouse WSB/EiJ) taxon_id: 10092</option>
+            <option value="mus_pahari">mus_pahari  (Shrew mouse) taxon_id: 10093</option>
+            <option value="mus_spretus_spreteij">mus_spretus_spreteij  (Algerian mouse) taxon_id: 10096</option>
+            <option value="mustela_putorius_furo">mustela_putorius_furo  (Ferret) taxon_id: 9669</option>
+            <option value="myotis_lucifugus">myotis_lucifugus  (Microbat) taxon_id: 59463</option>
+            <option value="nannospalax_galili">nannospalax_galili  (Upper Galilee mountains blind mole rat) taxon_id: 1026970</option>
+            <option value="nomascus_leucogenys">nomascus_leucogenys  (Gibbon) taxon_id: 61853</option>
+            <option value="notamacropus_eugenii">notamacropus_eugenii  (Wallaby) taxon_id: 9315</option>
+            <option value="ochotona_princeps">ochotona_princeps  (Pika) taxon_id: 9978</option>
+            <option value="octodon_degus">octodon_degus  (Degu) taxon_id: 10160</option>
+            <option value="oreochromis_niloticus">oreochromis_niloticus  (Tilapia) taxon_id: 8128</option>
+            <option value="ornithorhynchus_anatinus">ornithorhynchus_anatinus  (Platypus) taxon_id: 9258</option>
+            <option value="oryctolagus_cuniculus">oryctolagus_cuniculus  (Rabbit) taxon_id: 9986</option>
+            <option value="oryzias_latipes">oryzias_latipes  (Medaka) taxon_id: 8090</option>
+            <option value="otolemur_garnettii">otolemur_garnettii  (Bushbaby) taxon_id: 30611</option>
+            <option value="ovis_aries">ovis_aries  (Sheep) taxon_id: 9940</option>
+            <option value="pan_troglodytes">pan_troglodytes  (Chimpanzee) taxon_id: 9598</option>
+            <option value="papio_anubis">papio_anubis  (Olive baboon) taxon_id: 9555</option>
+            <option value="pelodiscus_sinensis">pelodiscus_sinensis  (Chinese softshell turtle) taxon_id: 13735</option>
+            <option value="peromyscus_maniculatus_bairdii">peromyscus_maniculatus_bairdii  (Northern American deer mouse) taxon_id: 230844</option>
+            <option value="petromyzon_marinus">petromyzon_marinus  (Lamprey) taxon_id: 7757</option>
+            <option value="poecilia_formosa">poecilia_formosa  (Amazon molly) taxon_id: 48698</option>
+            <option value="pongo_abelii">pongo_abelii  (Orangutan) taxon_id: 9601</option>
+            <option value="procavia_capensis">procavia_capensis  (Hyrax) taxon_id: 9813</option>
+            <option value="pteropus_vampyrus">pteropus_vampyrus  (Megabat) taxon_id: 132908</option>
+            <option value="rattus_norvegicus">rattus_norvegicus  (Rat) taxon_id: 10116</option>
+            <option value="saccharomyces_cerevisiae">saccharomyces_cerevisiae  (Saccharomyces cerevisiae) taxon_id: 4932</option>
+            <option value="sarcophilus_harrisii">sarcophilus_harrisii  (Tasmanian devil) taxon_id: 9305</option>
+            <option value="sorex_araneus">sorex_araneus  (Shrew) taxon_id: 42254</option>
+            <option value="sus_scrofa">sus_scrofa  (Pig) taxon_id: 9823</option>
+            <option value="taeniopygia_guttata">taeniopygia_guttata  (Zebra Finch) taxon_id: 59729</option>
+            <option value="takifugu_rubripes">takifugu_rubripes  (Fugu) taxon_id: 31033</option>
+            <option value="tetraodon_nigroviridis">tetraodon_nigroviridis  (Tetraodon) taxon_id: 99883</option>
+            <option value="tupaia_belangeri">tupaia_belangeri  (Tree Shrew) taxon_id: 37347</option>
+            <option value="tursiops_truncatus">tursiops_truncatus  (Dolphin) taxon_id: 9739</option>
+            <option value="vicugna_pacos">vicugna_pacos  (Alpaca) taxon_id: 30538</option>
+            <option value="xenopus_tropicalis">xenopus_tropicalis  (Xenopus) taxon_id: 8364</option>
+            <option value="xiphophorus_maculatus">xiphophorus_maculatus  (Platyfish) taxon_id: 8083</option>
+    </xml>
+    <xml name="biotypes_help">
+            <help><![CDATA[
+Example biotypes: 
+protein_coding, non_coding, pseudogene, nonsense_mediated_decay, non_stop_decay, 
+translated_processed_pseudogene, transcribed_processed_pseudogene, transcribed_unitary_pseudogene, transcribed_unprocessed_pseudogene, 
+polymorphic_pseudogene, processed_pseudogene, unprocessed_pseudogene, unitary_pseudogene, processed_transcript, 
+retained_intron, ccds_gene, sense_overlapping, sense_intronic, cdna_update, antisense, 
+LRG_gene, IG_C_gene, IG_D_gene, IG_J_gene, IG_LV_gene IG_V_gene, TR_C_gene, TR_D_gene, TR_J_gene, TR_V_gene, 
+IG_pseudogene, IG_C_pseudogene, IG_D_pseudogene, IG_J_pseudogene, IG_V_pseudogene, TR_J_pseudogene, TR_V_pseudogene, TEC, 
+ribozyme, RNase_P_RNA, guide_RNA, macro_lncRNA, bidirectional_promoter_lncRNA, 3prime_overlapping_ncRNA, antisense_RNA, vaultRNA, Y_RNA, SRP_RNA, RNase_MRP_RNA, IG_C_pseudogene, lncRNA, lincRNA, miRNA, snRNA, sRNA, telomerase_RNA, Mt_tRNA, Mt_rRNA, scaRNA, misc_RNA, rRNA, tRNA, scRNA, snoRNA, other
+            ]]></help>
+    </xml>
+</macros>
Binary file test-data/GRCh38.1.2bit has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/human_transcripts.bed	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,19 @@
+chr1	14403	29570	ENST00000488147	1000	-	14402	14402	0,0,0	11	98,34,152,159,198,136,137,147,99,154,37	0,601,1392,2203,2454,2829,3202,3511,3864,10334,15130	WASH7P-201	none	none	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1	unprocessed_pseudogene	ENSG00000227232	WASH7P	unprocessed_pseudogene
+chr1	29553	31097	ENST00000473358	1000	+	29552	29552	0,0,0	3	486,104,122	0,1010,1422	MIR1302-2HG-202	none	none	-1,-1,-1	lincRNA	ENSG00000243485	MIR1302-2HG	lincRNA
+chr1	30266	31109	ENST00000469289	1000	+	30265	30265	0,0,0	2	401,134	0,709	MIR1302-2HG-201	none	none	-1,-1	lincRNA	ENSG00000243485	MIR1302-2HG	lincRNA
+chr1	30365	30503	ENST00000607096	1000	+	30364	30364	0,0,0	1	138	0	MIR1302-2-201	none	none	-1	miRNA	ENSG00000284332	MIR1302-2	miRNA
+chr1	34553	36081	ENST00000417324	1000	-	34552	34552	0,0,0	3	621,205,361	0,723,1167	FAM138A-201	none	none	-1,-1,-1	lincRNA	ENSG00000237613	FAM138A	lincRNA
+chr1	35244	36073	ENST00000461467	1000	-	35243	35243	0,0,0	2	237,353	0,476	FAM138A-202	none	none	-1,-1	lincRNA	ENSG00000237613	FAM138A	lincRNA
+chr1	52472	53312	ENST00000606857	1000	+	52471	52471	0,0,0	1	840	0	AL627309.6-201	none	none	-1	unprocessed_pseudogene	ENSG00000268020	AL627309.6	unprocessed_pseudogene
+chr1	57597	64116	ENST00000642116	1000	+	57596	57596	0,0,0	3	56,157,1201	0,1102,5318	OR4G11P-202	none	none	-1,-1,-1	processed_transcript	ENSG00000240361	OR4G11P	transcribed_unprocessed_pseudogene
+chr1	62948	63887	ENST00000492842	1000	+	62947	62947	0,0,0	1	939	0	OR4G11P-201	none	none	-1	transcribed_unprocessed_pseudogene	ENSG00000240361	OR4G11P	transcribed_unprocessed_pseudogene
+chr1	65418	71585	ENST00000641515	1000	+	69090	70008	0,0,0	3	15,54,2549	0,101,3618	OR4F5-202	cmpl	cmpl	-1,-1,0	protein_coding	ENSG00000186092	OR4F5	protein_coding
+chr1	69054	70108	ENST00000335137	1000	+	69090	70008	0,0,0	1	1054	0	OR4F5-201	cmpl	cmpl	0	protein_coding	ENSG00000186092	OR4F5	protein_coding
+chr1	131024	134836	ENST00000442987	1000	+	131023	131023	0,0,0	1	3812	0	CICP27-201	none	none	-1	processed_pseudogene	ENSG00000233750	CICP27	processed_pseudogene
+chr1	139789	140339	ENST00000493797	1000	-	139788	139788	0,0,0	2	58,265	0,285	AL627309.2-201	none	none	-1,-1	antisense_RNA	ENSG00000239906	AL627309.2	antisense_RNA
+chr1	157783	157887	ENST00000410691	1000	-	157782	157782	0,0,0	1	104	0	RNU6-1100P-201	none	none	-1	snRNA	ENSG00000222623	RNU6-1100P	snRNA
+chr1	187890	187958	ENST00000612080	1000	-	187889	187889	0,0,0	1	68	0	MIR6859-2-201	none	none	-1	miRNA	ENSG00000273874	MIR6859-2	miRNA
+chr1	263014	297502	ENST00000424587	1000	-	263013	263013	0,0,0	4	5190,150,105,158	0,5652,26251,34330	AP006222.1-206	none	none	-1,-1,-1,-1	processed_transcript	ENSG00000228463	AP006222.1	transcribed_processed_pseudogene
+chr1	347981	348366	ENST00000458203	1000	-	347980	347980	0,0,0	1	385	0	RPL23AP24-201	none	none	-1	processed_pseudogene	ENSG00000236679	RPL23AP24	processed_pseudogene
+chr1	439869	440232	ENST00000437905	1000	+	439868	439868	0,0,0	1	363	0	WBP1LP7-201	none	none	-1	processed_pseudogene	ENSG00000269732	WBP1LP7	processed_pseudogene
+chr1	450702	451697	ENST00000426406	1000	-	450739	451678	0,0,0	1	995	0	OR4F29-201	cmpl	cmpl	0	protein_coding	ENSG00000284733	OR4F29	protein_coding
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/human_transcripts_seq.bed	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,12 @@
+1	14403	29570	ENST00000488147	1000	-	14402	14402	0,0,0	11	98,34,152,159,198,136,137,147,99,154,37	0,601,1392,2203,2454,2829,3202,3511,3864,10334,15130	WASH7P-201	none	none	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1	unprocessed_pseudogene	ENSG00000227232	WASH7P	unprocessed_pseudogene	ATGGGAGCCGTGTGCACGTCGGGAGCTCGGAGTGAGCGTGAGTTCCGTGCCCAGGCCCGCGACTCGGCCCGACAGGACAGCGCTCCGGGTCGACGGGGTCCTGGAGCCGCGCTCGGGGAGGGCGCAGTGGAGGGCGAGCGGCGGCGTTAGGACCCGGAGGCGCGGGCGGACTGGGGGCGGCGGGGCTAGGACCCAGCGGCTCCGGCAGAGCGGAAGCGGCGGCGGGAGCTTCCGGGAGGGCGGCTCGCAGGTGAGGAGGCGTCCGGGGCCGCGGGAAGTAGGGTCGTGGGGGCCTGGCGGGGCGAAGTAGGGGACCCGGAGGGGCTGGAGGGAGGCGGGCGGGAGGCCCGGGACCGTTCCTGACCGAGAAGCCTGCGCCAAGCTGGTGTTCCGCGGCCGCTGCCCGGTGCCCGGCTCCACTGCGAACGCCGCCGCTGGGCCCCGACCGCCCGGGAGGCGTCTTGGGCTCGCCCCGGAGCTTCCTCCCTGGAGCCGCGCCCTGCACCCGGCCTTGCCCGGCCCTAGCAGGGAAGCCAAGGCTTGTGGGGCGCAGGGACCCGGGCTCTGCGGGGTCCCGGTTCCGCCTCCCCACTCCTGCGTCTTCCCGCCCCTGCCGGGTTCTGGGAAGCCTCGCGCGGCTCTTCCGCAGCTGCTGCCCGCCCGGAGCTCCTGGTCCCTCGTAGGGGACCCCACTTCTCTGACACCGCGTTGGGTTCCCGGGGCCTACAGCGAGGCTTGTAACTCCGGGAGAGACCCTGGAGCGGGGTGTGGGAGAACGGTCTGGAGGAAGGGCTCCGAGCACTTCGAAAGTATAAACCGCGGTCCCAAAGAGGCGTGCTGTGTCTGCATTTTCCTGGGAGTGCACGGTTTACATTCTCGAAAGCAGTGCTGTCGACTAGAAATATTGAGCGATACACATGTACAAGTTTTGTCACTTAAAAAGAATTTGAAAAAACTTCATAGATGCAAAAAAAAAAAAAAACCACCATTATTAAAGAATACTTAGGTATTTGTGGAATGCATTGAAGAGTTAACAAAATGGATAGGCAGGAAATATCGCAGACCTAGAATGAATTACAGTTACCCACTGTGGAACTGAGGAGCTAGGGTTTCTCATAAAACTCCCTGATAGAAGACGACTTTTGATAAATTTTTTTTTCCGCCAACAAAATCCCCTGTCTTCTCAACTAGTTACTGTCTGTCCACTAAATAAGAGGTGGTCCGTCACTTCTTCAGATGAGCAACTACAGGCTTTTCAAAAGATAATTGCTAATCAACCCCTTTGTGCCTGGGTTTTCTTATTTGTAAAAATAGATACTACTACCTAACTCCAAAGTGTGTGGTGAAGACAAACAATTGGGGTGATGTATACTAAAGTAACGAAAGTGTTGACCACACACTACGGGCTGGTTAGTGTTAGATTCCCTTGTTTTTCCCTCAGTATCAAAAACAGATCTAATTTAGGTTTACATAAAGACAAAGTATGAAGATAAGGTGACTTACAGTTGGTACTACTAACAAAATGTTTGGGCTAAGATTTGCATTATTGCATGAAAACAACAAAACATATCAATAAATAACAAAAAGCTTGGAATTCAGACGACAGATCCAAGTCTGGGCTTGATCTCAAGCTAGTGTTTTGATGTTGAAAAAATGTTATTTGGTCTTTCTAACCCCATTTCCTTATGTAAAATAGGGGATGATGATAAATTCACTGATAATAAGAGTTAAATGAGATTCTTGAGGAGTCAGAATGGTTCTAACATGTGTAGGTATTATTAGCAGTCATACTGTAGCATAAGAAAATACCGTCTGCTGAAAGAGGGACAATAAAGATTATCTACATGGTCATCATTTAAAAGCTACCAGATATAGGAAGAAGGGGCCATAAAATGATAACGTTATGATGATTAATTTTGATGCTTAGGTCAGAGTCCATTCTAGGATATCTGCTGCCCAAAAACAGCAGAGACTCATTTCTTTGGAATCACAGGACGCTGAGTGAGAGGAAAGAAAAAGAAAAGAAATATTTAAGTCACATATGTGATTTCTAAAAGTAAAAAGAAACAGATGAAATTAGTGATATATTTTTAAAATCCAGTATATCCCAAATATGGTTATTTTAGCACGTAATCAATATAAAATAATAAGATATTTTACATTCTTTTTTTCTAGCCTTTGAAATTTGGTGCATATTTTACACTTATGGCACATCTCAATTCAGACTATCCACATTTCAAGTGCTCAGTGGCTGCATGTGCCTGGTGGCTACCATATTGGACAGCACAGGTCTAAGGATTTCATTCCTGCCACAAGTCCAAACTCCTAGCTTTAATTTTGAGTGTTTTTAACAAACTGGCCTCTGTTTATCATTCTTTCTTCTAGTACTTCCCCAAGGATGATTGTACCCTCAGCACTCAAGACCGCTTGCGGTTCCCCTACACACTTTTTGTTCAAGCTGTTTCTTTTACCTGGAATGCTGTCTTTGCACCTTCTTCCTGGACCTGGTTCACCCTCGTTGCCTAGGCTGGAGTGCCATGGCGCGATCTTGGCACACTGCAACCTCCACCTTCCTGGTTCAAGTGATTCTCCTTCCTCAGCCTCCCGAGTAGCGGGGATTACAGGCATGCACCACCACGCCTGGCTAATTTTGTATTTTTAGTAGAGATGGAGTTTCACCATGTTGGTCAGACTGGTCTCGAACTCCCGACCTCAGGTGATCTGCCTGCCTTCGCCTCCCAAAGTGCTGGGATTACAGGCGTGAGCCGCTGCGCCCGGCCGAGAGGCACACATTCTGCTAAGAGCTTTTTCCTGACTCCCCTAACTCCAAGAGGGATTTGTCACTCCTTAGCTTTGTACCCATGACTGGAGTAGAATGAATTTAATTTGAGTTTAGTTGTTTTTGAGACTCTCCCTGGCTAGTGTAGTGTCTTATTCGTCTTTGTTGTGATCATGGCCTGCACCTAACAGATGATCAGTAGATGTTTGCAGACAGAAAGTAAACCACTCATCAGGTGTATTCAGTCCCATTCTTGAACGGGCTTGCTGCCTCCTTTTTGAGGAGATCTGTGTATGTACTCTTCTTTCACGCATATGTGTGAGCAAACACACACACACTAACAAGAAATTCATCTGAAGATGTGCACAGGAAATATCTTGCATCTTTACCCCCTTTGTGATCTTACATATGGGAGAACTGAGGCACAGAAATAAGTTAGGACAGCCAGCAAACTTGCATCAGTATAAATACAAAGAAGGGGAGGGAGGAACATGCTTGAAAGGGGTGTGCTGGTCTCAGAGGGTTGGGTTTCTCAGTTGGCTGGGCATCAGCTGGCCATGCTTTAGTTATTTGATGGGAGGAAAAATAAGTGGGAGGTGAGGAGTAACTCCTGGGCTCTGATGAGTATTCAAGGCAAGTACAGATCTGGAAAGCCTGTATGCAAAGGAGGAACTCACTGAAAAGTGCTGGCCTGAGGAGGGCAGAAGGGAGGGCTGGGGAAGCCAGCAGCGGGAGCAAAGGAGTAGGCTCCAACTGGGTGAAGATGTTGGTGTGGTGCGTTATGTAAAATATACAAATTATTATTGGAAATAACCACGTCTCAGCAGTGCTAGTTCTCAGTTTGGAGAATGGGAAATCGAAAGGATCAGATTCAGAGACGGCAACTTACTCAAGGTCACAGCATTTTAAACCCAAGTGAAATCTCCTAGGCCCTTCATGCCACACTCATCCATCCCTACCTACTTGTGTTGCAACCAAGGGCCCCACTGTAGTGCCTAGGGGAGCAGGTCTAGGGCACAGTGCCAGGCCTGATTAATGTCTTCCTTACCATTTTCCAGTGAGGGGCTGTGATTAGGCCTATTTATAGGGGCCTGGTCCCTTAATATTCTGCCTGGTGCATCTCTTGCCAATCAAATCAGTGCTGTCTGCAGTGTGATTGCTGCTTTAGTGGCACCAGGGAGAGGAGTTAATTAAACCCAATATAAATAGACTCTGCCCTCACTTTGCAATTCCAGGAGTGTTTTTCCTTCCTGTCCTCCACCCCCACAGGCACCTCTTTCCTCTTGTCCCCCTAAGCTCTAGCCTGGGTGAGCAGGGCTGGATACTCCTATACCTAGAGTCACTAGCCACTGCCCAGTCTGTTTCAGGAGCAGGCCTCAGATTCCTCAGGGGTTAAAGTGGGAAGAACCCGTGTGTGCACATTTTTTGTGCTTTTCCAGAACTGTGTACCATTTGGCAGTTGATCAGGCAATCTCCCCTGCTACCCCATTTCTACCCCTTTGTTTCCAGCCTCTTTTTTCCTCTGCAACCAAGGTTTCTTGTTTATCCAAGGTGGGGAGCTGAACTGAGACAAGGTATGGAAAGGGTGCCTGGCAGGTAGCAAGCACCTTGTAGGGGGTCAGAAATGTTGCACCTTCTCTGAACTCCTCCATTGACCCTACAGATTCCCCAGTCCCGGGCCCTGCCCTTTCCCTCATTCACTCAGCAGGCATCAGCAGAGTCCCATCTATGCGCTCCTGGCCTCTCAGCAAATGCTCTGTCCCCTACTCCCCTATCTGTGCAGGCTGAAGCTATGTGCATAGTTGGGATGAGGGCTGTGTTGTCTCAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGTGGTCGTGGGTGGCTCTGACGCTCCGGCTCCGACCCACAGGCACCATGACTCCTGTGAGGATGCAGCACTCCCTGGCAGGTCAGACCTATGCCGTGCCCTTCATCCAGCCAGACCTGCGGCGAGAGGAGGCCGTCCAGCAGATGGCGGATGCCCTGCAGTACCTGCAGAAGGTCTCTGGAGACATCTTCAGCAGGTGGGTGCTGCCACTCACCCCCACCTGATGAGAGGGCCATCCCTGTCCTGGGCAATCCCAGCAACACACCCTCTGGGAGCAGCCCCCTTGGGGAATCCCGGTCCTGGGGAACCCATCTGGCTTCCCTGTGTGGGAGGGGCTGAAGTGAGAGCCCAACTTGGAAGCTTTTACTCCTGGGAGTCCGAGAGCTCACTCCCTTCCACCCCACTTAGCCTCCTGGTTTCCTGTGGTGGCTCTGCTCTCACAACTCATGCTTTTCCTCCCATTGGAGGGCCTATTCCTTCACGTTTTCCTGCAGCCAACAAATATTTACCCAGCAGTGCTCGTGTGCAAGGCAGTGTGGGAATCTCTATATATCCAGCCACGGATAAGGCAACATACCTCTCCACCTGGAGCGCACATTCTGGCAGGAGAGAAAGACCTAAATAAGCAATAGATGATTAGTTCTTCAATAACAGTTGTGACAAGGTCTATTGATAATATTTTGTAATCACTAATATTCATATAAACCGTGCACAACCATTGATTTGAGTGCATTAACTCACACTTCATGAGCAGGCACTGCCGTCATCTCATTTTATAGATGAGGAAACTGAGGCACAGAAGGGCTGAGAGACCTGGCCTAGTGACAGAGCCAGGATTCAAAGCCATAGATCATGGCCCCGGGTTATGTAGGTTATTACTGCATCTGTTCAGGGGAGATGGGGTACTGTGAGGCTCGTCATGGGAAGCCTGGCTTGGTCTCAGGTCAGGGAAGGCAGACGTGAGGAAATGACATTTATGGTAAAGTCTGAGGGTTGAGTGGGTAGGTTGGGAAGAACATTCCAGAAAGAAGCACATGAACTACAGCCTGGAGGTGGAGGACCTAAAAGGAAGCCAGCATGGCTGGAGCACGGAGTGGCCATTGAGGGAGGCGAGCTGGAGGGCTGCAGCTTCTTGTATTGGCAGTGCTGACCTCGCACAGTCCTTGGGCTCCAGTGACTTCACTCAGTGTTTATCTAACATGAGTGAGTGAATGGTGTTTGCTCTTTTTTTGGTAAAGGTCCCAGGGGTTGTCGGGTACACAGGTCCTGTCTTTGGCCATAAGCAAACTGAAATGAGGCTTGGTCTCCTTCCCAGGATCCCACACCATGCCTCACATGGTAGACCCCAGTGGGAAGTATGTGACTGCCTGACTCAGGTGCCTCTCGTGGTCCAAGCCATCCCTGCCCTGTCCCTTCCCTGGTTGTCGCCAGACCTGGAGCCCCTGCTCCTTCACTTTGCAGCCTCCTCTTCTGTCACCAACTGGGAACCCACCTCTTCCTGAAAGTCCTCCCCCACTGACTCACCGGCTTGCCCCGAGTTTGTCAAGAATGTCCCAGTAACCAGGGGACACACAGTGAAGTGACTGAGGGGTTACCTTGGAGTTGATGCCTTGGCTCAGATCCAGCTCCCCTGTTTTCTTCCTCTGTAACCTTGGGCAACCCAACCCCTCTAAGCCTCGGTGTTCTCATTTGTGAAGTTGTGGTAATAATGGTAGCTTCCTGGTAGAATTATTTTAAATATTAAATTAATCAAAACATGCAAAGGAATGGAACAGTGCCTGGCACCTAGGAAGCCTTCAGGAAATGCTATCTCTTCCCTGTTGATAATCTTGACCCGTACACTGCCTTTGGTTGCCATTCATAAACCTGCCACCAATAGTAACAAAGTGCTGGATGCACCTTTTGTGCTTATCTTTGTGCTAAATGTGCCCGAGGGACACCTAGGGAAGAGGATGCAGGTCTTTAAGAGCCATCAGCTCCAGATTATGGCCACCCCATGTCCAGCACTTAGAATGGAGGCCAAAACCATTCCCTCGGAAATTGTGTTTCCTTGCCAAGATGGGGACTGCGTGGTTGCCCTTCTCTGAGGGCAGCGCTGGATTTTTGGCGTCTTTCCTTTCCTGTCCTGGTACTTGGCACCTTGTAGACAGTTGCATGTCCCCTGCCCAGGGATGGGATGAGGAGAGGGCAGGAAGGCATTTCCTGGGTAGTGGAGTGCTGCGTTCATTGAGTGTGGGTTCTCCAAGCTGCTGGCACAGCGCAGGGAGGGCCAGATGCCTCTCAGGAGCCTTGGGCCTGAGTCCTGGCTCCCTCACTCCTGGGTTCCAGGTCACTGCATCTGTCTCTCCACCATGTGCTCCACCTCGTGCTGGACCTTAAGAGATACCAATTATGTGGCTGCCACTGTGTCCTAGAGGCTGGAATGGGAACACATAGGGCGAGATTGATTGTTAATTGCTAGCATGAACCGCGTGGGCTTCTCAGGGTCTAGAGTGGAGAGAAATCGGTAAGAATTGGTGGCACGCCTGTCAGAACTCCCCAGACCAAGCTAAGCAAAAATTAACCAATCAGTAGAGCAGCCTTCGGAGTAAGGGCTAAAATGATGTCCTCAGGGCCTGGTTTTGCTTTCCTTCCATGTCAGTTTGCTTCTTTGGGTCTGGCTGCATTCCCAGACAGGCCATGCTCTCGTGGTAGCAAGGTGACATGACACAGGGTCAGGTCCAGCAGGAAAGAATGCTGTCCTGTGTCCCCACTTCCTCCAGAAGCCACACTCACTCATCCCACCTGGCTTGGTCCTCATGTCTATCCCAGAATCCATTAATGGGGCCAGGGGACTATGACACACCACTTGGCTTAGACTGAGGAGCTCTGTGGGCAGCCCCACCTGAAGCTCTGGGACTAAGCCTGCGAGAGAGATGGATTCCCCAAGGGAAATGGGGCCATTGCTTGAGTAAAAAGGAAATAGTTGCTGAAGAGGAAAACCACGTGCTTACTCCACATAGGGCAGACTCCTGGAAGAGGGGGGCAGGGTAGGGAGGTGGATATGCAGGTTGCCCTGGCAGGGTCTGGAAATGGGGGCTGCAGGCTTGGAGGGAGGCCTCAGTGTGGCTTGGAACGTGGTGTATGGTGGTCTGCCGCGAAGGCCGGCCTGCACAGGGGTGGGAGGGGGGTGCTTCTGCATGGGAAGCACAGACAGCGCTGCCTCTCCCTTGCACTCAGCTCTCGGGGCATGAGAGGCTGACTTTCCGTGAGCCTGTGGGCCAGGCCTCTTTGAATGGGGCTGAGGGAGCTTTGCCCTGGTTCCTTTGTGTCCCCACGGTGCCACGGGAGGCTCCCTGGCAGGGTGTGGGGCAGGGCAGTGAGTGAAGAGTTGGGATGAGTGAGTTAGGGCCCACGGATTACTCAAGACAGGACTTCAAGTTGATTCAGGCGTGTTAGGGAGCTGTGATTGGATTTTGAGCAGGGCAGGGATGGGACAGAAGAGTTTGGGGAAGGTTCCTCAGGCATCCGTCACGGAAGGGACAAGAAGGGAGAGAGAGTGGATGCCAGGGACACCCAGAAGCTGTTATTGTAGTCAGGATACGACAGGGGTGAGGCTACAGACAGGGGACTTGCAAGCAGGGAGGGCAGGGTGAGACATTCAGAGGAAACGACGACAGGAAATGGTGACAGATAGGGAACGAGGATGAAGGGAAGGGAGAGCCAGTGACGACTGGCAGTGGAGTGGGGAGCACCGCCACCTCTCCTCCTCCACTTGCCCCTCCTGTGGCACTGGACAAGCTAGTGGGCTTTTCGTTGTCCATGGGCTTTTTCGGTGGGGATGTGACCAGCTTTGAACCCGTCCCCTTAAACATGCTCCTCCTGCACGGAAGAGACAGGGGCAGGGGAGAGACTCTCTCCCCACCACCCGGCTCAGGCCCCAGCACAGCCCGGCCTCTGGCCTCACTGGCGTCTGTGCCCAGTGACGCAGGCAGGTGAGCTCCTGGCAAATTAGCATTGCAGGCTGTGCTCTCTCCTCCTGCTCTGCTGCAGCTGGGAGTGTGCAGAGACTGGAGGGGATGACAGTCACCCTCTGTTTTCTGTGGTGGCTCTGTTTTCTGTGGTGCTGGATGCACCTCTGTTTTCTGTGGTGGCTCCAAGAGAGTGCACGGTCCCTGCTGATTGAAAGAAGGATGAAGGGCAGAAGAGGGGCGGGGAGCTGTGTGCCCTAAGATCTCATTGCCTTTTTATGCCGATTAACATGCTTTTAGCCCCTACTGAGCTTATAGTTAACAGAAGTTTCCAGGTCTTTCTTCACCTGAACTGTGTCTAAAGCAAGTTCCCTCCACCTTCTGTATTTATACGCTTGATTTTTAAAACCTAAATGTTGGGCTTCACATTTGTTCCTTGTAAATTTCATCTTGGTGATTGCAGTCTACCCTCTGGCCTTTAAAAATTGTCTGAGCCTTGATTCGATCATGAAACCAGCTTACCCTTCCCCTGTGTGCTGGCCCCAGTTTTCTAACCAGGTGTTGAATGAACTGGATGGACTCTGCCAGATCCCTCCGTGCAAGGCTGGAATCAGTCCATTGTTCAACTGTGCCCTTTGGGGCTGTGGTTCATTTGGCTCTGATTTTTCCTATATGTTCTCTCCTCCAACCCCCATAGCTCCATCTTGTCTACAAGATTTTGTTAGAAGCCGTCAAAATCCTGCTGACTCGAGATGCACTGTGCTGCATGTTTTCCCCGGGCACAGCAGGCTAATAATCCTGTTACAAAGAGAAATGCTGTACATTTCGAGCAGTGCTGGCCCCTGGGACTCACCGCGGCCTTTTCTAAGTGCTTACAGACTCTCTGTTTAATAATCCATTCCAGAAATTTTCCAGGGCTCATTGTTGAGCTTGGTGTTCGCAACTTTGAGTGATCAGCCCTTCTCCTTTGTGGGAGCACCAGGACAGAGCAGCCTTTGTCCCTCCCCAGTCTCAGTTCCCTCCCACTGCCCCTGTGGACCTCGAATGCAGAGCTTATGCACCTACCGAAGGTCGTGTCAGCACCCAAGGCAGAACGAGGCTGCCCTGGGAACTAGGGTCAATTAAGACAGCTTGTGCTGGAGGACCCTTTACAGCAGATGAAGGCCTCTCCCCAGCCAGAAAAGATGGAGCACACGCTGGGTGGTGGTCCCGCTTCCTCACTGGAAGGAGATGGTGCTCTTCTTTTTTCTTTCTGAATTGTGGCCACCTTCATACCAGTCTGTCATGGAACACTTAAGCCGCTTGAGTGCCTGCTGGTACTCCCAGCCCTGCCATGCCTGAGCCCCCTGCACACAAGGAGCCAGGAGTAATCAGGGCAGACCCTTTAGGGCACGGGGACTTCTGGATTGTGAAATTGGCTCTCTGGGGGCCAAGGCCTTCTAACGTTGGTGGAAGTGGCTTTGGCTTATTGGGTCGGATTCTAGGCCATTCATTCCAACCTTTAGAGACATCCCAGCTTTCCCTAGCCCAGAGTCTGCAGCCCCTCCACCATCCCACATCCTCCCCCTCCCTTTCCTCATGAACCCCAGTCGCGCCTCTGCCTTCTCAAACCCCTCCACCATCCCACACCCTCCTCCTGCCCTTCCTCATGAACCCCAGTCGCGCCTCTGCCTTCTCATCCCTGCGCACCACACAGGCTCGCTCGTGCCCGGTGAGTGCTGAGGCTGCTCTGCACGTGGAGTGTGGCCCTGTGGGCAAGGGCTGGGCTCTTGGAGGTAGGGGAGCTACAGGGGCGACTGGGAGGAGGATGTTGTGTTACACACGCATCAGAGTTAACTTTGCAGTGAGAGCGGCCTTGCTGCGGCCAAAGAACATGGAAAAGCATGAGTGGGGTGATGTGCCTTAAAGCATCAGACACTTGGGCCTCGGGCATCAGGAGCCAGCCACAGGGATGTCTGGGGAAATGGCGTTCCATGAGATGCAAGCACACAAGAATGCACTTGGCACATCTGGGGAACAGCAGGCAGCTGATATCACTGGGCCCACCCCGCACCAGGGAGGATGGAAGCAGGTGAGGAGCTAGACCACACTGAGGCGGTGGTCGGGACTCGGGGTTTGCTCAGTGAGCCGTTCAGTATGTGCAGGGGCAGTTCCCCGTCTGAATTTAGGTGACGACACTCAGGTCCAGCCTTGCCAGTCTCAGCCTCCGGTCTCCGTTCCCCCTCTGCAGAGGCCACATTGTCTGCTGCACGTGATCATGAGGGGTTGTGAAGTGCTTGCCCCATCAGTAGCCATGTGTGCATGTGTAAATACCATCCTCTGTGTGCCCTGGAGGCTGTCCTTCAGATAGCATGTACAGGTGGCAGCATAGGGCCTGTCCCTACTGAGAGTGCAGGGAACTCAGCACCGTCAACTCCTCGACCCTGCAGGTCAGATTATCCTTGTAGAGGCCCCCTGGATGGCACCAAGATCGGCCCTGGCAAGTAGGTGACCCTGACTTCAGAGCCCTTGCCTGAGGGCCTGGCCTGGCAGCTCTGCTGTTAGAAGCAGGAGGTGTGCAGAGGGTGGGGAGCAGCCCAGCCTCTGTGATCTTCTCCATGGCAGGATCTCCCAGCAGGTAGAGCAGAGCCGGAGCCAGGTGCAGGCCATTGGAGAGAAGGTCTCCTTGGCCCAGGCCAAGATTGAGAAGATCAAGGGCAGCAAGAAGGCCATCAAGGTAGTCCCCATACCCCTGTGTCCTGAGGCTACTGGGCAGTCCCTCCATTTCCCCGTGCCTCTGAGGCTGCCCAGTCTCTGCCCTGCTGCCCACCTGTACCTTGAGCTTTCTTCTCGCCCAGGCTTCCAACTCCACCCTCTCCTGCCAAGCAATCCTAGCCCTCTGAGCCTCTTGGGGCCCCCTCAGACTTGTCCCTGTGTCCACAGGTGTTCTCCAGTGCCAAGTACCCTGCTCCAGGGCGCCTGCAGGAATATGGCTCCATCTTCACGGGCGCCCAGGACCCTGGCCTGCAGAGACGCCCCCGCCACAGGATCCAGAGCAAGCACCGCCCCCTGGACGAGCGGGCCCTGCAGGTCTGCTGGCCGCGCATATAGCCTGTCACACACCAGGAGGACTGGATACTGGGGAGGAGCCGGGGCCACCATAGGGTTCTGTCCCCCAGAGGAGGCTGACTGGGATGGGATGGCAGCTGATTAGGCCCAGCACCAAATATTCACCATCCCTTGGCCATCCTGGCCCTCTCAGGAGAAGCTGAAGGACTTTCCTGTGTGCGTGAGCACCAAGCCGGAGCCCGAGGACGATGCAGAAGAGGGACTTGGGGGTCTTCCCAGCAACATCAGCTCTGTCAGCTCCTTGCTGCTCTTCAACACCACCGAGAACCTGTATGGCCAGAGGGCAGGGCCGAGGGGTGTGGGCGGGAGGCCCGGCCTGGCTTAGTGGGGACCCAGGGCATCAGACACAGGTACAGCACATAGGCCAGGAGCCAGGGGGTGACGGGTGGCTCGGCTCGGGAGGCCTGGGACCCCACAGTGCACGCTGTGCCCCTGATGATGTGGGAGAGGAACATGGGCTCAGGACAGCGGGTGTCAGCTTGCCTGACCCCCATGTCGCCTCTGTAGGTAGAAGAAGTATGTCTTCCTGGACCCCCTGGCTGGTGCTGTAACAAAGACCCATGTGATGCTGGGGGCAGAGACAGAGGAGAAGCTGTTTGATGCCCCCTTGTCCATCAGCAAGAGAGAGCAGCTGGAACAGCAGGTGGGAGGGGTGGGACAGAGGTGGAGACAGGTGCAGTGGCCCAGGGCCTTGCCAGAGCTCCTCTCCAGTCAAGGCTGTTGGGCCCCTTATTCCACCCATGGGAGGTGCACACAAGGTCTTGTTGGCTGCCCCTGCAGGTCCCTGTCACCTCTCACATGTCCCTGCCTAATCTTGCAGGTCCCAGAGAACTACTTCTATGTGCCAGACCTGGGCCAGGTGCCTGAGATTGATGTTCCATCCTACCTGCCTGACCTGCCCGGCATTGCCAACGACCTCATGTACATTGCCGACCTGGGCCCCGGCATTGCCCCCTCTGCCCCTGGCACCATTCCAGAACTGCCCACCTTCCACACTGAGGTAGCCGAGCCTCTCAAGGTAGGTGAGCTGGGTTCTGGGATGGGAGCTGGGCCGGGGACCTCCCTGGTCACACACCTTCTTCCCTAGACACCCCACACTTTGTGTTTCAGACCTACAAGATGGGGTACTAACACCACCCCCACCGCCCCCACCACCACCCCCAGCTCCTGAGGTGCTGGCCAGTGCACCCCCACTCCCACCCTCAACCGCGGCCCCTGTAGGCCAAGGCGCCAGGCAGGACGACAGCAGCAGCAGCGCGTCTCCTTCAGGTGGGAGCAGCTCTTTGAGGCCACCTGATTTCTGGCGTGCTCAGTGCACTCGGGTGGATTTTCTGTGGGTTTGTTAAGTGGTCAGAAATTCTCAATTTTTTGAATAGTTTCCATTTCAAATATCTTGTTCTACTTGGTTCATAAAATAGTGGTTTTCAAACTGTAGAGCTCTGGACTTCTCACTTCTAGGGCAGAGGGAGCCTGAACAAGTGAGGCTCTGGGTTCCCCATTCCTAATTAAACCAATGGAAAGAAGGGGTCTAATAACAAACTACAGCAACACATTTTTCATTTCAGCTTCACTGCTGTGTCTCCCAGTGTAACCCTAGCATCCAGAAGTGGCACAAAACCCCTCTGCTGGCTCGTGTGTGCAACTGAGACTGTCAGAGCATGGCTAGCTCAGGGGTCCAGCTCTGCAGGGTGGGGGCTAGAGAGGAAGCAGGGAGTATCTGCACACAGGATGCCCGCGCTCAGGTGGTTGCAGAAGTCAGTGCCCAGGCCCCCACACACAGTCTCCAAAGGTCCGGCCTCCCCAGCGCAGGGCTCCTCGTTTGAGGGGAGGTGACTTCCCTCCCAGCAGGCTCTTGGACACAGTAAGCTTCCCCAGCCCTGCCTGAGCAGCCTTTCCTCCTTGCCCTGTTCCCCACCTCCCGGCTCCAGTCCAGGGAGCTCCCAGGGAAGTGGTTGACCCCTCCGGTGGCTGGCCACTCTGCTAGAGTCCATCCGCCAAGCTGGGGGCATCGGCAAGGCCAAGCTGCGCAGCATGAAGGAGCGAAAGCTGGAGAAGCAGCAGCAGAAGGAGCAGGAGCAAGGTGAGCGGGCCCTGGAGCTTGCAGTCGGAGGGCCTTGGGCAAGATCGCCTCCTCCCCTCCAGCCCTGAGTCCACCGGGTGCTTTCTGCCCACCCCCTGCTCTTGCCAGCTGGCCCCTGCTTCCCCTAGGGCACATGCTGGAAGCCCTGGGCCGCCACCAGAGGTCCTCAGCCCTCCTGCCTGGGCTATGGCTCCTTCCTGGTTTGGGAGCCATAGTGGAGCTTTCCTCTCTAAGCTCACCCAGCTCAAACTGACAGGAGAATCTTCTTCGACTGCCAAGAGCGGTCCAAGGCAATGGTCAGCCACTGCAGCCTCCTGAGATATTTTTAGAGACTGGACCTGAGGCCTCTGGAGGCTACTGATGATGCCTGCTGTGAACGCAGACACTGGTGTGATGCGATGCCTGCGCCTGCAGCGGCAGTGCCCTGGGCACTATGGTTTTGAGCTTGTACCCAGCGCTGCTTTTGCCTTGCTCTGTGACCCCAGGCAAGCTGCCTCACCTCTCTGGGCCAGTTTCCCCATTGTACAGTGGTGCTGCACACCCTGGCCCTGGCCCCGAGGTGGCTGGGAGGTGGCTCCTCAAACAGCCGCTGTCTCATCAGTGCCCGGTGCTGGGTCAGGGATCGACTGAGGCTCTGAGCTAACTGGGAAACACAGTGGCCTTGGAGGGCTGGGGAGTGTCATGGGGGTGGGGACAGGGAGTCACCGGTCGCATGTGACTGAACTCTTCACCCCAGTCTGTGGCTTTCCCGTTGCAGTGAGAGCCACGAGCCAAGGTGGGCACTTGATGTCGGATCTCTTCAACAAGCTGGTCATGAGGCGCAAGGGTAGGAGGCAGGGCCGCTGCCCGCCCTGGGCCAGCACCTTGTAATTCTGTCCTGCCTTTTTCTTCCTGTATTTAAGTCTCCGGGGGCTGGGGGAACCAGGGTTTCCCACCAACCACCCTCACTCAGCCTTTTCCCTCCAGGCATCTCTGGGAAAGGACCTGGGGCTGGTGAGGGGCCCGGAGGAGCCTTTGCCCGCGTGTCAGACTCCATCCCTCCTCTGCCGCCACCGCAGCAGCCACAGGCAGAGGAGGACGAGGACGACTGGGAATCGTAGGGGGCTCCATGACACCTTCCCCCCCAGACCCAGACTTGGGCCGTTGCTCTGACATGGACACAGCCAGGACAAGCTGCTCAGACCTACTTCCTTGGGAGGGGGTGACGGAACCAGCACTGTGTGGAGACCAGCTTCAAGGAGCGGAAGGCTGGCTTGAGGCCACACAGCTGGGGCGGGGACTTCTGTCTGCCTGTGCTCCATGGGGGGACGGCTCCACCCAGCCTGCGCCACTGTGTTCTTAAGAGGCTTCCAGAGAAAACGGCACACCAATCAATAAAGAACTGAGCAGAAA
+1	29553	31097	ENST00000473358	1000	+	29552	29552	0,0,0	3	486,104,122	0,1010,1422	MIR1302-2HG-202	none	none	-1,-1,-1	lincRNA	ENSG00000243485	MIR1302-2HG	lincRNA	GTGCACACGGCTCCCATGCGTTGTCTTCCGAGCGTCAGGCCGCCCCTACCCGTGCTTTCTGCTCTGCAGACCCTCTTCCTAGACCTCCGTCCTTTGTCCCATCGCTGCCTTCCCCTCAAGCTCAGGGCCAAGCTGTCCGCCAACCTCGGCTCCTCCGGGCAGCCCTCGCCCGGGGTGCGCCCCGGGGCAGGACCCCCAGCCCACGCCCAGGGCCCGCCCCTGCCCTCCAGCCCTACGCCTTGACCCGCTTTCCTGCGTCTCTCAGCCTACCTGACCTTGTCTTTACCTCTGTGGGCAGCTCCCTTGTGATCTGCTTAGTTCCCACCCCCCTTTAAGAATTCAATAGAGAAGCCAGACGCAAAACTACAGATATCGTATGAGTCCAGTTTTGTGAAGTGCCTAGAATAGTCAAAATTCACAGAGACAGAAGCAGTGGTCGCCAGGAATGGGGAAGCAAGGCGGAGTTGGGCAGCTCGTGTTCAATGGGTAGAGTTTCAGGCTGGGGTGATGGAAGGGTGCTGGAAATGAGTGGTAGTGATGGCGGCACAACAGTGTGAATCTACTTAATCCCACTGAACTGTATGCTGAAAAATGGTTTAGACGGTGAATTTTAGGTTATGTATGTTTTACCACAATTTTTAAAAAGCTAGTGAAAAGCTGGTAAAAAGAAAGAAAAGAGGCTTTTTTAAAAAGTTAAATATATAAAAAGAGCATCATCAGTCCAAAGTCCAGCAGTTGTCCCTCCTGGAATCCGTTGGCTTGCCTCCGGCATTTTTGGCCCTTGCCTTTTAGGGTTGCCAGATTAAAAGACAGGATGCCCAGCTAGTTTGAATTTTAGATAAACAACGAATAATTTCGTAGCATAAATATGTCCCAAGCTTAGTTTGGGACATACTTATGCTAAAAAACATTATTGGTTGTTTATCTGAGATTCAGAATTAAGCATTTTATATTTTATTTGCTGCCTCTGGCCACCCTACTCTCTTCCTAACACTCTCTCCCTCTCCCAGTTTTGTCCGCCTTCCCTGCCTCCTCTTCTGGGGGAGTTAGATCGAGTTGTAACAAGAACATGCCACTGTCTCGCTGGCTGCAGCGTGTGGTCCCCTTACCAGAGGTAAAGAAGAGATGGATCTCCACTCATGTTGTAGACAGAATGTTTATGTCCTCTCCAAATGCTTATGTTGAAACCCTAACCCCTAATGTGATGGTATGTGGAGATGGGCCTTTGGTAGGTAATTACGGTTAGATGAGGTCATGGGGTGGGGCCCTCATTATAGATCTGGTAAGAAAAGAGAGCATTGTCTCTGTGTCTCCCTCTCTCTCTCTCTCTCTCTCTCTCATTTCTCTCTATCTCATTTCTCTCTCTCTCGCTATCTCATTTTTCTCTCTCTCTCTTTCTCTCCTCTGTCTTTTCCCACCAAGTGAGGATGCGAAGAGAAGGTGGCTGTCTGCAAACCAGGAAGAGAGCCCTCACCGGGAACCCGTCCAGCTGCCACCTTGAACTTGGACTTCCAAGCCTCCAGAACTGTGAGGGATAAATGTAT
+1	30266	31109	ENST00000469289	1000	+	30265	30265	0,0,0	2	401,134	0,709	MIR1302-2HG-201	none	none	-1,-1	lincRNA	ENSG00000243485	MIR1302-2HG	lincRNA	TCATCAGTCCAAAGTCCAGCAGTTGTCCCTCCTGGAATCCGTTGGCTTGCCTCCGGCATTTTTGGCCCTTGCCTTTTAGGGTTGCCAGATTAAAAGACAGGATGCCCAGCTAGTTTGAATTTTAGATAAACAACGAATAATTTCGTAGCATAAATATGTCCCAAGCTTAGTTTGGGACATACTTATGCTAAAAAACATTATTGGTTGTTTATCTGAGATTCAGAATTAAGCATTTTATATTTTATTTGCTGCCTCTGGCCACCCTACTCTCTTCCTAACACTCTCTCCCTCTCCCAGTTTTGTCCGCCTTCCCTGCCTCCTCTTCTGGGGGAGTTAGATCGAGTTGTAACAAGAACATGCCACTGTCTCGCTGGCTGCAGCGTGTGGTCCCCTTACCAGAGGTAAAGAAGAGATGGATCTCCACTCATGTTGTAGACAGAATGTTTATGTCCTCTCCAAATGCTTATGTTGAAACCCTAACCCCTAATGTGATGGTATGTGGAGATGGGCCTTTGGTAGGTAATTACGGTTAGATGAGGTCATGGGGTGGGGCCCTCATTATAGATCTGGTAAGAAAAGAGAGCATTGTCTCTGTGTCTCCCTCTCTCTCTCTCTCTCTCTCTCTCATTTCTCTCTATCTCATTTCTCTCTCTCTCGCTATCTCATTTTTCTCTCTCTCTCTTTCTCTCCTCTGTCTTTTCCCACCAAGTGAGGATGCGAAGAGAAGGTGGCTGTCTGCAAACCAGGAAGAGAGCCCTCACCGGGAACCCGTCCAGCTGCCACCTTGAACTTGGACTTCCAAGCCTCCAGAACTGTGAGGGATAAATGTATGATTTTAAAGTC
+1	30365	30503	ENST00000607096	1000	+	30364	30364	0,0,0	1	138	0	MIR1302-2-201	none	none	-1	miRNA	ENSG00000284332	MIR1302-2	miRNA	GGATGCCCAGCTAGTTTGAATTTTAGATAAACAACGAATAATTTCGTAGCATAAATATGTCCCAAGCTTAGTTTGGGACATACTTATGCTAAAAAACATTATTGGTTGTTTATCTGAGATTCAGAATTAAGCATTTTA
+1	34553	36081	ENST00000417324	1000	-	34552	34552	0,0,0	3	621,205,361	0,723,1167	FAM138A-201	none	none	-1,-1,-1	lincRNA	ENSG00000237613	FAM138A	lincRNA	CACACAACGGGGTTTCGGGGCTGTGGACCCTGTGCCAGGAAAGGAAGGGCGCAGCTCCTGCAATGCGGAGCAGCCAGGGCAGTGGGCACCAGGCTTTAGCCTCCCTTTCTCACCCTACAGAGGGCAGGCCCTTCAGCTCCATTCTCCTCCAAGGCTGCAGAGGGGGCAGGAATTGGGGGTGACAGGAGAGCTGTAAGGTCTCCAGTGGGTCATTCTGGGCCCAGAGATGGGTGCTGAAGCTCCCACGCCTGCCTGTGAAAATGGAGTCCTCTCTCACCTGGGAGAGCCAGGTGCTGCCCCGAGAAGGATGCATTTATGGCTTCGTGAAGTCTTTCCTGACCCCCGATGCTGCTGACTATAGGTAAGTCTGAGCAAATCTGGGGGAGCCTCATCTTGGCATGAGAAAGAGATGGCTTCTTCTAAGCCCACTGGCCGTGATCCCAGGATTATAACACATTCTGGCTCAAGTCCAGACTATTTGTAGAACACAGGAGATCCTCCATGAGAGGTAGTATAATATAGAGGATATGTGTGCTTACTAAGAGGCTGCCTGTCTGACCTTGGACAAGTTGTTTTTATTTATTTATTTATTTTTTATAGAGACAAAGTCTCACTATGTTGCTCAGGCTGGTCTTGAACTCCTGGCCTCAAGCGATCCTCCCACCTCAGCCTCCCAAAGTGTTGGGATTATAGACATGAGCCACTGCACCTGGCCGACCTTGGGCAAGTTCTTAAACCCTTCAAAGCCTCATTTTTCTCCAATCACAAAAGGGAAAGATGGTAATATTTTCCCCACCAAATTCTTGTAAGTATTAAACATTGTATATGTATTTTGAACACGATTAAGCTCTAAACACTTGTTAGGAAGCAGGACTGGCATTTGAAACAAACAGCTCTTTTCCCACAGGTCGGATGCCCTCACAGAATTGAGATTATGTACGTAAAACACCAGGTGCCTAACCCGGCACAGAGCAGGAGGGCTAAGCGTGACATCCAGCACGTGGTCAGTGGAATCCAGTATTCCTACCCACCTCTCTAGTCTCCCCTCCACCCCTCTCCCTTTCAGAGGCACCAAGCTGCTTGTGGTCTTGTCTATTCCCACTCCCTGCCTGACTGAACATTTTCTCCACCTCCTGATCATCAGCAGCAGAAACTGGCTGCTCTTCCTCCTGGGTAGACAGCCAGACTGTATTTCCCAGCTGCCCCTGCAGTGAGATGTGGCCATCGGAGCCAGCATTGGCCAATGGACTCTGCATGGGAGTGACGCATGCTGCCTCCAGGCTTGTCCCTAAAACCTCCCACGTGTCCTCCGCCTGCTCTTCCCACCTCCAAGGAGCACGGCAATTGTGGAAGACCCAGATTAGTGATGGCAGAACCATAGATGGGAGGAACCTGGGTCCCTGACTTAAAGTATCATGGATTTGGATGTTCCCTTAGTGAGAAATAAACTTCCATTGTGTTTAAGCCTTTATTTGTTTATAGTTGGTTACAGCAACTGCCTTCTTTTAATTAAAACACTCCTGCTGCT
+1	35244	36073	ENST00000461467	1000	-	35243	35243	0,0,0	2	237,353	0,476	FAM138A-202	none	none	-1,-1	lincRNA	ENSG00000237613	FAM138A	lincRNA	GGGGTTTCGGGGCTGTGGACCCTGTGCCAGGAAAGGAAGGGCGCAGCTCCTGCAATGCGGAGCAGCCAGGGCAGTGGGCACCAGGCTTTAGCCTCCCTTTCTCACCCTACAGAGGGCAGGCCCTTCAGCTCCATTCTCCTCCAAGGCTGCAGAGGGGGCAGGAATTGGGGGTGACAGGAGAGCTGTAAGGTCTCCAGTGGGTCATTCTGGGCCCAGAGATGGGTGCTGAAGCTCCCACGCCTGCCTGTGAAAATGGAGTCCTCTCTCACCTGGGAGAGCCAGGTGCTGCCCCGAGAAGGATGCATTTATGGCTTCGTGAAGTCTTTCCTGACCCCCGATGCTGCTGACTATAGGTAAGTCTGAGCAAATCTGGGGGAGCCTCATCTTGGCATGAGAAAGAGATGGCTTCTTCTAAGCCCACTGGCCGTGATCCCAGGATTATAACACATTCTGGCTCAAGTCCAGACTATTTGTAGAACACAGGAGATCCTCCATGAGAGGTAGTATAATATAGAGGATATGTGTGCTTACTAAGAGGCTGCCTGTCTGACCTTGGACAAGTTGTTTTTATTTATTTATTTATTTTTTATAGAGACAAAGTCTCACTATGTTGCTCAGGCTGGTCTTGAACTCCTGGCCTCAAGCGATCCTCCCACCTCAGCCTCCCAAAGTGTTGGGATTATAGACATGAGCCACTGCACCTGGCCGACCTTGGGCAAGTTCTTAAACCCTTCAAAGCCTCATTTTTCTCCAATCACAAAAGGGAAAGATGGTAATATTTTCCCCACCAAATTCTTGTAAGTATTAAACATTGTATATGTATTTTGAA
+1	52472	53312	ENST00000606857	1000	+	52471	52471	0,0,0	1	840	0	AL627309.6-201	none	none	-1	unprocessed_pseudogene	ENSG00000268020	AL627309.6	unprocessed_pseudogene	GCGGTATCTAAATTTGTATTGATTGGACTTTCAAGCTCTTGGGAGATGCATCTTTTTCTTTTTTGGTTCTTCTCTGTGTTCTACATGGGAATTATCCTGGAAAATCTCTTCATTGTGTTCACAGTAATTATTGACTCTCATTTAAATTCCCCAGGTACTGCCTACTGGCCAACATTTATCTTCTTGATCTGGGTCTTCTCCTACAGTTCTGACTTTTTCACTAACTGCAGCATCATTTCTTTTCCAAGATGCATCATACAGATATTTTTCATTTGTGTCATGCGTAAAAATTGAGATGGTGCTGCTCATAACCATGGCATAGAGCAGGTACACTGCCAATCTGTAAGCCTCCCCATTACCTGACCACAATGAACCCCAAAATGTGTGTTTCCTTTGTTGGAGGCATCCTGGATAGTCAGGATAATCCATGCTGTATCTCAGTTTGTTTTTGCCATAAACTTGCCTTTTTGTGGCCCTAATAGAGTAGGTAGTTTTCACTGTGATTTTCCTTATGTCATGAAACTTGCTTGTGTAGACACTTACAAACTAGAGGTTGTAGTCACTGCTAACAGTGGGCTTATATCCATAGCTACCTGTTTCTTATTAATAATATCCTATATTTTCATTTCGGTAACCGTCTAGAATCCTTCTTCAGGAGACTTATCTAAAGCATTTGTGTCATGTTAGATCACATCACAGTAGGGATTTTGTTTTTTATGCCATGTATATTTCTGTATGTGTAGCCTTTGCCTAAAACAACACATGATTAATATTTGTTCATTGTTCCTTTTGCTATCACCCCTGTCTAGGATCTACACATTAAGAAACAAAGACATGAAC
+1	57597	64116	ENST00000642116	1000	+	57596	57596	0,0,0	3	56,157,1201	0,1102,5318	OR4G11P-202	none	none	-1,-1,-1	processed_transcript	ENSG00000240361	OR4G11P	transcribed_unprocessed_pseudogene	AGCTATCTGAATTTCTCCTTCTCCTAAAAATGCACATCCTATGACTGAAAAGACAGGTAAAAGAGATGCTTTTAATTACAAAACTTTCCCTGTCGTGGTTGCTTCTCTCTATCCTTCTAAACTCCCTTTCAATTTCTTCTCTTCTGTAACATATTTGTGCCCAAAATCTTCTGCTTTCTGAAATATTTTATCTTTTTCTTCCACACTATCTCTTATTTTCCAATTTTAATCATTAAATTATATTATGTCTTATAAAACTAATCCCACATATAAACCCCTATGATAATTTCAGTTTGTCCCTAGTATGAAGTTCTTTAAAGATGTGTAGTTTTCTAACTTTCATGCTCTCCAATTAATTATAAACTTCATTTTCCACTCTGAAAAGGAGATGTCTGATCTCAGCTATTTCCATCCTATTTGAAAACCAGATTTAGTTTTAAACCAGAGGAAGGGAATCTCAAGTCTTTACCTCCCACAGTCTGGTGTGATTCTCTCTCTTTTGGTATTACCTTCCTCCACATTGGAACACTCCAGCCAATGCATAGGCTGAGAGGCTATCTCAGATTCAGAAAGATTTGGCCTCATCCCAGGGGAGGGTACAGAGGAGCTGATGACTATGAATTCTGAAATGGAACTGTTCCAGGTTGAAGAAATAAGAAAGGGAATTGGGAAGAGCAATGCCCAGTGAAAAAGAAGAAATAATATTTTAGGAAGTGAATGCTAATTTTATTTTAAACAAAATAAGAACTCAAGGAATAAGAGGGTTCTTCCAATAGGTTAGAGTGATCCTGTCAAACATATATGCTTCTAGATTTTTTTAAAGACTGTTTCTACTAAGAAAGCATAGACCGCTATTGAGAAAGATCATTAAACTGGAATTTAGGAGGTCTGCCTTCTGATTCTGACTTCTTGAATGTATTGTTAGCCATTTAACCACACTGTGTTGTTTCTCATTCTACCTGTAGAATCTCAAAGTTCTTTCCCACTTCTATACAAAACTATAATTCTGAACATCCTTTTTGTTTAATATAAGTCTGCATTTCCTGTTTGAAGATATGTGTCCCAGACCCTAAATGACTGACAAATTTTAAATCTCCAATAGGAAAGATGACAAACTCTATGGAAACTTGGCTTCTGAAGAACTCCTAGAAGCTTTCCAAAGTCATCAGTGTTTCCTAAGAAGGCAGAGAAATCAAACACATGGTCTTTTCCTCCAGACAAGCTCCTTTGGGTCATCAGGATTTCTTCAACAATAAAATGTAATAATTCCAAATGTTTGTAACAGAATGGGTAGGACTTTCTTCACTTATTTAAATACTCCCTTTTTTATGCAACTGAGTTTTCATCAACAAGTACAAGCTTGTGAAGGAGTACTTTAAAATGCAATTTCTCTCTATTTTTGTGGGGGCTAATATTTTATTTCTCATATTGACAATTTATTATGCTGTTTTTAAAAAGTTCATTCATCAAGTATTTCTTGAGCTTTTTCTATGAGACAGGCACTGTTTTAGGCAAGTAATTATGCACTGAACAATGCAAAAAGTTTCCCTGCACTCATGGACTTTAATTTTACATTTATGAAAAGCTACAAATATTAGAATAAGTAAAATACTGCCTGGAGGCTAAAGCATATTTTGATCACTTATTCCCTAATTCTTTTAGAAGAGAACTCACCTGTCGGTTAGCTGAACCACTGCCAGTGATATCCAACTATACATTCAATCCCACCATACCTCATTATCACACCTATTCACTCACAAGCTTAAACTCTTAACTTTTCTCCACATATCAGTGACTATTTCCTACAGCTTTTCTTTTACTTTCCATGTTTGCAGTGACAATATACATAAACAGTGTATGAAAACTCAAGTAAAATCTACTCTCTCAGGTGTTCATAATGTATCAATGTATATTGCTTTAAGCCTGAAGGTAACCTAAGTAAAGATGTACCATGTTCCACCAATGCTTCTTTTGATCATCATTTTATCCTGTTTTTTCTTTAGGATTCTTTCTTATTCCTTCCCCTGACCCTTCTTTTATTCTCCAAATTTCTTTCCAATTCATCTTTGTTCTTCCCTTTCCTTTTTACTCTCTTTAAACATTCTATGGACTCTGCCTCCTTCACACTGATATTGAACGCCCATAGTTTCATATTTTGGATTGCGATTGTTTTATTTTAAAATGGCAAATGTTCATGTTATAAAGAGAATTTTTCAGTCTTTAGACTAATAGGTTCATGTAGTTTGGGATTTTCCTCTTTAAGAAAATTAATTATCACTCACACTCCAAGACAAACACCATTTCAGTAGCAATATGAATTTCAGTAGTAATAGGAATCTCCAAATATGACAAAGTAATTCAGACATTAATTGCTTTTGTTTTGGAATTGCTCTTATAAGATGAAATATCACTTTCATGATGAGAGTCCTAGAGTGCTTGGTTTATATATTGTATCTTAGTTTTAACAGGATAAAACACTTGATCCTAAGCAGTAAACATGATTCTTCAGCTTCAACTTCATTTCTTTATAAATAACTATTTATGAATTGGTGTTGAGCTTAGTAAGTCACCAAACACCTTCTGCTCAGCAGCATAAAGGACATTTCCATGAAACCTCCCAGGGATAATCTTATTTACTCTATAATGTTTCCCGGGTTCAATTCCTCTCCCAAAATTCTTTGTTCTTAAGCCCCTATGATCTGGGTGATCTAAATATGGGTAAGAAGTCCAGGGATAGCACTATGAATGAAGTGAAAATAGTAAAACATAGTTAAAAATGTACAGATGCTCTCTGACTTATAATAGGGTTACGTCCTGATAAATCCATCATAAGTCAAAAATGCATTTAATATTCCTAATGTACCTCACATCATAGTTTGGCCTAGCCTACCTTAAATGTGCTCAGAACACTTTCATTAGCTTATATAAGATCACCTAATACAAAGCCTATTTTATAATAAAATATTGAATAGCTCACGTAATATACTGACTACTATACTCAAGTACAGTTTCTTCTGAATGCATGTCACTTTCTCACCATTGTAAAGTCAAACAATTATAAGTCAAACTATCACAAGCCAGGGACCATCCATATGTATTTCATTCAGAAAATGCTGGAAAGAGCATTTCGGAGAATATCTAGATGAGAGAAGGTAGAAAGCCATGCACAAATTCACTGAGAGTTTAAAAAAATACATGCATATTGTGGAGATAGAAATCAAATCTATTTGTCTCCATCTGCTGTATTCTTCCCAAAATATTATCTCTTCTTATCCCATTGTACTATATTGCATTTCTTTGACCATTTATTGTGTATCTCTTAATATTTCCCACTTCATCATTACTAACCTCACTCACTCTGAACTTGATGAGAGCACCTGAGCATTAATTTTTCTTATAATTATTTAATGATTACCAGAATTCGTTCAGTATGGCCAGCTCTGGTCAAAGTGAGGCAGGCAAGATGCTTTGTCAACTGCCTGGATGGAATGTCTCAAAAGGTTTCCATTTCATGGTAGCATTATGCAAAGTTCAAGACGTTTAATCAAGACCCTTCACTTACTTAACTATACCTCCTTGAGAATCCCATCTATGAAAAAATTCTAGTCATTATAAAAATGATTGATTAAATGAGGGAAGTAGTAGAGTTCTTCATTTCTTTAGTTGGTTTAGTCTCCTATGAGTCAATCCTATTTTCAAAATTCTTAATAAACCATTTATTCCTTCAACTTTCTATGCCATTTGATGTTTTGTAAAAAAAAAAATATAATATGTATACAAAAAGATATTTCAAAATCTAGAAAGAGAGCTTTAGAGCTTTGTAAAGCTCTTTTAAAAATCAAAAACAACTACTGTTAATTAACATGTTGTACTATGCAATTTGTTTACCATTATTACTCTTGGTATTTTTAAGAAAAGTCTTTCCATTGTTATTATAAATGCTTCTATTGATATTTATTTTAATAACTGTTATTACAGTCCGTCATGTACATACACTATACTTAAACCTAATGTTTGGTATTTAAATCGTTTCAAGATTTTATCACTGTCAACAAAGTATGATGAATATTTTTATGCTGAAAACTTCTGTAAAAATAGAATTCCAAGAGTATTATTGCACCAAAAGGCATGGACTTAAAATTCTTGATACATGATTTCAAAATATTTTCTTTAAGGTTTGAATCAGTCTATATTCCCTCCAGCAGCGTATAAAAGTGCCAATTTCTCTGATCCTTAGCCAGTTTGGGTAATAATAATTGTAAAACTTTTTTTTCTTTTTTTTTGAGACAGAGTCTCCCTCTGTCGCCAGGCTGAAGTGCAGTGGCGCAATCTCGGCTCACTGCAACCTCCGCCTCCCGGGGTCAAGCTATTCTCCTGCCTCAGCCTCCCAAGTAGCTGGGACTACAGGCATGCACCACCATGCCCAGCTAATTTTTGTTATTTTTAGTAGAGATGGAGTTTCCCCATGTTGGACAGGATGGTCTCGATCTCTTGACCTCGTGATCCACCCTCCTCGGCCTCCCAAAGTGCTGGGATAACAGGCGTGAACAACCATGCCCGGCCTGTAAAACTTTTTCCTAATTTAACAGAAAAATAATAGTATTATATTTTATCATATTTCTTTGATTTCTAAGACACACATACACACACACACACACATATCTGTATATACAAATACACGTATAGCTTACATTTTAATTCTTCATTTCATTTGTTCATTTATTAGGTCTTGGAGATTTTGTGAAACTGTTTAAATTCTTTTTTATACTATGAAGATATCAACCTTTTGTCTCTACAGCATTTCAAATTCAAGTATGATTCACGTGTTGGTTTGGGGTAGATCATTATAGGCACATGTAGGAAACAGCTTTCAGAGATGCCTTAACCGTAATTATGCATTTGTATTCTAATTTTTATTTAATGTTATTATTGATTGCATTTTTAAAGATTCTGTATTTTTTAAACCATTTATTTGTATATGTTGGTATACAATCTTGCCATTTTCTGGGATTTCATATTTCCTTATTTTTGTTTTTTACCTTTTTTGGCTTGAATTTTTTGAGTTTTTATGCATTCTTTTCCAGTTTCTTAAGATGCTAATAAGTTCATGTATTTGAGCAATTGAGAACATTTAAAGCAATAGACTGCCTCTGAGCACAGCTTTGTCCATATTACATTAACCTTTTATACCCTGGGTTCCCACTAGTTTTTAAATAATCTACTATCAAATAAAAGATTTGTTAATAATAAATTTTAAATCATTAACACTTAACGCATTATTTTCAGTCACACTAAGTTGATTCCTTCGTTTCTTTCAGGTTGCTTCAGAGTCTTCCCTTCTATCTGATTCAGTGGACCAAGTAAATGACTCTCTGGTAACAGAATTTGTATTACTTGGACTTGCACAATCCTTGGAAATGCAGTTTTTCCTTTTTCTCTTCTTCTCTTTATTCTATGTGGGAATTATCCTGGGAAAACTCTTCATTGTGTTCACAGTGATCTTTGATCCTCACTTACACTCCCCCATGTATATTCTGCTGGCCAACCTATCGCTCATTGACTTGAGCCTTTCATCTACCACAGTTCCTAGGTTGATCTACGATCTTTTTACTGATTGTAAAGTTATTTCCTTCCATAATTGCATGATACAAAAGTTCTTTATCCATGTTATGGGAGGAGTTGAAATGGTGCTGCTGATAGTCATGGCATATGATAGGTACACTGCGATCTGCAAGCCTCTCCACTATCCAACTATTATGAATCCCAAAATGTGCATGTTTTTGGTAGCAGCAGCTTGGGTCATTGGGGTGATTCATGCTATGTCTCAGTTTGTTTTTGTCATAAATTTACCCTTCTGTGGCCCTAATAATGTGGGGAGCTTTTATTGTGATTTTCCTCGGGTTATTAAACTTGCATGCATGGACACTTATGGGCTAGAATTTGTGGTCACTGCCAACAGTGGATTCATATCGATGGGCACCTTCTTTTTCTTAATTGTATCATACATTTTTATTCTGGTCACTGTCCAACGACATTCCTCAAATGATTTATCCAAAGCATTCTTCACTTCGTCGGCTCACATCACCGTAGTGGTTTTGTTTTTTGCTCCATGCATGTTTCTCTACGTGTGGCCTTTCCCTACTAAGTCATTGGATAAATTTTTTGCCATCATGAACTTTGTTGTCACCCCTGTCGTAAATCCTGCCATCTATACTTTAAGGAACAAAGATATGAAGTTTGCAATGAGAAGGCTGAATCAACATATTTTAAATTCTATGGAGACGACATAACACATTTGGTTGATGAGAGCACAGGATAAATGCCATGGACCATCAAGACTCCTGTGATCACCATGATCACTATGGAACGCGCACATTTTTAGTATTGCCTGAAAAAACTGAAAAATCTGCAAAAAGGATGCATTAAATCTAAGAATTGTATTTCAGATAAAGTTGCAACATTTTTTGTTAATCATAAAAAGTATATATTTCTATCTAATGTGTGTATCTAATTAACAGC
+1	62948	63887	ENST00000492842	1000	+	62947	62947	0,0,0	1	939	0	OR4G11P-201	none	none	-1	transcribed_unprocessed_pseudogene	ENSG00000240361	OR4G11P	transcribed_unprocessed_pseudogene	GTGGACCAAGTAAATGACTCTCTGGTAACAGAATTTGTATTACTTGGACTTGCACAATCCTTGGAAATGCAGTTTTTCCTTTTTCTCTTCTTCTCTTTATTCTATGTGGGAATTATCCTGGGAAAACTCTTCATTGTGTTCACAGTGATCTTTGATCCTCACTTACACTCCCCCATGTATATTCTGCTGGCCAACCTATCGCTCATTGACTTGAGCCTTTCATCTACCACAGTTCCTAGGTTGATCTACGATCTTTTTACTGATTGTAAAGTTATTTCCTTCCATAATTGCATGATACAAAAGTTCTTTATCCATGTTATGGGAGGAGTTGAAATGGTGCTGCTGATAGTCATGGCATATGATAGGTACACTGCGATCTGCAAGCCTCTCCACTATCCAACTATTATGAATCCCAAAATGTGCATGTTTTTGGTAGCAGCAGCTTGGGTCATTGGGGTGATTCATGCTATGTCTCAGTTTGTTTTTGTCATAAATTTACCCTTCTGTGGCCCTAATAATGTGGGGAGCTTTTATTGTGATTTTCCTCGGGTTATTAAACTTGCATGCATGGACACTTATGGGCTAGAATTTGTGGTCACTGCCAACAGTGGATTCATATCGATGGGCACCTTCTTTTTCTTAATTGTATCATACATTTTTATTCTGGTCACTGTCCAACGACATTCCTCAAATGATTTATCCAAAGCATTCTTCACTTCGTCGGCTCACATCACCGTAGTGGTTTTGTTTTTTGCTCCATGCATGTTTCTCTACGTGTGGCCTTTCCCTACTAAGTCATTGGATAAATTTTTTGCCATCATGAACTTTGTTGTCACCCCTGTCGTAAATCCTGCCATCTATACTTTAAGGAACAAAGATATGAAGTTTGCAATGAGAAGGCTGAATCAACATATTTTAAATTCTATGGAGACGACATAA
+1	65418	71585	ENST00000641515	1000	+	69090	70008	0,0,0	3	15,54,2549	0,101,3618	OR4F5-202	cmpl	cmpl	-1,-1,0	protein_coding	ENSG00000186092	OR4F5	protein_coding	CCCAGATCTCTTCAGGTACATCTAGTCCATTCATAAAGGGCTTTTAATTAACCAAGTGGTTTACTAAAAAGGACAATTCACTACATATTATTCTCTTACAGTTTTTATGCCTCATTCTGTGAAAATTGCTGTAGTCTCTTCCAGTTATGAAGAAGGTAGGTGGAAACAAAGACAAAACACATATATTAGAAGAATGAATGAAATTGTAGCATTTTATTGACAATGAGATGGTTCTATTAGTAGGAATCTATTCTGCATAATTCCATTTTGTGTTTACCTTCTGGAAAAATGAAAGGATTCTGTATGGTTAACTTAAATACTTAGAGAAATTAATATGAATAATGTTAGCAAGAATAACCCTTGTTATAAGTATTATGCTGGCAACAATTGTCGAGTCCTCCTCCTCACTCTTCTGGGCTAATTTGTTCTTTTCTCCCCATTTAATAGTCCTTTTCCCCATCTTTCCCCAGGTCCGGTGTTTTCTTACCCACCTCCTTCCCTCCTTTTTATAATACCAGTGAAACTTGGTTTGGAGCATTTCTTTCACATAAAGGTACAAATCATACTGCTAGAGTTGTGAGGATTTTTACAGCTTTTGAAAGAATAAACTCATTTTAAAAACAGGAAAGCTAAGGCCCAGAGATTTTTAAATGATATTCCCATGATCACACTGTGAATTTGTGCCAGAACCCAAATGCCTACTCCCATCTCACTGAGACTTACTATAAGGACATAAGGCATTTATATATATATATATTATATATACTATATATTTATATATATTACATATTATATATATAATATATATTATATAATATATATTATATTATATAATATATAATATAAATATAATATAAATTATATTATATAATATATAATATAAATATAATATAAATTATATAAATATAATATATATTTTATTATATAATATAATATATATTATATAAATATAATATATAAATTATATAATATAATATATATTATATAATATAATATATTTTATTATATAAATATATATTATATTATATAATATATATTTTATTATATAATATATATTATATATTTATAGAATATAATATATATTTTATTATATAATATATATTATATAATATATATTATATTTATATATAACATATATTATTATATAAAATATGTATAATATATATTATATAAATATATTTATATATTATATAAATATATATATTATATATAATTCTAATGGTTGAATTCCAAGAATAATCTATGGCATGAAAGATTTTACCTGTCAACAGTGGCTGGCTCTTCATGGTTGCTACAATGAGTGTGTAAGATTCTGAAGGACTCCTTTAATAAGCCTAAACTTAATGTTCAACTTAGAATAAATACAATTCTTCTAATTTTTTTTGAATAATTTTTAAAAAGTCAGAAATGAGCTTTGAAAGAATTATGGTGGTGAAGGATCCCCTCAGCAGCACAAATTCAGGAGAGAGATGTCTTAACTACGTTAGCAAGAAATTCCTTTTGCTAAAGAATAGCATTCCTGAATTCTTACTAACAGCCATGATAGAAAGTCTTTTGCTACAGATGAGAACCCTCGGGTCAACCTCATCCTTGGCATATTTCATGTGAAGATATAACTTCAAGATTGTCCTTGCCTATCAATGAAATGAATTAATTTTATGTCAATGCATATTTAAGGTCTATTCTAAATTGCACACTTTGATTCAAAAGAAACAGTCCAACCAACCAGTCAGGACAGAAATTATCTCACAATAAAAATCCTATCGTTTGTACTGTCAATGATTAGTATGATTATATTTATTACCGTGCTAAGCAGAAGAGAAATGAAGTGAATGTTCATGATTTATTCCACTATTAGACTTCTCTTTATTCTTAAAAATATTTAAGATCACTAAATTTTTATAGGACTTTAAAAACAGTAATGTGCTGCTTTGAGTGTGTAGGACTAAGAAATGGGATTCAGAGTAGTAAAGAGAAAAGTGGAATTTCCAAGCACTATGAATTACTGTTCTTTAAAAAACAGCAAAAATCAAATAACAGTATTCCTCCAAAAAAGATGGCAAGTGTAAACTCTATACCTTCATGTCTCCCGTGGAATGTTAGTGATCAATTTCCACTTCTCTCTTTTACATCTTACTTGCCCATTAACTCTTATACCTAATCCAAAGATTGTTAATATGGCTATGTCTCACTTTCAGGACACCTTTTATTTGTTACTTCTCTTCACTGCAAAACTTCTTGAAACAGTACTTATTTTCTCTCCTCCATACACAATTGAAATGGCTCTCAACTCATGCCCAGAAGTCAGTGTTCAGTCTCTCACCTGGCAGATAGCAACTTACAAAGATGCCCCAACAATACCTCCTTGTGTCTAGACAGTCATCATTATCCTTTACCTTTTTCTGTATTTATTTCTGCTCCTAAAAGGGATCTCTATGTAAAGTATTGTTATACTAGTGCTTGTTATAATTATTATCAGAGTTAAAGCCATCACAATGTTCCCAATTACTTAAAGACATTGGAATAACATTTTTTTTATTTTCCACATCTTGCCAAAAAATATTTTGTTATCAGTACCTTAATAATGGCTATTATATATTGACCATTACTATTTGCTAGAAAATTTATATACCTGGTCGTATCCAATCCTCACAGAACTTCTATAAAGTTGTGCTATTATCACCTATATTTTCCAGATGTGGCCGTAAGACTGAAATCACTTAGGTGACTTGTCTAAGGTCATTCAGATACATAGTAGATAACCCAGGATTTGAACACAGGCCTCCTAGCACACAAGCTCATATCTTAACTACTTTAATACGTTGCTCGATGGGATCTTACAGGTCTTCATTCACCCCTTTCCTGCTCACACAACCACAACCTGCAGCTATTACCTATTGTTAGGCTTAAAATAATTACTTGGCTTCATTTCCAAGCTCCCTCCCTTCCAATTCACATTGAGTCCAGAGCTAAATTAAACAATCATTCAAAATTTTTCAGTAGTTCTTGTCTCTATAATAAAACAGAAATGCTTTAGAAAGCATTCCAAAATCTCTTACCAGTTTTATCTCCTATGAAAGTCCTTCACACTTTCTCTCATTTAAACTTTATTGCATTTTCCTCACTTTTTCTCACTTCACTTTTGAATTCCCTATTCTTTTATCCTCTGTTAATTTTTAAGTATTATATTTGTGATATTATTTTTTCTTTTTTTCTATTTTTTATCTTTCATTTCATTTTGGCCTATTTTTTTCTCTTAAGAACTTTAATATCACCAAATAACATGTGTGCTACAAACTGTTTTGTAGTTCAAAGAAAAAGGAGATAAACATAGAGTTATGGCATAGACTTAATCTGGCAGAGAGACAAGCATAAATAATGGTATTTTATATTAGGAATAAACCTAACATTAATGGAGACACTGAGAAGCCGAGATAACTGAATTATAAGGCATAGCCAGGGAAGTAGTGCGAGATAGAATTATGATCTTGTTGAATTCTGAATGTCTTTAAGTAATAGATTATAGAAAGTCACTGTAAGAGTGAGCAGAATGATATAAAATGAGGCTTTGAATTTGAATATAATAATTCTGACTTCCTTCTCCTTCTCTTCTTCAAGGTAACTGCAGAGGCTATTTCCTGGAATGAATCAACGAGTGAAACGAATAACTCTATGGTGACTGAATTCATTTTTCTGGGTCTCTCTGATTCTCAGGAACTCCAGACCTTCCTATTTATGTTGTTTTTTGTATTCTATGGAGGAATCGTGTTTGGAAACCTTCTTATTGTCATAACAGTGGTATCTGACTCCCACCTTCACTCTCCCATGTACTTCCTGCTAGCCAACCTCTCACTCATTGATCTGTCTCTGTCTTCAGTCACAGCCCCCAAGATGATTACTGACTTTTTCAGCCAGCGCAAAGTCATCTCTTTCAAGGGCTGCCTTGTTCAGATATTTCTCCTTCACTTCTTTGGTGGGAGTGAGATGGTGATCCTCATAGCCATGGGCTTTGACAGATATATAGCAATATGCAAGCCCCTACACTACACTACAATTATGTGTGGCAACGCATGTGTCGGCATTATGGCTGTCACATGGGGAATTGGCTTTCTCCATTCGGTGAGCCAGTTGGCGTTTGCCGTGCACTTACTCTTCTGTGGTCCCAATGAGGTCGATAGTTTTTATTGTGACCTTCCTAGGGTAATCAAACTTGCCTGTACAGATACCTACAGGCTAGATATTATGGTCATTGCTAACAGTGGTGTGCTCACTGTGTGTTCTTTTGTTCTTCTAATCATCTCATACACTATCATCCTAATGACCATCCAGCATCGCCCTTTAGATAAGTCGTCCAAAGCTCTGTCCACTTTGACTGCTCACATTACAGTAGTTCTTTTGTTCTTTGGACCATGTGTCTTTATTTATGCCTGGCCATTCCCCATCAAGTCATTAGATAAATTCCTTGCTGTATTTTATTCTGTGATCACCCCTCTCTTGAACCCAATTATATACACACTGAGGAACAAAGACATGAAGACGGCAATAAGACAGCTGAGAAAATGGGATGCACATTCTAGTGTAAAGTTTTAGATCTTATATAACTGTGAGATTAATCTCAGATAATGACACAAAATATAGTGAAGTTGGTAAGTTATTTAGTAAAGCTCATGAAAATTGTGCCCTCCATTCCCATATAATTTAGTAATTGTCTAGGAACTTCCACATACATTGCCTCAATTTATCTTTCAACAACTTGTGTGTTATATTTTGGAATACAGATACAAAGTTATTATGCTTTCAAAATATTCTTTTGCTAATTCTTAGAACAAAGAAAGGCATAAATATATTAGTATTTGTGTACACCTGTTCCTTCCTGTGTGACCCTAAGTTTAGTAGAAGAAAGGAGAGAAAATATAGCCTAGCTTATAAATTTAAAAAAAAATTTATTTGGTCCATTTTGTGAAAAACATAAAAAAAGAACTGTCACATCTTAATTTAAAAAATATATGCTTAGTGGTAAGGAGATATATGTCAACTTTTAAGAGGTTGAAAAACAAACGCCTCCCATTATAAGTTTATACTTCACCTCCCACCACTATAACAACCCAGAATCCATGAGGGCATTATCAGGAGTGAGTGGAAGAGTAAGTTTGCCAATGTGAAATGTGCCTTCTAGGTCCTAGACGTCTGTGGTATAACTGCTCATAAGCAGTAGAAAGAATTTAGAGGGATCCAGGCTCTCATCACGTTGGCACAAAGTATATTACTTGGATCCATCTATGTCATTTTCCATGGTTAATGTTTAAAAGCACAGGCTTTAAAGTAAAAAACAAAGAGCTGGATTCAACTCTACTGACTCTTATTAATCATGATTTTGGGCACATTACGTAGCTTTCATGAGCTTTAGTTTCTACATTTATAAACAGGAGATTATACCTATTATGCATGGTTATTATGAAGGAAAATGACAAAATAGATATAAATCAAATAGCCCACTTCGAGACATATTAAGCATGAATAAACATTAGATACTATTAAAATCCTATATATTAACAAAGCCAAAAGTTTCAAACTTTACTTTTTCCCAACATTCTTGTGAAATATGACACATCCCAATCTTAACAGATGCTCATTTGGGATACTGTACTTGTGAGTGGAAGTGTGTATATTTGTGTGCAAGTGTGTACTCATATACTTCCACCTTACCACCCTAGAAAGGCATGATGAAAATTTAAGATAGAAGGAAAATATAAATTGAAAAAAAAAAACCTTAACAAATGATTCTGACAAATATCTTCTCTTTCCAGGGAGAATCACTGAGCCAGAATAAAATTGAACACTAAATATTCTAAGAAAAAAGGAATCTAGTTTGTCAAAATGTGACTTGAATTAATAGATAAGGAGAGTCAGATGATAAGAGGGTCAAAATTATGTTTATCTTAGGAAAAGTAGAATAGAAAATTTATAAGCAGATTAAAAACACATAATAAAAGTAGTAAATAATAATGACAGTATCTCAAATCAGTGCAGGGGGGAAAGGCCTACTAATGTGATGGTGGGATAATTGGATAGCAATATGGGAAAAGATATATTTAATTTATTTGCTACACCAAATGCCAGGACAATCTCTAAGTGAATTCAAGACATAACTCTTTTTTCAAAAAAAC
+1	69054	70108	ENST00000335137	1000	+	69090	70008	0,0,0	1	1054	0	OR4F5-201	cmpl	cmpl	0	protein_coding	ENSG00000186092	OR4F5	protein_coding	TCCTGGAATGAATCAACGAGTGAAACGAATAACTCTATGGTGACTGAATTCATTTTTCTGGGTCTCTCTGATTCTCAGGAACTCCAGACCTTCCTATTTATGTTGTTTTTTGTATTCTATGGAGGAATCGTGTTTGGAAACCTTCTTATTGTCATAACAGTGGTATCTGACTCCCACCTTCACTCTCCCATGTACTTCCTGCTAGCCAACCTCTCACTCATTGATCTGTCTCTGTCTTCAGTCACAGCCCCCAAGATGATTACTGACTTTTTCAGCCAGCGCAAAGTCATCTCTTTCAAGGGCTGCCTTGTTCAGATATTTCTCCTTCACTTCTTTGGTGGGAGTGAGATGGTGATCCTCATAGCCATGGGCTTTGACAGATATATAGCAATATGCAAGCCCCTACACTACACTACAATTATGTGTGGCAACGCATGTGTCGGCATTATGGCTGTCACATGGGGAATTGGCTTTCTCCATTCGGTGAGCCAGTTGGCGTTTGCCGTGCACTTACTCTTCTGTGGTCCCAATGAGGTCGATAGTTTTTATTGTGACCTTCCTAGGGTAATCAAACTTGCCTGTACAGATACCTACAGGCTAGATATTATGGTCATTGCTAACAGTGGTGTGCTCACTGTGTGTTCTTTTGTTCTTCTAATCATCTCATACACTATCATCCTAATGACCATCCAGCATCGCCCTTTAGATAAGTCGTCCAAAGCTCTGTCCACTTTGACTGCTCACATTACAGTAGTTCTTTTGTTCTTTGGACCATGTGTCTTTATTTATGCCTGGCCATTCCCCATCAAGTCATTAGATAAATTCCTTGCTGTATTTTATTCTGTGATCACCCCTCTCTTGAACCCAATTATATACACACTGAGGAACAAAGACATGAAGACGGCAATAAGACAGCTGAGAAAATGGGATGCACATTCTAGTGTAAAGTTTTAGATCTTATATAACTGTGAGATTAATCTCAGATAATGACACAAAATATAGTGAAGTTGGTAAGTTATTTAGTAAAGCTCATGAAAATTGTGCCCTCCATTCC
+1	131024	134836	ENST00000442987	1000	+	131023	131023	0,0,0	1	3812	0	CICP27-201	none	none	-1	processed_pseudogene	ENSG00000233750	CICP27	processed_pseudogene	CCCCTTCTCTGGGCCCAAGCCACCTTGGCTGAGGAGGGGGCGAGGAGGTGTGAGCCCCTGCCAGGAACCCCCTGCCCGGACCAAGTGCTCGGCCCCCAGGCCTGCGTTCAGTGAGGCCTCCCGTGGCGTCAGCATGTTCGTGTGGAGGAATGTGGAAGGTCACTCTGCGGCCGTGTTCTCCTGGTACTCCATCCCCTTCCTGACCCCTCCCTGCAGCCACACGAGGCCCAGCAACCTGCCAGTCACTCAGTGGCCTCCAACCAGAGAAAACAACCTGCCAAGTTGGCAGCTGTTGCTCATGAGCGTCCACCAGGTGGGACAGGGAGTGTTGACCCTGGGCGGCCCCCTGGAGCCACCTGCCCTGAAAGCCCAGGGCCCGCAACCCCACACACTTTGGGGTTGGTGGAACCTGGTAAAAGCTCACCTCCCACCATGGAGGAGGAGCCCTGGGCCCCTCAGGGGAGTCCCTGCTGGACAGTGAGACAGAGAATGACCATGATGATGCTTTCCTCTCCATCATGTCTCCTGACACCCAGTTGCCTCTACCACTCAGATGATGTCAGGCCCAGTCCCTCAGTGCCCTGCGCAAGGAACAGGACTCATCTTCTGAGAAGGATGGACGCAGCCCCAACAAATCAGACAAGGACCACATCCGGTGGCCCATGAGTGGCGCTCATGATCTTCAGCAGGCGGCACCAGGCCCTGGCGGGGCGCACCAGGGTCACCCCAACCAGGATAACCGGACCGTCAGCCAGATGCTGAGCGAGCGGTGGTACACCCTGGGGCCCAATGAGATGCAGAAATACAACCTGGCCTTCCAGGTGAAGGTGGCCCACTTGCAACAAGGACCGAAAGAAGTCCAGCTCAGAGGCCAAGCCCACAAGCCAGGGGCTAGCAGGAGTGTAACAAGGGCTCGTGGGAGCGGAGCATATCAGAGACGGGCACTGCCACTGCCCCTGGGGTGTCCTCTGAACTCCTGTCAGTTGCAGCCCAAACACTCCAGAGCTCGGATACCAAGGAGCAGCTTCTGTGGGGCAGAACGGCTGCACACAGTCAGGGAACCTGGCTCAGCCTGGCCCAAGCCTTCTCCCACAGCGGGGTACACAGCCTGGACGGCAGGGAAATAGACCGTCAGGCACTACGGGAACTGACACAGGTGGTGTCTGGCACTGCATCATACTCTGGCCCAAAGCCTTCTACTCAGCATGGAGCTCCAGGCCACTTTGCAGCCCCTGGTGAGGGAGGTGACCCGTGGGCAGCCCTGCTGCCGCCCACGTGAGCTGCTCATTCCCAGCACATGGCCAGCGAGGTCATAGCGAGTGACGAAGAGCACACGGTCATCCATGAGGAGGAGGGGGTGATGATGTCATTGCTGATGATGGCTTTAGCACCACCGACACCGATCTCAAGTTCAAGGAGTGGGTGACCGACTGAGAGTGGGGACAACTCTGGGGAGGAGCCAGAGGGCAACAAGGGCTTTGGTGGGAAGGTATTTGCACCTGTCATTCCTTCCTCCTTTACTCCTGCCGCCCCTTGCTGGATCCTGAGCCCCCAGGGTCCCCCGATCCACCTGCAGCTTTTGGCAGTCTATGGTCACACCCTGTCCTCCTCCTACACATACTCGGATGCTTCCTCCTCAACCTTGGCACCCACCTCCTTCTTACTGGGCCCAGGAGCCTTCAAAGCCCAGGAGTCTGGTCAACGCAGCAGAGCGGGCCCCCTACGGCCCCAACCCCTGGGGATGGGGGCCCAGGGACGCCTTCCAAGGTGGCCTGTTTCCTCCCAATGGATCCTGCCACCTTCTGGTGCAAGAGACCTGAAAGTGTGGGCGACCTGGAGCTACCAGGCTCCTCAGTCATCAGGGTCCCTCCCAACACTAAGGCTTTCCTAGGCAGGAGCTGGGCTGAGCCACCCGGGGGGCAGAGCCTGAAGAGAAACTGACTGGGCTTTCGGGGTCGGGGCAGAGGGAACCCCACGGACATGGACCCCACACTGGAGGACCCCACCGCGCCCAAATGCAAGATGAGAAGATGCTCCAGCTGCAGTCCAAAGCCCAACACCCCCAAGTGTGCCATGTGTGATGGGGACAGCTTCCCCTTTGCCTGTACAGGTGGAGAAGCCGAGGACAGGCTCAGGGAACCGGAGACCAAGAAGGCGCTGTCCTCTTCACTGCATGTACCCTGGACCAGTGCCGGCCCTGATCATGCAGCTCTTCCAGGCCCACTGCTTCTTCCTGTCCACTAGGCCACAGCCGCCCTCCAGGCCCACTATGCACACATCTTCCCCTCCAAGGTTTGTTCTGCCCCTGCCCTGACTCCCAGCCCTGTGGGGGTCCTGACCGCACCTCACCTGGCTCAGACTCTTGACGCTGCCCTGGCTGCCCCACCAGTGCTTCTGCCCGAGAGTCACGTGAGGCTGAGAGTAGGGGCAGGGGCAGCAGTGGTGCCAGTTGGGGGGCGGTCCAGTGGGAGGAGCCTCAGCCTCGCAGGCTGCTCCGTGGGACTGATGACTGCATGATCTTCTGGGCACCTCACGGATCTTCAACTGCAGGTGAAACGGATGCTGGTGGTGGGTGCAGGGCCGCTGGGAGCTGCTGCATGGTTCCCAGAGGCTGGACTGAGGCAGGTGCCAACTGAAGCTGCTGGGGCAGCATGGGCAGGATGTTCTGCACACAAACCTTGGAGAAGAAGATGTGTGCATAGCAGGTCCACTGCTGCTGCCCCTGCCCTGACTCCCAGCCCTGCCTGACCCCACCTCAACCTGCTCAGGCTCTGGCACAACCCTGGCTGCCCTGCCACTGCCTCTGCCCCAGAGTTGGTGCCTTGACAGCCTGGTTGGAAGGGGACACCCCAGCCCTGCCTCAACACCTGGGGGTCTCCATAACTAGCACAGGCAGGTGGGCAACCCCAAAGATCCCAGGACTCACAGTACCCCCTGAGAACATGGACAGTATGTGGGGGTAGCAATGGAGGGCAGGATGGTTATCTTCTCCCAGGTGAAGCCATTTAATCCTTTCAGTTTGGGACGGAGTAAGGCCTTCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGAGACCGAGTCTTGCTCTGTCGCCCAGGCTGGAGTGCAGTGGTGCGATCTTGGCTCACTGCAACCTCTTCCCGCTGGGTTCACGCCATTCTCCTGCCTCAGCCTTCCGGGTAGCTAGGATTACAGGTGGACGCTACCACGTCCGGCTAATTTTTGTATTTTTAGTACAGACGGGGCTTCATCATCTTGGCCAGGCTGATTTCGATCTCCTGACATCGTGATCTGCCTGCCTCCCCCTCCCAAAGTGCTGGGATTACAGGCGTGAGCCACCACGCCTGGCCAAGGCCTGCTCCTCTTATCTATACCCCCTACCCCTGCAGCTGTGCCGGGGGAAAGCTGGGCAGTTTCCCTCCTCCGAGCCCCTGTACATACCATGAATTGTGGGACCTTCAGAGCTTTTCACTTTTCGGAAAATAGCTCCTGCTGGGGCTACAAGATGGAGTGTGAAGAGGGCCTTGGGCCACAGGGAGGCGCCTGTGGACTAGGGGGAGTTCATGCACCCCTTCTTTCCCCAGAGGGGCTGGACTCAGGTGAGTATGGGGGTGGGGGCTCCTGCACTTCGACACAGGCAGCAGGAGGGTTTTCTCCCCATTCCCTCTGCACTCCCAACTTGAGCTATACTTTTTAAGAAAGTGATTCACCCTGCCTTTGCCCCCTTCCCCAGAACAGAACACGTTGATCGTGGGCGATATTTTTCATTGTGCCAAAAAGTTGCCATGACCGTCATTAAACCTGTTTAACAC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/translate_bed.py	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,297 @@
+#!/usr/bin/env python
+"""
+#
+#------------------------------------------------------------------------------
+#                         University of Minnesota
+#         Copyright 2017, Regents of the University of Minnesota
+#------------------------------------------------------------------------------
+# Author:
+#
+#  James E Johnson
+#
+#------------------------------------------------------------------------------
+"""
+
+import argparse
+import re
+import sys
+
+from Bio.Seq import translate
+
+from bedutil import bed_from_line
+
+import digest
+
+from ensembl_rest import get_cdna
+
+from twobitreader import TwoBitFile
+
+
+def __main__():
+    parser = argparse.ArgumentParser(
+        description='Translate from BED')
+    parser.add_argument(
+        'input_bed', default=None,
+        help="BED to translate,  '-' for stdin")
+    pg_seq = parser.add_argument_group('Genomic sequence source')
+    pg_seq.add_argument(
+        '-t', '--twobit', default=None,
+        help='Genome reference sequence in 2bit format')
+    pg_seq.add_argument(
+        '-c', '--column', type=int, default=None,
+        help='Column offset containing genomic sequence' +
+             'between start and stop (-1) for last column')
+    pg_out = parser.add_argument_group('Output options')
+    pg_out.add_argument(
+        '-f', '--fasta', default=None,
+        help='Path to output translations.fasta')
+    pg_out.add_argument(
+        '-b', '--bed', default=None,
+        help='Path to output translations.bed')
+    pg_bed = parser.add_argument_group('BED filter options')
+    pg_bed.add_argument(
+        '-E', '--ensembl', action='store_true', default=False,
+        help='Input BED is in 20 column Ensembl format')
+    pg_bed.add_argument(
+        '-R', '--regions', action='append', default=[],
+        help='Filter input by regions e.g.:'
+             + ' X,2:20000-25000,3:100-500+')
+    pg_bed.add_argument(
+        '-B', '--biotypes', action='append', default=[],
+        help='For Ensembl BED restrict translations to Ensembl biotypes')
+    pg_trans = parser.add_argument_group('Translation filter options')
+    pg_trans.add_argument(
+        '-m', '--min_length', type=int, default=10,
+        help='Minimum length of protein translation to report')
+    pg_trans.add_argument(
+        '-e', '--enzyme', default=None,
+        help='Digest translation with enzyme')
+    pg_trans.add_argument(
+        '-M', '--start_codon', action='store_true', default=False,
+        help='Trim translations to methionine start_codon')
+    pg_trans.add_argument(
+        '-C', '--cds', action='store_true', default=False,
+        help='Only translate CDS')
+    pg_trans.add_argument(
+        '-A', '--all', action='store_true',
+        help='Include CDS protein translations ')
+    pg_fmt = parser.add_argument_group('ID format options')
+    pg_fmt.add_argument(
+        '-r', '--reference', default='',
+        help='Genome Reference Name')
+    pg_fmt.add_argument(
+        '-D', '--fa_db', dest='fa_db', default=None,
+        help='Prefix DB identifier for fasta ID line, e.g. generic')
+    pg_fmt.add_argument(
+        '-s', '--fa_sep', dest='fa_sep', default='|',
+        help='fasta ID separator defaults to pipe char, ' +
+             'e.g. generic|ProtID|description')
+    pg_fmt.add_argument(
+        '-P', '--id_prefix', default='',
+        help='prefix for the sequence ID')
+    parser.add_argument('-v', '--verbose', action='store_true', help='Verbose')
+    parser.add_argument('-d', '--debug', action='store_true', help='Debug')
+    args = parser.parse_args()
+
+    input_rdr = open(args.input_bed, 'r')\
+        if args.input_bed != '-' else sys.stdin
+    fa_wtr = open(args.fasta, 'w')\
+        if args.fasta is not None and args.fasta != '-' else sys.stdout
+    bed_wtr = open(args.bed, 'w') if args.bed is not None else None
+
+    enzyme = digest.expasy_rules.get(args.enzyme, None)
+
+    biotypea = [bt.strip() for biotype in args.biotypes
+                for bt in biotype.split(',')]
+
+    twobit = TwoBitFile(args.twobit) if args.twobit else None
+
+    selected_regions = dict()  # chrom:(start, end)
+    region_pat = '^(?:chr)?([^:]+)(?::(\d*)(?:-(\d+)([+-])?)?)?'
+    if args.regions:
+        for entry in args.regions:
+            if not entry:
+                continue
+            regs = [x.strip() for x in entry.split(',') if x.strip()]
+            for reg in regs:
+                m = re.match(region_pat, reg)
+                if m:
+                    (chrom, start, end, strand) = m.groups()
+                    if chrom:
+                        if chrom not in selected_regions:
+                            selected_regions[chrom] = []
+                        selected_regions[chrom].append([start, end, strand])
+        if args.debug:
+            print >> sys.stderr, "selected_regions: %s" % selected_regions
+
+    def filter_by_regions(bed):
+        if not selected_regions:
+            return True
+        ref = re.sub('^(?i)chr', '', bed.chrom)
+        if ref not in selected_regions:
+            return False
+        for reg in selected_regions[ref]:
+            (_start, _stop, _strand) = reg
+            start = int(_start) if _start else 0
+            stop = int(_stop) if _stop else sys.maxint
+            if _strand and bed.strand != _strand:
+                continue
+            if bed.chromEnd >= start and bed.chromStart <= stop:
+                return True
+        return False
+
+    translations = dict()  # start : end : seq
+
+    def unique_prot(tbed, seq):
+        if tbed.chromStart not in translations:
+            translations[tbed.chromStart] = dict()
+            translations[tbed.chromStart][tbed.chromEnd] = []
+            translations[tbed.chromStart][tbed.chromEnd].append(seq)
+        elif tbed.chromEnd not in translations[tbed.chromStart]:
+            translations[tbed.chromStart][tbed.chromEnd] = []
+            translations[tbed.chromStart][tbed.chromEnd].append(seq)
+        elif seq not in translations[tbed.chromStart][tbed.chromEnd]:
+            translations[tbed.chromStart][tbed.chromEnd].append(seq)
+        else:
+            return False
+        return True
+
+    def get_sequence(chrom, start, end):
+        if twobit:
+            if chrom in twobit:
+                return twobit[chrom][start:end]
+            contig = chrom[3:] if chrom.startswith('chr') else 'chr%s' % chrom
+            if contig in twobit:
+                return twobit[contig][start:end]
+        return None
+
+    def write_translation(tbed, prot):
+        if args.id_prefix:
+            tbed.name = "%s%s" % (args.id_prefix, tbed.name)
+        if bed_wtr:
+            bed_wtr.write("%s\t%s\n" % (str(tbed), prot))
+            bed_wtr.flush()
+        location = "chromosome:%s:%s:%s:%s:%s"\
+            % (args.reference, tbed.chrom,
+               tbed.thickStart, tbed.thickEnd, tbed.strand)
+        fa_desc = '%s%s' % (args.fa_sep, location)
+        fa_db = '%s%s' % (args.fa_db, args.fa_sep) if args.fa_db else ''
+        fa_id = ">%s%s%s\n" % (fa_db, tbed.name, fa_desc)
+        fa_wtr.write(fa_id)
+        fa_wtr.write(prot)
+        fa_wtr.write("\n")
+        fa_wtr.flush()
+
+    def translate_bed(bed):
+        translate_count = 0
+        transcript_id = bed.name
+        refprot = None
+        if not bed.seq:
+            if twobit:
+                bed.seq = get_sequence(bed.chrom, bed.chromStart, bed.chromEnd)
+            else:
+                bed.cdna = get_cdna(transcript_id)
+        cdna = bed.get_cdna()
+        if cdna is not None:
+            cdna_len = len(cdna)
+            if args.cds or args.all:
+                try:
+                    cds = bed.get_cds()
+                    if cds:
+                        if args.debug:
+                            print >> sys.stderr, "cdna:%s" % str(cdna)
+                            print >> sys.stderr, "cds: %s" % str(cds)
+                        if len(cds) % 3 != 0:
+                            cds = cds[:-(len(cds) % 3)]
+                        refprot = translate(cds) if cds else None
+                except:
+                    refprot = None
+                if args.cds:
+                    if refprot:
+                        if args.start_codon:
+                            m = refprot.find('M')
+                            if m < 0:
+                                return 0
+                            elif m > 0:
+                                bed.trim_cds(m*3)
+                                refprot = refprot[m:]
+                        stop = refprot.find('*')
+                        if stop >= 0:
+                            bed.trim_cds((stop - len(refprot)) * 3)
+                            refprot = refprot[:stop]
+                        if len(refprot) >= args.min_length:
+                            write_translation(bed, refprot)
+                            return 1
+                    return 0
+            if args.debug:
+                print >> sys.stderr, "%s\n" % (str(bed))
+                print >> sys.stderr, "CDS: %s %d %d"\
+                    % (bed.strand, bed.cdna_offset_of_pos(bed.thickStart),
+                       bed.cdna_offset_of_pos(bed.thickEnd))
+                print >> sys.stderr, "refprot: %s" % str(refprot)
+            for offset in range(3):
+                seqend = cdna_len - (cdna_len - offset) % 3
+                aaseq = translate(cdna[offset:seqend])
+                aa_start = 0
+                while aa_start < len(aaseq):
+                    aa_end = aaseq.find('*', aa_start)
+                    if aa_end < 0:
+                        aa_end = len(aaseq)
+                    prot = aaseq[aa_start:aa_end]
+                    if args.start_codon:
+                        m = prot.find('M')
+                        aa_start += m if m >= 0 else aa_end
+                        prot = aaseq[aa_start:aa_end]
+                    if enzyme and refprot:
+                        frags = digest._cleave(prot, enzyme)
+                        for frag in reversed(frags):
+                            if frag in refprot:
+                                prot = prot[:prot.rfind(frag)]
+                            else:
+                                break
+                    is_cds = refprot and prot in refprot
+                    if args.debug:
+                        print >> sys.stderr, "is_cds: %s %s"\
+                            % (str(is_cds), str(prot))
+                    if len(prot) < args.min_length:
+                        pass
+                    elif not args.all and is_cds:
+                        pass
+                    else:
+                        tstart = aa_start*3+offset
+                        tend = aa_end*3+offset
+                        prot_acc = "%s_%d_%d" % (transcript_id, tstart, tend)
+                        tbed = bed.trim(tstart, tend)
+                        if args.all or unique_prot(tbed, prot):
+                            translate_count += 1
+                            tbed.name = prot_acc
+                            write_translation(tbed, prot)
+                    aa_start = aa_end + 1
+        return translate_count
+
+    if input_rdr:
+        translation_count = 0
+        transcript_count = 0
+        for i, bedline in enumerate(input_rdr):
+            try:
+                bed = bed_from_line(bedline, ensembl=args.ensembl,
+                                    seq_column=args.column)
+                if bed is None:
+                    continue
+                transcript_count += 1
+                if bed.biotype and biotypea and bed.biotype not in biotypea:
+                    continue
+                if filter_by_regions(bed):
+                    translation_count += translate_bed(bed)
+            except Exception as e:
+                print >> sys.stderr, "BED format Error: line %d: %s\n%s"\
+                    % (bedline, e)
+                break
+        if args.debug or args.verbose:
+            print >> sys.stderr,\
+                "transcripts: %d\ttranslations: %d"\
+                % (transcript_count, translation_count)
+
+
+if __name__ == "__main__":
+    __main__()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/translate_bed.xml	Sun Jan 14 13:52:49 2018 -0500
@@ -0,0 +1,303 @@
+<tool id="translate_bed" name="Translate BED transcripts" version="0.1.0">
+    <description>cDNA in 3frames or CDS</description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <requirements>
+        <expand macro="ensembl_requirements" />
+        <expand macro="bedutil_requirements" />
+        <expand macro="twobit_requirements" />
+    </requirements>
+    <stdio>
+        <exit_code range="1:" />
+    </stdio>
+    <command detect_errors="aggressive"><![CDATA[
+        python '$__tool_directory__/translate_bed.py'  
+            #if $ref.ref_source == 'cached':
+                --twobit='$ref.ref_loc.fields.path'
+            #elif $ref.ref_source == 'history':
+                --twobit='$ref.ref_file'
+            #elif $ref.ref_source == 'last_column':
+                --column '-1'
+            #elif $ref.ref_source == 'select_column':
+                --column ${int(str($ref.seq_column)) - 1}
+            #elif $ref.ref_source == 'ensembl_rest':
+                --ensembl
+            #end if
+            #if $translations.translate == 'CDS':
+                --cds
+            #elif $translations.translate == 'cDNA':
+                --all
+            #end if 
+            $translations.start_codon
+            #if $bed_filters.biotypes:
+                --biotypes '$bed_filters.biotypes'
+                --ensembl
+            #end if
+            #if $bed_filters.regions:
+                --regions '$bed_filters.regions'
+            #end if
+            --min_length $translations.min_length
+            #if $translations.enzyme:
+                --enzyme '$translations.enzyme'
+            #end if
+            #if $fa_id.fa_db:
+               --fa_db='$fa_id.fa_db'
+            #end if
+            #if $fa_id.fa_sep:
+               --fa_sep='$fa_id.fa_sep'
+            #end if
+            #if $fa_id.reference:
+               --reference $fa_id.reference
+            #else:
+               --reference ${input.metadata.dbkey}
+            #end if
+            #if $fa_id.id_prefix:
+               --id_prefix '$fa_id.id_prefix'
+            #end if
+            --bed '$translation_bed'
+            --fasta '$translation_fasta'
+            -v
+        $input
+    ]]></command>
+    <inputs>
+        <param name="input" type="data" format="bed" label="A BED file with 12 columns" 
+               help="thickStart and thickEnd define protein coding region, blocks define exon regions"/>
+        <conditional name="ref">
+            <param name="ref_source" type="select" label="Source for Genomic Sequence Data">
+                <option value="cached">Locally cached twobit</option>
+                <option value="history">History dataset twobit</option>
+                <option value="last_column">Last Column in the BED file</option>
+                <option value="select_column">Select Column in the BED file</option>
+                <option value="ensembl_rest">Retrieve sequences from Ensembl (Slow and only for Ensembl Transcripts)</option>
+            </param>
+            <when value="cached">
+                <param name="ref_loc" type="select" label="Select reference 2bit file">
+                    <options from_data_table="twobit" />
+                </param>
+            </when>
+            <when value="history">
+                <param name="ref_file" type="data" format="twobit" label="reference 2bit file" />
+            </when>
+            <when value="last_column"/>
+            <when value="select_column">
+                <param name="seq_column" type="data_column" data_ref="input" label="BED column conatining the genomic sequence"
+                    help="unspliced genomic sequence from chromStart to chromEnd (Extract Genomic DNA)"/>
+            </when>
+            <when value="ensembl_rest"/>
+        </conditional>
+        <section name="bed_filters" expanded="false" title="BED Filtering Options">
+            <param name="regions" type="text" value="" optional="true" label="Restrict to features overlapping a comma-separated list of regions" >
+                <help>Each region is specifed as: chr or chr:pos or chr:from-to</help>
+                <validator type="regex" message="">^(\w+(:\d+(-\d+)?)?(,\w+(:\d+(-\d+)?)?)*)?$</validator>
+            </param>
+            <param name="biotypes" type="text" value="" optional="true" label="Restrict Feature translation to these biotypes" 
+                   help="For 20 column BED from Ensembl REST server">
+                <expand macro="biotypes_help" />
+            </param>
+        </section>
+        <section name="translations" expanded="false" title="Translation  Options">
+            <param name="translate" type="select" label="Feature translation">
+                <option value="cDNA_minus_CDS">cDNA in 3 frames excluding known CDS</option>
+                <option value="cDNA">cDNA in 3 frames</option>
+                <option value="CDS">CDS proteins</option>
+            </param>
+            <param name="min_length" type="integer" value="10" min="1" label="Minimum length of protein translation to report"/>
+            <param name="start_codon" type="boolean" truevalue="--start_codon" falsevalue="" checked="false" 
+                    label="Require translations to start with Methionine, trim other leading Amino Acids"/>
+            <param name="enzyme" type="select" optional="true" label="Digest enzyme" 
+                 help="Split the protein into peptides according to enzyme digestion">
+                <option value="trypsin">trypsin:       ([KR](?=[^P]))|((?&lt;=W)K(?=P))|((?&lt;=M)R(?=P))</option>
+            </param>
+        </section>
+        <section name="fa_id" expanded="false" title="Fasta ID Options">
+            <param name="reference" type="text" value="" optional="true" label="Genome reference name"
+                   help="By default, the input bed dataset metadata will be used."/>
+            <param name="fa_db" type="text" value="" optional="true" label="fasta ID source, e.g. generic"
+                   help="Any Compomics application such as PeptideShaker, requires a source for non reference proteins of 'generic' e.g.: generic|pep1|peptide description">
+            </param>
+            <param name="fa_sep" type="text" value="" optional="true" label="fasta ID line separator character"
+                   help="defaults to the pipe character, Ensembl FASTA files usually use a space character">
+            </param>
+            <param name="id_prefix" type="text" value="" optional="true" label="ID prefix for generated IDs"
+                   help="Can be used to distinguish samples">
+                <validator type="regex" message="Allowed chars:a-z A-Z 0-9 _ - |">^[a-zA-Z0-9_-|]*$</validator>
+            </param>
+        </section>
+    </inputs>
+    <outputs>
+        <data name="translation_bed" format="bed">
+            <actions>
+                <action name="column_names" type="metadata" 
+                 default="chrom,chromStart,chromEnd,name,score,strand,thickStart,thickEnd,itemRgb,blockCount,blockSizes,blockStarts,peptideSequence"/>
+            </actions>
+        </data>
+        <data name="translation_fasta" format="fasta"/>
+    </outputs>
+    <tests>
+        <test>
+            <param name="input" value="human_transcripts.bed" ftype="bed12"/>
+            <param name="ref_source" value="ensembl_rest"/>
+            <param name="translate" value="cDNA_minus_CDS"/>
+            <output name="translation_bed">
+                <assert_contents>
+                    <has_text text="ENST00000641515" />
+                </assert_contents>
+            </output>
+            <output name="translation_fasta">
+                <assert_contents>
+                    <has_text text=">ENST00000641515" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <param name="input" value="human_transcripts_seq.bed" ftype="bed12"/>
+            <param name="ref_source" value="last_column"/>
+            <param name="translate" value="cDNA_minus_CDS"/>
+            <output name="translation_bed">
+                <assert_contents>
+                    <has_text text="ENST00000488147" />
+                    <has_text text="FLLSSLLIGVPFCTSPHSCFSMFFGRSKAALTAKLTLMRV" />
+                </assert_contents>
+            </output>
+            <output name="translation_fasta">
+                <assert_contents>
+                    <has_text text="ENST00000488147" />
+                    <has_text text="FLLSSLLIGVPFCTSPHSCFSMFFGRSKAALTAKLTLMRV" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <param name="input" value="human_transcripts_seq.bed" ftype="bed12"/>
+            <param name="ref_source" value="last_column"/>
+            <param name="translate" value="CDS"/>
+            <output name="translation_bed">
+                <assert_contents>
+                    <has_text text="ENST00000641515" />
+                    <has_text text="MVTEFIFLGLSDSQELQTFLFMLFFVFY" />
+                </assert_contents>
+            </output>
+            <output name="translation_fasta">
+                <assert_contents>
+                    <has_text text="ENST00000641515" />
+                    <has_text text="MVTEFIFLGLSDSQELQTFLFMLFFVFY" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <param name="input" value="human_transcripts_seq.bed" ftype="bed12"/>
+            <param name="ref_source" value="last_column"/>
+            <param name="translate" value="cDNA_minus_CDS"/>
+            <param name="biotypes" value="protein_coding"/>
+            <param name="start_codon" value="False"/>
+            <param name="fa_db" value="generic"/>
+            <param name="id_prefix" value="test_"/>
+            <output name="translation_bed">
+                <assert_contents>
+                    <has_text text="generic|test_ENST00000641515" />
+                    <has_text text="ELPHTLPQFIFQQLVCYILEYRYKVIMLSKYSFANS" />
+                </assert_contents>
+            </output>
+            <output name="translation_fasta">
+                <assert_contents>
+                    <has_text text="test_ENST00000641515" />
+                    <has_text text="ELPHTLPQFIFQQLVCYILEYRYKVIMLSKYSFANS" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <param name="input" value="human_transcripts_seq.bed" ftype="bed12"/>
+            <param name="ref_source" value="last_column"/>
+            <param name="translate" value="cDNA_minus_CDS"/>
+            <param name="biotypes" value="protein_coding"/>
+            <param name="start_codon" value="True"/>
+            <param name="fa_db" value="generic"/>
+            <param name="id_prefix" value="test_"/>
+            <output name="translation_bed">
+                <assert_contents>
+                    <has_text text="test_ENST00000641515" />
+                    <has_text text="MLSKYSFANS" />
+                    <not_has_text text="ELPHTLPQFIFQQLVCYILEYRYKVIMLSKYSFANS" />
+                </assert_contents>
+            </output>
+            <output name="translation_fasta">
+                <assert_contents>
+                    <has_text text="generic|test_ENST00000641515" />
+                    <has_text text="MLSKYSFANS" />
+                    <not_has_text text="ELPHTLPQFIFQQLVCYILEYRYKVIMLSKYSFANS" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <param name="input" value="human_transcripts.bed" ftype="bed12"/>
+            <param name="ref_source" value="history"/>
+            <param name="ref_file" value="GRCh38.1.2bit" ftype="twobit"/>
+            <param name="translate" value="cDNA_minus_CDS"/>
+            <param name="regions" value="1:0-30000"/>
+            <param name="start_codon" value="True"/>
+            <param name="fa_db" value="generic"/>
+            <param name="id_prefix" value="test_"/>
+            <output name="translation_bed">
+                <assert_contents>
+                    <has_text text="test_ENST00000488147" />
+                    <has_text text="MAPSSRAPRTLACRDAPATGSRASTAPWTSGPCRRS" />
+                    <not_has_text text="ENST00000335137" />
+                </assert_contents>
+            </output>
+            <output name="translation_fasta">
+                <assert_contents>
+                    <has_text text="generic|test_ENST00000488147" />
+                    <has_text text="MAPSSRAPRTLACRDAPATGSRASTAPWTSGPCRRS" />
+                    <not_has_text text="ENST00000335137" />
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+    <help><![CDATA[
+Translate transcripts from the input BED file into protein sequences.  
+
+The genomic sequence:
+
+  - may be supplied in an extra column in the BED input file
+  - retrieved from a twobit genomic reference file  
+  - retrieved from the Ensembl REST API for Ensembl transcripts
+
+
+**INPUTS**
+
+  - BED file with at least the standard 12 columns
+  - Genome reference in twobit format (optional)
+
+
+**OUTPUTS**
+
+  - FASTA of transcript translations
+  - BED with the genomic location of the translated protein.  The added 13th column contains the protein sequence.
+
+
+**OPTIONS**
+
+  - Feature translation
+
+    - cDNA - three frame translations of the cDNA sequences with an output for each sequence between STOP codons
+    - CDS - three frame translations of CDS (coding sequence defined by thickStart and thickEnd in the BED file)  
+
+  - Translation filtering
+
+    - can be trimmed to a Methionine start codon
+    - can be split into peptides by an enzyme digestion
+    - must exceed specified minimum length
+
+
+  - BED Filtering
+
+    - genomic regions 
+    - ensembl biotype if the BED contains the 20 columns as retrieved from the Ensembl REST API
+  
+
+    ]]></help>
+    <citations>
+        <citation type="doi">10.1093/bioinformatics/btu613</citation>
+        <citation type="doi">10.1093/nar/gku1010</citation>
+    </citations>
+</tool>