def test_fw_posterior_quad(ref_method, data_fw_cctbx, data_fw_mcmc):
    """
    Test the _french_wilson_posterior_quad function directly against cctbx output.
    The cctbx implementations can be found
     - `acentric <https://github.com/cctbx/cctbx_project/blob/8db5aedd7d0897bcea82b9c8dc2d21976437435f/cctbx/french_wilson.py#L92>`_
     - `centric <https://github.com/cctbx/cctbx_project/blob/8db5aedd7d0897bcea82b9c8dc2d21976437435f/cctbx/french_wilson.py#L128>`_
    """
    if ref_method == 'cctbx':
        I, SigI, Sigma, J, SigJ, F, SigF, Centric = data_fw_cctbx.to_numpy(
            np.float64).T
        Centric = Centric.astype(np.bool)
        rtol = 0.06
        rs_J, rs_SigJ, rs_F, rs_SigF = _french_wilson_posterior_quad(
            I, SigI, Sigma, Centric)
    elif ref_method == 'mcmc':
        I, SigI, Sigma, J, SigJ, F, SigF, Centric = data_fw_mcmc.to_numpy(
            np.float64).T
        Centric = Centric.astype(np.bool)
        rtol = 0.025
        rs_J, rs_SigJ, rs_F, rs_SigF = _french_wilson_posterior_quad(
            I, SigI, Sigma, Centric)
    elif ref_method == 'mcmc vs cctbx':
        I, SigI, Sigma, J, SigJ, F, SigF, Centric = data_fw_mcmc.to_numpy(
            np.float64).T
        Centric = Centric.astype(np.bool)
        _, _, _, rs_J, rs_SigJ, rs_F, rs_SigF, _ = data_fw_cctbx.to_numpy(
            np.float64).T
        rtol = 0.06

    assert np.allclose(rs_J, J, rtol=rtol)
    assert np.allclose(rs_SigJ, SigJ, rtol=rtol)
    assert np.allclose(rs_F, F, rtol=rtol)
    assert np.allclose(rs_SigF, SigF, rtol=rtol)
from reciprocalspaceship.algorithms.scale_merged_intensities import _french_wilson_posterior_quad
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

data_fw_mcmc = pd.read_csv("fw_mcmc_data.csv")
I,SigI,Sigma,J,SigJ,F,SigF,Centric = data_fw_mcmc.to_numpy(np.float64).T

Centric = Centric.astype(np.bool)
rs_J,rs_SigJ,rs_F,rs_SigF = _french_wilson_posterior_quad(I, SigI, Sigma, Centric)

#All the plots
plt.plot(J, rs_J, 'k.', label='Acentric')
plt.plot(J[Centric], rs_J[Centric], 'r.', label='Centric')
plt.xlabel("MCMC J")
plt.ylabel("rs J")
plt.legend()
plt.savefig("J.png")

plt.figure()
plt.plot(F, rs_F, 'k.', label='Acentric')
plt.plot(F[Centric], rs_F[Centric], 'r.', label='Centric')
plt.xlabel("MCMC F")
plt.ylabel("rs F")
plt.legend()
plt.savefig("F.png")

plt.figure()
plt.plot(I/SigI, 100.*(rs_F - F)/F, 'k.', alpha=0.1, label='Acentric')
plt.plot((I/SigI)[Centric], (100.*(rs_F - F)/F)[Centric], 'r.', alpha=0.1, label='Centric')
plt.legend()
def _centric_posterior(Iobs, SigIobs, Sigma, npoints=200):
    return _french_wilson_posterior_quad(Iobs, SigIobs, Sigma, True, npoints)