def METHOD_NAME(self, axis="all", dx=0.1):
    """
    ???
    :param axis: ???
    :type axis: ???
    :param dx: ???
    :type dx: ???
    :return: ???
    :rtype: ???
    """
    tth, I = self.ai.xrpd(self.img, max(self.shape))
    dI = SGModule.getSavitzkyGolay(I, npoints=5, degree=2, order=1)\
        / (tth[1] - tth[0])
    dImg = self.reconstruct(tth, dI)
    f = self.ai.getFit2D()
    _tth2d_ref = self.ai.twoThetaArray(self.shape)  # useless variable ???
    keys = ["centerX", "centerY", "tilt", "tiltPlanRotation"]
    if axis != "all":
        keys = [i for i in keys if i == axis]
    grad = {}
    for key in keys:
        fp = f.copy()
        fp[key] += dx
        ap = AzimuthalIntegrator()
        ap.setFit2D(**fp)
        dtth = (ap.twoThetaArray(self.shape)
                - self.ai.twoThetaArray(self.shape)) / dx
        grad[key] = (dtth * dImg).sum()
    if axis == "all":
        return grad
    else:
        return grad[axis]