Ejemplo n.º 1
0
    def setUp(self):
        rsexecute.set_client(use_dask=True)

        from rascil.data_models.parameters import rascil_path
        self.dir = rascil_path('test_results')
        self.persist = os.getenv("RASCIL_PERSIST", True)
        self.verbose = True
Ejemplo n.º 2
0
    def setUp(self):

        rsexecute.set_client(memory_limit=4 * 1024 * 1024 * 1024,
                             n_workers=4,
                             dashboard_address=None)

        self.persist = os.getenv("RASCIL_PERSIST", False)
 def setUp(self):
     rsexecute.set_client(use_dask=True, processes=True, threads_per_worker=1)
 
     from rascil.data_models.parameters import rascil_path, rascil_data_path
     self.dir = rascil_path('test_results')
     
     self.persist = os.getenv("RASCIL_PERSIST", False)
Ejemplo n.º 4
0
def set_client(client):
    """Set RASCIL Dask client.

    :param client: Dask distributed client

    """
    rsexecute.set_client(client=client, dask=True)
Ejemplo n.º 5
0
    def setUp(self):
        #        super(rsexecuteTestCase, self).setUp()

        import os
        from rascil.workflows.rsexecute.execution_support.rsexecute import rsexecute
        use_dask = os.environ.get('RASCIL_TESTS_USE_DASK', '1') == '1'
        rsexecute.set_client(use_dask=use_dask)
Ejemplo n.º 6
0
 def setUp(self):
     rsexecute.set_client(verbose=False, memory_limit=4 * 1024 * 1024 * 1024, n_workers=4, dashboard_address=None)
     
     from rascil.data_models.parameters import rascil_path
     self.dir = rascil_path('test_results')
     
     self.persist = os.getenv("RASCIL_PERSIST", False)
Ejemplo n.º 7
0
    def setUp(self):
        rsexecute.set_client(memory_limit=4 * 1024 * 1024 * 1024,
                             n_workers=4,
                             dashboard_address=None)

        from rascil.data_models.parameters import rascil_path
        self.dir = rascil_path('test_results')

        self.frequency = numpy.linspace(1e8, 1.5e8, 3)
        self.channel_bandwidth = numpy.array([2.5e7, 2.5e7, 2.5e7])
        self.phasecentre = SkyCoord(ra=+15.0 * u.deg,
                                    dec=-60.0 * u.deg,
                                    frame='icrs',
                                    equinox='J2000')
        self.times = numpy.linspace(-300.0, 300.0, 3) * numpy.pi / 43200.0
Ejemplo n.º 8
0
    def setUp(self):
        rsexecute.set_client(use_dask=True,
                             processes=True,
                             threads_per_worker=1)

        from rascil.data_models.parameters import rascil_path
        self.dir = rascil_path('test_results')

        self.frequency = numpy.linspace(1e8, 1.5e8, 3)
        self.channel_bandwidth = numpy.array([2.5e7, 2.5e7, 2.5e7])
        self.phasecentre = SkyCoord(ra=+15.0 * u.deg,
                                    dec=-60.0 * u.deg,
                                    frame='icrs',
                                    equinox='J2000')
        self.times = numpy.linspace(-300.0, 300.0, 3) * numpy.pi / 43200.0
Ejemplo n.º 9
0
    def setUp(self):
        rsexecute.set_client(use_dask=True,
                             processes=True,
                             threads_per_worker=1)

        from rascil.data_models.parameters import rascil_path, rascil_data_path
        self.dir = rascil_path('test_results')

        self.frequency = numpy.linspace(1e8, 1.5e8, 3)
        self.channel_bandwidth = numpy.array([2.5e7, 2.5e7, 2.5e7])
        self.flux = numpy.array([[100.0], [100.0], [100.0]])
        self.phasecentre = SkyCoord(ra=+15.0 * u.deg,
                                    dec=-35.0 * u.deg,
                                    frame='icrs',
                                    equinox='J2000')
        self.config = create_named_configuration('LOWBD2-CORE')
        self.times = numpy.linspace(-300.0, 300.0, 3) * numpy.pi / 43200.0
        nants = self.config.xyz.shape[0]
        assert nants > 1
        assert len(self.config.names) == nants
        assert len(self.config.mount) == nants

        self.persist = os.getenv("RASCIL_PERSIST", False)
