Commit 0efad3cf authored by Wei Chengliang's avatar Wei Chengliang
Browse files

update dark and hotpix

parent 5f565d9f
Pipeline #11603 failed with stage
in 0 seconds
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
# can add some of the command-line arguments here as well; # can add some of the command-line arguments here as well;
# ok to pass either way or both, as long as they are consistent # ok to pass either way or both, as long as they are consistent
work_dir: "/public/home/fangyuedong/project/workplace/" work_dir: "/public/home/fangyuedong/project/workplace/"
run_name: "ext_on" run_name: "csst-msc-c11-test-wide-v1"
data_set: "csst-msc-c11-1000sqdeg-wide-v1" data_set: "csst-msc-c11-test-wide-v1"
# Project cycle and run counter are used to name the outputs # Project cycle and run counter are used to name the outputs
project_cycle: 11 project_cycle: 11
......
...@@ -9,14 +9,13 @@ ...@@ -9,14 +9,13 @@
############################################### ###############################################
# Observation type # Observation type
obs_type: "SCI" obs_type: null
obs_type_code: "101" obs_type_code: "101"
obs_id: "00000001" # this setting will only be used if pointing list file is not given obs_id: "00000001" # this setting will only be used if pointing list file is not given
# Define list of chips # Define list of chips
# run_chips: [6,7,8,9,11,12,13,14,15,16,17,18,19,20,22,23,24,25] # Photometric chips run_chips: [6,7,8,9,11,12,13,14,15,16,17,18,19,20,22,23,24,25] # Photometric chips
#run_chips: [1,2,3,4,5,10,21,26,27,28,29,30] # Spectroscopic chips # run_chips: [1,2,3,4,5,10,21,26,27,28,29,30] # Spectroscopic chips
run_chips: [17, 22]
# Define observation sequence # Define observation sequence
call_sequence: call_sequence:
...@@ -55,11 +54,12 @@ call_sequence: ...@@ -55,11 +54,12 @@ call_sequence:
# Set it here is you want to override the default # Set it here is you want to override the default
# exptime: 150. # [s] # exptime: 150. # [s]
add_dark: YES add_dark: YES
input_dark: YES
# Simulate brighter fatter effects # Simulate brighter fatter effects
bright_fatter: {} bright_fatter: {}
# Add detector defects: hot/warm pixels, bad columns # Add detector defects: hot/warm pixels, bad columns
detector_defects: detector_defects:
hot_pixels: YES # hot_pixels: NO
dead_pixels: YES dead_pixels: YES
bad_columns: YES bad_columns: YES
# Apply CCD Saturation & Blooming # Apply CCD Saturation & Blooming
......
...@@ -124,6 +124,7 @@ class Chip(FocalPlane): ...@@ -124,6 +124,7 @@ class Chip(FocalPlane):
self.rotate_angle = 0. self.rotate_angle = 0.
self.overscan = 1000 self.overscan = 1000
self.badfraction = 5e-5 self.badfraction = 5e-5
self.chip_type = 'default'
# Override default values # Override default values
# for key in ["gain", "bias_level, dark_exptime", "flat_exptime", "readout_time", "full_well", "read_noise", "dark_noise", "overscan"]: # for key in ["gain", "bias_level, dark_exptime", "flat_exptime", "readout_time", "full_well", "read_noise", "dark_noise", "overscan"]:
# if key in config["ins_effects"]: # if key in config["ins_effects"]:
......
...@@ -214,44 +214,73 @@ def get_poisson(seed=0, sky_level=0.): ...@@ -214,44 +214,73 @@ def get_poisson(seed=0, sky_level=0.):
return rng_poisson, poisson_noise return rng_poisson, poisson_noise
def get_base_img(img, chip, read_noise, readout_time, dark_noise, exptime=150., InputDark=None): def get_base_img(img, chip, read_noise, readout_time, dark_noise, exptime=150., InputDark=False):
if InputDark is None: if not InputDark:
# base_level = read_noise**2 + dark_noise*(exptime+0.5*readout_time) # base_level = read_noise**2 + dark_noise*(exptime+0.5*readout_time)
# base_level = dark_noise*(exptime+0.5*readout_time) # base_level = dark_noise*(exptime+0.5*readout_time)
base_level = dark_noise*(exptime) base_level = dark_noise*(exptime)
base_img1 = base_level * np.ones_like(img.array) base_img1 = base_level * np.ones_like(img.array)
else:
base_img1 = np.zeros_like(img.array)
ny = int(chip.npix_y/2)
nx = chip.npix_x
arr = np.arange(ny).reshape(ny, 1)
arr = np.broadcast_to(arr, (ny, nx))
base_img2 = np.zeros_like(img.array)
base_img2[:ny, :] = arr
base_img2[ny:, :] = arr[::-1, :]
base_img2[:, :] = base_img2[:, :]*(readout_time/ny)*dark_noise
return base_img1+base_img2
def add_poisson(img, chip, exptime=150., seed=0, sky_level=0., poisson_noise=None, dark_noise=None, InputDark=None): ny = int(chip.npix_y/2)
nx = chip.npix_x
arr = np.arange(ny).reshape(ny, 1)
arr = np.broadcast_to(arr, (ny, nx))
base_img2 = np.zeros_like(img.array)
base_img2[:ny, :] = arr
base_img2[ny:, :] = arr[::-1, :]
base_img2[:, :] = base_img2[:, :]*(readout_time/ny)*dark_noise
else:
# base_img1 = np.zeros_like(img.array)
histfile = 'hist_dark_{:}.npz'.format(chip.chip_type)
try:
with pkg_resources.files('observation_sim.instruments.data.ccd').joinpath(histfile) as dark_histogram:
hist_dc = np.load(dark_histogram)
except AttributeError:
with pkg_resources.path('observation_sim.instruments.data.ccd', histfile) as dark_histogram:
hist_dc = np.load(dark_histogram)
hist = stats.rv_histogram((hist_dc['counts'], hist_dc['bins']), density=True)
xsize= chip.npix_x
ysize= chip.npix_y
seed = chip.chipID
samples= hist.rvs(size=xsize*ysize, random_state=seed)
map_dc = np.reshape(samples, [ysize, xsize])
base_img1 = map_dc*exptime
# base_img2
map_temp = np.zeros((ysize//2, 2*xsize))
map_temp[:, :xsize] = map_dc[:ysize//2, :]
map_temp[:, xsize:] = map_dc[:ysize//2-1:-1, :]
dt= readout_time/(ysize/2.)
A = map_temp
A_adjusted= np.vstack([np.zeros((1, A.shape[1])), A[:-1]])
cumsum_A = np.cumsum(A_adjusted, axis=0)
B = cumsum_A * dt
base_img2 = np.vstack([B[:, :xsize], B[::-1, xsize:]])
del hist_dc
del hist
del samples
del map_temp
del A
del A_adjusted
del cumsum_A
del B
return base_img1+base_img2, map_dc
def add_poisson(img, chip, exptime=150., seed=0, sky_level=0., poisson_noise=None, dark_noise=None, InputDark=False):
if poisson_noise is None: if poisson_noise is None:
_, poisson_noise = get_poisson(seed=seed, sky_level=sky_level) _, poisson_noise = get_poisson(seed=seed, sky_level=sky_level)
read_noise = chip.read_noise read_noise = chip.read_noise
if dark_noise is None: if dark_noise is None:
dark_noise = chip.dark_noise dark_noise = chip.dark_noise
base_img = get_base_img(img=img, chip=chip, read_noise=read_noise, readout_time=chip.readout_time, base_img, map_dc = get_base_img(img=img, chip=chip, read_noise=read_noise, readout_time=chip.readout_time,
dark_noise=dark_noise, exptime=exptime, InputDark=InputDark) dark_noise=dark_noise, exptime=exptime, InputDark=InputDark)
img += base_img img += base_img
img.addNoise(poisson_noise) img.addNoise(poisson_noise)
# img -= read_noise**2 # img -= read_noise**2
del base_img
if InputDark is not None: return img, map_dc
# "Instrument/data/dark/dark_1000s_example_0.fits"
hdu = fits.open(InputDark)
img += hdu[0].data/hdu[0].header['exptime']*exptime
hdu.close()
return img, base_img
def add_brighter_fatter(img): def add_brighter_fatter(img):
......
{ {
"31": { "31": {
"chip_name": "FGS1A-D1", "chip_name": "FGS1A-D1",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
}, },
"32": { "32": {
"chip_name": "FGS1A-D2", "chip_name": "FGS1A-D2",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -45,6 +47,7 @@ ...@@ -45,6 +47,7 @@
}, },
"33": { "33": {
"chip_name": "FGS1B-D1", "chip_name": "FGS1B-D1",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -67,6 +70,7 @@ ...@@ -67,6 +70,7 @@
}, },
"34": { "34": {
"chip_name": "FGS1B-D2", "chip_name": "FGS1B-D2",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -89,6 +93,7 @@ ...@@ -89,6 +93,7 @@
}, },
"35": { "35": {
"chip_name": "FGS2A-D1", "chip_name": "FGS2A-D1",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -111,6 +116,7 @@ ...@@ -111,6 +116,7 @@
}, },
"36": { "36": {
"chip_name": "FGS2A-D2", "chip_name": "FGS2A-D2",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -133,6 +139,7 @@ ...@@ -133,6 +139,7 @@
}, },
"37": { "37": {
"chip_name": "FGS2B-D1", "chip_name": "FGS2B-D1",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -155,6 +162,7 @@ ...@@ -155,6 +162,7 @@
}, },
"38": { "38": {
"chip_name": "FGS2B-D2", "chip_name": "FGS2B-D2",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -177,6 +185,7 @@ ...@@ -177,6 +185,7 @@
}, },
"39": { "39": {
"chip_name": "FGS3-D1", "chip_name": "FGS3-D1",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -199,6 +208,7 @@ ...@@ -199,6 +208,7 @@
}, },
"40": { "40": {
"chip_name": "FGS3-D2", "chip_name": "FGS3-D2",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -221,6 +231,7 @@ ...@@ -221,6 +231,7 @@
}, },
"41": { "41": {
"chip_name": "FGS4-D1", "chip_name": "FGS4-D1",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -243,6 +254,7 @@ ...@@ -243,6 +254,7 @@
}, },
"42": { "42": {
"chip_name": "FGS4-D2", "chip_name": "FGS4-D2",
"chip_type": "default",
"pix_size": 0.0075, "pix_size": 0.0075,
"pix_scale": 0.0555, "pix_scale": 0.0555,
"npix_x": 11264, "npix_x": 11264,
...@@ -265,6 +277,7 @@ ...@@ -265,6 +277,7 @@
}, },
"1": { "1": {
"chip_name": "GI-1", "chip_name": "GI-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -288,6 +301,7 @@ ...@@ -288,6 +301,7 @@
}, },
"2": { "2": {
"chip_name": "GV-1", "chip_name": "GV-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -311,6 +325,7 @@ ...@@ -311,6 +325,7 @@
}, },
"3": { "3": {
"chip_name": "GU-1", "chip_name": "GU-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -334,6 +349,7 @@ ...@@ -334,6 +349,7 @@
}, },
"4": { "4": {
"chip_name": "GU-2", "chip_name": "GU-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -357,6 +373,7 @@ ...@@ -357,6 +373,7 @@
}, },
"5": { "5": {
"chip_name": "GV-2", "chip_name": "GV-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -380,6 +397,7 @@ ...@@ -380,6 +397,7 @@
}, },
"6": { "6": {
"chip_name": "y-1", "chip_name": "y-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -403,6 +421,7 @@ ...@@ -403,6 +421,7 @@
}, },
"7": { "7": {
"chip_name": "i-1", "chip_name": "i-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -426,6 +445,7 @@ ...@@ -426,6 +445,7 @@
}, },
"8": { "8": {
"chip_name": "g-1", "chip_name": "g-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -449,6 +469,7 @@ ...@@ -449,6 +469,7 @@
}, },
"9": { "9": {
"chip_name": "r-1", "chip_name": "r-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -472,6 +493,7 @@ ...@@ -472,6 +493,7 @@
}, },
"10": { "10": {
"chip_name": "GI-2", "chip_name": "GI-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -495,6 +517,7 @@ ...@@ -495,6 +517,7 @@
}, },
"11": { "11": {
"chip_name": "z-1", "chip_name": "z-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -518,6 +541,7 @@ ...@@ -518,6 +541,7 @@
}, },
"12": { "12": {
"chip_name": "NUV-1", "chip_name": "NUV-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -541,6 +565,7 @@ ...@@ -541,6 +565,7 @@
}, },
"13": { "13": {
"chip_name": "NUV-2", "chip_name": "NUV-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -564,6 +589,7 @@ ...@@ -564,6 +589,7 @@
}, },
"14": { "14": {
"chip_name": "u-1", "chip_name": "u-1",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -587,6 +613,7 @@ ...@@ -587,6 +613,7 @@
}, },
"15": { "15": {
"chip_name": "y-2", "chip_name": "y-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -610,6 +637,7 @@ ...@@ -610,6 +637,7 @@
}, },
"16": { "16": {
"chip_name": "y-3", "chip_name": "y-3",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -633,6 +661,7 @@ ...@@ -633,6 +661,7 @@
}, },
"17": { "17": {
"chip_name": "u-2", "chip_name": "u-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -656,6 +685,7 @@ ...@@ -656,6 +685,7 @@
}, },
"18": { "18": {
"chip_name": "NUV-3", "chip_name": "NUV-3",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -679,6 +709,7 @@ ...@@ -679,6 +709,7 @@
}, },
"19": { "19": {
"chip_name": "NUV-4", "chip_name": "NUV-4",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -702,6 +733,7 @@ ...@@ -702,6 +733,7 @@
}, },
"20": { "20": {
"chip_name": "z-2", "chip_name": "z-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -725,6 +757,7 @@ ...@@ -725,6 +757,7 @@
}, },
"21": { "21": {
"chip_name": "GI-3", "chip_name": "GI-3",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -748,6 +781,7 @@ ...@@ -748,6 +781,7 @@
}, },
"22": { "22": {
"chip_name": "r-2", "chip_name": "r-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -771,6 +805,7 @@ ...@@ -771,6 +805,7 @@
}, },
"23": { "23": {
"chip_name": "g-2", "chip_name": "g-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -794,6 +829,7 @@ ...@@ -794,6 +829,7 @@
}, },
"24": { "24": {
"chip_name": "i-2", "chip_name": "i-2",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -817,6 +853,7 @@ ...@@ -817,6 +853,7 @@
}, },
"25": { "25": {
"chip_name": "y-4", "chip_name": "y-4",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -840,6 +877,7 @@ ...@@ -840,6 +877,7 @@
}, },
"26": { "26": {
"chip_name": "GV-3", "chip_name": "GV-3",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -863,6 +901,7 @@ ...@@ -863,6 +901,7 @@
}, },
"27": { "27": {
"chip_name": "GU-3", "chip_name": "GU-3",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -886,6 +925,7 @@ ...@@ -886,6 +925,7 @@
}, },
"28": { "28": {
"chip_name": "GU-4", "chip_name": "GU-4",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -909,6 +949,7 @@ ...@@ -909,6 +949,7 @@
}, },
"29": { "29": {
"chip_name": "GV-4", "chip_name": "GV-4",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
...@@ -932,6 +973,7 @@ ...@@ -932,6 +973,7 @@
}, },
"30": { "30": {
"chip_name": "GI-4", "chip_name": "GI-4",
"chip_type": "default",
"pix_size": 0.01, "pix_size": 0.01,
"pix_scale": 0.074, "pix_scale": 0.074,
"npix_x": 9216, "npix_x": 9216,
......
...@@ -20,11 +20,13 @@ def add_poisson_and_dark(self, chip, filt, tel, pointing, catalog, obs_param): ...@@ -20,11 +20,13 @@ def add_poisson_and_dark(self, chip, filt, tel, pointing, catalog, obs_param):
exptime = pointing.exp_time exptime = pointing.exp_time
if obs_param["add_dark"] is True: if obs_param["add_dark"] is True:
if obs_param["input_dark"]:
self.chip_output.Log_info(" Applying input_dark")
chip.img, _ = chip_utils.add_poisson(img=chip.img, chip.img, _ = chip_utils.add_poisson(img=chip.img,
chip=chip, chip=chip,
exptime=exptime, exptime=exptime,
poisson_noise=chip.poisson_noise, poisson_noise=chip.poisson_noise,
InputDark=None) InputDark=obs_param["input_dark"])
else: else:
chip.img, _ = chip_utils.add_poisson(img=chip.img, chip.img, _ = chip_utils.add_poisson(img=chip.img,
chip=chip, chip=chip,
......
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