'Morph the label.
Useful for transforming a label from one subject to another.
Parameters
subject_from : str | None
The name of the subject of the current label. If None, the
initial subject will be taken from self.subject.
subject_to : str
The name of the subject to morph the label to. This will
be put in label.subject of the output label file.
smooth : int
Number of iterations for the smoothing of the surface data.
Cannot be None here since not all vertices are used.
grade : int, list (of two arrays), array, or None
Resolution of the icosahedral mesh (typically 5). If None, all
vertices will be used (potentially filling the surface). If a list,
values will be morphed to the set of vertices specified in grade[0]
and grade[1], assuming that these are vertices for the left and
right hemispheres. Note that specifying the vertices (e.g.,
``grade=[np.arange(10242), np.arange(10242)]`` for fsaverage on a
standard grade 5 source space) can be substantially faster than
computing vertex locations. If one array is used, it is assumed
that all vertices belong to the hemisphere of the label. To create
a label filling the surface, use None.
subjects_dir : string, or None
Path to SUBJECTS_DIR if it is not set in the environment.
n_jobs : int
Number of jobs to run in parallel.
verbose : bool, str, int, or None
If not None, override default verbose level (see
:func:`mne.verbose` and :ref:`Logging documentation <tut_logging>`
for more).
Returns
label : instance of Label
The morphed label.
Notes
This function will set label.pos to be all zeros. If the positions
on the new surface are required, consider using `mne.read_surface`
with `label.vertices`.'

@verbose
def morph(self, subject_from=None, subject_to=None, smooth=5, grade=None, subjects_dir=None, n_jobs=1, verbose=None):

    subject_from = _check_subject(self.subject, subject_from)
    if (not isinstance(subject_to, string_types)):
        raise TypeError('"subject_to"    must    be    entered    as    a    string')
    if (not isinstance(smooth, int)):
        raise TypeError('smooth    must    be    an    integer')
    if np.all((self.values == 0)):
        raise ValueError('Morphing    label    with    all    zero    values    will    result    in    the    label    having    no    vertices.    Consider    using    something    like    label.values.fill(1.0).')
    if isinstance(grade, np.ndarray):
        if (self.hemi == 'lh'):
            grade = [grade, np.array([], int)]
        else:
            grade = [np.array([], int), grade]
    if (self.hemi == 'lh'):
        vertices = [self.vertices, np.array([], int)]
    else:
        vertices = [np.array([], int), self.vertices]
    data = self.values[:, np.newaxis]
    stc = SourceEstimate(data, vertices, tmin=1, tstep=1, subject=subject_from)
    stc = morph_data(subject_from, subject_to, stc, grade=grade, smooth=smooth, subjects_dir=subjects_dir, warn=False, n_jobs=n_jobs)
    inds = np.nonzero(stc.data)[0]
    self.values = stc.data[inds, :].ravel()
    self.pos = np.zeros((len(inds), 3))
    if (self.hemi == 'lh'):
        self.vertices = stc.vertices[0][inds]
    else:
        self.vertices = stc.vertices[1][inds]
    self.subject = subject_to
    return self