Ejemplo n.º 10
0
 def setUp(self):
     rsexecute.set_client(use_dask=True, verbose=False)
Ejemplo n.º 11
0
    show = args.show == 'True'
    context = args.context
    nworkers = args.nworkers
    threads_per_worker = 1
    nthreads = args.nthreads
    memory = args.memory
    serial = args.serial == "True"

    basename = os.path.basename(os.getcwd())

    if serial:
        print("Will use serial processing")
        use_serial_invert = True
        use_serial_predict = True
        rsexecute.set_client(use_dask=False)
        print(rsexecute.client)
        nworkers = 1
    else:
        print("Will use dask processing")
        if nworkers > 0:
            print(
                "{nworkers} workers each with {memory}GB, worker files in {local_dir}"
                .format(nworkers=nworkers,
                        memory=memory,
                        local_dir=args.dask_worker_space))
            client = get_dask_client(n_workers=nworkers,
                                     memory_limit=memory * 1024 * 1024 * 1024,
                                     threads_per_worker=threads_per_worker,
                                     local_dir=args.dask_worker_space)
            rsexecute.set_client(client=client)
Ejemplo n.º 12
0
    def setUp(self):

        numpy.random.seed(180555)
        rsexecute.set_client(use_dask=True, processes=True, threads_per_worker=1)

        self.persist = os.getenv("RASCIL_PERSIST", False)
Ejemplo n.º 13
0
log = logging.getLogger()
log.setLevel(logging.DEBUG)

logging.getLogger('asyncio').setLevel(logging.WARNING)

if __name__ == '__main__':
    
    print("Starting cluster_test_image")
    # We pass in the scheduler from the invoking script
    if len(sys.argv) > 1:
        scheduler = sys.argv[1]
        client = Client(scheduler)
    else:
        client = Client()
    rsexecute.set_client(client=client)
    
    from rascil.data_models.parameters import rascil_path
    
    dir = rascil_path('test_results')
    
    frequency = numpy.linspace(1e8, 1.5e8, 3)
    channel_bandwidth = numpy.array([2.5e7, 2.5e7, 2.5e7])
    flux = numpy.array([[100.0], [100.0], [100.0]])
    config = create_named_configuration('LOWBD2-CORE')
    times = numpy.linspace(-300.0, 300.0, 3) * numpy.pi / 43200.0
    nants = config.xyz.shape[0]
    assert nants > 1
    assert len(config.names) == nants
    assert len(config.mount) == nants
    
