diff --git a/imcal.py b/imcal.py index bc819b54c45f7f3cfe9c43b73934f89b0c239eef..2cba5d1325a755dc4b944428ad78ddf012aa2bdd 100755 --- a/imcal.py +++ b/imcal.py @@ -42,7 +42,7 @@ def modify_filename(fname, string, ext=None): return fbase + string + fext -def wsclean(msin, outname=None, pixelsize=3, imagesize=3072, mgain=0.8, multifreq=0, autothresh=0.3, +def wsclean(msin, datacolumn='DATA', outname=None, pixelsize=3, imagesize=3072, mgain=0.8, multifreq=0, autothresh=0.3, automask=3, niter=1000000, multiscale=False, save_source_list=True, clearfiles=True, clip_model_level=None, fitsmask=None, kwstring=''): @@ -67,7 +67,7 @@ def wsclean(msin, outname=None, pixelsize=3, imagesize=3072, mgain=0.8, multifre if fitsmask: kwstring += f' -fits-mask {fitsmask}' - cmd = f'wsclean -name {outname} -size {imagesize} {imagesize} -scale {pixelsize}asec -niter {niter} \ + cmd = f'wsclean -name {outname} -data-column {datacolumn} -size {imagesize} {imagesize} -scale {pixelsize}asec -niter {niter} \ {kwstring} {msin}' cmd = " ".join(cmd.split()) logging.debug("Running command: %s", cmd) @@ -199,6 +199,7 @@ def dical(msin, srcdb, msout=None, h5out=None, solint=1, startchan=0, split_ncha check_return_code(return_code) return msout + def ddecal(msin, srcdb, msout=None, h5out=None, solint=120, nfreq=30, startchan=0, nchan=0, minvisratio=0.6, mode='diagonal', uvlambdamin=500, subtract=True): """ Perform direction dependent calibration with DPPP """ @@ -317,6 +318,28 @@ def remove_model_components_below_level(model, level=0.0, out=None): return out +def apply_ddcal_sols(msin, parmdb, msout='.', msout_datacolumn='CORRECTED_DATA', amp_interp = 'nearest', ph_interp = 'nearest'): + """ apply calibration solution from h5file """ + + with h5py.File(parmdb, 'r') as f: + directions = list(dict(f['sol000/source']).keys()) + + dir_names = [i.decode().strip('[]') for i in directions] + dp3args = [f'msin={msin}', 'msin.datacolumn=DATA', 'msout=.', 'msout.datacolumn=CORRECTED_DATA', + f'steps={dir_names}'] + for d in dir_names: + dp3args += [f'{d}.type=applycal', + f'{d}.parmdb={parmdb}', + f'{d}.steps=[ph,amp]', + f'{d}.amp.correction=amplitude000', + f'{d}.ph.correction=phase000', + f'{d}.amp.interpolation={amp_interp}', + f'{d}.ph.interpolation={ph_interp}', + f'{d}.direction={[d]}', + ] + execute_dppp(dp3args) + + def main(msin, outbase=None, cfgfile='imcal.yml'): msin = msin.rstrip('/') logging.info('Processing {}'.format(msin)) @@ -361,8 +384,8 @@ def main(msin, outbase=None, cfgfile='imcal.yml'): if os.path.exists(img_ddcal+'-image.fits'): - logging.info('The final image exists. Exiting...') - return 0 + logging.warning('The final image exists!..') + # return 0 if (not os.path.exists(ms_split)) and (cfg['split1']['startchan'] or cfg['split1']['nchan']): ms_split = split_ms(msin, msout_path=ms_split, **cfg['split1']) @@ -428,10 +451,16 @@ def main(msin, outbase=None, cfgfile='imcal.yml'): # DDE calibration + peeling everything if (not os.path.exists(ddsub)): ddsub, h5out = ddecal(dical3, clustered_sdb, msout=ddsub, h5out=h5_dd, **cfg['ddcal']) - # view the solutions and save figure view_sols(h5_dd, outname=msbase+'_sols_ddcal') + +# Apply DDEcal soulutions to dical3 + + # apply_ddcal_sols(dical3, h5_dd) # does not work -- image is bad. Can you apply all solution to all directions with DP3? + # wsclean(dical3, datacolumn='CORRECTED_DATA', outname='test_apply_ddcal', **cfg['clean4']) + # sys.exit('planned') + if (not os.path.exists(img_ddsub+'-image.fits')): wsclean(ddsub, outname=img_ddsub, **cfg['clean4'])