def fit_a_pixel(args): if len(args) == 6: tline1, etline1, cont1, tline2, etline2, cont2 = args elif len(args) == 7: tline1, etline1, cont1, tline2, etline2, cont2, pb = args pb.update() pargrid1 = (cont1*np.exp(-taugrid1) + (1-np.exp(-taugrid1))*texgrid1) pargrid2 = (cont2*np.exp(-taugrid2) + (1-np.exp(-taugrid2))*texgrid2) #spec = (1.0-np.exp(-np.array(tau_nu_cumul)))*(Tex-Tbackground) match, indbest, chi2 = grid_2p_getmatch(tline1+cont1, etline1, pargrid1, tline2+cont2, etline2, pargrid2) likelihood = np.exp(-chi2/2.) def lwt(x, mask=match): """ Likelihood-weighted mean """ return (x*likelihood)[mask].sum() / likelihood[mask].sum() def lstd(x, mask=match): """ Likelihood-weighted stddev """ return (((x-lwt(x,mask))**2*likelihood)[mask].sum() / likelihood[mask].sum() * (mask.sum()/(mask.sum()-1)))**0.5 chi2best = chi2.flat[indbest] dens_best = densityarr.flat[indbest] col_best = columnarr.flat[indbest] temp_best = temparr.flat[indbest] opr_best = oprarr.flat[indbest] best = (dens_best, col_best, temp_best, opr_best, chi2best) if np.count_nonzero(match) == 0: log.warn(str(args)) warnings.warn("Found no matches. Returning NaNs") return best, np.nan, np.nan, np.nan, np.nan, np.nan chi2_all = chi2[match] dens_all = densityarr[match] col_all = columnarr[match] temp_all = temparr[match] opr_all = oprarr[match] mins = map(min, (dens_all, col_all, temp_all, opr_all, chi2_all)) maxs = map(max, (dens_all, col_all, temp_all, opr_all, chi2_all)) mean = map(np.mean, (dens_all, col_all, temp_all, opr_all, chi2_all)) std = map(np.std, (dens_all, col_all, temp_all, opr_all, chi2_all)) lweighted = map(lwt, (densityarr, columnarr, temparr, oprarr)) lerror = map(lstd, (densityarr, columnarr, temparr, oprarr)) return best,mins,maxs,mean,std,chi2best,lweighted,lerror
xx,yy,zz = (82-1, 73-1, 107-1) xx,yy,zz = (111-1, 110-1, 98-1) # lowdens / highstd? EXTREME degeneracy! xx,yy,zz = (90-1, 110-1, 110-1) # low dens, high *column* std but low *dens* std cont1 = cont11[yy,xx] cont2 = cont22[yy,xx] tline1 = cube1.cube[zz,yy,xx] tline2 = cube2.cube[zz,yy,xx] etline1 = cube1.errorcube[zz,yy,xx] etline2 = cube2.errorcube[zz,yy,xx] pargrid1 = (cont1*np.exp(-taugrid1) + (1-np.exp(-taugrid1))*texgrid1) pargrid2 = (cont2*np.exp(-taugrid2) + (1-np.exp(-taugrid2))*texgrid2) #spec = (1.0-np.exp(-np.array(tau_nu_cumul)))*(Tex-Tbackground) match, indbest, chi2 = grid_2p_getmatch(tline1+cont1, etline1, pargrid1, tline2+cont2, etline2, pargrid2) match11, indbest11, chi2_11 = grid_getmatch(tline1+cont1, etline1, pargrid1) match22, indbest22, chi2_22 = grid_getmatch(tline2+cont2, etline2, pargrid2) bw,bz,by,bx = np.unravel_index(indbest, pargrid1.shape) pl.jet() pl.clf() extent = [densityarr.flat[0],densityarr.flat[-1], columnarr.flat[0],columnarr.flat[-1]] pl.imshow(pargrid1[bw,bz,:,:], alpha=0.5, extent=extent) pl.contour(densityarr[bw,bz,:,:],columnarr[bw,bz,:,:], pargrid2[bw,bz,:,:], levels=np.linspace(tline2-20*etline2+cont2, tline2+20*etline2+cont2, 10))