Ejemplo n.º 14
0
    def simulation(self,
                   args,
                   time_series='wind',
                   band='B2',
                   context='singlesource',
                   vp_directory=''):

        ra = args.ra
        declination = args.declination
        use_radec = args.use_radec == "True"
        integration_time = args.integration_time
        time_range = args.time_range
        time_chunk = args.time_chunk
        offset_dir = args.offset_dir
        pbtype = args.pbtype
        pbradius = args.pbradius
        rmax = args.rmax
        flux_limit = args.flux_limit
        npixel = args.npixel
        shared_directory = args.shared_directory
        vp_directory = args.vp_directory

        # Simulation specific parameters
        global_pe = numpy.array(args.global_pe)
        static_pe = numpy.array(args.static_pe)
        dynamic_pe = args.dynamic_pe

        seed = args.seed
        basename = os.path.basename(os.getcwd())

        use_dask = False
        rsexecute.set_client(use_dask=use_dask)

        # Set up details of simulated observation
        nfreqwin = 1
        if band == 'B1':
            frequency = [0.765e9]
        elif band == 'B2':
            frequency = [1.36e9]
        elif band == 'Ku':
            frequency = [12.179e9]
        else:
            raise ValueError("Unknown band %s" % band)

        phasecentre = SkyCoord(ra=ra * u.deg,
                               dec=declination * u.deg,
                               frame='icrs',
                               equinox='J2000')

        bvis_graph = create_standard_mid_simulation_rsexecute_workflow(
            band, rmax, phasecentre, time_range, time_chunk, integration_time,
            shared_directory)
        future_bvis_list = rsexecute.persist(bvis_graph)
        vis_graph = [
            rsexecute.execute(convert_blockvisibility_to_visibility)(bv)
            for bv in future_bvis_list
        ]
        future_vis_list = rsexecute.persist(vis_graph, sync=True)

        # We need the HWHM of the primary beam, and the location of the nulls
        HWHM_deg, null_az_deg, null_el_deg = find_pb_width_null(
            pbtype, frequency)

        HWHM = HWHM_deg * numpy.pi / 180.0

        FOV_deg = 8.0 * 1.36e9 / frequency[0]

        advice_list = rsexecute.execute(advise_wide_field)(
            future_vis_list[0], guard_band_image=1.0, delA=0.02, verbose=False)
        advice = rsexecute.compute(advice_list, sync=True)
        pb_npixel = 1024
        d2r = numpy.pi / 180.0
        pb_cellsize = d2r * FOV_deg / pb_npixel
        cellsize = advice['cellsize']

        # Now construct the components
        original_components, offset_direction = create_simulation_components(
            context, phasecentre, frequency, pbtype, offset_dir, flux_limit,
            pbradius * HWHM, pb_npixel, pb_cellsize)

        vp_list = [
            rsexecute.execute(create_image_from_visibility)(
                bv,
                npixel=pb_npixel,
                frequency=frequency,
                nchan=nfreqwin,
                cellsize=pb_cellsize,
                phasecentre=phasecentre,
                override_cellsize=False) for bv in future_bvis_list
        ]
        vp_list = [
            rsexecute.execute(create_vp)(vp,
                                         pbtype,
                                         pointingcentre=phasecentre,
                                         use_local=not use_radec)
            for vp in vp_list
        ]
        future_vp_list = rsexecute.persist(vp_list)

        # Make one image per component
        future_model_list = [
            rsexecute.execute(create_image_from_visibility)(
                future_vis_list[0],
                npixel=npixel,
                frequency=frequency,
                nchan=nfreqwin,
                cellsize=cellsize,
                phasecentre=offset_direction,
                polarisation_frame=PolarisationFrame("stokesI"))
            for i, _ in enumerate(original_components)
        ]

        a2r = numpy.pi / (3600.0 * 1800)

        no_error_gtl = None
        error_gtl = None
        if time_series == '':
            global_pointing_error = global_pe
            static_pointing_error = static_pe
            pointing_error = dynamic_pe

            no_error_gtl, error_gtl = \
                create_pointing_errors_gaintable_rsexecute_workflow(future_bvis_list, original_components,
                                                                     sub_vp_list=future_vp_list,
                                                                     use_radec=use_radec,
                                                                     pointing_error=a2r * pointing_error,
                                                                     static_pointing_error=a2r * static_pointing_error,
                                                                     global_pointing_error=a2r * global_pointing_error,
                                                                     seed=seed,
                                                                     show=False, basename=basename)

        elif time_series == 'wind':

            no_error_gtl, error_gtl = \
                create_pointing_errors_gaintable_rsexecute_workflow(future_bvis_list, original_components,
                                                                     sub_vp_list=future_vp_list,
                                                                     use_radec=use_radec,
                                                                     time_series=time_series,
                                                                     time_series_type='precision',
                                                                     seed=seed,
                                                                     show=False, basename=basename)
        elif time_series == 'gravity':
            no_error_gtl, error_gtl = \
                create_surface_errors_gaintable_rsexecute_workflow(band, future_bvis_list, original_components,
                                                                    vp_directory=vp_directory, use_radec=use_radec,
                                                                    show=False, basename=basename)
        else:
            raise ValueError("Unknown type of error %s" % time_series)

        # Now make all the residual images
        vis_comp_chunk_dirty_list = \
            calculate_residual_from_gaintables_rsexecute_workflow(future_bvis_list, original_components,
                                                                   future_model_list,
                                                                   no_error_gtl, error_gtl)

        # Add the resulting images
        error_dirty_list = sum_invert_results_rsexecute(
            vis_comp_chunk_dirty_list)

        # Actually compute the graph assembled above
        error_dirty, sumwt = rsexecute.compute(error_dirty_list, sync=True)

        return error_dirty, sumwt
