def METHOD_NAME(obj):
    """
    Convert a single version 13 object instance to the equivalent version 14 object,
    including metadata.
    """
    assert isinstance(
        obj,
        (
            Root13,
            Metadata13,
            Array13,
            PointList13,
            PointListArray13,
            Calibration13,
            DataCube13,
            DiffractionSlice13,
            VirtualDiffraction13,
            RealSlice13,
            VirtualImage13,
            Probe13,
            QPoints13,
            BraggVectors13,
        ),
    ), f"obj must be a v13 class instance, not type {type(obj)}"
    if isinstance(obj, Root13):
        x = Root(name=obj.name)
    elif isinstance(obj, Calibration13):
        x = Calibration(name=obj.name)
        x._params.update(obj._params)
    elif isinstance(obj, DataCube13):
        x = DataCube(name=obj.name, data=obj.data, slicelabels=obj.slicelabels)
    elif isinstance(obj, DiffractionSlice13):
        if obj.is_stack:
            data = np.rollaxis(obj.data, axis=2)
        else:
            data = obj.data
        x = DiffractionSlice(
            name=obj.name, data=data, units=obj.units, slicelabels=obj.slicelabels
        )
    elif isinstance(obj, VirtualDiffraction13):
        x = VirtualDiffraction(name=obj.name, data=obj.data)
    elif isinstance(obj, RealSlice13):
        if obj.is_stack:
            data = np.rollaxis(obj.data, axis=2)
        else:
            data = obj.data
        x = RealSlice(
            name=obj.name, data=data, units=obj.units, slicelabels=obj.slicelabels
        )
        pass
    elif isinstance(obj, VirtualImage13):
        x = VirtualImage(name=obj.name, data=obj.data)
        pass
    elif isinstance(obj, Probe13):
        from py4DSTEM.braggvectors import Probe
        x = Probe(name=obj.name, data=obj.data)
    elif isinstance(obj, QPoints13):
        x = PointList(name=obj.name, data=obj.data)
    elif isinstance(obj, BraggVectors13):
        from py4DSTEM.braggvectors import BraggVectors
        x = BraggVectors(name=obj.name, Rshape=obj.Rshape, Qshape=obj.Qshape)
        x._v_uncal = obj._v_uncal
        if hasattr(obj, "_v_cal"):
            x._v_cal = obj._v_cal
    elif isinstance(obj, Metadata13):
        x = Metadata(name=obj.name)
        x._params.update(obj._params)
    elif isinstance(obj, Array13):
        # prepare arguments
        if obj.is_stack:
            data = np.rollaxis(obj.data, axis=2)
        else:
            data = obj.data
        args = {"name": obj.name, "data": data}
        if hasattr(obj, "units"):
            args["units"] = obj.units
        if hasattr(obj, "dim_names"):
            args["dim_names"] = obj.dim_names
        if hasattr(obj, "dim_units"):
            args["dim_units"] = obj.dim_units
        if hasattr(obj, "slicelabels"):
            args["slicelabels"] = obj.slicelabels
        if hasattr(obj, "dims"):
            dims = []
            for dim in obj.dims:
                dims.append(dim)
            args["dims"] = dims
        # get the array
        x = Array(**args)
    elif isinstance(obj, PointList13):
        x = PointList(name=obj.name, data=obj.data)
    elif isinstance(obj, PointListArray13):
        x = PointListArray(name=obj.name, dtype=obj.dtype, shape=obj.shape)
        for idx, jdx in tqdmnd(
            x.shape[0],
            x.shape[1],
            desc="transferring PointListArray v13->14",
            unit="foolishness",
        ):
            x[idx, jdx] = obj[idx, jdx]
    else:
        raise Exception(f"Unexpected object type {type(obj)}")
    # Handle metadata
    if hasattr(obj, "metadata"):
        for key in obj.metadata.keys():
            md = obj.metadata[key]
            dm = Metadata(name=md.name)
            dm._params.update(md._params)
            x.metadata = dm
    # Return
    return x