code: def GeneReader( fh, format='gff' ):
      known_formats = ( 'gff', 'gtf', 'bed')
      if format not in known_formats: 
          print('%s format not in %s' % (format, ",".join( known_formats )), file=sys.stderr)
          raise Exception('?')
      if format == 'bed':
          for line in fh:    
              f = line.strip().split()
              chrom = f[0]
              chrom_start = int(f[1])
              name = f[4]
              strand = f[5]
              cdsStart = int(f[6])
              cdsEnd = int(f[7])
              blockCount = int(f[9])
              blockSizes = [ int(i) for i in f[10].strip(',').split(',') ]
              blockStarts = [ chrom_start + int(i) for i in f[11].strip(',').split(',') ]
              gene_exons = []
              for base,offset in zip( blockStarts, blockSizes ):
                  exon_start = base
                  exon_end = base+offset
                  gene_exons.append( (exon_start, exon_end) )
              yield chrom, strand, gene_exons, name
      genelist = {}
      grouplist = []
      if format == 'gff' or format == 'gtf':
          for line in fh:
              if line.startswith('
              fields = line.strip().split('\t')
              if len( fields ) < 9: continue
              chrom = fields[0]
              ex_st = int( fields[3] ) - 1
              ex_end = int( fields[4] )
              strand = fields[6]
              if format == 'gtf':
                  group = fields[8].split(';')[0]
              else:
                  group = fields[8]
              if group not in grouplist: grouplist.append( group )
              if group not in genelist:
                  genelist[group] = (chrom, strand, [])
              exons_i = 2
              genelist[group][exons_i].append( ( ex_st, ex_end ) )
          sp = lambda a,b: cmp( a[0], b[0] )
          for gene in grouplist:
              chrom, strand, gene_exons = genelist[ gene ]
              gene_exons = bitset_union( gene_exons )
              yield chrom, strand, gene_exons, gene