def init_logging():
    logging.basicConfig(
        filename='%s/ska-pipeline.log' % results_dir,
        filemode='a',
        format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
        datefmt='%H:%M:%S',
        level=logging.INFO)


if __name__ == '__main__':

    log = logging.getLogger()
    logging.info("Starting Imaging pipeline")

    rsexecute.set_client(use_dask=True)
    print(rsexecute.client)
    rsexecute.run(init_logging)

    nfreqwin = 8
    ntimes = 5
    rmax = 750.0
    centre = nfreqwin // 2

    # Load data from previous simulation
    vis_list = [
        rsexecute.execute(create_blockvisibility_from_ms)(rascil_path(
            '%s/ska-pipeline_simulation_vislist_%d.ms' % (results_dir, v)))[0]
        for v in range(nfreqwin)
    ]
def init_logging():
    logging.basicConfig(
        filename='%s/ska-pipeline.log' % results_dir,
        filemode='a',
        format='%%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
        datefmt='%H:%M:%S',
        level=logging.INFO)


if __name__ == '__main__':
    log = logging.getLogger()
    print("Starting ska-pipelines simulation pipeline")

    rsexecute.set_client(use_dask=True,
                         threads_per_worker=1,
                         memory_limit=32 * 1024 * 1024 * 1024,
                         n_workers=8,
                         local_dir=dask_dir)
    print(rsexecute.client)
    rsexecute.run(init_logging)

    # We create a graph to make the visibility. The parameter rmax determines the distance of the
    # furthest antenna/stations used. All over parameters are determined from this number.

    nfreqwin = 41
    ntimes = 5
    rmax = 750.0
    centre = nfreqwin // 2

    frequency = numpy.linspace(0.9e8, 1.1e8, nfreqwin)
    channel_bandwidth = numpy.array(nfreqwin * [frequency[1] - frequency[0]])
