code: def transform(elem, chain_CT_CQ, max_gap):
      (chain, CT, CQ) = chain_CT_CQ
      start, end = max(elem['start'], chain.tStart) - chain.tStart, min(elem['end'], chain.tEnd) - chain.tStart
      assert np.all( (CT[:,1] - CT[:,0]) == (CQ[:,1] - CQ[:,0]) )
      to_chrom = chain.qName
      to_gab_start = chain.qStart
      start_idx = np.where( CT[:,1] > start )[0][0]
      end_idx = np.where( CT[:,0] < end )[0][-1]
      if start_idx > end_idx:
          return []
      if max_gap >= 0 and start_idx < end_idx - 1:
          if np.max(CT[(start_idx+1):end_idx,0] - CT[start_idx:(end_idx-1),1]) > max_gap or np.max(CQ[(start_idx+1):end_idx,0] - CQ[start_idx:(end_idx-1),1]) > max_gap:
              return []
      assert start < CT[start_idx, 1]
      assert  CT[end_idx, 0] < end
      to_start = CQ[start_idx, 0] + max(0, start - CT[start_idx,0])
      to_end = CQ[end_idx, 1] - max(0, CT[end_idx, 1] - end)
      if start_idx == end_idx:
          slices = [(to_start, to_end)]
      else:
          slices = [(to_start, CQ[start_idx,1])]
          slices += [(CQ[i,0], CQ[i,1]) for i in range(start_idx+1, end_idx)]
          slices.append( (CQ[end_idx,0], to_end) )
      if chain.qStrand == '-':
          Sz = chain.qEnd - chain.qStart
          slices =  [(Sz-t[1], Sz-t[0]) for t in slices]
      return [(to_chrom, to_gab_start + t[0], to_gab_start + t[1], elem['id']) for t in slices]