def my_convolution(chann, head, newsize, outspax, psf, instpsf): #Convolve cube channel with PSF channel chann = psf_convolve(chann, psf) #Convolve cube channel with instrument PSF chann = psf_convolve(chann, instpsf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) #chann *= (head['CDELT1']*head['CDELT2']*1.E-6) chann = frebin(chann, (newsize[0],newsize[1]), total=True) #chann /= (outspax[0]*outspax[1]*1.E-6) return chann
def wavelength_loop(cube, head, wavels, out_cube, newsize, outspax): '''Function to take input datacube and process it iteratively through each wavelength channel as follows: - Generate PSF array for given channel - Add effect of ADR to channel - Convolve cube channel with PSF - Frebin up to chosen output spaxel scale Inputs: cube: Datacube head: Datacube header wavels: Wavelength array out_cube: Empty output cube newsize: tuple containing (x_newsize, y_newsize) array sizes outspax: output spaxels (x, y) (mas, mas) Output: cube: Processed cube head: Updated header ''' nspec = wp.NIRSpec() nspec.pupilopd = None print 'OPD = ', nspec.pupilopd oversamp = 1000. / float(outspax[0]) for l in xrange(len(wavels)): #Print percentage bar update_progress(n.round(l / float(len(wavels)), 2)) #Create PSF channel psf = nspec.calcPSF(outfile=None, source=None, filter=None, nlambda=None, monochromatic=wavels[l] * 1.E-6, oversample=oversamp, fov_arcsec=5, rebin=False) psf = psf[0].data #Convolve cube channel with PSF channel channel = psf_convolve(cube[l, :, :], psf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) channel *= (head['CDELT1'] * head['CDELT2'] * 1.E-6) channel = frebin(channel, (newsize[0], newsize[1]), total=True) channel /= (outspax[0] * outspax[1] * 1.E-6) #Add channel to output cube out_cube[l, :, :] = channel return out_cube, head
def pp_wavelength_channel(chann, head, wave, l, newsize, outspax): '''Function to take input datacube and process it iteratively through each wavelength channel as follows: - Generate PSF array for given channel - Add effect of ADR to channel - Convolve cube channel with PSF - Frebin up to chosen output spaxel scale Inputs: chann: cube channel head: Datacube header wave: wavelength [um] l: iteration no. out_cube: Empty output cube newsize: tuple containing (x_newsize, y_newsize) array sizes outspax: tuple containing (x, y) output spaxel scales Output: cube: Processed cube head: Updated header inspax: Input spaxel scale (mas, mas) outspax: Output spaxel scale (mas, mas) ''' nspec = wp.NIRSpec() nspec.pupilopd = None #print 'OPD = ', nspec.pupilopd oversamp = 1000. / float(outspax[0]) #Create PSF channel #print 'Wavelength = ', wave*1.E-6, 'm' psf = nspec.calcPSF(outfile=None, source=None, filter=None, nlambda=None, monochromatic=wave * 1.E-6, oversample=oversamp, fov_arcsec=5, rebin=False) psf = psf[0].data #Convolve cube channel with PSF channel chann = psf_convolve(chann, psf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) chann *= (head['CDELT1'] * head['CDELT2'] * 1.E-6) chann = frebin(chann, (newsize[0], newsize[1]), total=True) chann /= (outspax[0] * outspax[1] * 1.E-6) return chann, l
def wavelength_loop(cube, head, wavels, out_cube, newsize, outspax): '''Function to take input datacube and process it iteratively through each wavelength channel as follows: - Generate PSF array for given channel - Add effect of ADR to channel - Convolve cube channel with PSF - Frebin up to chosen output spaxel scale Inputs: cube: Datacube head: Datacube header wavels: Wavelength array out_cube: Empty output cube newsize: tuple containing (x_newsize, y_newsize) array sizes outspax: output spaxels (x, y) (mas, mas) Output: cube: Processed cube head: Updated header ''' nspec = wp.NIRSpec() nspec.pupilopd = None print 'OPD = ', nspec.pupilopd oversamp = 1000./float(outspax[0]) for l in xrange(len(wavels)): #Print percentage bar update_progress(n.round(l/float(len(wavels)),2)) #Create PSF channel psf = nspec.calcPSF(outfile=None, source=None, filter=None, nlambda=None, monochromatic=wavels[l]*1.E-6, oversample=oversamp, fov_arcsec=5, rebin=False) psf = psf[0].data #Convolve cube channel with PSF channel channel = psf_convolve(cube[l,:,:], psf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) channel *= (head['CDELT1']*head['CDELT2']*1.E-6) channel = frebin(channel, (newsize[0],newsize[1]), total=True) channel /= (outspax[0]*outspax[1]*1.E-6) #Add channel to output cube out_cube[l,:,:] = channel return out_cube, head
def pp_wavelength_channel(chann, head, wave, l, newsize, outspax): '''Function to take input datacube and process it iteratively through each wavelength channel as follows: - Generate PSF array for given channel - Add effect of ADR to channel - Convolve cube channel with PSF - Frebin up to chosen output spaxel scale Inputs: chann: cube channel head: Datacube header wave: wavelength [um] l: iteration no. out_cube: Empty output cube newsize: tuple containing (x_newsize, y_newsize) array sizes outspax: tuple containing (x, y) output spaxel scales Output: cube: Processed cube head: Updated header inspax: Input spaxel scale (mas, mas) outspax: Output spaxel scale (mas, mas) ''' nspec = wp.NIRSpec() nspec.pupilopd = None #print 'OPD = ', nspec.pupilopd oversamp = 1000./float(outspax[0]) #Create PSF channel #print 'Wavelength = ', wave*1.E-6, 'm' psf = nspec.calcPSF(outfile=None, source=None, filter=None, nlambda=None, monochromatic=wave*1.E-6, oversample=oversamp, fov_arcsec=5, rebin=False) psf = psf[0].data #Convolve cube channel with PSF channel chann = psf_convolve(chann, psf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) chann *= (head['CDELT1']*head['CDELT2']*1.E-6) chann = frebin(chann, (newsize[0],newsize[1]), total=True) chann /= (outspax[0]*outspax[1]*1.E-6) return chann, l
def wavelength_loop(cube, head, wavels, out_cube, AO, psfvars, adrvals, newsize, outspax, adr_switch='ON'): '''Function to take input datacube and process it iteratively through each wavelength channel as follows: - Generate PSF array for given channel - Add effect of ADR to channel - Convolve cube channel with PSF - Frebin up to chosen output spaxel scale Inputs: cube: Datacube head: Datacube header wavels: Wavelength array out_cube: Empty output cube AO: AO mode [LTAO, SCAO, Gaussian] psdvars: list containing [psfparams, psfspax, psfsize, [D,eps], res_jitter, seeing, user_psf, user_psflams] adrvals: array of ADR values newsize: tuple containing (x_newsize, y_newsize) array sizes outspax: tuple containing (x, y) output spaxel scales adr_switch: ON or OFF. Turns ADR effect on or off. Output: cube: Processed cube head: Updated header inspax: Input spaxel scale (mas, mas) outspax: Output spaxel scale (mas, mas) ''' for l in xrange(len(wavels)): #Print percentage bar update_progress(n.round(l / float(len(wavels)), 2)) #Create PSF channel #If user PSF and 2D image upsf = psfvars[-2] upsflams = psfvars[-1] if type(upsf) != str and type(upsflams) == str: psf = upsf #If User PSF and 3D cube elif type(upsf) != str and type(upsflams) != str: #Interpolate PSF cube interp = interp1d(upsflams, upsf, axis=0) psf = interp(wavels[l]) elif AO == 'LTAO' or AO == 'SCAO' or AO == 'GLAO': psf = create_psf_channel(psfvars[0], l, psfvars[1], (head['CDELT1'], head['CDELT2']), psfvars[2], psfvars[3], psfvars[4]) elif AO == 'Gaussian': psf = create_Gausspsf_channel(wavels[l], psfvars[5], psfvars[3], psfvars[4], psfvars[2], Nyquist=False, psfspax=psfvars[1], output_spax=(head['CDELT1'], head['CDELT2'])) else: print 'AO = ', AO raise ValueError('AO choice error!') #Create instrument PSF array instpsf = create_instpsf(psfvars[2], psfvars[1], outspax, (head['CDELT1'], head['CDELT2'])) #Add ADR effect to channel if adr_switch == 'ON': cube[l, :, :] = add_ADR(cube[l, :, :], head, adrvals[l], 'spline3') #Convolve cube channel with PSF channel channel = psf_convolve(cube[l, :, :], psf) #Convolve cube channel with instrument PSF channel = psf_convolve(channel, instpsf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) channel *= (head['CDELT1'] * head['CDELT2'] * 1.E-6) channel = frebin(channel, (newsize[0], newsize[1]), total=True) channel /= (outspax[0] * outspax[1] * 1.E-6) #Correct ADR effect if adr_switch == 'ON': adrhead = head.copy() adrhead['CDELT1'] = outspax[0] adrhead['CDELT2'] = outspax[1] channel = add_ADR(channel, adrhead, -1. * adrvals[l], 'spline3') #Add channel to output cube out_cube[l, :, :] = channel return out_cube, head
def pp_wavelength_channel(chann, head, wave, l, AO, psfvars, adrval, newsize, outspax, adr_switch): '''Function to take input datacube and process it iteratively through each wavelength channel as follows: - Generate PSF array for given channel - Add effect of ADR to channel - Convolve cube channel with PSF - Frebin up to chosen output spaxel scale Inputs: chann: cube channel head: Datacube header wave: wavelength [um] l: iteration no. out_cube: Empty output cube AO: AO mode [LTAO, SCAO, Gaussian] psfvars: list containing [psfparams, psfspax, psfsize, [D,eps], res_jitter, seeing, user_psf, user_psflams] adrval: ADR value newsize: tuple containing (x_newsize, y_newsize) array sizes outspax: tuple containing (x, y) output spaxel scales adr_switch: On or OFF. Turns ADR effect on or off Output: cube: Processed cube head: Updated header inspax: Input spaxel scale (mas, mas) outspax: Output spaxel scale (mas, mas) ''' #Create PSF channel #If user PSF and 2D image upsf = psfvars[-2] upsflams = psfvars[-1] if type(upsf) != str and type(upsflams) == str: psf = upsf #If User PSF and 3D cube elif type(upsf) != str and type(upsflams) != str: #Interpolate PSF cube interp = interp1d(upsflams, upsf, axis=0) psf = interp(wave) elif AO == 'LTAO' or AO == 'SCAO' or AO == 'GLAO': psf = create_psf_channel(psfvars[0], l, psfvars[1], (head['CDELT1'], head['CDELT2']), psfvars[2], psfvars[3], psfvars[4]) elif AO == 'Gaussian': psf = create_Gausspsf_channel(wave, psfvars[5], psfvars[3], psfvars[4], psfvars[2], False, psfvars[1], (head['CDELT1'], head['CDELT2'])) else: print 'AO = ', AO raise ValueError('AO choice or user_PSF error!') #Create instrument PSF array instpsf = create_instpsf(psfvars[2], psfvars[1], outspax, (head['CDELT1'], head['CDELT2'])) #Add ADR effect to channel if adr_switch == 'ON': chann = add_ADR(chann, head, adrval, 'spline3') #Convolve cube channel with PSF channel chann = psf_convolve(chann, psf) #Convolve cube channel with instrument PSF chann = psf_convolve(chann, instpsf) #Frebin datacube up to output spaxel scale newsize = (int(newsize[0]), int(newsize[1])) chann *= (head['CDELT1'] * head['CDELT2'] * 1.E-6) chann = frebin(chann, (newsize[0], newsize[1]), total=True) chann /= (outspax[0] * outspax[1] * 1.E-6) #"Correct" ADR effect if adr_switch == 'ON': adrhead = head.copy() adrhead['CDELT1'] = outspax[0] adrhead['CDELT2'] = outspax[1] chann = add_ADR(chann, adrhead, -1. * adrval, 'spline3') return chann, l