def set_quantum_sys(self):
        """
        Initialize quantum propagator
        :param self:
        :return:
        """
        omega = 1.

        self.quant_sys = SplitOpWignerMoyal(
            t=0,
            dt=0.05,
            x_grid_dim=256,
            x_amplitude=10.,
            p_grid_dim=256,
            p_amplitude=10.,

            # kinetic energy part of the hamiltonian
            k=lambda p: 0.5 * p**2,

            # potential energy part of the hamiltonian
            v=lambda x: 0.5 * (omega * x)**2,

            # these functions are used for evaluating the Ehrenfest theorems
            x_rhs=lambda p: p,
            p_rhs=lambda x, p: -omega**2 * x,
        )

        # set randomised initial condition
        sigma = np.random.uniform(1., 3.)
        p0 = np.random.uniform(-3., 3.)
        x0 = np.random.uniform(-3., 3.)

        self.quant_sys.set_wignerfunction(lambda x, p: np.exp(-sigma * (
            x - x0)**2 - (1. / sigma) * (p - p0)**2))
        # kinetic energy part of the hamiltonian
        K="0.5 * {P} ** 2",

        # potential energy part of the hamiltonian
        V="0.5 * {X} ** 4",
    )

    print("Calculating the Gibbs state...")
    gibbs_state = SplitOpWignerBloch(**qsys_params).get_thermal_state()

    # Propagate this state via the Wigner-Moyal equation

    print(
        "Check that the obtained Gibbs state is stationary under the Wigner-Moyal propagation..."
    )
    propagator = SplitOpWignerMoyal(**qsys_params)
    final_state = propagator.set_wignerfunction(gibbs_state).propagate(3000)

    ##############################################################################
    #
    #   Plot the results
    #
    ##############################################################################

    from wigner_normalize import WignerSymLogNorm

    # save common plotting parameters
    plot_params = dict(
        origin='lower',
        extent=[
            propagator.X.min(),