Return the molecule in cartesian coordinates.

        Raises an :class:`~exceptions.InvalidReference` exception,
        if the reference of the i-th atom is undefined.

        Args:
            None

        Returns:
            Cartesian: Reindexed version of the zmatrix.

def get_cartesian(self):
        """Return the molecule in cartesian coordinates.

        Raises an :class:`~exceptions.InvalidReference` exception,
        if the reference of the i-th atom is undefined.

        Args:
            None

        Returns:
            Cartesian: Reindexed version of the zmatrix.
        """
        def create_cartesian(positions, row):
            xyz_frame = pd.DataFrame(columns=['atom', 'x', 'y', 'z'],
                                     index=self.index[:row], dtype='f8')
            xyz_frame['atom'] = self.loc[xyz_frame.index, 'atom']
            xyz_frame.loc[:, ['x', 'y', 'z']] = positions[:row]
            from chemcoord.cartesian_coordinates.cartesian_class_main \
                import Cartesian
            cartesian = Cartesian(xyz_frame, metadata=self.metadata)
            return cartesian

        c_table = self.loc[:, ['b', 'a', 'd']]
        c_table = c_table.replace(constants.int_label)
        c_table = c_table.replace({k: v for v, k in enumerate(c_table.index)})
        c_table = c_table.values.astype('i8').T

        C = self.loc[:, ['bond', 'angle', 'dihedral']].values.T
        C[[1, 2], :] = np.radians(C[[1, 2], :])

        err, row, positions = transformation.get_X(C, c_table)
        positions = positions.T

        if err == ERR_CODE_InvalidReference:
            rename = dict(enumerate(self.index))
            i = rename[row]
            b, a, d = self.loc[i, ['b', 'a', 'd']]
            cartesian = create_cartesian(positions, row)
            raise InvalidReference(i=i, b=b, a=a, d=d,
                                   already_built_cartesian=cartesian)
        elif err == ERR_CODE_OK:
            return create_cartesian(positions, row + 1)