Concatenate visibility measurement sets.

    invises (list of str)
      Paths to the input measurement sets
    outvis (str)
      Path to the output measurement set.
    timesort (boolean)
      If true, sort the output in time after concatenation.

    Example::

      from pwkit.environments.casa import tasks
      tasks.concat(['epoch1.ms', 'epoch2.ms'], 'combined.ms')

def concat(invises, outvis, timesort=False):
    """Concatenate visibility measurement sets.

    invises (list of str)
      Paths to the input measurement sets
    outvis (str)
      Path to the output measurement set.
    timesort (boolean)
      If true, sort the output in time after concatenation.

    Example::

      from pwkit.environments.casa import tasks
      tasks.concat(['epoch1.ms', 'epoch2.ms'], 'combined.ms')

    """
    tb = util.tools.table()
    ms = util.tools.ms()

    if os.path.exists(outvis):
        raise RuntimeError('output "%s" already exists' % outvis)

    for invis in invises:
        if not os.path.isdir(invis):
            raise RuntimeError('input "%s" does not exist' % invis)

    tb.open(b(invises[0]))
    tb.copy(b(outvis), deep=True, valuecopy=True)
    tb.close()

    ms.open(b(outvis), nomodify=False)

    for invis in invises[1:]:
        ms.concatenate(msfile=b(invis), freqtol=b(concat_freqtol),
                        dirtol=b(concat_dirtol))

    ms.writehistory(message=b'taskname=tasklib.concat', origin=b'tasklib.concat')
    ms.writehistory(message=b('vis = ' + ', '.join(invises)), origin=b'tasklib.concat')
    ms.writehistory(message=b('timesort = ' + 'FT'[int(timesort)]), origin=b'tasklib.concat')

    if timesort:
        ms.timesort()

    ms.close()