Add Nan handling and 3C405 new images
|
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 297 KiB After Width: | Height: | Size: 324 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 241 KiB |
|
Before Width: | Height: | Size: 339 KiB After Width: | Height: | Size: 360 KiB |
|
Before Width: | Height: | Size: 460 KiB After Width: | Height: | Size: 479 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050.png
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050_IQU.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050_P.png
Normal file
|
After Width: | Height: | Size: 330 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050_P_err.png
Normal file
|
After Width: | Height: | Size: 246 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050_SNRi.png
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050_SNRp.png
Normal file
|
After Width: | Height: | Size: 584 KiB |
|
Before Width: | Height: | Size: 434 KiB After Width: | Height: | Size: 264 KiB |
|
Before Width: | Height: | Size: 379 KiB |
|
Before Width: | Height: | Size: 214 KiB |
|
Before Width: | Height: | Size: 219 KiB |
|
Before Width: | Height: | Size: 370 KiB |
|
Before Width: | Height: | Size: 530 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM050_rot_IQU.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 316 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 428 KiB After Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 482 KiB After Width: | Height: | Size: 329 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100.png
Normal file
|
After Width: | Height: | Size: 472 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100_IQU.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100_P.png
Normal file
|
After Width: | Height: | Size: 338 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100_P_err.png
Normal file
|
After Width: | Height: | Size: 256 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100_SNRi.png
Normal file
|
After Width: | Height: | Size: 468 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100_SNRp.png
Normal file
|
After Width: | Height: | Size: 910 KiB |
|
Before Width: | Height: | Size: 448 KiB After Width: | Height: | Size: 352 KiB |
|
Before Width: | Height: | Size: 721 KiB |
|
Before Width: | Height: | Size: 392 KiB |
|
Before Width: | Height: | Size: 384 KiB |
|
Before Width: | Height: | Size: 724 KiB |
|
Before Width: | Height: | Size: 774 KiB |
BIN
plots/3C405_x136060/3C405_FOC_combine_FWHM100_rot_IQU.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 263 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 442 KiB After Width: | Height: | Size: 348 KiB |
|
Before Width: | Height: | Size: 767 KiB After Width: | Height: | Size: 559 KiB |
|
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 230 KiB |
|
Before Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 182 KiB |
|
Before Width: | Height: | Size: 289 KiB |
|
Before Width: | Height: | Size: 355 KiB |
BIN
plots/3C405_x136060/3C405_FOC_rot_IQU.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 377 KiB After Width: | Height: | Size: 248 KiB |
@@ -87,7 +87,7 @@ def main():
|
||||
iterations = 10
|
||||
# Error estimation
|
||||
error_sub_shape = (75,75)
|
||||
display_error = True
|
||||
display_error = False
|
||||
# Data binning
|
||||
rebin = True
|
||||
if rebin:
|
||||
@@ -96,17 +96,17 @@ def main():
|
||||
rebin_operation = 'sum' #sum or average
|
||||
# Alignement
|
||||
align_center = 'image' #If None will align image to image center
|
||||
display_data = True
|
||||
display_data = False
|
||||
# Smoothing
|
||||
smoothing_function = 'combine' #gaussian_after, gaussian or combine
|
||||
smoothing_FWHM = None #If None, no smoothing is done
|
||||
smoothing_FWHM = 1.00 #If None, no smoothing is done
|
||||
smoothing_scale = 'arcsec' #pixel or arcsec
|
||||
# Rotation
|
||||
rotate_stokes = False #rotation to North convention can give erroneous results
|
||||
rotate_data = False #rotation to North convention can give erroneous results
|
||||
# Polarization map output
|
||||
figname = '3C405_FOC' #target/intrument name
|
||||
figtype = '' #additionnal informations
|
||||
figtype = '_combine_FWHM100' #additionnal informations
|
||||
SNRp_cut = 3 #P measurments with SNR>3
|
||||
SNRi_cut = 30 #I measurments with SNR>30, which implies an uncertainty in P of 4.7%.
|
||||
step_vec = 1 #plot all vectors in the array. if step_vec = 2, then every other vector will be plotted
|
||||
@@ -165,7 +165,7 @@ def main():
|
||||
# Rotate images to have North up
|
||||
if rotate_stokes:
|
||||
ref_header = copy.deepcopy(headers[0])
|
||||
I_stokes, Q_stokes, U_stokes, Stokes_cov, headers = proj_red.rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, -ref_header['orientat'])
|
||||
I_stokes, Q_stokes, U_stokes, Stokes_cov, headers = proj_red.rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, -ref_header['orientat'], SNRi_cut=None)
|
||||
# Compute polarimetric parameters (polarization degree and angle).
|
||||
P, debiased_P, s_P, s_P_P, PA, s_PA, s_PA_P = proj_red.compute_pol(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers)
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@ def polarization_map(Stokes, SNRp_cut=3., SNRi_cut=30., step_vec=1,
|
||||
pang_err = Stokes[np.argmax([Stokes[i].header['datatype']=='Pol_ang_err' for i in range(len(Stokes))])]
|
||||
|
||||
pivot_wav = Stokes[0].header['photplam']
|
||||
convert_flux = 1.#Stokes[0].header['photflam']
|
||||
convert_flux = Stokes[0].header['photflam']
|
||||
wcs = WCS(Stokes[0]).deepcopy()
|
||||
|
||||
#Plot Stokes parameters map
|
||||
@@ -194,11 +194,13 @@ def polarization_map(Stokes, SNRp_cut=3., SNRi_cut=30., step_vec=1,
|
||||
#Compute SNR and apply cuts
|
||||
pol.data[pol.data == 0.] = np.nan
|
||||
SNRp = pol.data/pol_err.data
|
||||
SNRp[np.isnan(SNRp)] = 0.
|
||||
pol.data[SNRp < SNRp_cut] = np.nan
|
||||
SNRi = stkI.data/np.sqrt(stk_cov.data[0,0])
|
||||
SNRi[np.isnan(SNRi)] = 0.
|
||||
pol.data[SNRi < SNRi_cut] = np.nan
|
||||
|
||||
mask = (SNRp < SNRp_cut) * (SNRi < SNRi_cut)
|
||||
mask = (SNRp > SNRp_cut) * (SNRi > SNRi_cut)
|
||||
|
||||
# Look for pixel of max polarization
|
||||
if np.isfinite(pol.data).any():
|
||||
|
||||
@@ -646,15 +646,14 @@ def align_data(data_array, error_array=None, upsample_factor=1., ref_data=None,
|
||||
# Create a rescaled null array that can contain any rotation of the
|
||||
#original image (and shifted images)
|
||||
shape = data_array.shape
|
||||
res_shape = int(np.ceil(np.sqrt(2)*np.max(shape[1:])))
|
||||
rescaled_image = np.ones((shape[0],res_shape,res_shape))
|
||||
res_shape = int(np.ceil(np.sqrt(2.5)*np.max(shape[1:])))
|
||||
rescaled_image = np.zeros((shape[0],res_shape,res_shape))
|
||||
rescaled_error = np.ones((shape[0],res_shape,res_shape))
|
||||
res_center = (np.array(rescaled_image.shape[1:])/2).astype(int)
|
||||
|
||||
shifts, errors = [], []
|
||||
for i,image in enumerate(data_array):
|
||||
# Initialize rescaled images to background values
|
||||
rescaled_image[i] *= 0.*background[i]
|
||||
rescaled_error[i] *= background[i]
|
||||
# Get shifts and error by cross-correlation to ref_data
|
||||
shift, error, phase_diff = phase_cross_correlation(ref_data, image,
|
||||
@@ -1004,10 +1003,10 @@ def compute_Stokes(data_array, error_array, headers, FWHM=None,
|
||||
|
||||
#Remove nan
|
||||
I_stokes[np.isnan(I_stokes)]=0.
|
||||
Q_stokes[np.isnan(Q_stokes)]=0.
|
||||
Q_stokes[I_stokes == 0.]=0.
|
||||
U_stokes[np.isnan(U_stokes)]=0.
|
||||
U_stokes[I_stokes == 0.]=0.
|
||||
Q_stokes[np.isnan(Q_stokes)]=0.
|
||||
U_stokes[np.isnan(U_stokes)]=0.
|
||||
|
||||
mask = (Q_stokes**2 + U_stokes**2) > I_stokes**2
|
||||
if mask.any():
|
||||
@@ -1114,6 +1113,16 @@ def compute_pol(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers):
|
||||
s_P_P = np.sqrt(2.)/np.sqrt(N_obs)*100.
|
||||
s_PA_P = s_P_P/(2.*P/100.)*180./np.pi
|
||||
|
||||
# Nan handling :
|
||||
fmax = np.finfo(np.float64).max
|
||||
|
||||
P[np.isnan(P)] = 0.
|
||||
s_P[np.isnan(s_P)] = fmax
|
||||
s_PA[np.isnan(s_PA)] = fmax
|
||||
debiased_P[np.isnan(debiased_P)] = 0.
|
||||
s_P_P[np.isnan(s_P_P)] = fmax
|
||||
s_PA_P[np.isnan(s_PA_P)] = fmax
|
||||
|
||||
return P, debiased_P, s_P, s_P_P, PA, s_PA, s_PA_P
|
||||
|
||||
|
||||
@@ -1186,7 +1195,7 @@ def rotate_data(data_array, error_array, headers, ang):
|
||||
return new_data_array, new_error_array, new_headers
|
||||
|
||||
|
||||
def rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, ang):
|
||||
def rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, ang, SNRi_cut=None):
|
||||
"""
|
||||
Use scipy.ndimage.rotate to rotate I_stokes to an angle, and a rotation
|
||||
matrix to rotate Q, U of a given angle in degrees and update header
|
||||
@@ -1209,6 +1218,10 @@ def rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, ang):
|
||||
ang : float
|
||||
Rotation angle (in degrees) that should be applied to the Stokes
|
||||
parameters
|
||||
SNRi_cut : float, optional
|
||||
Cut that should be applied to the signal-to-noise ratio on I.
|
||||
Any SNR < SNRi_cut won't be displayed. If None, cut won't be applied.
|
||||
Defaults to None.
|
||||
----------
|
||||
Returns:
|
||||
new_I_stokes : numpy.ndarray
|
||||
@@ -1226,6 +1239,18 @@ def rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, ang):
|
||||
Updated list of headers corresponding to the reduced images accounting
|
||||
for the new orientation angle.
|
||||
"""
|
||||
#Apply cuts
|
||||
if not(SNRi_cut is None):
|
||||
SNRi = I_stokes/np.sqrt(Stokes_cov[0,0])
|
||||
mask = SNRi < SNRi_cut
|
||||
eps = 1e-5
|
||||
for i in range(I_stokes.shape[0]):
|
||||
for j in range(I_stokes.shape[1]):
|
||||
if mask[i,j]:
|
||||
I_stokes[i,j] = eps*np.sqrt(Stokes_cov[0,0][i,j])
|
||||
Q_stokes[i,j] = eps*np.sqrt(Stokes_cov[1,1][i,j])
|
||||
U_stokes[i,j] = eps*np.sqrt(Stokes_cov[2,2][i,j])
|
||||
|
||||
#Rotate I_stokes, Q_stokes, U_stokes using rotation matrix
|
||||
alpha = ang*np.pi/180.
|
||||
new_I_stokes = 1.*I_stokes
|
||||
@@ -1275,6 +1300,16 @@ def rotate_Stokes(I_stokes, Q_stokes, U_stokes, Stokes_cov, headers, ang):
|
||||
|
||||
new_headers.append(new_header)
|
||||
|
||||
# Nan handling :
|
||||
fmax = np.finfo(np.float64).max
|
||||
|
||||
new_I_stokes[np.isnan(new_I_stokes)] = 0.
|
||||
new_Q_stokes[new_I_stokes == 0.] = 0.
|
||||
new_U_stokes[new_I_stokes == 0.] = 0.
|
||||
new_Q_stokes[np.isnan(new_Q_stokes)] = 0.
|
||||
new_U_stokes[np.isnan(new_U_stokes)] = 0.
|
||||
new_Stokes_cov[np.isnan(new_Stokes_cov)] = fmax
|
||||
|
||||
return new_I_stokes, new_Q_stokes, new_U_stokes, new_Stokes_cov, new_headers
|
||||
|
||||
|
||||
|
||||