code: def tile_interval( sources, index, ref_src, start, end, seq_db=None ):
      assert sources[0].split('.')[0] == ref_src.split('.')[0], \
          "%s != %s" % ( sources[0].split('.')[0], ref_src.split('.')[0] )
      base_len = end - start
      blocks = index.get( ref_src, start, end )
      blocks.sort(key=lambda t: t.score)
      mask = [ -1 ] * base_len
      ref_src_size = None
      for i, block in enumerate( blocks ):
          ref = block.get_component_by_src_start( ref_src )
          ref_src_size = ref.src_size
          assert ref.strand == "+"
          slice_start = max( start, ref.start )
          slice_end = min( end, ref.end )
          for j in range( slice_start, slice_end ):
              mask[j-start] = i
      tiled = []
      for i in range( len( sources ) ):
          tiled.append( [] )
      for ss, ee, index in intervals_from_mask( mask ):
          if index < 0:
              if seq_db:
                  tiled[0].append( bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).get( start+ss, ee-ss ) )
              else:
                  tiled[0].append( "N" * (ee-ss) )
              for row in tiled[1:]:
                  row.append( "-" * ( ee - ss ) )
          else:
              slice_start = start + ss
              slice_end = start + ee
              block = blocks[index]
              ref = block.get_component_by_src_start( ref_src )
              sliced = block.slice_by_component( ref, slice_start, slice_end )
              sliced = sliced.limit_to_species( sources )
              sliced.remove_all_gap_columns()
              for i, src in enumerate( sources ):
                  comp = sliced.get_component_by_src_start( src )
                  if comp:
                      tiled[i].append( comp.text )
                  else:
                      tiled[i].append( "-" * sliced.text_size )
      return [ "".join( t ) for t in tiled ]