def ical_wrapper(conf):
    """ Wrap ICAL pipeline
    
    :param conf: Configuration from JSON file
    :return:
    """
    vis_list = BufferBlockVisibility(conf["buffer"], conf['inputs']['vis_list']).memory_data_model
    
    cellsize = json_to_quantity(conf["image"]["cellsize"]).to("rad").value
    npixel = conf["image"]["npixel"]
    pol_frame = PolarisationFrame(conf["image"]["polarisation_frame"])
    
    model_imagelist = [arlexecute.execute(create_image_from_visibility)(v, npixel=npixel, cellsize=cellsize,
                                                                        polarisation_frame=pol_frame)
                       for v in vis_list]
    
    future_vis_list = arlexecute.scatter(vis_list)
    
    result = ical_workflow(vis_list=future_vis_list,
                            model_imagelist=model_imagelist,
                            context=conf["imaging"]["context"],
                            scales=conf["deconvolution"]["scales"],
                            algorithm=conf["deconvolution"]["algorithm"],
                            nmoment=conf["deconvolution"]["nmoment"],
                            niter=conf["deconvolution"]["niter"],
                            fractional_threshold=conf["deconvolution"]["fractional_threshold"],
                            threshold=conf["deconvolution"]["threshold"],
                            nmajor=conf["deconvolution"]["nmajor"],
                            gain=conf["deconvolution"]["gain"],
                            deconvolve_facets=conf["deconvolution"]["deconvolve_facets"],
                            deconvolve_overlap=conf["deconvolution"]["deconvolve_overlap"],
                            deconvolve_taper=conf["deconvolution"]["deconvolve_taper"],
                            vis_slices=conf["imaging"]["vis_slices"],
                            psf_support=conf["deconvolution"]["psf_support"])
    
    def output_images(result):
        BufferSkyModel(conf["buffer"], conf['outputs']['skymodel'], SkyModel(images=result[0])).sync()
        
        deconvolved = image_gather_channels(result[0])
        residual = image_gather_channels(remove_sumwt(result[1]))
        restored = image_gather_channels(result[2])
        
        BufferImage(conf["buffer"], conf['outputs']['deconvolved'], deconvolved).sync()
        BufferImage(conf["buffer"], conf['outputs']['residual'], residual).sync()
        BufferImage(conf["buffer"], conf['outputs']['restored'], restored).sync()
        
        
        return result
    
    return arlexecute.execute(output_images)(result)
    def test_readwriteblockvisibility(self):
        self.vis = create_blockvisibility(
            self.midcore,
            self.times,
            self.frequency,
            channel_bandwidth=self.channel_bandwidth,
            phasecentre=self.phasecentre,
            polarisation_frame=PolarisationFrame("linear"),
            weight=1.0,
            meta={"ARL": 0.0})
        self.vis = predict_skycomponent_visibility(self.vis, self.comp)

        config = {
            "buffer": {
                "directory": self.dir
            },
            "vislist": {
                "name": "test_bufferblockvisibility.hdf",
                "data_model": "BlockVisibility"
            }
        }
        bdm = BufferBlockVisibility(config["buffer"], config["vislist"],
                                    self.vis)
        bdm.sync()
        new_bdm = BufferBlockVisibility(config["buffer"], config["vislist"])
        new_bdm.sync()
        newvis = bdm.memory_data_model

        assert isinstance(newvis, BlockVisibility)
        assert numpy.array_equal(newvis.frequency, self.vis.frequency)
        assert newvis.data.shape == self.vis.data.shape
        assert numpy.max(numpy.abs(self.vis.vis - newvis.vis)) < 1e-15
        assert numpy.max(numpy.abs(self.vis.uvw - newvis.uvw)) < 1e-15
        assert numpy.abs(newvis.configuration.location.x.value -
                         self.vis.configuration.location.x.value) < 1e-15
        assert numpy.abs(newvis.configuration.location.y.value -
                         self.vis.configuration.location.y.value) < 1e-15
        assert numpy.abs(newvis.configuration.location.z.value -
                         self.vis.configuration.location.z.value) < 1e-15
        assert numpy.max(
            numpy.abs(newvis.configuration.xyz -
                      self.vis.configuration.xyz)) < 1e-15
        assert newvis.meta == self.vis.meta
def predict_vislist_wrapper(conf):
    """Wrapper for prediction

    :param conf: Configuration from JSON file
    :return:
    """
    vis_list = BufferBlockVisibility(conf["buffer"], conf['inputs']['vis_list']).memory_data_model
    skymodel = BufferSkyModel(conf["buffer"], conf["inputs"]["skymodel"]).memory_data_model
    
    flux_limit = conf['primary_beam']['flux_limit']
    
    if conf["primary_beam"]["apply"]:
        def apply_pb_image(vt, model):
            telescope = vt.configuration.name
            pb = create_pb(model, telescope)
            model.data *= pb.data
            return model
        
        def apply_pb_comp(vt, model, comp):
            telescope = vt.configuration.name
            pb = create_pb(model, telescope)
            return apply_beam_to_skycomponent(comp, pb, flux_limit)
        
        image_list = [arlexecute.execute(apply_pb_image, nout=1)(v, skymodel.images[i]) for i, v in enumerate(vis_list)]
        if len(skymodel.components) > 1:
            component_list = [arlexecute.execute(apply_pb_comp, nout=1)(v, skymodel.images[i], skymodel.components)
                              for i, v in enumerate(vis_list)]
        else:
            component_list = []
    else:
        image_list = [skymodel.images[0] for v in vis_list]
        component_list = skymodel.components
    
    future_vis_list = arlexecute.scatter(vis_list)
    predicted_vis_list = [arlexecute.execute(predict_skycomponent_visibility)(v, component_list)
                          for v in future_vis_list]
    predicted_vis_list = predict_workflow(predicted_vis_list, image_list,
                                           context=conf['imaging']['context'],
                                           vis_slices=conf['imaging']['vis_slices'])
    
    def output_vislist(v):
        bdm = BufferBlockVisibility(conf["buffer"], conf["outputs"]["vis_list"], v)
        bdm.sync()
    
    return arlexecute.execute(output_vislist)(predicted_vis_list)
def corrupt_vislist_wrapper(conf):
    """Wrapper for corruption

    :param conf:
    :return:
    """
    vis_list = BufferBlockVisibility(conf["buffer"], conf['inputs']['vis_list']).memory_data_model
    phase_error = json_to_quantity(conf['corrupt_vislist']['phase_error']).to('rad').value
    
    corrupted_vislist = corrupt_workflow(vis_list,
                                          phase_error=phase_error,
                                          amplitude_error=conf['corrupt_vislist']['amplitude_error'])
    
    def output_vislist(v):
        bdm = BufferBlockVisibility(conf["buffer"], conf["outputs"]["vis_list"], v)
        bdm.sync()
    
    return arlexecute.execute(output_vislist)(corrupted_vislist)
 def output_vislist(v):
     bdm = BufferBlockVisibility(conf["buffer"], conf["outputs"]["vis_list"], v)
     bdm.sync()