def do_n_fits_register(nfits, xsh, ysh, imsize, usfac=10,
        return_error=False, **kwargs):
    """
    Test code

    Parameters
    ----------
    nfits : int
        Number of times to perform fits
    xsh : float
        X shift from input to output image
    ysh : float
        Y shift from input to output image
    imsize : int
        Size of image (square)
    """
    offsets = []
    for ii in xrange(nfits):
        im1,im2,temp = make_offset_images(xsh, ysh, imsize, **kwargs)
        xoff,yoff,reg = register_images(
            im1, im2,
            return_registered=True, usfac=usfac)
        chi2 = ((im1-reg)**2).sum() / im1.size
        offsets.append([xoff,yoff,chi2])

    return offsets
def compare_methods(im1,im2, ntests=100, noise=np.std,
        usfac=201, **kwargs):
    """
    Perform tests with noise added to determine the errors on the 
    'best-fit' offset

    Parameters
    ----------
    usfac : int
        upsampling factor; governs accuracy of fit (1/usfac is best accuracy)
    ntests : int
        Number of tests to run
    noise : func or real
        Either a function to apply to im2 to determine the noise to use, or
        a fixed noise level
    """

    try:
        noise = noise(im2)
    except TypeError:
        pass

    try: 
        import progressbar
        widgets = [progressbar.FormatLabel('Processed: %(value)d offsets in %(elapsed)s'), progressbar.Percentage()]
        progress = progressbar.ProgressBar(widgets=widgets)
    except ImportError:
        def progress(x):
            yield x

    offsets = []
    eoffsets = []
    for test_number in progress(xrange(ntests)):
        extra_noise = np.random.randn(*im2.shape) * noise
        dxr, dyr, edxr, edyr = register_images(im1, im2+extra_noise, usfac=usfac,
                return_error=True, **kwargs)
        dxccs, dyccs, edxccs, edyccs = cross_correlation_shifts(im1,
                im2+extra_noise,
                errim2=im2*0+extra_noise.std(),
                return_error=True, **kwargs)
        # too slow!!!
        dxccg, dyccg, edxccg, edyccg = 0,0,0,0
        #dxccg, dyccg, edxccg, edyccg = cross_correlation_shifts(im1,
        #        im2+extra_noise, return_error=True, gaussfit=True,
        #        **kwargs)
        dxchi, dychi, edxchi, edychi = chi2_shift(im1, im2+extra_noise,
                err=im2*0+noise,
                return_error=True, upsample_factor='auto', verbose=False, **kwargs)
        offsets.append([dxr,dyr,dxccs,dyccs,dxccg,dyccg,dxchi,dychi])
        eoffsets.append([edxr,edyr,edxccs,edyccs,edxccg,edyccg,edxchi,edychi])

    return np.array(offsets),np.array(eoffsets)
def register_accuracy_test(im1,im2,usf_range=[1,100],**kwargs):
    offsets = []
    try: 
        import progressbar
        widgets = [progressbar.FormatLabel('Processed: %(value)d offsets in %(elapsed)s)'), progressbar.Percentage()]
        progress = progressbar.ProgressBar(widgets=widgets)
    except ImportError:
        def progress(x):
            yield x
    for usf in progress(xrange(*usf_range)): 
        dy,dx = register_images(im1,im2,usfac=usf,**kwargs)
        offsets.append([dx,dy])

    return np.array(offsets)