Commit 471e6c0b authored by Yan Zhaojun's avatar Yan Zhaojun
Browse files

update

parent 19fd5ed7
...@@ -138,7 +138,7 @@ class CDM03bidir(): ...@@ -138,7 +138,7 @@ class CDM03bidir():
# read in trap information # read in trap information
trapdata = np.loadtxt( trapdata = np.loadtxt(
self.values['dir_path']+self.values['paralleltrapfile']) os.path.join(self.values['dir_path'],self.values['paralleltrapfile']))
if trapdata.ndim > 1: if trapdata.ndim > 1:
self.nt_p = trapdata[:, 0] self.nt_p = trapdata[:, 0]
self.sigma_p = trapdata[:, 1] self.sigma_p = trapdata[:, 1]
...@@ -150,7 +150,7 @@ class CDM03bidir(): ...@@ -150,7 +150,7 @@ class CDM03bidir():
self.taur_p = [trapdata[2],] self.taur_p = [trapdata[2],]
trapdata = np.loadtxt( trapdata = np.loadtxt(
self.values['dir_path']+self.values['serialtrapfile']) os.path.join(self.values['dir_path'],self.values['serialtrapfile']))
if trapdata.ndim > 1: if trapdata.ndim > 1:
self.nt_s = trapdata[:, 0] self.nt_s = trapdata[:, 0]
self.sigma_s = trapdata[:, 1] self.sigma_s = trapdata[:, 1]
...@@ -261,10 +261,7 @@ class CDM03bidir(): ...@@ -261,10 +261,7 @@ class CDM03bidir():
return np.asanyarray(CTIed) return np.asanyarray(CTIed)
################################################################################################################# #################################################################################################################
################################################################################################################# #################################################################################################################
""" """
These functions can be used for logging information. These functions can be used for logging information.
...@@ -272,8 +269,6 @@ These functions can be used for logging information. ...@@ -272,8 +269,6 @@ These functions can be used for logging information.
:version: 0.3 :version: 0.3
""" """
def lg(log_filename, loggername='logger'): def lg(log_filename, loggername='logger'):
""" """
Sets up a logger. Sets up a logger.
...@@ -302,8 +297,6 @@ def lg(log_filename, loggername='logger'): ...@@ -302,8 +297,6 @@ def lg(log_filename, loggername='logger'):
logger.addHandler(handler) logger.addHandler(handler)
return logger return logger
############################################################################## ##############################################################################
def IFSinformation(): def IFSinformation():
...@@ -658,7 +651,7 @@ def ill2flux(path, E): ...@@ -658,7 +651,7 @@ def ill2flux(path, E):
""" """
# use template from sky_bkg (background_spec_hst.dat) # use template from sky_bkg (background_spec_hst.dat)
filename = path+'IFS_inputdata/refs/background_spec_hst.dat' filename = os.path.join(path,'IFS_inputdata/refs/background_spec_hst.dat')
cat_spec = pd.read_csv(filename, sep='\\s+', header=None, comment='#') cat_spec = pd.read_csv(filename, sep='\\s+', header=None, comment='#')
wave0 = cat_spec[0].values # A wave0 = cat_spec[0].values # A
spec0 = cat_spec[2].values # erg/s/cm^2/A/arcsec^2 spec0 = cat_spec[2].values # erg/s/cm^2/A/arcsec^2
...@@ -752,7 +745,7 @@ class StrayLight(object): ...@@ -752,7 +745,7 @@ class StrayLight(object):
self.ecliptic = self.equator.transform_to('barycentrictrueecliptic') self.ecliptic = self.equator.transform_to('barycentrictrueecliptic')
self.pointing = transRaDec2D(radec[0], radec[1]) self.pointing = transRaDec2D(radec[0], radec[1])
self.slcdll = ctypes.CDLL( self.slcdll = ctypes.CDLL(
self.path+'IFS_inputdata/refs/libstraylight.so') # dylib os.path.join(self.path,'IFS_inputdata/refs/libstraylight.so')) # dylib
self.slcdll.Calculate.argtypes = [ctypes.c_double, ctypes.POINTER(ctypes.c_double), self.slcdll.Calculate.argtypes = [ctypes.c_double, ctypes.POINTER(ctypes.c_double),
ctypes.POINTER(ctypes.c_double), ctypes.POINTER( ctypes.POINTER(ctypes.c_double), ctypes.POINTER(
...@@ -775,11 +768,11 @@ class StrayLight(object): ...@@ -775,11 +768,11 @@ class StrayLight(object):
ctypes.POINTER(ctypes.c_double)] ctypes.POINTER(ctypes.c_double)]
self.slcdll.Init.argtypes = [ self.slcdll.Init.argtypes = [
ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p] ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
self.deFn = self.path+"IFS_inputdata/refs/DE405" self.deFn = os.path.join(self.path,"IFS_inputdata/refs/DE405")
self.PSTFn = self.path+"IFS_inputdata/refs/PST" self.PSTFn = os.path.join(self.path,"IFS_inputdata/refs/PST")
self.RFn = self.path + "IFS_inputdata/refs/R" self.RFn = os.path.join(self.path,"IFS_inputdata/refs/R")
self.ZolFn = self.path+"IFS_inputdata/refs/Zodiacal" self.ZolFn = os.path.join(self.path,"IFS_inputdata/refs/Zodiacal")
self.brightStarTabFn = self.path+"IFS_inputdata/refs/BrightGaia_with_csst_mag" self.brightStarTabFn = os.path.join(self.path,"IFS_inputdata/refs/BrightGaia_with_csst_mag")
self.slcdll.Init(str.encode(self.deFn), str.encode( self.slcdll.Init(str.encode(self.deFn), str.encode(
self.PSTFn), str.encode(self.RFn), str.encode(self.ZolFn)) self.PSTFn), str.encode(self.RFn), str.encode(self.ZolFn))
...@@ -1865,9 +1858,6 @@ class IFSsimulator(): ...@@ -1865,9 +1858,6 @@ class IFSsimulator():
# get solar position # get solar position
dt = datetime.fromisoformat(time) dt = datetime.fromisoformat(time)
jd = time2jd(dt) jd = time2jd(dt)
#
#
#
# # jd = julian.to_jd(dt, fmt='jd') # # jd = julian.to_jd(dt, fmt='jd')
t = Time(jd, format='jd', scale='utc') t = Time(jd, format='jd', scale='utc')
...@@ -1888,7 +1878,7 @@ class IFSsimulator(): ...@@ -1888,7 +1878,7 @@ class IFSsimulator():
# interpolated zodical surface brightness at 0.5 um # interpolated zodical surface brightness at 0.5 um
zodi = pd.read_csv( zodi = pd.read_csv(
self.information['dir_path']+'IFS_inputdata/refs/zodi_map.dat', sep='\\s+', header=None, comment='#') os.path.join(self.information['dir_path'],'IFS_inputdata/refs/zodi_map.dat'), sep='\\s+', header=None, comment='#')
beta_angle = np.array([0, 5, 10, 15, 20, 25, 30, 45, 60, 75]) beta_angle = np.array([0, 5, 10, 15, 20, 25, 30, 45, 60, 75])
lamda_angle = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45, lamda_angle = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45,
60, 75, 90, 105, 120, 135, 150, 165, 180]) 60, 75, 90, 105, 120, 135, 150, 165, 180])
...@@ -1902,7 +1892,7 @@ class IFSsimulator(): ...@@ -1902,7 +1892,7 @@ class IFSsimulator():
# read the zodical spectrum in the ecliptic # read the zodical spectrum in the ecliptic
cat_spec = pd.read_csv( cat_spec = pd.read_csv(
self.information['dir_path']+'IFS_inputdata/refs/solar_spec.dat', sep='\\s+', header=None, comment='#') os.path.join(self.information['dir_path'],'IFS_inputdata/refs/solar_spec.dat'), sep='\\s+', header=None, comment='#')
wave = cat_spec[0].values # A wave = cat_spec[0].values # A
spec0 = cat_spec[1].values # spec0 = cat_spec[1].values #
zodi_norm = 252 # zodi_norm = 252 #
...@@ -1922,42 +1912,6 @@ class IFSsimulator(): ...@@ -1922,42 +1912,6 @@ class IFSsimulator():
return wave_A, spec_erg2 return wave_A, spec_erg2
########################################################################## ##########################################################################
# def smoothingWithChargeDiffusion(self, image, sigma=(0.32, 0.32)):
# """
# Parameters
# ----------
# image : TYPE
# DESCRIPTION.
# sigma : TYPE, optional
# DESCRIPTION. The default is (0.32, 0.32).
# Returns
# -------
# TYPE
# DESCRIPTION.
# """
# """
# Smooths a given image with a gaussian kernel with widths given as sigmas.
# This smoothing can be used to mimic charge diffusion within the CCD.
# The default values are from Table 8-2 of CCD_273_Euclid_secification_1.0.130812.pdf converted
# to sigmas (FWHM / (2sqrt(2ln2)) and rounded up to the second decimal.
# .. Note:: This method should not be called for the full image if the charge spreading
# has already been taken into account in the system PSF to avoid double counting.
# :param image: image array which is smoothed with the kernel
# :type image: ndarray
# :param sigma: widths of the gaussian kernel that approximates the charge diffusion [0.32, 0.32].
# :param sigma: tuple
# :return: smoothed image array
# :rtype: ndarray
# """
# return ndimage.filters.gaussian_filter(image, sigma)
############################################################################### ###############################################################################
def readCosmicRayInformation(self): def readCosmicRayInformation(self):
...@@ -1979,9 +1933,9 @@ class IFSsimulator(): ...@@ -1979,9 +1933,9 @@ class IFSsimulator():
# print(self.information) # print(self.information)
crLengths = np.loadtxt( crLengths = np.loadtxt(
self.information['dir_path']+self.information['cosmicraylengths']) os.path.join(self.information['dir_path'],self.information['cosmicraylengths']))
crDists = np.loadtxt( crDists = np.loadtxt(
self.information['dir_path']+self.information['cosmicraydistance']) os.path.join(self.information['dir_path'],self.information['cosmicraydistance']))
self.cr = dict(cr_u=crLengths[:, 0], cr_cdf=crLengths[:, 1], cr_cdfn=np.shape(crLengths)[0], self.cr = dict(cr_u=crLengths[:, 0], cr_cdf=crLengths[:, 1], cr_cdfn=np.shape(crLengths)[0],
cr_v=crDists[:, 0], cr_cde=crDists[:, 1], cr_cden=np.shape(crDists)[0]) cr_v=crDists[:, 0], cr_cde=crDists[:, 1], cr_cden=np.shape(crDists)[0])
...@@ -2038,31 +1992,21 @@ class IFSsimulator(): ...@@ -2038,31 +1992,21 @@ class IFSsimulator():
else: else:
ss = '_' ss = '_'
# if self.information['dir_path'] == '/nfsdata/share/simulation-unittest/ifs_sim/':
# self.result_path = self.information['dir_path'] + \
# self.information['result_path']+'/'+self.source+ss+result_day
# else:
# home_path = os.environ['HOME']
# if home_path == '/home/yan':
# self.result_path = '../IFS_simData/'+self.source+ss+result_day
# else:
# self.result_path = '/data/ifspip/CCD_ima/'+self.source+ss+result_day
self.result_path = self.information['result_path'] + \ ### create result father path;
'/'+self.source+ss+result_day if os.path.isdir(self.information['result_path']) is False:
print(self.information['result_path']) os.mkdir(self.information['result_path'])
self.result_path=os.path.join(self.information['result_path'], self.source+ss+result_day)
print(self.result_path)
if os.path.isdir(self.result_path) is False: if os.path.isdir(self.result_path) is False:
os.mkdir(self.result_path) os.mkdir(self.result_path)
os.mkdir(self.result_path+'/calibration_Data') os.mkdir(os.path.join(self.result_path,'calibration_Data'))
os.mkdir(self.result_path+'/log_file') os.mkdir(os.path.join(self.result_path,'log_file'))
os.mkdir(self.result_path+'/original_Calibration') os.mkdir(os.path.join(self.result_path,'original_Calibration'))
os.mkdir(self.result_path+'/original_sky') os.mkdir(os.path.join(self.result_path,'original_sky'))
os.mkdir(self.result_path+'/shift_rot_sky') os.mkdir(os.path.join(self.result_path,'shift_rot_sky'))
os.mkdir(self.result_path+'/sky_Data') os.mkdir(os.path.join(self.result_path,'sky_Data'))
############################################################################## ##############################################################################
now = datetime.utcnow() now = datetime.utcnow()
...@@ -2070,8 +2014,8 @@ class IFSsimulator(): ...@@ -2070,8 +2014,8 @@ class IFSsimulator():
data_time = now.strftime("%Y-%m-%d-%H-%M-%S") data_time = now.strftime("%Y-%m-%d-%H-%M-%S")
############################################################ ############################################################
self.log = lg(self.result_path+'/log_file/IFS_' + self.log = lg(os.path.join(self.result_path,'log_file/IFS_' +
self.source+'_'+data_time+'_Num_'+str(simnumber)+'.log') self.source+'_'+data_time+'_Num_'+str(simnumber)+'.log'))
self.log.info('STARTING A NEW SIMULATION') self.log.info('STARTING A NEW SIMULATION')
...@@ -2092,7 +2036,7 @@ class IFSsimulator(): ...@@ -2092,7 +2036,7 @@ class IFSsimulator():
self.HgArsigma = self.light_FWHM/2.35 # sigma value of the light source self.HgArsigma = self.light_FWHM/2.35 # sigma value of the light source
# load system optical and CCD efficiency data # load system optical and CCD efficiency data
matfn0 = self.information['dir_path']+'IFS_inputdata/TotalQ200923.mat' matfn0 = os.path.join(self.information['dir_path'],'IFS_inputdata/TotalQ200923.mat')
self.log.info('Optical optical efficiency file path is: %s' % (matfn0)) self.log.info('Optical optical efficiency file path is: %s' % (matfn0))
da0 = sio.loadmat(matfn0) da0 = sio.loadmat(matfn0)
# optical efficiency of blue channel # optical efficiency of blue channel
...@@ -2103,7 +2047,7 @@ class IFSsimulator(): ...@@ -2103,7 +2047,7 @@ class IFSsimulator():
# load all useful data; # load all useful data;
# load wavefront data; # load wavefront data;
matfn2 = self.information['dir_path']+'IFS_inputdata/opd/opd_638nm.mat' matfn2 = os.path.join(self.information['dir_path'],'IFS_inputdata/opd/opd_638nm.mat')
self.log.info('OPD0 file path is: %s' % (matfn2)) self.log.info('OPD0 file path is: %s' % (matfn2))
da2 = sio.loadmat(matfn2) da2 = sio.loadmat(matfn2)
opd0 = da2['opd'] # opd unit is in meter opd0 = da2['opd'] # opd unit is in meter
...@@ -2111,17 +2055,17 @@ class IFSsimulator(): ...@@ -2111,17 +2055,17 @@ class IFSsimulator():
self.pupil = abs(opd0) > 0.0 self.pupil = abs(opd0) > 0.0
#################### ####################
matfn2 = self.information['dir_path']+'IFS_inputdata/opd/opd1.fits' matfn2 = os.path.join(self.information['dir_path'],'IFS_inputdata/opd/opd1.fits')
da = fits.open(matfn2) da = fits.open(matfn2)
self.opd1 = da[0].data self.opd1 = da[0].data
self.log.info('OPD1 file path is: %s' % (matfn2)) self.log.info('OPD1 file path is: %s' % (matfn2))
matfn2 = self.information['dir_path']+'IFS_inputdata/opd/opd2.fits' matfn2 = os.path.join(self.information['dir_path'],'IFS_inputdata/opd/opd2.fits')
self.log.info('OPD2 file path is: %s' % (matfn2)) self.log.info('OPD2 file path is: %s' % (matfn2))
da = fits.open(matfn2) da = fits.open(matfn2)
self.opd2 = da[0].data self.opd2 = da[0].data
matfn2 = self.information['dir_path']+'IFS_inputdata/opd/opd3.fits' matfn2 = os.path.join(self.information['dir_path'],'IFS_inputdata/opd/opd3.fits')
self.log.info('OPD3 file path is: %s' % (matfn2)) self.log.info('OPD3 file path is: %s' % (matfn2))
da = fits.open(matfn2) da = fits.open(matfn2)
self.opd3 = da[0].data self.opd3 = da[0].data
...@@ -2424,50 +2368,50 @@ class IFSsimulator(): ...@@ -2424,50 +2368,50 @@ class IFSsimulator():
self.log.info('Added dark current to bule and red channel') self.log.info('Added dark current to bule and red channel')
if self.information['dark1_b'] > 0.001 or self.information['dark1_b'] > 0.001: if self.information['dark1_b'] < 0.0001 or self.information['dark1_b'] > 0.001:
self.log.error( self.log.error(
'dark1_b value error, it shoub be in [0.0001, 0.001]!') 'dark1_b value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark1_b value error, it shoub be in [0.0001, 0.001]!') 'dark1_b value error, it shoub be in [0.0001, 0.001]!')
if self.information['dark2_b'] > 0.001 or self.information['dark2_b'] > 0.001: if self.information['dark2_b'] < 0.0001 or self.information['dark2_b'] > 0.001:
self.log.error( self.log.error(
'dark2_b value error, it shoub be in [0.0001, 0.001]!') 'dark2_b value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark2_b value error, it shoub be in [0.0001, 0.001]!') 'dark2_b value error, it shoub be in [0.0001, 0.001]!')
if self.information['dark3_b'] > 0.001 or self.information['dark3_b'] > 0.001: if self.information['dark3_b'] < 0.0001 or self.information['dark3_b'] > 0.001:
self.log.error( self.log.error(
'dark3_b value error, it shoub be in [0.0001, 0.001]!') 'dark3_b value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark3_b value error, it shoub be in [0.0001, 0.001]!') 'dark3_b value error, it shoub be in [0.0001, 0.001]!')
if self.information['dark4_b'] > 0.001 or self.information['dark4_b'] > 0.001: if self.information['dark4_b'] < 0.0001 or self.information['dark4_b'] > 0.001:
self.log.error( self.log.error(
'dark4_b value error, it shoub be in [0.0001, 0.001]!') 'dark4_b value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark4_b value error, it shoub be in [0.0001, 0.001]!') 'dark4_b value error, it shoub be in [0.0001, 0.001]!')
#################################################################### ####################################################################
if self.information['dark1_r'] > 0.001 or self.information['dark1_r'] > 0.001: if self.information['dark1_r'] < 0.0001 or self.information['dark1_r'] > 0.001:
self.log.error( self.log.error(
'dark1_r value error, it shoub be in [0.0001, 0.001]!') 'dark1_r value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark1_r value error, it shoub be in [0.0001, 0.001]!') 'dark1_r value error, it shoub be in [0.0001, 0.001]!')
if self.information['dark2_r'] > 0.001 or self.information['dark2_r'] > 0.001: if self.information['dark2_r'] < 0.0001 or self.information['dark2_r'] > 0.001:
self.log.error( self.log.error(
'dark2_r value error, it shoub be in [0.0001, 0.001]!') 'dark2_r value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark2_r value error, it shoub be in [0.0001, 0.001]!') 'dark2_r value error, it shoub be in [0.0001, 0.001]!')
if self.information['dark3_r'] > 0.001 or self.information['dark3_r'] > 0.001: if self.information['dark3_r'] < 0.0001 or self.information['dark3_r'] > 0.001:
self.log.error( self.log.error(
'dark3_r value error, it shoub be in [0.0001, 0.001]!') 'dark3_r value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
'dark3_r value error, it shoub be in [0.0001, 0.001]!') 'dark3_r value error, it shoub be in [0.0001, 0.001]!')
if self.information['dark4_r'] > 0.001 or self.information['dark4_r'] > 0.001: if self.information['dark4_r'] < 0.0001 or self.information['dark4_r'] > 0.001:
self.log.error( self.log.error(
'dark4_r value error, it shoub be in [0.0001, 0.001]!') 'dark4_r value error, it shoub be in [0.0001, 0.001]!')
raise ValueError( raise ValueError(
...@@ -2558,7 +2502,7 @@ class IFSsimulator(): ...@@ -2558,7 +2502,7 @@ class IFSsimulator():
Warning:: This method does not work if the input file has exactly one line. Warning:: This method does not work if the input file has exactly one line.
""" """
cosmetics = np.loadtxt( cosmetics = np.loadtxt(
self.information['dir_path']+self.information['cosmeticsfile_b']) os.path.join(self.information['dir_path'],self.information['cosmeticsfile_b']))
self.log.info('cosmeticsfile_b path is: %s' % self.log.info('cosmeticsfile_b path is: %s' %
(self.information['cosmeticsfile_b'])) (self.information['cosmeticsfile_b']))
...@@ -2582,7 +2526,7 @@ class IFSsimulator(): ...@@ -2582,7 +2526,7 @@ class IFSsimulator():
############################################################################# #############################################################################
cosmetics = np.loadtxt( cosmetics = np.loadtxt(
self.information['dir_path']+self.information['cosmeticsfile_r']) os.path.join(self.information['dir_path'],self.information['cosmeticsfile_r']))
self.log.info('cosmeticsfile_r path is: %s' % self.log.info('cosmeticsfile_r path is: %s' %
(self.information['cosmeticsfile_r'])) (self.information['cosmeticsfile_r']))
...@@ -3257,48 +3201,7 @@ class IFSsimulator(): ...@@ -3257,48 +3201,7 @@ class IFSsimulator():
self.log.info('Maximum and total values of the image are %i and %i, respectively' % (np.max(self.image_r), self.log.info('Maximum and total values of the image are %i and %i, respectively' % (np.max(self.image_r),
np.sum(self.image_r))) np.sum(self.image_r)))
# ############################################################################ # ############################################################################
# def applyImageShift(self):
# """
# Returns
# -------
# None.
# """
# np.random.seed(9*self.simnumber)
# ud = np.random.random() # Choose a random rotation
# dx = 2 * (ud-0.5) * self.information['shiftmax']
# np.random.seed(99*self.simnumber)
# ud = np.random.random() # Choose a random rotation
# dy = 2 * (ud-0.5) * self.information['shiftmax']
# self.image_b = ndimage.shift(self.image_b.copy(), [
# dy+self.information['shift_b_y'], dx+self.information['shift_b_x']], order=0, mode='nearest')
# self.image_r = ndimage.shift(self.image_r.copy(), [
# dy+self.information['shift_r_y'], dx+self.information['shift_r_x']], order=0, mode='nearest')
# self.log.info('Applied image shifting to g r i channels.')
# self.information['ra'] = dx*self.information['pixel_size']
# self.information['dec'] = dy*self.information['pixel_size']
##############################################################################
# def applyImageRotate(self):
# """
# Returns
# -------
# None.
# """
# np.random.seed(10*self.simnumber)
# ud = np.random.random() # Choose a random rotation
# angle = 2 * (ud-0.5) * self.information['tel_rotmax']
# inputimg = self.image_b.copy()
# # here we choose reshape=False, the rotated image will
# rotimg = ndimage.rotate(
# inputimg, angle+self.information['rotate_b'], order=1, reshape=False)
# self.image_b = rotimg
# inputimg = self.image_r.copy()
# # here we choose reshape=False, the rotated image will
# rotimg = ndimage.rotate(
# inputimg, angle+self.information['rotate_r'], order=1, reshape=False)
# self.image_r = rotimg
# self.information['Tel_rot'] = angle
# self.log.info(
# 'Applied telescope rotation with angle (in degree)= %f.', angle)
############################################################################### ###############################################################################
def CCDreadout(self): def CCDreadout(self):
...@@ -3518,6 +3421,7 @@ class IFSsimulator(): ...@@ -3518,6 +3421,7 @@ class IFSsimulator():
filename_b = 'CSST_IFS_B_'+self.source+'_'+exp_start_str + \ filename_b = 'CSST_IFS_B_'+self.source+'_'+exp_start_str + \
'_'+exp_end_str+'_'+str(obsid)+'_B_L0_V'+sim_ver '_'+exp_end_str+'_'+str(obsid)+'_B_L0_V'+sim_ver
self.file_b = self.result_path+'/sky_Data/'+filename_b+'.fits' self.file_b = self.result_path+'/sky_Data/'+filename_b+'.fits'
filename_r = 'CSST_IFS_R_'+self.source+'_'+exp_start_str + \ filename_r = 'CSST_IFS_R_'+self.source+'_'+exp_start_str + \
...@@ -3537,11 +3441,11 @@ class IFSsimulator(): ...@@ -3537,11 +3441,11 @@ class IFSsimulator():
filename_b = 'CSST_IFS_B_'+self.source+'_'+exp_start_str + \ filename_b = 'CSST_IFS_B_'+self.source+'_'+exp_start_str + \
'_'+exp_end_str+'_'+str(obsid)+'_B_L0_V'+sim_ver '_'+exp_end_str+'_'+str(obsid)+'_B_L0_V'+sim_ver
self.file_b = self.result_path+'/calibration_Data/'+filename_b+'.fits' self.file_b = os.path.join(self.result_path,'calibration_Data/'+filename_b+'.fits')
filename_r = 'CSST_IFS_R_'+self.source+'_'+exp_start_str + \ filename_r = 'CSST_IFS_R_'+self.source+'_'+exp_start_str + \
'_'+exp_end_str+'_'+str(obsid)+'_R_L0_V'+sim_ver '_'+exp_end_str+'_'+str(obsid)+'_R_L0_V'+sim_ver
self.file_r = self.result_path+'/calibration_Data/'+filename_r+'.fits' self.file_r = os.path.join(self.result_path,'calibration_Data/'+filename_r+'.fits')
# create a new FITS file, using HDUList instance # create a new FITS file, using HDUList instance
# #### layer 0 #### # #### layer 0 ####
...@@ -3566,7 +3470,7 @@ class IFSsimulator(): ...@@ -3566,7 +3470,7 @@ class IFSsimulator():
'ICRS', 'coordinate system of the object') 'ICRS', 'coordinate system of the object')
ofd_b.header['EQUINOX'] = (float(2000.0), '') ofd_b.header['EQUINOX'] = (float(2000.0), '')
ofd_b.header['FITSSWV'] = ( ofd_b.header['FITSSWV'] = (
'ifs_sim_0.8.03', 'FITS creating software version') 'csst_ifs_sim_3.0.0', 'FITS creating software version')
# ######## Object information ############# # ######## Object information #############
if self.source == 'SCI' or self.source == 'COMP': if self.source == 'SCI' or self.source == 'COMP':
ofd_b.header['OBJECT'] = ( ofd_b.header['OBJECT'] = (
...@@ -3933,7 +3837,7 @@ class IFSsimulator(): ...@@ -3933,7 +3837,7 @@ class IFSsimulator():
ofd_r.header['EQUINOX'] = (float(2000.0), '') ofd_r.header['EQUINOX'] = (float(2000.0), '')
ofd_r.header['FITSSWV'] = ( ofd_r.header['FITSSWV'] = (
'ifs_sim_0.8.03', 'FITS creating software version') 'csst_ifs_sim_3.0.0', 'FITS creating software version')
# ######## Object information ############# # ######## Object information #############
if self.source == 'SCI' or self.source == 'COMP': if self.source == 'SCI' or self.source == 'COMP':
...@@ -4377,19 +4281,19 @@ class IFSsimulator(): ...@@ -4377,19 +4281,19 @@ class IFSsimulator():
""" """
# read solar template # read solar template
solar_template = pd.read_csv(self.information['dir_path']+'IFS_inputdata/refs/solar_spec.dat', sep='\\s+', solar_template = pd.read_csv(os.path.join(self.information['dir_path'],'IFS_inputdata/refs/solar_spec.dat'), sep='\\s+',
header=None, comment='#') header=None, comment='#')
template_wave = solar_template[0].values template_wave = solar_template[0].values
template_flux = solar_template[1].values template_flux = solar_template[1].values
# read earth shine surface brightness # read earth shine surface brightness
earthshine_curve = pd.read_csv(self.information['dir_path']+'IFS_inputdata/refs/earthshine.dat', earthshine_curve = pd.read_csv(os.path.join(self.information['dir_path'],'IFS_inputdata/refs/earthshine.dat'),
header=None, comment='#') header=None, comment='#')
angle = earthshine_curve[0].values angle = earthshine_curve[0].values
surface_brightness = earthshine_curve[1].values surface_brightness = earthshine_curve[1].values
# read V-band throughtput # read V-band throughtput
cat_filter_V = pd.read_csv(self.information['dir_path']+'IFS_inputdata/refs/filter_Bessell_V.dat', sep='\\s+', cat_filter_V = pd.read_csv(os.path.join(self.information['dir_path'],'IFS_inputdata/refs/filter_Bessell_V.dat'), sep='\\s+',
header=None, comment='#') header=None, comment='#')
filter_wave = cat_filter_V[0].values filter_wave = cat_filter_V[0].values
filter_response = cat_filter_V[1].values filter_response = cat_filter_V[1].values
...@@ -4507,23 +4411,21 @@ class IFSsimulator(): ...@@ -4507,23 +4411,21 @@ class IFSsimulator():
################################################################ ################################################################
# ######## # ########
# #### load slicer_Qe1K.fits #### # #### load slicer_Qe1K.fits ####
slicerfile = self.information['dir_path'] + \ slicerfile = os.path.join(self.information['dir_path'],'IFS_inputdata/Flatfield/slicer_QE_1K_230625.fits')
'IFS_inputdata/Flatfield/slicer_QE_1K_230625.fits'
da = fits.open(slicerfile) da = fits.open(slicerfile)
self.log.info('hole Sim and slicer 1K QE file:%s' % (slicerfile)) self.log.info('hole Sim and slicer 1K QE file:%s' % (slicerfile))
slicer_Qe = da[0].data slicer_Qe = da[0].data
# #### load hole mask ###### # #### load hole mask ######
# load hole mask matrix # load hole mask matrix
file = self.information['dir_path'] + \ file = os.path.join(self.information['dir_path'], 'IFS_inputdata/Hole/holemask_230612.fits')
'IFS_inputdata/Hole/holemask_230612.fits'
self.log.info('hole mask file is %s' % (file)) self.log.info('hole mask file is %s' % (file))
da = fits.open(file) da = fits.open(file)
HoleMask = da[self.simnumber].data HoleMask = da[self.simnumber].data
# load HgAr data; # load HgAr data;
matfn3 = self.information['dir_path']+'IFS_inputdata/HgAr.mat' matfn3 = os.path.join(self.information['dir_path'],'IFS_inputdata/HgAr.mat')
self.log.info('lamp flux file is : %s' % (matfn3)) self.log.info('lamp flux file is : %s' % (matfn3))
da3 = sio.loadmat(matfn3) da3 = sio.loadmat(matfn3)
HgArst = da3['HgArst'] # opd unit is in meter HgArst = da3['HgArst'] # opd unit is in meter
...@@ -4772,10 +4674,10 @@ class IFSsimulator(): ...@@ -4772,10 +4674,10 @@ class IFSsimulator():
data_time = now.strftime("%Y-%m-%d") data_time = now.strftime("%Y-%m-%d")
# write the actual file # write the actual file
bluefile = self.result_path+'/original_Calibration/IFS_'+self.source + \ bluefile = os.path.join(self.result_path,'original_Calibration/IFS_'+self.source + \
'_'+data_time+'_'+str(self.simnumber)+'_B_original.fits' '_'+data_time+'_'+str(self.simnumber)+'_B_original.fits')
redfile = self.result_path+'/original_Calibration/IFS_'+self.source + \ redfile = os.path.join(self.result_path,'original_Calibration/IFS_'+self.source + \
'_'+data_time+'_'+str(self.simnumber)+'_R_original.fits' '_'+data_time+'_'+str(self.simnumber)+'_R_original.fits')
fits.writeto(bluefile, blue_img.array, overwrite=True) fits.writeto(bluefile, blue_img.array, overwrite=True)
fits.writeto(redfile, red_img.array, overwrite=True) fits.writeto(redfile, red_img.array, overwrite=True)
...@@ -4795,7 +4697,7 @@ class IFSsimulator(): ...@@ -4795,7 +4697,7 @@ class IFSsimulator():
newd = fits.HDUList([hdu1, hdu2]) newd = fits.HDUList([hdu1, hdu2])
filename = self.result_path+'/calibration_Data/'+self.source+'_flux.fits' filename = os.path.join(self.result_path,'calibration_Data/'+self.source+'_flux.fits')
if self.simnumber == 1: if self.simnumber == 1:
newd.writeto(filename, overwrite=True) newd.writeto(filename, overwrite=True)
...@@ -4836,8 +4738,7 @@ class IFSsimulator(): ...@@ -4836,8 +4738,7 @@ class IFSsimulator():
############################################################################ ############################################################################
# consider the slice optical efficiency in different slicer channel # consider the slice optical efficiency in different slicer channel
slicer_QE_file = self.information['dir_path'] + \ slicer_QE_file = os.path.join(self.information['dir_path'],'IFS_inputdata/Flatfield/slicer_QE230625.fits')
'IFS_inputdata/Flatfield/slicer_QE230625.fits'
da = fits.open(slicer_QE_file) da = fits.open(slicer_QE_file)
self.log.info('slicer_QE_file path is: %s' % (slicer_QE_file)) self.log.info('slicer_QE_file path is: %s' % (slicer_QE_file))
slicer_Qe = da[0].data slicer_Qe = da[0].data
...@@ -5041,9 +4942,7 @@ class IFSsimulator(): ...@@ -5041,9 +4942,7 @@ class IFSsimulator():
# orbit parameters are not in currenct txt file # orbit parameters are not in currenct txt file
if self.orbit_pars[-1, 0] < t2jd: if self.orbit_pars[-1, 0] < t2jd:
self.orbit_file_num = self.orbit_file_num+1 self.orbit_file_num = self.orbit_file_num+1
fn = self.information['dir_path'] + \ fn = os.path.join(self.information['dir_path'] , 'IFS_inputdata/TianCe/orbit20160925/'+str(self.orbit_file_num)+'.txt')
'IFS_inputdata/TianCe/orbit20160925/' + \
str(self.orbit_file_num)+'.txt'
self.orbit_pars = np.loadtxt(fn) self.orbit_pars = np.loadtxt(fn)
self.orbit_exp_num = 0 self.orbit_exp_num = 0
...@@ -5220,10 +5119,8 @@ class IFSsimulator(): ...@@ -5220,10 +5119,8 @@ class IFSsimulator():
# PSFfilename='/media/yan//IFSsim/IFSsim Data/rot_shift_Img.fits' # PSFfilename='/media/yan//IFSsim/IFSsim Data/rot_shift_Img.fits'
# fits.writeto('/media/yan//IFSsim/IFSsim Data/rot_shift_subImg.fits',image0.array[50-32:50+32,50-32:50+32],overwrite=True ) # fits.writeto('/media/yan//IFSsim/IFSsim Data/rot_shift_subImg.fits',image0.array[50-32:50+32,50-32:50+32],overwrite=True )
hdu1.writeto(self.result_path+'/shift_rot_sky/rot_shift_subImg_' + hdu1.writeto(os.path.join(self.result_path,'shift_rot_sky/rot_shift_subImg_'+str(simnumber)+'.fits'), overwrite=True)
str(simnumber)+'.fits', overwrite=True) fits.writeto(os.path.join(self.result_path,'shift_rot_sky/original_Img_'+str(simnumber)+'.fits'), Nimg, overwrite=True)
fits.writeto(self.result_path+'/shift_rot_sky/original_Img_' +
str(simnumber)+'.fits', Nimg, overwrite=True)
##################################################################### #####################################################################
# ## do convolve image0 with PSF0 from primay CSST ### # ## do convolve image0 with PSF0 from primay CSST ###
...@@ -5342,22 +5239,6 @@ class IFSsimulator(): ...@@ -5342,22 +5239,6 @@ class IFSsimulator():
energy = energy+sum(photons.flux[idx0]) energy = energy+sum(photons.flux[idx0])
p_num = len(idx0[0]) p_num = len(idx0[0])
##############################################################
# ######### code for test slice is right or not ##############
##############################################################
# photons_2=galsim.PhotonArray(N=p_num, x=photons.x[idx0], y=photons.y[idx0], flux = photons.flux[idx0], wavelength=lam)
# if k==0:
# sliceimage = galsim.Image(100,100)
# sliceimage.scale = pixelscale
# sliceimage.setOrigin(0,0)
# #image.setCenter(int(np.mean(photons.x)), int(np.mean(photons.y)))
# rotphotons=galsim.PhotonArray(N=p_num, x=photons_2.x/pixelscale, y=photons_2.y/pixelscale, flux = photons_2.flux)
# sensor = galsim.Sensor()
# sensor.accumulate(rotphotons, sliceimage)
# ######### finish testing #############################
# #############################################################
# #################################### # ####################################
# find photons for blue channel, and make the flux multiple the optical and CCD efficiency # find photons for blue channel, and make the flux multiple the optical and CCD efficiency
...@@ -5404,17 +5285,6 @@ class IFSsimulator(): ...@@ -5404,17 +5285,6 @@ class IFSsimulator():
######################################################## ########################################################
# ##################### test code ################################
# ################################################################
# fits.writeto('originalImg.fits',Nimg,overwrite=True)
# fits.writeto('PSFedImg.fits',temp,overwrite=True)
# fits.writeto('rotedphotonsImg.fits',image.array,overwrite=True)
# fits.writeto('newsub_rotedphotonsImg.fits',newimage.array,overwrite=True)
# fits.writeto('slicephotonsImg.fits',sliceimage.array,overwrite=True)
# pause()
# #############################################################
# ############## finish test code ###########################
##################################################################### #####################################################################
# stray light will cover 2% of input total light; # stray light will cover 2% of input total light;
...@@ -5430,10 +5300,10 @@ class IFSsimulator(): ...@@ -5430,10 +5300,10 @@ class IFSsimulator():
self.image_r = red_img.array self.image_r = red_img.array
obsid = simnumber obsid = simnumber
bluefile = self.result_path+'/original_sky/IFS_' + \ bluefile = os.path.join(self.result_path,'original_sky/IFS_' + \
self.source+'_'+str(obsid)+'_B.fits' self.source+'_'+str(obsid)+'_B.fits')
redfile = self.result_path+'/original_sky/IFS_' + \ redfile = os.path.join(self.result_path,'original_sky/IFS_' + \
self.source+'_'+str(obsid)+'_R.fits' self.source+'_'+str(obsid)+'_R.fits')
fits.writeto(bluefile, blue_img.array, overwrite=True) fits.writeto(bluefile, blue_img.array, overwrite=True)
fits.writeto(redfile, red_img.array, overwrite=True) fits.writeto(redfile, red_img.array, overwrite=True)
...@@ -5463,14 +5333,13 @@ class IFSsimulator(): ...@@ -5463,14 +5333,13 @@ class IFSsimulator():
# load HgAr data; # load HgAr data;
if self.source == 'LAMP': if self.source == 'LAMP':
matfn3 = self.information['dir_path']+'IFS_inputdata/HgAr.mat' matfn3 = os.path.join(self.information['dir_path'],'IFS_inputdata/HgAr.mat')
self.log.info('lamp flux file is : %s' % (matfn3)) self.log.info('lamp flux file is : %s' % (matfn3))
da3 = sio.loadmat(matfn3) da3 = sio.loadmat(matfn3)
HgArst = da3['HgArst'] # opd unit is in meter HgArst = da3['HgArst'] # opd unit is in meter
# load flat data # load flat data
if self.source == 'FLAT': if self.source == 'FLAT':
matfn3 = self.information['dir_path'] + \ matfn3 = os.path.join(self.information['dir_path'],'IFS_inputdata/flat_light.mat')
'IFS_inputdata/flat_light.mat'
self.log.info('flat flux file is : %s' % (matfn3)) self.log.info('flat flux file is : %s' % (matfn3))
da3 = sio.loadmat(matfn3) da3 = sio.loadmat(matfn3)
flat_light = da3['flat_light'] # opd unit is in meter flat_light = da3['flat_light'] # opd unit is in meter
...@@ -5639,7 +5508,7 @@ class IFSsimulator(): ...@@ -5639,7 +5508,7 @@ class IFSsimulator():
# print('time=',(end-start)) # print('time=',(end-start))
# consider the slice optical efficiency in different slicer channel # consider the slice optical efficiency in different slicer channel
da = fits.open( da = fits.open(
self.information['dir_path']+'IFS_inputdata/Flatfield/slicer_QE230625.fits') os.path.join(self.information['dir_path'],'IFS_inputdata/Flatfield/slicer_QE230625.fits'))
slicer_Qe = da[0].data slicer_Qe = da[0].data
img0 = img0*slicer_Qe img0 = img0*slicer_Qe
# ######### do the slice effect ################### # ######### do the slice effect ###################
...@@ -5698,22 +5567,6 @@ class IFSsimulator(): ...@@ -5698,22 +5567,6 @@ class IFSsimulator():
p_num = len(idx0[0]) p_num = len(idx0[0])
# ############################################################# # #############################################################
# ##### code for test slice is right or not ##################
#########################################################
# photons_2=galsim.PhotonArray(N=p_num, x=photons.x[idx0], y=photons.y[idx0], flux = photons.flux[idx0], wavelength=lam)
# if k==0:
# sliceimage = galsim.Image(100,100)
# sliceimage.scale = pixelscale
# sliceimage.setOrigin(0,0)
# #image.setCenter(int(np.mean(photons.x)), int(np.mean(photons.y)))
# rotphotons=galsim.PhotonArray(N=p_num, x=photons_2.x/pixelscale, y=photons_2.y/pixelscale, flux = photons_2.flux)
# sensor = galsim.Sensor()
# sensor.accumulate(rotphotons, sliceimage)
# ######################## finish testing #######################################################
# ######################################################################################################
##################################### #####################################
# find photons for blue channel, and make the flux multiple the optical and CCD efficiency # find photons for blue channel, and make the flux multiple the optical and CCD efficiency
...@@ -5769,10 +5622,11 @@ class IFSsimulator(): ...@@ -5769,10 +5622,11 @@ class IFSsimulator():
data_time = now.strftime("%Y-%m-%d") data_time = now.strftime("%Y-%m-%d")
# write the actual file # write the actual file
bluefile = self.result_path+'/original_Calibration/IFS_'+self.source + \ bluefile = os.path.join(self.result_path,'original_Calibration/IFS_'+self.source + \
'_'+data_time+'_'+str(self.simnumber)+'_B_original.fits' '_'+data_time+'_'+str(self.simnumber)+'_B_original.fits')
redfile = self.result_path+'/original_Calibration/IFS_'+self.source + \
'_'+data_time+'_'+str(self.simnumber)+'_R_original.fits' redfile = os.path.join(self.result_path,'original_Calibration/IFS_'+self.source + \
'_'+data_time+'_'+str(self.simnumber)+'_R_original.fits')
fits.writeto(bluefile, blue_img.array, overwrite=True) fits.writeto(bluefile, blue_img.array, overwrite=True)
fits.writeto(redfile, red_img.array, overwrite=True) fits.writeto(redfile, red_img.array, overwrite=True)
...@@ -5792,7 +5646,7 @@ class IFSsimulator(): ...@@ -5792,7 +5646,7 @@ class IFSsimulator():
newd = fits.HDUList([hdu1, hdu2]) newd = fits.HDUList([hdu1, hdu2])
filename = self.result_path+'/calibration_Data/'+self.source+'_flux.fits' filename = os.path.join(self.result_path,'calibration_Data/'+self.source+'_flux.fits')
if self.simnumber == 1: if self.simnumber == 1:
newd.writeto(filename, overwrite=True) newd.writeto(filename, overwrite=True)
...@@ -5861,8 +5715,7 @@ class IFSsimulator(): ...@@ -5861,8 +5715,7 @@ class IFSsimulator():
if simnumber <= 200 and simnumber > 150: if simnumber <= 200 and simnumber > 150:
self.information['exptime'] = 1200 self.information['exptime'] = 1200
self.skyfilepath = self.information['dir_path'] + \ self.skyfilepath = os.path.join(self.information['dir_path'],self.information['sky_fitsin'])
self.information['sky_fitsin']
print('self.skyfilepath = ', self.skyfilepath) print('self.skyfilepath = ', self.skyfilepath)
...@@ -5879,7 +5732,7 @@ class IFSsimulator(): ...@@ -5879,7 +5732,7 @@ class IFSsimulator():
########################################## ##########################################
df = pd.read_csv( df = pd.read_csv(
self.information['dir_path']+'IFS_inputdata/TianCe/'+starcat) os.path.join(self.information['dir_path'],'IFS_inputdata/TianCe/'+starcat))
############################################################## ##############################################################
sn = self.simnumber-1 sn = self.simnumber-1
...@@ -5905,8 +5758,8 @@ class IFSsimulator(): ...@@ -5905,8 +5758,8 @@ class IFSsimulator():
# fn=father_path+'/IFS_inputdata/TianCe/orbit20160925/'+str(k)+'.txt'; # fn=father_path+'/IFS_inputdata/TianCe/orbit20160925/'+str(k)+'.txt';
fn = self.information['dir_path'] + \ fn = os.path.join(self.information['dir_path'],
'IFS_inputdata/TianCe/orbit20160925/'+str(k)+'.txt' 'IFS_inputdata/TianCe/orbit20160925/'+str(k)+'.txt')
d = np.loadtxt(fn) d = np.loadtxt(fn)
for kk in range(len(d[:, 0])): for kk in range(len(d[:, 0])):
...@@ -5928,8 +5781,8 @@ class IFSsimulator(): ...@@ -5928,8 +5781,8 @@ class IFSsimulator():
else: else:
fn = self.information['dir_path'] + \ fn = os.path.join(self.information['dir_path'] ,
'IFS_inputdata/TianCe/orbit20160925/'+str(k+1)+'.txt' 'IFS_inputdata/TianCe/orbit20160925/'+str(k+1)+'.txt')
d = np.loadtxt(fn) d = np.loadtxt(fn)
self.orbit_pars = d self.orbit_pars = d
...@@ -6164,20 +6017,15 @@ def runIFSsim(sourcein, configfile, dir_path, result_path, iLoop, debug, applyho ...@@ -6164,20 +6017,15 @@ def runIFSsim(sourcein, configfile, dir_path, result_path, iLoop, debug, applyho
simulate[iLoop] = IFSsimulator(configfile) simulate[iLoop] = IFSsimulator(configfile)
simulate[iLoop].configure(sourcein, dir_path, result_path, simulate[iLoop].configure(sourcein, dir_path, result_path,
iLoop, debug, applyhole) # load the configfile; iLoop, debug, applyhole)
# load the configfile;
simulate[iLoop].information['result_path'] = result_path
if applyhole == 'yes' and sourcein == 'LAMP': if applyhole == 'yes' and sourcein == 'LAMP':
simulate[iLoop].information['holemask'] = 'yes' simulate[iLoop].information['holemask'] = 'yes'
else: else:
simulate[iLoop].information['holemask'] = 'no' simulate[iLoop].information['holemask'] = 'no'
# ## dir_path = os.path.join(os.environ['UNIT_TEST_DATA_ROOT'], 'ifs_sim/')
# simulate[iLoop].information['dir_path'] = dir_path
# simulate[iLoop].information['debug'] = debug
# simulate[iLoop].information['result_path'] = result_path
simulate[iLoop].simulate(sourcein, iLoop) simulate[iLoop].simulate(sourcein, iLoop)
return 1 return 1
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment