PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/run_inversion_gridded2.py

https://gitlab.com/flomertens/sph_img
Python | 252 lines | 245 code | 7 blank | 0 comment | 0 complexity | c91f97188f23dd6e5c1944115be7078f MD5 | raw file
  1. import os
  2. import sys
  3. import time
  4. import shutil
  5. import matplotlib as mpl
  6. mpl.use('Agg')
  7. from libwise import scriptshelper as sh
  8. from libwise import profileutils
  9. import sphimg
  10. import util
  11. import numpy as np
  12. import pandas as pd
  13. from astropy import constants as const
  14. from astropy.io import fits as pyfits
  15. USAGE = '''Run the ML spherical harmonics inversion
  16. Usage: run_inversion.py name
  17. Additional options:
  18. --config, -c: configuration file to be used instead of the default config.py
  19. '''
  20. def save_data(filename, data, columns_name):
  21. df = pd.DataFrame(dict(zip(columns_name, data)))
  22. df.to_csv(filename)
  23. def save_alm_rec(dirname, ll, mm, freq, alm_rec, alm_rec_noise, cov_error):
  24. columns = ['ll', 'mm', 'freq', 'alm_rec', 'alm_rec_noise', 'cov_error']
  25. filename = os.path.join(dirname, 'alm_rec.dat')
  26. print "Saving alm result to:", filename
  27. save_data(filename, [ll, mm, freq, alm_rec, alm_rec_noise, cov_error], columns)
  28. def save_visibilities_rec(dirname, ru, uphis, uthetas, Vobs, Vrec):
  29. columns = ['ru', 'uphis', 'uthetas', 'Vobs', 'Vrec']
  30. filename = os.path.join(dirname, 'visibilities_rec.dat')
  31. print "Saving vis result to:", filename
  32. save_data(filename, [ru, uphis, uthetas, Vobs, Vrec], columns)
  33. def read_gridded_visbilities(filename, config):
  34. dirname = os.path.dirname(filename)
  35. basename = '_'.join(os.path.basename(filename).split('_')[:-1])
  36. g_real = os.path.join(dirname, basename + '_GR.fits')
  37. g_imag = os.path.join(dirname, basename + '_GI.fits')
  38. weighting = os.path.join(dirname, basename + '_W.fits')
  39. assert os.path.exists(g_real) and os.path.exists(g_imag)
  40. f_g_real = pyfits.open(g_real)
  41. f_g_imag = pyfits.open(g_imag)
  42. freq = f_g_real[0].header['CRVAL3'] / float(1e6) # in MHz
  43. du = f_g_real[0].header['CDELT1']
  44. dv = f_g_real[0].header['CDELT2']
  45. nu = f_g_real[0].header['NAXIS1']
  46. nv = f_g_real[0].header['NAXIS2']
  47. nfreq = f_g_real[0].header['NAXIS3']
  48. delnu = f_g_real[0].header['CDELT3'] / float(1e6) # in MHz
  49. print '\nFreq=%s MHz du=%s dv=%s nu=%s nv=%s nfreq=%s delnu=%s MHz\n' % (freq, du, dv, nu, nv, nfreq, delnu)
  50. u = du * np.arange(-nu / 2, nu / 2)
  51. v = dv * np.arange(-nv / 2, nv / 2)
  52. #uu, vv = np.meshgrid(u, v)
  53. # Read data
  54. vis_freq = []
  55. uu_freq = []
  56. vv_freq = []
  57. noiserms_freq = []
  58. freqs = []
  59. for i in range(nfreq):
  60. vis = f_g_real[0].data[i][:][:] + 1j * f_g_imag[0].data[i][:][:]
  61. uu, vv = np.meshgrid(u, v)
  62. idx_u, idx_v = np.nonzero(vis)
  63. vis = vis[idx_u, idx_v].flatten()
  64. uu = uu[idx_u, idx_v].flatten()
  65. vv = vv[idx_u, idx_v].flatten()
  66. ru = np.sqrt(uu ** 2 + vv ** 2)
  67. idx = (ru >= config.uv_rumin) & (ru <= config.uv_rumax)
  68. freq = freq + i * delnu
  69. vis = vis[idx]
  70. uu = uu[idx]
  71. vv = vv[idx]
  72. vis_freq.append(vis)
  73. uu_freq.append(uu)
  74. vv_freq.append(vv)
  75. freqs.append(freq)
  76. # calculate from SEFD and scale with grid point weighting
  77. if os.path.exists(weighting):
  78. print "Using weighting file and SEFD"
  79. w = pyfits.open(weighting)[0].data[i][:][:]
  80. w = w[idx_u, idx_v].flatten()[idx]
  81. noiserms = (config.SEFD / np.sqrt(2. * delnu * config.Int_time)) * (1. / np.sqrt(w))
  82. else:
  83. noiserms = config.noiserms
  84. noiserms_freq.append(noiserms)
  85. return freqs, uu_freq, vv_freq, vis_freq, noiserms_freq
  86. def do_inversion_gridded(config, result_dir):
  87. config.out_lm_even_only = False
  88. ll2, mm2 = sphimg.get_out_lm_sampling(config)
  89. config.out_lm_even_only = True
  90. ll, mm = sphimg.get_out_lm_sampling(config)
  91. print '\nBuilding the global YLM matrix...'
  92. freqs, uufreq, vvfreq, Vobsfreq, noisermsfreq = read_gridded_visbilities(config.gridded_fits[0], config)
  93. # Read uv values for 1st channel
  94. uu = uufreq[0]
  95. vv = vvfreq[0]
  96. ru, uphis, uthetas = util.cart2sph(uu, vv, np.zeros_like(uu))
  97. global_ylm = util.SplittedYlmMatrix(ll, mm, uphis, uthetas, ru,
  98. config.cache_dir, keep_in_mem=config.keep_in_mem)
  99. uthetas, uphis, ru = global_ylm[0].thetas, global_ylm[0].phis, global_ylm[0].rb
  100. uu, vv, ww = util.sph2cart(uthetas, uphis, ru)
  101. alms_rec = []
  102. for i in range(len(freqs)):
  103. freq = freqs[i]
  104. Vobs = Vobsfreq[i]
  105. noiserms = noisermsfreq[i]
  106. Vobs = Vobs[global_ylm[0].sort_idx_cols]
  107. config.noiserms = noiserms
  108. print "\nProcessing frequency %s MHz" % freq
  109. lamb = const.c.value / (float(freq) * 1e6) # in m
  110. print "\nProcessing SB %s m" % lamb
  111. result_freq_dir = os.path.join(result_dir, 'freq_%s' % i)
  112. os.mkdir(result_freq_dir)
  113. t = time.time()
  114. print "Building transformation matrix..."
  115. trm = util.get_alm2vis_matrix(ll, mm, global_ylm, 1, order='F')
  116. print "Done in %.2f s" % (time.time() - t)
  117. # plotting the visibilities
  118. sphimg.plot_visibilities(uu, vv, ww, Vobs, os.path.join(result_freq_dir, 'visibilities.pdf'))
  119. sphimg.plot_2d_visibilities(uu, vv, Vobs, os.path.join(result_freq_dir, 'visibilities_2d.pdf'))
  120. alm_rec, alm_rec_noise, Vrec, cov_error = sphimg.alm_ml_inversion(ll, mm, Vobs, uphis, uthetas, i, trm, config)
  121. # When w=0, odd l, +m modes are not recovered, we compute them by interpolation
  122. alm_rec, ll2, mm2 = sphimg.interpolate_lm_odd(alm_rec, ll, mm, config)
  123. alm_rec_noise, _, _ = sphimg.interpolate_lm_odd(alm_rec_noise, ll, mm, config)
  124. cov_error, _, _ = sphimg.interpolate_lm_odd(cov_error, ll, mm, config)
  125. vlm_rec = util.alm2vlm(alm_rec, ll2)
  126. vlm_rec_noise = util.alm2vlm(alm_rec_noise, ll2)
  127. alms_rec.append(alm_rec)
  128. save_alm_rec(result_freq_dir, ll2, mm2, freq, alm_rec, alm_rec_noise, cov_error)
  129. save_visibilities_rec(result_freq_dir, ru, uphis, uthetas, Vobs, Vrec)
  130. print "Plotting result"
  131. t = time.time()
  132. # plot vlm_rec
  133. sphimg.plot_vlm_rec_map(ll2, mm2, vlm_rec, cov_error, os.path.join(result_freq_dir, 'vlm_rec_map.pdf'),
  134. vmin=1e-2, vmax=1e3)
  135. sphimg.plot_vlm(ll2, mm2, vlm_rec, os.path.join(result_freq_dir, 'vlm_rec.pdf'))
  136. sphimg.plot_vlm(ll2, mm2, vlm_rec_noise, os.path.join(result_freq_dir, 'vlm_rec_noise.pdf'))
  137. # plot visibilities
  138. sphimg.plot_vis_diff(ru, Vobs, Vrec, os.path.join(result_freq_dir, 'vis_minus_vis_rec.pdf'))
  139. # plot output sky
  140. sphimg.plot_sky_cart(alm_rec, ll2, mm2, config.nside, theta_max=1 * config.fwhm,
  141. savefile=os.path.join(result_freq_dir, 'output_sky.pdf'))
  142. # plot power spectra
  143. sphimg.plot_rec_power_sepctra(ll2, mm2, alm_rec, config, os.path.join(
  144. result_freq_dir, 'angular_power_spectra.pdf'))
  145. sphimg.plot_vis_vs_vis_rec(ru, Vobs, Vrec, os.path.join(result_freq_dir, 'vis_vs_vis_rec.pdf'))
  146. print "Done in %.2f s" % (time.time() - t)
  147. global_ylm.close()
  148. print '\nAll done!'
  149. def main():
  150. sh.init(0.1, USAGE)
  151. config_file = sh.get_opt_value('config', 'c', default='config_gridded.py')
  152. args = sh.get_args(min_nargs=1)
  153. result_dir = args[0]
  154. print "Result will be stored in:", result_dir
  155. if os.path.exists(result_dir):
  156. if not sh.askbool("Result directory already exist. Overwriting ?"):
  157. sys.exit(0)
  158. else:
  159. print "Removing:", result_dir
  160. shutil.rmtree(result_dir)
  161. if not os.path.isfile(config_file):
  162. print "Configuration file %s does not exist" % config_file
  163. sh.usage(True)
  164. if 'OMP_NUM_THREADS' not in os.environ:
  165. print "\nOMP_NUM_THREADS not set"
  166. else:
  167. print "Maximum number of threads used:", os.environ['OMP_NUM_THREADS']
  168. print "\nCreating test directory: %s\n" % result_dir
  169. os.mkdir(result_dir)
  170. shutil.copyfile(config_file, os.path.join(result_dir, 'config.py'))
  171. config = sphimg.get_config(result_dir)
  172. profileutils.start()
  173. do_inversion_gridded(config, result_dir)
  174. profileutils.done(stdout=False, file=os.path.join(result_dir, 'stats.dmp'))
  175. if __name__ == '__main__':
  176. main()