An error occurred while loading the file. Please try again.
PSFMatsEll_coverage.py 5.98 KiB
import unittest
import sys,os,math
from itertools import islice
#import mpi4py.MPI as MPI
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('Agg')
import scipy.io
from scipy import ndimage
#sys.path.append("/public/home/weichengliang/lnData/CSST_new_framwork/csstPSF_v4_20210326")
sys.path.append("../")
from ObservationSim.PSF.PSFInterp import PSFConfig as myConfig
#import PSFUtil as myUtil
NPSF = 400
##############################
###计算PSF椭率###
def psfSecondMoments(psfMat, cenX, cenY, pixSize=1):
    apr = 0.5 #arcsec, 0.5角秒内测量
    fl  = 28. #meters
    pxs = 2.5 #microns
    apr = np.deg2rad(apr/3600.)*fl*1e6
    apr = apr/pxs
    apr = np.int(np.ceil(apr))
    I = psfMat
    ncol = I.shape[1]
    nrow = I.shape[0]
    w   = 0.0
    w11 = 0.0
    w12 = 0.0
    w22 = 0.0
    for icol in range(ncol):
        for jrow in range(nrow):
            x = icol*pixSize - cenX
            y = jrow*pixSize - cenY
            rr = np.sqrt(x*x + y*y)
            wgt= 0.0
            if rr <= apr:
                wgt = 1.0
            w   += I[jrow, icol]*wgt
            w11 += x*x*I[jrow, icol]*wgt
            w12 += x*y*I[jrow, icol]*wgt
            w22 += y*y*I[jrow, icol]*wgt
    w11 /= w
    w12 /= w
    w22 /= w
    sz = w11 + w22
    e1 = (w11 - w22)/sz
    e2 = 2.0*w12/sz
    return sz, e1, e2
##############################
##############################
'''
def assignTasks(npsf, NTasks, ThisTask):
    npsfPerTasks = int(npsf/NTasks)
    iStart= 0 + npsfPerTasks*ThisTask
    iEnd  = npsfPerTasks + npsfPerTasks*ThisTask
    if ThisTask == NTasks:
        iEnd = npsf
    return iStart, iEnd
''' #def test_psfEll(iccd, iwave, psfPath, ThisTask, NTasks): def test_psfEll(iccd, iwave, psfPath): nccd = 30 npsf = NPSF #iStart, iEnd = assignTasks(npsf, NTasks, ThisTask) imx = np.zeros(npsf) imy = np.zeros(npsf) psf_e1 = np.zeros(npsf) psf_e2 = np.zeros(npsf) psf_sz = np.zeros(npsf) #for ipsf in range(iStart+1, iEnd+1): for ipsf in range(1, 401): if ipsf != 1: continue print('ipsf-{:}'.format(ipsf), end='\r') psfInfo = myConfig.LoadPSF(iccd, iwave, ipsf, psfPath, InputMaxPixelPos=True, PSFCentroidWgt=True, VPSF=False) imx[ipsf-1] = psfInfo['image_x']+psfInfo['centroid_x'] imy[ipsf-1] = psfInfo['image_y']+psfInfo['centroid_y'] psfMat = psfInfo['psfMat'] cenX = 256 cenY = 256 sz, e1, e2 = psfSecondMoments(psfMat, cenX, cenY, pixSize=1) psf_e1[ipsf-1] = e1 psf_e2[ipsf-1] = e2 psf_sz[ipsf-1] = sz print('test:' ,sz, e1, e2) ####### #comm.barrier() #imx = comm.allreduce(imx, op=MPI.SUM) #imy = comm.allreduce(imy, op=MPI.SUM) #psf_e1 = comm.allreduce(psf_e1, op=MPI.SUM) #psf_e2 = comm.allreduce(psf_e2, op=MPI.SUM) #psf_sz = comm.allreduce(psf_sz, op=MPI.SUM) #comm.barrier() #if ThisTask == 0: # arr = [imx, imy, psf_e1, psf_e2, psf_sz] # np.save('/public/home/weichengliang/lnData/CSST_new_framwork/csstPSF_v4_20210326/test4report/data/psfEll20_{:}_{:}'.format(iccd, iwave), arr) def test_psfEllPlot(OVERPLOT=False): #if ThisTask == 0: if True: prefix = 'psfEll30' iccd = 1 iwave= 1 data = np.load('data/'+prefix+'_1_1.npy') imx= data[0] imy= data[1] psf_e1 = data[2] psf_e2 = data[3] print(np.shape(imx)) npsf = np.shape(imx)[0] plt.cla() plt.close("all") fig = plt.figure(figsize=(12,12)) plt.plot(imx, imy, 'r.') plt.savefig('figs/psfPos.pdf') ####### fig = plt.figure(figsize=(12, 12))
plt.subplots_adjust(wspace=0.1, hspace=0.1) ax = plt.subplot(1, 1, 1) for ipsf in range(npsf): plt.plot(imx[ipsf], imy[ipsf], 'r.') ang = np.arctan2(psf_e2[ipsf], psf_e1[ipsf])/2 ell = np.sqrt(psf_e1[ipsf]**2 + psf_e2[ipsf]**2) ell *= 15 lcos = ell*np.cos(ang) lsin = ell*np.sin(ang) plt.plot([imx[ipsf]-lcos, imx[ipsf]+lcos],[imy[ipsf]-lsin, imy[ipsf]+lsin],'r', lw=2) ########### ang = 0. ell = 0.05 ell*= 15 lcos = ell*np.cos(ang) lsin = ell*np.sin(ang) plt.plot([imx[898]-lcos, imx[898]+lcos],[imy[898]+5.-lsin, imy[898]+5.+lsin],'k', lw=2) plt.annotate('{:}'.format(ell/15), (imx[898]-2., imy[898]+6.), xycoords='data', fontsize=10) plt.xlabel('CCD X (mm)') plt.ylabel('CCD Y (mm)') if OVERPLOT == True: prefix = 'psfEll20' data = np.load('data/'+prefix+'_1_1.npy') imx= data[0] imy= data[1] psf_e1 = data[2] psf_e2 = data[3] npsf = np.shape(imx)[0] for ipsf in range(npsf): plt.plot(imx[ipsf], imy[ipsf], 'b.') ang = np.arctan2(psf_e2[ipsf], psf_e1[ipsf])/2 ell = np.sqrt(psf_e1[ipsf]**2 + psf_e2[ipsf]**2) ell *= 15 lcos = ell*np.cos(ang) lsin = ell*np.sin(ang) plt.plot([imx[ipsf]-lcos, imx[ipsf]+lcos],[imy[ipsf]-lsin, imy[ipsf]+lsin],'b', lw=2) plt.gca().set_aspect(1) if OVERPLOT == True: prefix = 'psfEllOP' plt.savefig('figs/'+prefix+'_iccd{:}.pdf'.format(iccd)) class PSFMatsEll_coverage(unittest.TestCase): def test_psfEll_(self): #comm = MPI.COMM_WORLD #ThisTask = comm.Get_rank() #NTasks = comm.Get_size() print('#####haha#####') iccd = 1 iwave= 1 psfPath = '/data/simudata/CSSOSDataProductsSims/data/csstPSFdata/CSSOS_psf_20210326/CSST_psf_ciomp_20x20field' #test_psfEll(iccd, iwave, psfPath, ThisTask, NTasks) test_psfEll(iccd, iwave, psfPath) test_psfEllPlot(OVERPLOT=True) ############################## ############################## ############################## if __name__=='__main__': unittest.main()