def trial_case(results,
               seed=180555,
               context='wstack',
               nworkers=8,
               threads_per_worker=1,
               memory=8,
               processes=True,
               order='frequency',
               nfreqwin=7,
               ntimes=3,
               rmax=750.0,
               facets=1,
               wprojection_planes=1,
               use_dask=True,
               use_serial_imaging=True,
               flux_limit=0.3,
               nmajor=5,
               dft_threshold=1.0,
               use_serial_clean=True,
               write_fits=False):
    """ Single trial for performance-timings
    
    Simulates visibilities from GLEAM including phase errors
    Makes dirty image and PSF
    Runs ICAL pipeline
    
    The results are in a dictionary:
    
    'context': input - a string describing concisely the purpose of the test
    'time overall',  overall execution time (s)
    'time predict', time to execute GLEAM prediction graph
    'time invert', time to make dirty image
    'time invert graph', time to make dirty image graph
    'time ICAL graph', time to create ICAL graph
    'time ICAL', time to execute ICAL graph
    'context', type of imaging e.g. 'wstack'
    'nworkers', number of workers to create
    'threads_per_worker',
    'nnodes', Number of nodes,
    'processes', 'order', Ordering of data_models
    'nfreqwin', Number of frequency windows in simulation
    'ntimes', Number of hour angles in simulation
    'rmax', Maximum radius of stations used in simulation (m)
    'facets', Number of facets in deconvolution and imaging
    'wprojection_planes', Number of wprojection planes
    'vis_slices', Number of visibility slices (per Visibbility)
    'npixel', Number of pixels in image
    'cellsize', Cellsize in radians
    'seed', Random number seed
    'dirty_max', Maximum in dirty image
    'dirty_min', Minimum in dirty image
    'restored_max',
    'restored_min',
    'deconvolved_max',
    'deconvolved_min',
    'residual_max',
    'residual_min',
    'git_info', GIT hash (not definitive since local mods are possible)
    
    :param results: Initial state
    :param seed: Random number seed (used in gain simulations)
    :param context: imaging context
    :param context: Type of context: '2d'|'timeslice'|'wstack'
    :param nworkers: Number of dask workers to use
    :param threads_per_worker: Number of threads per worker
    :param processes: Use processes instead of threads 'processes'|'threads'
    :param order: See simulate_list_list_rsexecute_workflow_workflowkflow
    :param nfreqwin: See simulate_list_list_rsexecute_workflow_workflowkflow
    :param ntimes: See simulate_list_list_rsexecute_workflow_workflowkflow
    :param rmax: See simulate_list_list_rsexecute_workflow_workflowkflow
    :param facets: Number of facets to use
    :param wprojection_planes: Number of wprojection planes to use
    :param use_dask: Use dask or immediate evaluation
    :return: results dictionary
    """
    if use_dask:
        scheduler = os.getenv('RASCIL_DASK_SCHEDULER', None)
        if scheduler is not None:
            client = get_dask_client(n_workers=nworkers,
                                     memory_limit=memory * 1024 * 1024 * 1024,
                                     threads_per_worker=threads_per_worker)
            rsexecute.set_client(client=client)
        else:
            rsexecute.set_client(threads_per_worker=threads_per_worker,
                                 processes=threads_per_worker == 1,
                                 memory_limit=memory * 1024 * 1024 * 1024,
                                 n_workers=nworkers)
        print("Defined %d workers" % (nworkers))
    else:
        rsexecute.set_client(use_dask=use_dask)
        results['nnodes'] = 1

    def init_logging():
        logging.basicConfig(
            filename='pipelines_rsexecute_timings.log',
            filemode='w',
            format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
            datefmt='%H:%M:%S',
            level=logging.INFO)

    init_logging()
    log = logging.getLogger()

    # Initialise logging on the workers. This appears to only work using the process scheduler.
    rsexecute.run(init_logging)

    def lprint(*args):
        log.info(*args)
        print(*args)

    lprint("Starting pipelines_rsexecute_timings")

    numpy.random.seed(seed)
    results['seed'] = seed

    start_all = time.time()

    results['context'] = context
    results['hostname'] = socket.gethostname()
    results['git_hash'] = git_hash()
    results['epoch'] = time.strftime("%Y-%m-%d %H:%M:%S")

    lprint("Context is %s" % context)

    results['nworkers'] = nworkers
    results['threads_per_worker'] = threads_per_worker
    results['processes'] = processes
    results['memory'] = memory
    results['order'] = order
    results['nfreqwin'] = nfreqwin
    results['ntimes'] = ntimes
    results['rmax'] = rmax
    results['facets'] = facets
    results['wprojection_planes'] = wprojection_planes
    results['dft threshold'] = dft_threshold

    results['use_dask'] = use_dask

    lprint("At start, configuration is:")
    lprint(sort_dict(results))

    # Parameters determining scale of simulation.
    frequency = numpy.linspace(1.0e8, 1.2e8, nfreqwin)
    centre = nfreqwin // 2
    if nfreqwin > 1:
        channel_bandwidth = numpy.array(nfreqwin *
                                        [frequency[1] - frequency[0]])
    else:
        channel_bandwidth = numpy.array([1e6])

    times = numpy.linspace(-numpy.pi / 4.0, numpy.pi / 4.0, ntimes)
    phasecentre = SkyCoord(ra=+0.0 * u.deg,
                           dec=-40.0 * u.deg,
                           frame='icrs',
                           equinox='J2000')

    lprint("****** Visibility creation ******")
    # Create the empty BlockVisibility's and persist these on the cluster
    tmp_bvis_list = simulate_list_rsexecute_workflow(
        'LOWBD2',
        frequency=frequency,
        channel_bandwidth=channel_bandwidth,
        times=times,
        phasecentre=phasecentre,
        order=order,
        format='blockvis',
        rmax=rmax)
    tmp_vis_list = [
        rsexecute.execute(convert_blockvisibility_to_visibility)(bv)
        for bv in tmp_bvis_list
    ]
    tmp_vis_list = rsexecute.client.compute(tmp_vis_list, sync=True)
    vis_list = rsexecute.gather(tmp_vis_list)

    import matplotlib.pyplot as plt
    plt.clf()
    plt.hist(vis_list[0].w, bins=100)
    plt.title('Histogram of w samples: rms=%.1f (wavelengths)' %
              numpy.std(vis_list[0].w))
    plt.xlabel('W (wavelengths)')
    #plt.show()
    plt.clf()
    plt.hist(vis_list[0].uvdist, bins=100)
    plt.title('Histogram of uvdistance samples')
    plt.xlabel('UV Distance (wavelengths)')
    #plt.show()

    rsexecute.client.cancel(tmp_vis_list)
    future_vis_list = rsexecute.scatter(vis_list)

    # Find the best imaging parameters but don't bring the vis_list back here
    print("****** Finding wide field parameters ******")
    future_advice = [
        rsexecute.execute(advise_wide_field)(
            v,
            guard_band_image=6.0,
            delA=0.1,
            facets=facets,
            wprojection_planes=wprojection_planes,
            oversampling_synthesised_beam=4.0) for v in future_vis_list
    ]

    future_advice = rsexecute.compute(future_advice)
    advice = rsexecute.client.gather(future_advice)[-1]
    rsexecute.client.cancel(future_advice)

    # Deconvolution via sub-images requires 2^n
    npixel = advice['npixels2']
    results['npixel'] = npixel
    cellsize = advice['cellsize']
    results['cellsize'] = cellsize
    lprint("Image will have %d by %d pixels, cellsize = %.6f rad" %
           (npixel, npixel, cellsize))

    # Create an empty model image
    tmp_model_list = [
        rsexecute.execute(create_image)(
            npixel=npixel,
            cellsize=cellsize,
            frequency=[frequency[f]],
            channel_bandwidth=[channel_bandwidth[f]],
            phasecentre=phasecentre,
            polarisation_frame=PolarisationFrame("stokesI"))
        for f, freq in enumerate(frequency)
    ]
    model_list = rsexecute.compute(tmp_model_list, sync=True)
    future_model_list = rsexecute.scatter(model_list)

    lprint("****** Setting up imaging parameters ******")
    # Now set up the imaging parameters
    template_model = create_image(
        npixel=npixel,
        cellsize=cellsize,
        frequency=[frequency[centre]],
        phasecentre=phasecentre,
        channel_bandwidth=[channel_bandwidth[centre]],
        polarisation_frame=PolarisationFrame("stokesI"))
    gcfcf = [create_pswf_convolutionfunction(template_model)]

    if context == 'timeslice':
        vis_slices = ntimes
        lprint("Using timeslice with %d slices" % vis_slices)
    elif context == '2d':
        vis_slices = 1
    elif context == "wprojection":
        wstep = advice['wstep']
        nw = advice['wprojection_planes']
        vis_slices = 1
        support = advice['nwpixels']
        results['wprojection_planes'] = nw

        lprint("****** Starting W projection kernel creation ******")
        lprint("Using wprojection with %d planes with wstep %.1f wavelengths" %
               (nw, wstep))
        lprint("Support of wprojection = %d pixels" % support)
        gcfcf = [
            create_awterm_convolutionfunction(template_model,
                                              nw=nw,
                                              wstep=wstep,
                                              oversampling=4,
                                              support=support,
                                              use_aaf=True)
        ]
        lprint("Size of W projection gcf, cf = %.2E bytes" % get_size(gcfcf))
    else:
        context = 'wstack'
        vis_slices = advice['vis_slices']
        lprint("Using wstack with %d slices" % vis_slices)

    gcfcf = rsexecute.scatter(gcfcf, broadcast=True)

    results['vis_slices'] = vis_slices

    # Make a skymodel from gleam, with bright sources as components and weak sources in an image
    lprint("****** Starting GLEAM skymodel creation ******")
    future_skymodel_list = [
        rsexecute.execute(create_low_test_skymodel_from_gleam)(
            npixel=npixel,
            cellsize=cellsize,
            frequency=[frequency[f]],
            phasecentre=phasecentre,
            polarisation_frame=PolarisationFrame("stokesI"),
            flux_limit=flux_limit,
            flux_threshold=dft_threshold,
            flux_max=5.0) for f, freq in enumerate(frequency)
    ]

    # We use predict_skymodel so that we can use skycomponents as well as images
    lprint("****** Starting GLEAM skymodel prediction ******")
    predicted_vis_list = [
        predict_skymodel_list_rsexecute_workflow(future_vis_list[f],
                                                 [future_skymodel_list[f]],
                                                 context=context,
                                                 vis_slices=vis_slices,
                                                 facets=facets,
                                                 gcfcf=gcfcf)[0]
        for f, freq in enumerate(frequency)
    ]

    # Corrupt the visibility for the GLEAM model
    lprint("****** Visibility corruption ******")
    tmp_corrupted_vis_list = corrupt_list_rsexecute_workflow(
        predicted_vis_list, phase_error=1.0, seed=seed)
    lprint("****** Weighting and tapering ******")
    tmp_corrupted_vis_list = weight_list_rsexecute_workflow(
        tmp_corrupted_vis_list, future_model_list)
    tmp_corrupted_vis_list = taper_list_rsexecute_workflow(
        tmp_corrupted_vis_list, 0.003 * 750.0 / rmax)
    tmp_corrupted_vis_list = rsexecute.compute(tmp_corrupted_vis_list,
                                               sync=True)

    corrupted_vis_list = rsexecute.gather(tmp_corrupted_vis_list)
    # rsexecute.client.cancel(predicted_vis_list)
    rsexecute.client.cancel(tmp_corrupted_vis_list)
    future_corrupted_vis_list = rsexecute.scatter(corrupted_vis_list)

    # At this point the only futures are of scatter'ed data so no repeated calculations should be
    # incurred.
    lprint("****** Starting dirty image calculation ******")
    start = time.time()
    dirty_list = invert_list_rsexecute_workflow(
        future_corrupted_vis_list,
        future_model_list,
        vis_slices=vis_slices,
        context=context,
        facets=facets,
        use_serial_invert=use_serial_imaging,
        gcfcf=gcfcf)
    results['size invert graph'] = get_size(dirty_list)
    lprint('Size of dirty graph is %.3E bytes' %
           (results['size invert graph']))
    end = time.time()
    results['time invert graph'] = end - start
    lprint("Construction of invert graph took %.3f seconds" % (end - start))

    start = time.time()
    dirty, sumwt = rsexecute.compute(dirty_list, sync=True)[centre]
    end = time.time()
    results['time invert'] = end - start
    lprint("Dirty image invert took %.3f seconds" % (end - start))
    lprint("Maximum in dirty image is %f, sumwt is %s" %
           (numpy.max(numpy.abs(dirty.data)), str(sumwt)))
    qa = qa_image(dirty)
    results['dirty_max'] = qa.data['max']
    results['dirty_min'] = qa.data['min']
    if write_fits:
        export_image_to_fits(
            dirty, "pipelines_rsexecute_timings-%s-dirty.fits" % context)

    lprint("****** Starting prediction ******")
    start = time.time()
    tmp_vis_list = predict_list_rsexecute_workflow(
        future_corrupted_vis_list,
        future_model_list,
        vis_slices=vis_slices,
        context=context,
        facets=facets,
        use_serial_predict=use_serial_imaging,
        gcfcf=gcfcf)
    result = rsexecute.compute(tmp_vis_list, sync=True)
    # rsexecute.client.cancel(tmp_vis_list)
    end = time.time()
    results['time predict'] = end - start
    lprint("Predict took %.3f seconds" % (end - start))

    # Create the ICAL pipeline to run major cycles, starting selfcal at cycle 1. A global solution across all
    # frequencies (i.e. Visibilities) is performed.

    print("Using subimage clean")
    deconvolve_facets = 8
    deconvolve_overlap = 16
    deconvolve_taper = 'tukey'

    lprint("****** Starting ICAL graph creation ******")

    controls = create_calibration_controls()

    controls['T']['first_selfcal'] = 1
    controls['T']['timeslice'] = 'auto'

    start = time.time()
    ical_list = ical_list_rsexecute_workflow(
        future_corrupted_vis_list,
        model_imagelist=future_model_list,
        context=context,
        vis_slices=vis_slices,
        scales=[0, 3, 10],
        algorithm='mmclean',
        nmoment=3,
        niter=1000,
        fractional_threshold=0.1,
        threshold=0.01,
        nmajor=nmajor,
        gain=0.25,
        psf_support=64,
        deconvolve_facets=deconvolve_facets,
        deconvolve_overlap=deconvolve_overlap,
        deconvolve_taper=deconvolve_taper,
        timeslice='auto',
        global_solution=True,
        do_selfcal=True,
        calibration_context='T',
        controls=controls,
        use_serial_predict=use_serial_imaging,
        use_serial_invert=use_serial_imaging,
        use_serial_clean=use_serial_clean,
        gcfcf=gcfcf)

    results['size ICAL graph'] = get_size(ical_list)
    lprint('Size of ICAL graph is %.3E bytes' % results['size ICAL graph'])
    end = time.time()
    results['time ICAL graph'] = end - start
    lprint("Construction of ICAL graph took %.3f seconds" % (end - start))

    print("Current objects on cluster: ")
    pp.pprint(rsexecute.client.who_has())
    #
    # Execute the graph
    lprint("****** Executing ICAL graph ******")
    start = time.time()
    deconvolved, residual, restored, gaintables = rsexecute.compute(ical_list,
                                                                    sync=True)
    end = time.time()

    results['time ICAL'] = end - start
    lprint("ICAL graph execution took %.3f seconds" % (end - start))
    qa = qa_image(deconvolved[centre])
    results['deconvolved_max'] = qa.data['max']
    results['deconvolved_min'] = qa.data['min']
    deconvolved_cube = image_gather_channels(deconvolved)
    if write_fits:
        export_image_to_fits(
            deconvolved_cube,
            "pipelines_rsexecute_timings-%s-ical_deconvolved.fits" % context)

    qa = qa_image(residual[centre][0])
    results['residual_max'] = qa.data['max']
    results['residual_min'] = qa.data['min']
    residual_cube = remove_sumwt(residual)
    residual_cube = image_gather_channels(residual_cube)
    if write_fits:
        export_image_to_fits(
            residual_cube,
            "pipelines_rsexecute_timings-%s-ical_residual.fits" % context)

    qa = qa_image(restored[centre])
    results['restored_max'] = qa.data['max']
    results['restored_min'] = qa.data['min']
    restored_cube = image_gather_channels(restored)
    if write_fits:
        export_image_to_fits(
            restored_cube,
            "pipelines_rsexecute_timings-%s-ical_restored.fits" % context)
    #
    rsexecute.close()

    end_all = time.time()
    results['time overall'] = end_all - start_all

    lprint("At end, results are:")
    results = sort_dict(results)
    lprint(results)

    return results
Ejemplo n.º 18
0
        logging.basicConfig(
            filename='%s/dprepb-pipeline.log' % results_dir,
            filemode='a',
            format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
            datefmt='%H:%M:%S',
            level=logging.INFO)

    log = logging.getLogger()
    logging.info("Starting Imaging pipeline")

    # Set up rsexecute to use Dask. This means that all computation is delayed until an
    # explicit rsexecute.compute call. If use_dask is False, all calls are computed immediately.
    # If running on a cluster, create a scheduler externally and pass in the IP address
    if args.scheduler is not None:
        c = Client(args.scheduler)
        rsexecute.set_client(c)
    else:
        rsexecute.set_client(use_dask=args.use_dask == 'True',
                             threads_per_worker=args.threads,
                             n_workers=args.nworkers,
                             local_directory=dask_dir)
    print(rsexecute.client)
    rsexecute.run(init_logging)

    nchan = args.nchan
    uvmax = 450.0
    cellsize = 0.00015
    npixel = args.npixel

    context = args.context
    if context == 'wstack':
 def setUp(self):
     rsexecute.set_client(use_dask=True,
                          processes=True,
                          threads_per_worker=1)