'Append new channels to the instance.
Parameters
add_list : list
A list of objects to append to self. Must contain all the same
type as the current object
force_update_info : bool
If True, force the info for objects to be appended to match the
values in `self`. This should generally only be used when adding
stim channels for which important metadata won\'t be overwritten.
.. versionadded:: 0.12
Returns
inst : instance of Raw, Epochs, or Evoked
The modified instance.'

def add_channels(self, add_list, force_update_info=False):

    from ..io import BaseRaw, _merge_info
    from ..epochs import BaseEpochs
    if (not isinstance(add_list, (list, tuple))):
        raise AssertionError('Input    must    be    a    list    or    tuple    of    objs')
    if (not all(([inst.preload for inst in add_list] + [self.preload]))):
        raise AssertionError('All    data    must    be    preloaded')
    if isinstance(self, BaseRaw):
        con_axis = 0
        comp_class = BaseRaw
    elif isinstance(self, BaseEpochs):
        con_axis = 1
        comp_class = BaseEpochs
    else:
        con_axis = 0
        comp_class = type(self)
    if (not all((isinstance(inst, comp_class) for inst in add_list))):
        raise AssertionError('All    input    data    must    be    of    same    type')
    data = [inst._data for inst in ([self] + add_list)]
    compare_axes = [i for i in range(data[0].ndim) if (i != con_axis)]
    shapes = np.array([dat.shape for dat in data])[:, compare_axes]
    if (not ((shapes[0] - shapes) == 0).all()):
        raise AssertionError('All    dimensions    except    channels    must    match')
    data = np.concatenate(data, axis=con_axis)
    infos = ([self.info] + [inst.info for inst in add_list])
    new_info = _merge_info(infos, force_update_to_first=force_update_info)
    self._data = data
    self.info = new_info
    if isinstance(self, BaseRaw):
        self._cals = np.concatenate([getattr(inst, '_cals') for inst in ([self] + add_list)])
    return self
