From d5059d305e4bbfea443e527d8c38e0af2909655a Mon Sep 17 00:00:00 2001 From: yuedong Date: Fri, 4 Jun 2021 18:39:40 +0800 Subject: [PATCH] fixed photometry/bad column issue, modify detector effects order --- ObservationSim/Config/ChipOutput.py | 2 + .../__pycache__/ChipOutput.cpython-38.pyc | Bin 4371 -> 4472 bytes ObservationSim/Instrument/Chip/Chip.py | 279 +++++++++--------- ObservationSim/Instrument/Chip/Effects.py | 22 +- .../Chip/__pycache__/Chip.cpython-38.pyc | Bin 16226 -> 16006 bytes .../Chip/__pycache__/Effects.cpython-38.pyc | Bin 17997 -> 18152 bytes ObservationSim/Instrument/Filter.py | 2 +- .../__pycache__/Filter.cpython-38.pyc | Bin 2820 -> 2834 bytes ObservationSim/ObservationSim.py | 22 +- ObservationSim/PSF/PSFInterp/PSFInterp.py | 4 +- .../__pycache__/PSFInterp.cpython-38.pyc | Bin 7087 -> 7000 bytes ObservationSim/Pointing.py | 10 +- .../__pycache__/ObservationSim.cpython-38.pyc | Bin 8360 -> 8375 bytes .../__pycache__/Pointing.cpython-38.pyc | Bin 1125 -> 1210 bytes ObservationSim/run.pbs | 2 +- ObservationSim/runExposure.py | 2 +- test/ObservationSim.cfg | 13 +- 17 files changed, 195 insertions(+), 163 deletions(-) diff --git a/ObservationSim/Config/ChipOutput.py b/ObservationSim/Config/ChipOutput.py index d3d8ff5..685e12d 100755 --- a/ObservationSim/Config/ChipOutput.py +++ b/ObservationSim/Config/ChipOutput.py @@ -37,8 +37,10 @@ class ChipOutput(object): fmt5 = "%10s %8.4f %8.4f %8.4f\n" self.hdr = hdr1 + hdr2 + hdr3 + hdr4 + hdr5 self.fmt = fmt1 + fmt2 + fmt3 + fmt4 + fmt5 + print("pointing_type = %s\n"%(pointing_type)) if pointing_type == 'MS': self.cat = open(os.path.join(self.subdir, self.cat_name), "w") + print("Creating catalog file %s ...\n"%(os.path.join(self.subdir, self.cat_name))) self.cat.write(self.hdr) def updateHDR(self, hdr): diff --git a/ObservationSim/Config/__pycache__/ChipOutput.cpython-38.pyc b/ObservationSim/Config/__pycache__/ChipOutput.cpython-38.pyc index 8629f5acd8af472c3d00ab6b178614b1411845fb..8d63bc483452a94c3210f9a5899706ba9d74c33d 100644 GIT binary patch delta 489 zcmbQN^h1d+l$V!_0SJmdZB3|=n#i}0iw($g2IAtDjn}jp<4QzRL~D4&7@8Rw8ESY^ z#Il(tFcvkGh?R(ENi2}8VaO5!V!?$>DdNpcH4O1mK=l&na!}n2SyBt6fvSZU0?kTc z2xicf+-%9TkI}A5xFA0>uOu@sJ-(!}AXULuLA98xh!yCFTa4vZvd%@Ri6BXZnaPYSJ6Kr@iZb&iZ)dsAs57~rHJZ_F@@rN{Rvtz!MybuZ zY>doo`XEmlY&PMPWMWjG?8hxGr2`TH6S^RqI7P$E(L^ zK3SJ9p3!P@FW&@SRgexfAfd@yq&``TUzW`eB;r5WmtRK)%{XqLW8)K3QsVQIvivts zDPqk`H4O2RK%V3RDIh7lkdcugg&~+hQ+#tg(>_M7B9Ljf7|S)K zCr7jFm@LJ5l~H^02i9mtr^!BSj*MKJC$TXyv*`g973puD$tlTXqy}Qk0f{KKjFck3 z)bd*_nI);YMcN>7Frfov-Qp}QNJ%V7^>7K&+5CjNj)~D^ax$MDquJz1eDREylRxoI z;8g+XPz4g2yhUo0`}t+rd_f|9lQ;3}$ecfl#Wb0V6oDeQ*np;`CYON4FbtTSASeL 65535] = 65535 + img.replaceNegative(replace_value=0) + img.quantize() + + ###################################################################################### + # Output images for calibration pointing + ###################################################################################### # Bias output if config["bias_output"].lower() == "y" and pointing_type=='CAL': print(" Output N frame Bias files", flush=True) @@ -466,7 +472,7 @@ class Chip(FocalPlane): cr_map = effects.produceCR_Map( xLen=self.npix_x, yLen=self.npix_y, exTime=0.01, - cr_pixelRatio=0.003*0.01/self.exptime, + cr_pixelRatio=0.003*(0.01+0.5*self.readout_time)/(self.exptime+0.5*self.readout_time), gain=self.gain, attachedSizes=self.attachedSizes, seed=SeedCosmicRay+pointing_ID*30+self.chipID+1) @@ -477,7 +483,11 @@ class Chip(FocalPlane): # Non-Linearity for Bias if config["non_linear"].lower() == "y": print(" Applying Non-Linearity on the Bias image", flush=True) - BiasCombImg = effects.NonLinearity(GSImage=BiasCombImg, beta1=1.e-7, beta2=1.e-10) + BiasCombImg = effects.NonLinearity(GSImage=BiasCombImg, beta1=5.e-7, beta2=0) + + # Apply Bad lines + if config["add_badcolumns"].lower() == "y": + BiasCombImg = effects.BadColumns(BiasCombImg-float(config["bias_level"])+5, seed=SeedBadColumns, chipid=self.chipID) + float(config["bias_level"])-5 BiasCombImg = effects.ApplyGainNonUniform16(BiasCombImg, gain=self.gain, nsecy = 2, nsecx=8, @@ -493,7 +503,7 @@ class Chip(FocalPlane): datetime_obs = datetime.fromtimestamp(timestamp_obs) date_obs = datetime_obs.strftime("%y%m%d") time_obs = datetime_obs.strftime("%H%M%S") - timestamp_obs += 5 * 60 + timestamp_obs += 10 * 60 self.outputCal( img=BiasCombImg, ra_cen=ra_cen, @@ -517,7 +527,7 @@ class Chip(FocalPlane): elif config["add_bias"].lower() == "n": biaslevel = 0 overscan = 0 - darklevel = self.dark_noise*self.flat_exptime + darklevel = self.dark_noise*(self.flat_exptime+0.5*self.readout_time) for i in range(NFlat): FlatSingle = flat_img * prnu_img + darklevel FlatCombImg, FlatTag = effects.MakeFlatNcomb( @@ -526,15 +536,15 @@ class Chip(FocalPlane): read_noise=self.read_noise, gain=1, overscan=overscan, - biaslevel=biaslevel, + biaslevel=0, seed_bias=SeedDefective+self.chipID ) if config["cosmic_ray"].lower() == "y": if config["cray_differ"].lower() == "y": cr_map = effects.produceCR_Map( xLen=self.npix_x, yLen=self.npix_y, - exTime=self.flat_exptime, - cr_pixelRatio=0.003*self.flat_exptime/self.exptime, + exTime=self.flat_exptime+0.5*self.readout_time, + cr_pixelRatio=0.003*(self.flat_exptime+0.5*self.readout_time)/(self.exptime+0.5*self.readout_time), gain=self.gain, attachedSizes=self.attachedSizes, seed=SeedCosmicRay+pointing_ID*30+self.chipID+3) @@ -544,19 +554,35 @@ class Chip(FocalPlane): if config["non_linear"].lower() == "y": print(" Applying Non-Linearity on the Flat image", flush=True) - FlatCombImg = effects.NonLinearity(GSImage=FlatCombImg, beta1=1.e-7, beta2=1.e-10) + FlatCombImg = effects.NonLinearity(GSImage=FlatCombImg, beta1=5.e-7, beta2=0) if config["cte_trail"].lower() == "y": FlatCombImg = effects.CTE_Effect(GSImage=FlatCombImg, threshold=3) + # Add Hot Pixels or/and Dead Pixels + rgbadpix = Generator(PCG64(int(SeedDefective+self.chipID))) + badfraction = 5E-5*(rgbadpix.random()*0.5+0.7) + FlatCombImg = effects.DefectivePixels(FlatCombImg, IfHotPix=BoolHotPix, IfDeadPix=BoolDeadPix, fraction=badfraction, seed=SeedDefective+self.chipID, biaslevel=0) + # Apply Bad lines if config["add_badcolumns"].lower() == "y": FlatCombImg = effects.BadColumns(FlatCombImg, seed=SeedBadColumns, chipid=self.chipID) - # Add Hot Pixels or/and Dead Pixels - rgbadpix = Generator(PCG64(int(SeedDefective+self.chipID))) - badfraction = 5E-5*(rgbadpix.random()*0.5+0.7) - FlatCombImg = effects.DefectivePixels(FlatCombImg, IfHotPix=BoolHotPix, IfDeadPix=BoolDeadPix, fraction=badfraction, seed=SeedDefective+self.chipID, biaslevel=self.bias_level) + # Add Bias level + if config["add_bias"].lower() == "y": + print(" Adding Bias level and 16-channel non-uniformity") + # img += float(config["bias_level"]) + FlatCombImg = effects.AddBiasNonUniform16(FlatCombImg, + bias_level=biaslevel, + nsecy = 2, nsecx=8, + seed=SeedBiasNonuni+self.chipID) + + # Add Read-out Noise + if config["add_readout"].lower() == "y": + seed = int(config["seed_readout"]) + pointing_ID*30 + self.chipID + rng_readout = galsim.BaseDeviate(seed) + readout_noise = galsim.GaussianNoise(rng=rng_readout, sigma=self.read_noise) + FlatCombImg.addNoise(readout_noise) FlatCombImg = effects.ApplyGainNonUniform16(FlatCombImg, gain=self.gain, nsecy = 2, nsecx=8, @@ -569,7 +595,7 @@ class Chip(FocalPlane): datetime_obs = datetime.fromtimestamp(timestamp_obs) date_obs = datetime_obs.strftime("%y%m%d") time_obs = datetime_obs.strftime("%H%M%S") - timestamp_obs += 5 * 60 + timestamp_obs += 10 * 60 self.outputCal( img=FlatCombImg, ra_cen=ra_cen, @@ -601,15 +627,15 @@ class Chip(FocalPlane): for i in range(NDark): DarkCombImg, DarkTag = effects.MakeDarkNcomb( self.npix_x, self.npix_y, - overscan=overscan, bias_level=biaslevel, darkpsec=0.02, exptime=self.dark_exptime, + overscan=overscan, bias_level=0, darkpsec=0.02, exptime=self.dark_exptime+0.5*self.readout_time, ncombine=1, read_noise=self.read_noise, gain=1, seed_bias=SeedBiasNonuni+self.chipID) if config["cosmic_ray"].lower() == "y": if config["cray_differ"].lower() == "y": cr_map = effects.produceCR_Map( xLen=self.npix_x, yLen=self.npix_y, - exTime=self.dark_exptime, - cr_pixelRatio=0.003*self.dark_exptime/self.exptime, + exTime=self.dark_exptime+0.5*self.readout_time, + cr_pixelRatio=0.003*(self.dark_exptime+0.5*self.readout_time)/(self.exptime+0.5*self.readout_time), gain=self.gain, attachedSizes=self.attachedSizes, seed=SeedCosmicRay+pointing_ID*30+self.chipID+2) @@ -638,19 +664,35 @@ class Chip(FocalPlane): # Non-Linearity for Dark if config["non_linear"].lower() == "y": print(" Applying Non-Linearity on the Dark image", flush=True) - DarkCombImg = effects.NonLinearity(GSImage=DarkCombImg, beta1=1.e-7, beta2=1.e-10) + DarkCombImg = effects.NonLinearity(GSImage=DarkCombImg, beta1=5.e-7, beta2=0) if config["cte_trail"].lower() == "y": DarkCombImg = effects.CTE_Effect(GSImage=DarkCombImg, threshold=3) + # Add Hot Pixels or/and Dead Pixels + rgbadpix = Generator(PCG64(int(SeedDefective+self.chipID))) + badfraction = 5E-5*(rgbadpix.random()*0.5+0.7) + DarkCombImg = effects.DefectivePixels(DarkCombImg, IfHotPix=BoolHotPix, IfDeadPix=BoolDeadPix, fraction=badfraction, seed=SeedDefective+self.chipID, biaslevel=0) + # Apply Bad lines if config["add_badcolumns"].lower() == "y": DarkCombImg = effects.BadColumns(DarkCombImg, seed=SeedBadColumns, chipid=self.chipID) - # Add Hot Pixels or/and Dead Pixels - rgbadpix = Generator(PCG64(int(SeedDefective+self.chipID))) - badfraction = 5E-5*(rgbadpix.random()*0.5+0.7) - DarkCombImg = effects.DefectivePixels(DarkCombImg, IfHotPix=BoolHotPix, IfDeadPix=BoolDeadPix, fraction=badfraction, seed=SeedDefective+self.chipID, biaslevel=self.bias_level) + # Add Bias level + if config["add_bias"].lower() == "y": + print(" Adding Bias level and 16-channel non-uniformity") + # img += float(config["bias_level"]) + DarkCombImg = effects.AddBiasNonUniform16(DarkCombImg, + bias_level=biaslevel, + nsecy = 2, nsecx=8, + seed=SeedBiasNonuni+self.chipID) + + # Add Read-out Noise + if config["add_readout"].lower() == "y": + seed = int(config["seed_readout"]) + pointing_ID*30 + self.chipID + rng_readout = galsim.BaseDeviate(seed) + readout_noise = galsim.GaussianNoise(rng=rng_readout, sigma=self.read_noise) + DarkCombImg.addNoise(readout_noise) DarkCombImg = effects.ApplyGainNonUniform16( DarkCombImg, gain=self.gain, @@ -667,7 +709,7 @@ class Chip(FocalPlane): datetime_obs = datetime.fromtimestamp(timestamp_obs) date_obs = datetime_obs.strftime("%y%m%d") time_obs = datetime_obs.strftime("%H%M%S") - timestamp_obs += 5 * 60 + timestamp_obs += 10 * 60 self.outputCal( img=DarkCombImg, ra_cen=ra_cen, @@ -680,41 +722,6 @@ class Chip(FocalPlane): output_dir=chip_output.subdir, exptime=self.dark_exptime) del DarkCombImg - - # Apply Nonlinearity on the chip image - if config["non_linear"].lower() == "y": - print(" Applying Non-Linearity on the chip image", flush=True) - img = effects.NonLinearity(GSImage=img, beta1=1.e-7, beta2=1.e-10) - - # Apply CCD Saturation & Blooming - if config["saturbloom"].lower() == "y": - print(" Applying CCD Saturation & Blooming") - img = effects.SaturBloom(GSImage=img, nsect_x=1, nsect_y=1, fullwell=fullwell) - - # Apply CTE Effect - if config["cte_trail"].lower() == "y": - print(" Apply CTE Effect") - img = effects.CTE_Effect(GSImage=img, threshold=27) - - # Apply Bad lines - if config["add_badcolumns"].lower() == "y": - img = effects.BadColumns(img, seed=SeedBadColumns, chipid=self.chipID) - - # Add Hot Pixels or/and Dead Pixels - rgbadpix = Generator(PCG64(int(SeedDefective+self.chipID))) - badfraction = 5E-5*(rgbadpix.random()*0.5+0.7) - img = effects.DefectivePixels(img, IfHotPix=BoolHotPix, IfDeadPix=BoolDeadPix, fraction=badfraction, seed=SeedDefective+self.chipID, biaslevel=self.bias_level) - - - # Apply Gain & Quantization - print(" Applying Gain (and 16 channel non-uniformity) & Quantization", flush=True) - img = effects.ApplyGainNonUniform16( - img, gain=self.gain, - nsecy = 2, nsecx=8, - seed=SeedGainNonuni+self.chipID) - img.array[img.array > 65535] = 65535 - img.replaceNegative(replace_value=0) - img.quantize() # img = galsim.ImageUS(img) # # 16 output channel, with each a single image file diff --git a/ObservationSim/Instrument/Chip/Effects.py b/ObservationSim/Instrument/Chip/Effects.py index 6384406..441359e 100644 --- a/ObservationSim/Instrument/Chip/Effects.py +++ b/ObservationSim/Instrument/Chip/Effects.py @@ -5,6 +5,7 @@ from numpy.core.fromnumeric import mean, size from numpy.random import Generator, PCG64 import math from numba import jit +from astropy import stats def AddOverscan(GSImage, overscan=1000, gain=1, widthl=27, widthr=27, widtht=8, widthb=8, read_noise=5): @@ -31,7 +32,7 @@ def AddOverscan(GSImage, overscan=1000, gain=1, widthl=27, widthr=27, widtht=8, return newimg -def DefectivePixels(GSImage, IfHotPix=True, IfDeadPix=True, fraction=1E-4, seed=20210304, biaslevel=500): +def DefectivePixels(GSImage, IfHotPix=True, IfDeadPix=True, fraction=1E-4, seed=20210304, biaslevel=0): # Also called bad pixels, including hot pixels and dead pixels # Hot Pixel > 20e-/s # Dead Pixel < 70%*Mean @@ -68,10 +69,11 @@ def DefectivePixels(GSImage, IfHotPix=True, IfDeadPix=True, fraction=1E-4, seed= return GSImage -def BadColumns(GSImage, seed=20210309, chipid=1): +def BadColumns(GSImage, seed=20240309, chipid=1): # Set bad column values ysize,xsize = GSImage.array.shape subarr = GSImage.array[int(ysize*0.1):int(ysize*0.12), int(xsize*0.1):int(xsize*0.12)] + subarr = stats.sigma_clip(subarr, sigma=4, cenfunc='median', maxiters=3, masked=False) meanimg = np.median(subarr) stdimg = np.std(subarr) seed += chipid @@ -80,15 +82,19 @@ def BadColumns(GSImage, seed=20210309, chipid=1): rgxpos = Generator(PCG64(int(seed*1.2))) rgdn = Generator(PCG64(int(seed*1.3))) - nbadsecA,nbadsecD = rgn.integers(low=1, high=5, size=2) + nbadsecA,nbadsecD = rgn.integers(low=1, high=5, size=2) collen = rgcollen.integers(low=int(ysize*0.1), high=int(ysize*0.7), size=(nbadsecA+nbadsecD)) xposit = rgxpos.integers(low=int(xsize*0.05), high=int(xsize*0.95), size=(nbadsecA+nbadsecD)) - signs = 2*rgdn.integers(0,2,size=(nbadsecA+nbadsecD))-1 - dn = rgdn.integers(low=meanimg*0.4, high=meanimg*0.8, size=(nbadsecA+nbadsecD))*signs + print(xposit+1) + # signs = 2*rgdn.integers(0,2,size=(nbadsecA+nbadsecD))-1 + if meanimg>0: + dn = rgdn.integers(low=meanimg*1.3+50, high=meanimg*2+150, size=(nbadsecA+nbadsecD)) #*signs + elif meanimg<0: + dn = rgdn.integers(low=meanimg*2-150, high=meanimg*1.3-50, size=(nbadsecA+nbadsecD)) #*signs for badcoli in range(nbadsecA): - GSImage.array[(ysize-collen[badcoli]):ysize,xposit[badcoli]:(xposit[badcoli]+1)] += np.random.random((collen[badcoli],1))*stdimg*3+dn[badcoli] + GSImage.array[(ysize-collen[badcoli]):ysize,xposit[badcoli]:(xposit[badcoli]+1)] = (np.abs(np.random.normal(0, stdimg*2, (collen[badcoli],1)))+dn[badcoli]) for badcoli in range(nbadsecD): - GSImage.array[0:collen[badcoli+nbadsecA],xposit[badcoli+nbadsecA]:(xposit[badcoli+nbadsecA]+1)] += np.random.random((collen[badcoli+nbadsecA],1))*stdimg*3+dn[badcoli+nbadsecA] + GSImage.array[0:collen[badcoli+nbadsecA],xposit[badcoli+nbadsecA]:(xposit[badcoli+nbadsecA]+1)] = (np.abs(np.random.normal(0, stdimg*2, (collen[badcoli+nbadsecA],1)))+dn[badcoli+nbadsecA]) return GSImage @@ -223,7 +229,7 @@ def PRNU_Img(xsize, ysize, sigma=0.01, seed=202101): return prnuimg -def NonLinearity(GSImage, beta1=1E-7, beta2=1E-10): +def NonLinearity(GSImage, beta1=5E-7, beta2=0): NonLinear_f = lambda x, beta_1, beta_2: x - beta_1*x*x + beta_2*x*x*x GSImage.applyNonlinearity(NonLinear_f, beta1, beta2) return GSImage diff --git a/ObservationSim/Instrument/Chip/__pycache__/Chip.cpython-38.pyc b/ObservationSim/Instrument/Chip/__pycache__/Chip.cpython-38.pyc index 714df698948c5c51688fad876725832c1f66b762..04dcf2fffaf8dbb23429b6504ae597b6bc5e9b96 100644 GIT binary patch delta 8034 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 diff --git a/ObservationSim/Instrument/Chip/__pycache__/Effects.cpython-38.pyc b/ObservationSim/Instrument/Chip/__pycache__/Effects.cpython-38.pyc index 44f89fdced2fa9a27886b382325bbac16bb0f113..5b8b9b9c4e96791918411bdc73a6fe5ccf036c3a 100644 GIT binary patch delta 5169 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 VZUG=%EgZfQ-$GwGU%YA2{{f;hz32b{ delta 4975 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 L9e)1m>N)=duF-?k diff --git a/ObservationSim/Instrument/Filter.py b/ObservationSim/Instrument/Filter.py index 0ce2cb7..abad405 100755 --- a/ObservationSim/Instrument/Filter.py +++ b/ObservationSim/Instrument/Filter.py @@ -73,5 +73,5 @@ class Filter(object): def getPhotonE(self): return photonEnergy(self.effective_wavelength) - def getSkyNoise(self, exptime, gain): + def getSkyNoise(self, exptime, gain=1.): return self.sky_background * exptime / gain diff --git a/ObservationSim/Instrument/__pycache__/Filter.cpython-38.pyc b/ObservationSim/Instrument/__pycache__/Filter.cpython-38.pyc index 25130bb497d27f287065bb9c8502433ea6743b78..fcebf5167a91b96e35555e3025f1b38a8f86e165 100644 GIT binary patch delta 190 zcmZn>nYoQdD6xJ5TD3%nq6!sQ|DAp8?6iy(` zmLiLD0HHiBWB>pF delta 176 zcmbOv)*{9m%FD~e00evbaucpkK{u&3~*@Bu|QQutE@fHY?cb1;LZ@MZzVSZ2ob$$2c38I>nLE~Sl|<*!DKc;EtwjIEa@7a z6b@;I8eR~YBGk(i%uvG@%%CZ}IZN;?6PG5_EyjvljFp-)lOsgJ1p|R5+~Q15&5JL{ ztcb5D3YvUCB#w(cAlR+AATv)>aI%eP>Ezv_vW!}jZ;EO$GH>P(Yhv<<0O?{4&PYux zy2W0Un39>8S6mbW7Ayt{YH}Cp0(nIs(~E+@;)zBS|FGNV{B5;GDtjc&2W$EV~c$Hx~%O#UZ1i?L+#Oerny bIFMqnj-<)wq*~cPRulySHH%L!khTW^II>uw delta 366 zcmca%w%(jKl$V!_0SHd@ zD~f_AcZEmlT8Mghjn8%3L#^ddn9vj%6RCKladFG@@S8dh8s3l=N}32Jf|=>mC0 zAO`?#O_Y#i%$!^;p~jdnd6C3Kwseqi!emRyaK@y`6D36%BPTDHoW)o^*-1)^I}s!a YR*^cnT&k5j7;cc!6CM&6J@CEx(Jq$mv3M~m$?6|hN28NG1s7T#ZrV4dYje2MWNftB;<38#k0nFhv zKenDLc2jK&a`m*nc$zdLYp_`gS)hMXVZw)z$5>Q90bQkG{d*BKcG*9vl-;YX=6OM{mrXvBARI8W&Lj@52Mp-Yuxb~LaM@S=X|$vyIwn|oqhL3Ugdsg5Yq0& zh3TGanQU2GUYQ!t%+HRKjA`ED=bapmap>Y;7j&F68=gg0*31=lr&ZC2lgb#@@u zxMoRI%Hx%s6U}oLURf%k0(rn@OZMLRWbdRBbwq`nM4k5Pq+qXr_krt(M3_^|*Kiea z?_H3HnDbilPKG@63Riy1`7D|0HvcZ?r|e;@HnhET&r*u&mXHft8jgtvO=sW6qA4%+ zW1@)VBN7eJu;Hh{8An*ae-T$f#8Io@o@fD97mq=Zorot-dWakqcow4I+^Pi+`uT{) zqjw{h?k(LR!jO>iTrg|-uLK-!viIVh)vt5f$05&Qox>XlsY>>1yj8t{G%Z<~SEgA_ zO;puW=ng3?xnzTxzG~N zmC91lhfPRMjfsg79!zTDi&+zW)fn~72NRQSjET|sWQN z*_qu>d!F=oCp;ciz|VKyk8X9H``Ei8!UeV|o{kZD7Kj4{h#duH6yheHO-RXwr{V*f zsLF+LM;}0fz2h8$$LuHPN?D4AwK@`>6SqaZnSz!yBkX-87Fal8Iii+h^1yM@v%OD{ zkg(03Dh==%12yjX-LeO*_#at|nuGv*MeX*Srxn^6Qj2y;pJX4XHL%UTR$Jf;_LtfO zKd^dN1C+2~*IHQ6+Ng+?e6*A_6zD!cxT(X-P_UAth` z(3+h-l0>c6(vG7RH~Nw4LGc;`RL%i)P$%9nhxQW6Ag!fw;wMdcmsw|=M~f9}MJd`4 z-Y=kBM0uHYl(dF(vxGcIdmw2n0A!Azh&z8693 z(IT1+#^s$WG(j6?MQkx)gtYKZgi6{3GFqYnITIFkMYEA6w5zm{v=W81O1=WPRv`X}s5qwx8ClFMPqSA8SxB+p0ykQ&ASWf?zq6d4 z$?Cm4%XJPD9IkS>#$k-Z4Gt-`8jQm@dpGz!OtPg=e*{FZ;Sur3|EP99IH3yMAhT~n zLH28Cz1&t|;{kgiJZ%5`>2wz!h8Z;RiXSR_uSxPE9UQDDS%p*lYPI!%y%0^*@t*&; z%{Qad>#y;^y9miry_M^S&$1q4<+QRNzH*Jn4Irc(iwo0zcQe_dYkB2%Ix|0;CK+9S zo%`E49Cm3n)WvNUoJFnZ(pT8Mm;wr0jcvg__HQiCZkC4!dZ|PpDwy5{8v)a6*r+WB zM4S_KjoR=g<)BM2ZPb3C+YK3Y$l>W1ZvJ8V44J)Mo?L&jv|%`QoV$WqW+=EZDvFEx ziIkTnMKfUXy|U91tQA7dZE0b{Lu}MfLzPAaUdsGlKq7%NIc_P#^2AD1TlhPK?6ZM8U;Z^KQ)KAugW(F!$2N(yFz%?hzgM zw^YSpojtB-k3Hn-AcqYOIS!i$Nk99gqM21!cC_*-CZo>`uqbE8rWR(W_qUSMj?9p~ zRoUHElr!1I%z}}!XYSw__lCwtUX-#KqCessYnn#}$^NcvuIeO$J7><#u}bqic)OVwZc?;|gz&Sx`i*|k%{qeJ=@8$6c% E4@MYnf&c&j diff --git a/ObservationSim/__pycache__/Pointing.cpython-38.pyc b/ObservationSim/__pycache__/Pointing.cpython-38.pyc index 57ecf0ddccba0c3b01b99904dbffed5c19a22a82..22442f6ccad9d75cc79c4e5e4a811f12344183ad 100644 GIT binary patch delta 568 zcmX|8F>ljQ5WahH8pm;5Cw1(mO$jbeO2WVh17bo#>P8R@PogE#9Z^eL8Y=@^2CExG zD*pj{Mm7#xtnX?N#>F#~{zI*R`ckh?^z3#keHZ71<`}ytts(S78@aFo_ z;nL;?)w+1%d*ybe|eC z#H{8#RaCw^ zA z=8q4r;EkO+yh1CPG9FjhBRf{c=PEfd?!&2PYV4==3`}EkPGFiNFj_2NU$W0ki(6@1 zvP-`zK4hJC_yLCmA;g#=0tbJI^N&nsGIK2hgez9*I_nIL&Z9u0fE?2$cZ9sbIz|m9 zl3a&1A$PA;2vV=|`VI&GSs*N+vUGJdaMWIQ70IIt`BWt!h)ZUZi|Iq&lpQ@eVT-GL zvcXY|`K1H1&0Dgjm;X89?GUK^R^8zAl6zF!1Jk=`@jZ8Qek8oU