Skip to content
Snippets Groups Projects
Select Git revision
  • faef953d650f4850e9faf180675094262e8510d2
  • master default protected
  • pol_cal_new
  • update_nifty9
  • fast-resolve_cal
  • fast-resolve_new
  • mgj0751
  • fast-resolve-multi-gpu
  • jax-resolve
  • to_jubik
  • multi_resolve
  • pol_cal
  • pol_cal_jr
  • jaxbind_pypi
  • tiles
  • box
  • resolve.re
  • time_freq_avg
  • feature/mf_img
  • jax_finufft
  • resolve_demo
  • v0.14
  • v0.13
  • v0.12
  • v0.10
  • v0.9
  • v0.8
  • v0.7
28 results

calibration_and_imaging.py

Blame
  • Philipp Arras's avatar
    Philipp Arras authored
    faef953d
    History
    calibration_and_imaging.py 4.02 KiB
    # SPDX-License-Identifier: GPL-3.0-or-later
    # Copyright(C) 2019-2020 Max-Planck-Society
    # Author: Philipp Arras
    
    from os.path import join
    
    import numpy as np
    from ducc0.fft import good_size
    
    import nifty7 as ift
    import resolve as rve
    
    
    def main():
        rve.set_nthreads(8)
        rve.set_wgridding(True)
        obs = rve.ms2observations('/data/AM754_A030124_flagged.ms', 'DATA', True, 0, "stokesi")
        t0, _ = rve.tmin_tmax(*obs)
        obs = [oo.move_time(-t0) for oo in obs]
        ocalib1, ocalib2, oscience = obs
        rve.set_epsilon(min(1/10/oo.max_snr() for oo in obs))
    
        uantennas = rve.unique_antennas(*obs)
        antenna_dct = {aa: ii for ii, aa in enumerate(uantennas)}
        npol, nfreq = obs[0].npol, obs[0].nfreq
    
        total_N = npol*len(uantennas)*nfreq
        tmin, tmax = rve.tmin_tmax(*obs)
        solution_interval = 20  # s
        time_domain = ift.RGSpace(good_size(int(2*(tmax-tmin)/solution_interval)),
                                  solution_interval)
        print(f'Npix in time domain {time_domain.shape[0]}')
        reshaper = rve.Reshaper([ift.UnstructuredDomain(total_N), time_domain],
                                [ift.UnstructuredDomain(npol), ift.UnstructuredDomain(len(uantennas)),
                                 time_domain, ift.UnstructuredDomain(nfreq)])
        dct = {
            'offset_mean': 0,
            'offset_std': (1, 0.5),
            'prefix': 'calibration_phases'
        }
        dct1 = {
            'fluctuations': (2., 1.),
            'loglogavgslope': (-4., 1),
            'flexibility': (5, 2.),
            'asperity': None
        }
        cfmph = ift.CorrelatedFieldMaker.make(**dct, total_N=total_N)
        cfmph.add_fluctuations(time_domain, **dct1)
        phase = reshaper @ cfmph.finalize(0)
        dct = {
            'offset_mean': 0,
            'offset_std': (1e-3, 1e-6),
            'prefix': 'calibration_logamplitudes'
        }
        dct1 = {
            'fluctuations': (2., 1.),
            'loglogavgslope': (-4., 1),
            'flexibility': (5, 2.),
            'asperity': None
        }
        cfmampl = ift.CorrelatedFieldMaker.make(**dct, total_N=total_N)
        cfmampl.add_fluctuations(time_domain, **dct1)
        logampl = reshaper @ cfmampl.finalize(0)
    
        fov = np.array([2, 2])*rve.DEG2RAD
        npix = np.array([1024, 1024])
        skydom = ift.RGSpace(npix, fov/npix)
        dct = {
            'target': skydom,
            'offset_mean': 19,
            'offset_std': (1, 0.1),
            'prefix': 'logdiffuse',
            'fluctuations': (5., 1.),
            'loglogavgslope': (-2., 1),
            'flexibility': (1., 0.5),
            'asperity': None
        }
        logsky = ift.SimpleCorrelatedField(**dct)
        sky = logsky.exp()
    
        abc_calib2 = rve.calibration_distribution(ocalib2, phase, logampl, antenna_dct, None)
        lh0 = rve.CalibrationLikelihood(ocalib2, abc_calib2, ift.full(ocalib2.vis.domain, 1+0.j))
        abc_science = rve.calibration_distribution(oscience, phase, logampl, antenna_dct, None)
        lh1 = rve.ImagingCalibrationLikelihood(oscience, sky, abc_science)
    
        plotter = rve.Plotter('png', 'plots')
        plotter.add_calibration_solution('calibration_logamplitude', logampl)
        plotter.add_calibration_solution('calibration_phase', phase)
        plotter.add_histogram('normalized_residuals_calib2', lh0.normalized_residual)
        plotter.add_histogram('normalized_residuals_science', lh1.normalized_residual)
        ham = ift.StandardHamiltonian(lh0)
        state = rve.MinimizationState(0.1*ift.from_random(ham.domain), [])
        minimizer = ift.NewtonCG(ift.GradientNormController(name='newton', iteration_limit=10))
        n0, n1 = 3, 3
        for ii in range(n0):
            state = rve.simple_minimize(ham, state.mean, 0, minimizer)
            plotter.plot(f'{ii}', state)
    
        # FIXME Total flux is unconstrained
        ham = ift.StandardHamiltonian(lh1)
        state = rve.MinimizationState(ift.MultiField.union([0.1*ift.from_random(ham.domain), state.mean]), [])
        plotter.add('logsky', sky.log10())
        plotter.add('logsky_pspec', logsky.power_spectrum)
    
        for ii in range(n0, n0+n1):
            state = rve.simple_minimize(ham, state.mean, 0, minimizer)
            plotter.plot(f'{ii}', state)
            state.save(join(plotter.directory, f'{ii}.state'))
    
    
    if __name__ == '__main__':
        main()