From ea140bf5d2194c32237d8bd167db6b0f5aeebd72 Mon Sep 17 00:00:00 2001 From: Jeb Bailey Date: Mon, 23 Feb 2026 13:35:07 -0800 Subject: [PATCH 1/6] Add IntelliJ IDEA project configuration files for `zs-scopesim`. --- .idea/.gitignore | 8 +++++++ .idea/deployment.xml | 23 +++++++++++++++++++ .../inspectionProfiles/profiles_settings.xml | 6 +++++ .idea/misc.xml | 4 ++++ .idea/modules.xml | 8 +++++++ .idea/vcs.xml | 7 ++++++ .idea/zs-scopesim.iml | 16 +++++++++++++ 7 files changed, 72 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/deployment.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/zs-scopesim.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 0000000..0d42f02 --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..79c3328 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4fb4b1a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..029a89b --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/zs-scopesim.iml b/.idea/zs-scopesim.iml new file mode 100644 index 0000000..457aaa4 --- /dev/null +++ b/.idea/zs-scopesim.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file From 3efc31ea6b63fa349512982ec0aeabd52c19bb88 Mon Sep 17 00:00:00 2001 From: Jeb Bailey Date: Mon, 23 Feb 2026 13:35:39 -0800 Subject: [PATCH 2/6] Add Jupyter notebook to explore PSF and atmospheric dispersion effects as an example of thinking. --- notebooks/psf_adc.ipynb | 906 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 906 insertions(+) create mode 100644 notebooks/psf_adc.ipynb diff --git a/notebooks/psf_adc.ipynb b/notebooks/psf_adc.ipynb new file mode 100644 index 0000000..2b4c4da --- /dev/null +++ b/notebooks/psf_adc.ipynb @@ -0,0 +1,906 @@ +{ + "cells": [ + { + "metadata": { + "collapsed": true + }, + "cell_type": "markdown", + "source": [ + "# Explore PSF Effects\n", + "\n", + "Sampling:\n", + "1. Density or total -> total in bin\n", + "1. Sampling: point is ben center or bin edge -> start with bin edge\n", + "\n", + "---\n", + "\n", + "1. Create a Moffat PSF Cube per some simple rules\n", + " 1. fixed beta\n", + " 1. fwhm/alpha/EE50/EE80 parameterized as function of wavelength\n", + " 1. spatial extent and oversample\n", + " 1. spectral extend, resolution element, and oversample\n", + "1. Apply Atmospheric dispersion: Use AD relation to compute grid shifts (with input angle and ZD at each wavelength and shift cube)\n", + "1. Apply a field rotation\n", + " 1. Assume rotator has some offset and angular error from desired orientation. take convention that 0 positions PA along slit\n", + "1. Apply ADC correction: shift back with opposite AD shift computed with a small parameterize angle error and add in emprical optical correction residuals\n", + "1. Clip out what makes it through a slit\n" + ], + "id": "88460e362f14432f" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "", + "id": "c71e9751936657d4" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T22:43:21.307227Z", + "start_time": "2026-02-11T22:43:21.262468Z" + } + }, + "cell_type": "code", + "source": [ + "from astropy.utils.masked.function_helpers import zeros_like\n", + "\n", + "\n", + "def Z(T,p,xw): #compressibility\n", + " t=T-273.15\n", + " a0 = 1.58123e-6 #K·Pa^-1\n", + " a1 = -2.9331e-8 #Pa^-1\n", + " a2 = 1.1043e-10 #K^-1·Pa^-1\n", + " b0 = 5.707e-6 #K·Pa^-1\n", + " b1 = -2.051e-8 #Pa^-1\n", + " c0 = 1.9898e-4 #K·Pa^-1\n", + " c1 = -2.376e-6 #Pa^-1\n", + " d = 1.83e-11 #K^2·Pa^-2\n", + " e = -0.765e-8 #K^2·Pa^-2\n", + " return 1-(p/T)*(a0+a1*t+a2*t**2+(b0+b1*t)*xw+(c0+c1*t)*xw**2) + (p/T)**2*(d+e*xw**2)\n", + "\n", + "\n", + "def n(lam,t,p,h,xc):\n", + " # lam: wavelength, 0.3 to 1.69 μm \n", + " # t: temperature, -40 to +100 °C\n", + " # p: pressure, 80000 to 120000 Pa\n", + " # h: fractional humidity, 0 to 1\n", + " # xc: CO2 concentration, 0 to 2000 ppm\n", + "\n", + " σ = 1/lam #μm^-1\n", + " \n", + " T= t + 273.15 #Temperature °C -> K\n", + " \n", + " R = 8.314510 #gas constant, J/(mol·K)\n", + " \n", + " k0 = 238.0185 #μm^-2\n", + " k1 = 5792105 #μm^-2\n", + " k2 = 57.362 #μm^-2\n", + " k3 = 167917 #μm^-2\n", + " \n", + " w0 = 295.235 #μm^-2\n", + " w1 = 2.6422 #μm^-2\n", + " w2 = -0.032380 #μm^-4\n", + " w3 = 0.004028 #μm^-6\n", + " \n", + " A = 1.2378847e-5 #K^-2\n", + " B = -1.9121316e-2 #K^-1\n", + " C = 33.93711047\n", + " D = -6.3431645e3 #K\n", + " \n", + " α = 1.00062\n", + " β = 3.14e-8 #Pa^-1,\n", + " γ = 5.6e-7 #°C^-2\n", + "\n", + " #saturation vapor pressure of water vapor in air at temperature T (Pa)\n", + " svp = np.where(t>=0,\n", + " np.exp(A*T**2 + B*T + C + D/T), # if t>=0\n", + " 10**(-2663.5/T+12.537)) # if t<0\n", + " \n", + " #enhancement factor of water vapor in air\n", + " f = α + β*p + γ*t**2\n", + " \n", + " #molar fraction of water vapor in moist air\n", + " xw = f*h*svp/p\n", + " \n", + " #refractive index of standard air at 15 °C, 101325 Pa, 0% humidity, 450 ppm CO2\n", + " nas = 1 + (k1/(k0-σ**2)+k3/(k2-σ**2))*1e-8\n", + " \n", + " #refractive index of standard air at 15 °C, 101325 Pa, 0% humidity, xc ppm CO2\n", + " naxs = 1 + (nas-1) * (1+0.534e-6*(xc-450))\n", + " \n", + " #refractive index of water vapor at standard conditions (20 °C, 1333 Pa)\n", + " nws = 1 + 1.022*(w0+w1*σ**2+w2*σ**4+w3*σ**6)*1e-8\n", + " \n", + " Ma = 1e-3*(28.9635 + 12.011e-6*(xc-400)) #molar mass of dry air, kg/mol\n", + " Mw = 0.018015 #molar mass of water vapor, kg/mol\n", + " \n", + " Za = Z(288.15, 101325, 0) #compressibility of dry air\n", + " Zw = Z(293.15, 1333, 1) #compressibility of pure water vapor\n", + " \n", + " #Eq.4 with (T,P,xw) = (288.15, 101325, 0)\n", + " ρaxs = 101325*Ma/(Za*R*288.15) #density of standard air\n", + " \n", + " #Eq 4 with (T,P,xw) = (293.15, 1333, 1)\n", + " ρws = 1333*Mw/(Zw*R*293.15) #density of standard water vapor\n", + " \n", + " # two parts of Eq.4: ρ=ρa+ρw\n", + " ρa = p*Ma/(Z(T,p,xw)*R*T)*(1-xw) #density of the dry component of the moist air \n", + " ρw = p*Mw/(Z(T,p,xw)*R*T)*xw #density of the water vapor component\n", + " \n", + " nprop = 1 + (ρa/ρaxs)*(naxs-1) + (ρw/ρws)*(nws-1)\n", + " \n", + " return nprop\n" + ], + "id": "dd7a41ed62731e47", + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:43:54.138304Z", + "start_time": "2026-02-11T23:43:54.113962Z" + } + }, + "cell_type": "code", + "source": [ + "from enum import Enum\n", + "import astropy.units as u\n", + "from astropy.modeling.models import Moffat2D\n", + "import numpy as np\n", + "from scipy.interpolate import make_interp_spline, RegularGridInterpolator\n", + "import skimage as ski\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "\n", + "class PSFScale(Enum):\n", + " FWHM = 'fwhm'\n", + " EE50 = 'ee50'\n", + " EE80 = 'ee80'\n", + " gamma = 'gamma' # astropy scale factor\n", + " alpha = 'alpha' # wikipedia scale factor\n", + "\n", + "\n", + "def make_wavlength_grid(min_wave, max_wave, resolving_power=20e3, osample=4, bin_edge=True):\n", + " \"\"\"\n", + " Make a wavelength grid in constant resolving power space with oversampling factor\n", + "\n", + " Args:\n", + " MIN_WAVE:\n", + " MAX_WAVE:\n", + " resolving_power:\n", + " osample:\n", + " bin_edge:\n", + "\n", + " Returns:\n", + "\n", + " \"\"\"\n", + " # TODO deal with edge vs center\n", + " rosamp = resolving_power*osample\n", + " return min_wave * (1 + 1/rosamp) ** np.arange(int(np.log(max_wave/min_wave)/np.log(1+1/(rosamp)))+1)\n", + "\n", + "\n", + "def make_spatial_grid(x_extent, y_extent:u.Quantity, plate_scale:u.Quantity, osample=10, bin_edge=False):\n", + " \"\"\"\n", + " Make a spatial grid with the specified extent and sampling with oversampling factor\n", + " Args:\n", + " x_extent:\n", + " y_extent:\n", + " plate_scale:\n", + " osample:\n", + "\n", + " Returns:\n", + "\n", + " \"\"\"\n", + " x=np.linspace(-x_extent/2, x_extent/2, num=int((x_extent/plate_scale*osample).to(u.dimensionless_unscaled).value))\n", + " y=np.linspace(-y_extent/2, y_extent/2, num=int((y_extent/plate_scale*osample).to(u.dimensionless_unscaled).value))\n", + " #TODO handle bin edge or not\n", + " return u.Quantity(np.meshgrid(x, y)).to(u.mas)\n", + "\n", + "\n", + "def ao_scale(wavelengths: u.Quantity) -> u.Quantity:\n", + "\n", + " global FWHM_AO\n", + " try:\n", + " return FWHM_AO(wavelengths)\n", + " except NameError:\n", + " SKYBANDS = (np.array([300, 400])*u.nm,\n", + " np.array([395, 505])*u.nm,\n", + " np.array([495, 635])*u.nm,\n", + " np.array([625, 800])*u.nm,\n", + " np.array([785, 1000])*u.nm,\n", + " np.array([990, 1185])*u.nm,\n", + " np.array([1165, 1400])*u.nm,\n", + " np.array([1500, 1800])*u.nm,\n", + " np.array([2000, 2600])*u.nm)\n", + " FWHM_AO=lambda x, *a, **kw: make_interp_spline([300]+list(map(lambda x : np.mean(x).value, SKYBANDS))[1:][:-1]+[2550],\n", + " [343, 357,220, 190, 185,183,182, 175, 182], k=1)(x.to(u.nm).value)*u.mas\n", + "\n", + " return FWHM_AO(wavelengths)\n", + "\n", + "\n", + "def natural_scale(seeing:u.Quantity, zenith_angle: u.Quantity, wavelengths: u.Quantity, pivot=500*u.nm) -> u.Quantity:\n", + " \"\"\"\n", + " Seeing law scaled to wavelength\n", + "\n", + " https://opg.optica.org/josa/fulltext.cfm?uri=josa-68-7-877&id=57124\n", + " https://www.mdpi.com/2072-4292/14/2/405\n", + " \"\"\"\n", + " return seeing * (wavelengths / pivot) ** -0.2 * 1/np.cos(zenith_angle.to(u.rad)) ** .6\n", + "\n", + "\n", + "def psf_moffat(scale:u.Quantity|float, beta:float, spatial_grid:u.Quantity, scaletyppe: PSFScale=PSFScale.FWHM):\n", + "\n", + " if scaletyppe == PSFScale.FWHM:\n", + " # theta = theta_factor*FWHM, specific to Moffat PSF\n", + " theta_factor = 0.5 / (2 ** (1. / beta) - 1.) ** .5\n", + " gamma = theta_factor * scale\n", + " elif scaletyppe in (PSFScale.gamma, PSFScale.alpha):\n", + " gamma = scale\n", + " else:\n", + " raise NotImplementedError(\"scale type not implemented\")\n", + "\n", + " amplitude = (beta-1)/np.pi/gamma[None, None, :].to(u.mas)**2\n", + "\n", + " cube = Moffat2D.evaluate(spatial_grid[0][...,None].to(u.mas), spatial_grid[1][...,None].to(u.mas),\n", + " amplitude, x_0=0, y_0=0, gamma=gamma[None, None, :].to(u.mas), alpha=beta)\n", + "\n", + " grid_step = spatial_grid[:,1,1]-spatial_grid[:,0,0]\n", + " grid_area = np.prod(grid_step.value) * spatial_grid.unit**2\n", + " norm = cube.sum(0).sum(0)*grid_area\n", + " if norm.max()<.99:\n", + " raise ValueError('use a bigger grid')\n", + " cube/=norm\n", + "\n", + " return cube\n", + "\n", + "\n", + "def psf_cube(seeing:u.Quantity, zenith_angle: u.Quantity, spatial_grid, wavelength_grid: u.Quantity, ao=False, AO_BETA=3.25, NATURAL_BETA=4.765) -> np.array:\n", + " return psf_moffat(ao_scale(wavelength_grid) if ao else natural_scale(seeing, zenith_angle, wavelength_grid),\n", + " AO_BETA if ao else NATURAL_BETA,\n", + " spatial_grid,\n", + " scaletyppe=PSFScale.FWHM if ao else PSFScale.FWHM)\n", + "\n", + "def n_air(wavelengths:u.Quantity):\n", + " # TODO\n", + " # see https://github.com/polyanskiy/refractiveindex.info-scripts/blob/main/scripts/Ciddor%201996%20-%20air.py\n", + " # see https://github.com/polyanskiy/refractiveindex.info-scripts/blob/main/scripts/Mathar%202007%20-%20Air%207.5-14.1um.py\n", + " # # https://github.com/polyanskiy/refractiveindex.info-scripts/blob/main/scripts/Birch%201994%20-%20air.py\n", + " return n(wavelengths.to(u.um).value,15,101325,0,450) #dry air, 15 °C, 450 ppm\n", + "\n", + "def ad_shift(zenith_angle: u.Quantity, wavelengths: u.Quantity, wave_ref: u.Quantity)-> u.Quantity:\n", + " shifts = 206265*(n_air(wavelengths)-n_air(wave_ref))*np.tan(zenith_angle.to(u.rad).value)*u.arcsec\n", + " return shifts.to(u.mas)\n", + "\n", + "\n", + "def apply_field_rotation(cube, angle: u.Quantity, miscentration: u.Quantity, angle_error: u.Quantity, spatial_grid:u.Quantity)-> u.Quantity:\n", + " \"\"\"\n", + " Rotate input cube about angle+angle_error centered miscentration offset from its center\n", + "\n", + " Args:\n", + " angle:\n", + " miscentration:\n", + " angle_error:\n", + "\n", + " Returns:\n", + "\n", + " \"\"\"\n", + "\n", + " grid_step_size = spatial_grid[:,1,1]-spatial_grid[:,0,0]\n", + " center = ((u.Quantity(miscentration)/grid_step_size).to(u.dimensionless_unscaled).value+np.array(spatial_grid.shape[1:])/2)[::-1]\n", + " return ski.transform.rotate(cube, (angle+ angle_error).to(u.deg).value, center=center, order=1, mode='edge')*cube.unit\n", + "\n", + "\n", + "def adc_correction(zenith_angle: u.Quantity, adc_zenith_error: u.Quantity, wavelengths: u.Quantity, wave_ref: u.Quantity,\n", + " broadband=True, resid_only=False)-> u.Quantity:\n", + " \"\"\"\n", + " Computer a correction for zenith angle\n", + " Args:\n", + " adc_zenith_angle:\n", + " wavelengths:\n", + "\n", + " Returns:\n", + "\n", + " \"\"\"\n", + "\n", + " #LRIS design note residuals\n", + " Z=np.array([0.,55.,60.])\n", + " lam_um=np.array([0.31,0.32,0.36,0.40,0.45,0.50,0.56,0.63,0.70,0.79,0.88,0.98,1.10])\n", + " R=np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0],\n", + " [-0.068,-0.057,0.017,0.016,0.052,0.052,0.052,0.059,0.041,0.031,-0.007,-0.063,-0.120],\n", + " [-0.083,-0.070,0.020,0.018,0.062,0.062,0.062,0.071,0.049,0.036,-0.009,-0.077,-0.146]])\n", + "\n", + " adc_opt_resid = RegularGridInterpolator((Z,lam_um),R,method=\"linear\",bounds_error=False,fill_value=None)\n", + "\n", + " adc_nir_resid = lambda xy: adc_opt_resid((xy[0], (xy[1]-1)/1.5*(1.1-.31)+.31)) #scale to nIR\n", + "\n", + " #300-500 & 500-1000\n", + " adc_ub_resid = lambda xy: adc_opt_resid((xy[0], (xy[1]-.3)/.2*(1.1-.31)+.31))/2 #scale\n", + " adc_gri_resid = lambda xy: adc_opt_resid((xy[0], (xy[1]-.5)/.5*(1.1-.31)+.31))/2 #scale to nIR\n", + "\n", + "\n", + " if resid_only:\n", + " shifts = np.zeros_like(wavelengths.value)*u.mas\n", + " else:\n", + " shifts = -ad_shift(zenith_angle+adc_zenith_error, wavelengths, wave_ref)\n", + "\n", + " if broadband:\n", + " use = wavelengths<1000*u.nm\n", + " shifts[use] += adc_opt_resid((zenith_angle.to_value(u.deg), wavelengths[use].to_value(u.um)))*1000*u.mas\n", + " else:\n", + " use = wavelengths<500*u.nm\n", + " shifts[use] += adc_ub_resid((zenith_angle.to_value(u.deg), wavelengths[use].to_value(u.um)))*1000*u.mas\n", + " use = ~use & (wavelengths<1000*u.nm)\n", + " shifts[use] += adc_gri_resid((zenith_angle.to_value(u.deg), wavelengths[use].to_value(u.um)))*1000*u.mas\n", + " use = wavelengths>=1000*u.nm\n", + " shifts[use] += adc_nir_resid((zenith_angle.to_value(u.deg), wavelengths[use].to_value(u.um)))*1000*u.mas\n", + "\n", + " return shifts.to(u.mas)\n", + "\n", + "\n", + "def apply_slit(cube:np.ndarray, spatial_grid:u.Quantity, slit_width:u.Quantity, slit_height:u.Quantity, slit_miscentration: u.Quantity)-> np.ndarray:\n", + " \"\"\"\n", + " Clip out the portion of the cube that is in the slit\n", + "\n", + " Args:\n", + " cube:\n", + " spatial_grid:\n", + " slit_width:\n", + " slit_height:\n", + " slit_miscentration:\n", + "\n", + " Returns:\n", + "\n", + " \"\"\"\n", + " shifted = np.abs(spatial_grid+slit_miscentration[:, None, None])\n", + " in_slit = (shifted[1] < slit_height/2) & (shifted[0] < slit_width/2)\n", + "\n", + " xs, ys = np.nonzero(in_slit)\n", + " x0, x1 = xs.min(), xs.max() + 1\n", + " y0, y1 = ys.min(), ys.max() + 1\n", + "\n", + " return cube[x0:x1, y0:y1, :]\n" + ], + "id": "6ce4c5638801e392", + "outputs": [], + "execution_count": 119 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:40:39.211317Z", + "start_time": "2026-02-11T23:40:39.200038Z" + } + }, + "cell_type": "code", + "source": [ + "import numpy as np\n", + "from scipy.ndimage import map_coordinates\n", + "\n", + "def shift_cube_xy_mapcoords_chunked(\n", + " psf: np.ndarray,\n", + " dy: np.ndarray,\n", + " dx: np.ndarray,\n", + " *,\n", + " chunk_w: int = 8,\n", + " order: int = 3\n", + ") -> np.ndarray:\n", + " \"\"\"\n", + " Shift each wavelength plane psf[:, :, w] by (dx[w], dy[w]) using interpolation.\n", + "\n", + " psf: (nx, ny, nwave)\n", + " dy: (nwave,) shift along y (axis=1), in pixels (float ok)\n", + " dx: (nwave,) shift along x (axis=0), in pixels (float ok); optional\n", + "\n", + " Sign convention:\n", + " Positive dy moves the image toward +y (increasing y index).\n", + " Positive dx moves the image toward +x (increasing x index).\n", + " \"\"\"\n", + " nx, ny, nw = psf.shape\n", + "\n", + " dy = np.asarray(dy, dtype=np.float32)\n", + " if dy.shape != (nw,):\n", + " raise ValueError(f\"dy must have shape (nwave,) == ({nw},), got {dy.shape}\")\n", + "\n", + " dx = np.asarray(dx, dtype=np.float32)\n", + " if dx.shape != (nw,):\n", + " raise ValueError(f\"dx must have shape (nwave,) == ({nw},), got {dx.shape}\")\n", + "\n", + " # Base grid for a single chunk (broadcasted)\n", + " xi = np.arange(nx, dtype=np.float32)[:, None, None] # (nx, 1, 1)\n", + " yi = np.arange(ny, dtype=np.float32)[None, :, None] # (1, ny, 1)\n", + "\n", + " out = np.empty_like(psf)\n", + "\n", + " # prefilter only matters for spline order > 1\n", + " prefilter = (order > 1)\n", + "\n", + " for w0 in range(0, nw, chunk_w):\n", + " w1 = min(w0 + chunk_w, nw)\n", + " k = w1 - w0\n", + "\n", + " # wave index grid for this chunk\n", + " wi = np.arange(w0, w1, dtype=np.float32)[None, None, :] # (1, 1, k)\n", + "\n", + " # To shift content by +dx/+dy, we sample input at (x - dx, y - dy).\n", + " # (map_coordinates samples the input at given coordinates)\n", + " xcoords = xi - dx[w0:w1][None, None, :] # (nx, 1, k) -> broadcast to (nx, ny, k)\n", + " ycoords = yi - dy[w0:w1][None, None, :] # (1, ny, k) -> broadcast to (nx, ny, k)\n", + "\n", + " # Broadcast to full chunk volume\n", + " xcoords = np.broadcast_to(xcoords, (nx, ny, k))\n", + " ycoords = np.broadcast_to(ycoords, (nx, ny, k))\n", + " wcoords = np.broadcast_to(wi, (nx, ny, k))\n", + "\n", + " coords = np.array([xcoords, ycoords, wcoords], dtype=np.float32) # (3, nx, ny, k)\n", + "\n", + " out[:, :, w0:w1] = map_coordinates(psf, coords, order=order, mode='nearest', prefilter=prefilter)*psf.unit\n", + "\n", + " return out\n" + ], + "id": "95c0f3ea6cadf186", + "outputs": [], + "execution_count": 106 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Grid", + "id": "7eaf3b4b9e1a564b" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:40:39.568614Z", + "start_time": "2026-02-11T23:40:39.547460Z" + } + }, + "cell_type": "code", + "source": [ + "MAX_PSF_WIDTH = 1.2e3*u.mas\n", + "SLIT_LENGTH = 10e3*u.mas\n", + "MIN_WAVE = 310*u.nm\n", + "MAX_WAVE = 2450*u.nm\n", + "PLATE_SCALE = 50*u.mas\n", + "\n", + "wave_ref=500*u.nm\n", + "wavelengths = make_wavlength_grid(MIN_WAVE, MAX_WAVE, resolving_power=10, osample=3)\n", + "sky_points = make_spatial_grid(5*MAX_PSF_WIDTH, SLIT_LENGTH+4*MAX_PSF_WIDTH, plate_scale=PLATE_SCALE, osample=4)\n", + "sky_step_size = sky_points[:,1,1]-sky_points[:,0,0]\n", + "sky_step_area = np.prod(sky_step_size.value) * sky_points.unit**2\n", + "print(f'PSF Cube needs {sky_points.size*wavelengths.size*8/1024**3:.0f} GiB')" + ], + "id": "b276c2dec48aa889", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PSF Cube needs 1 GiB\n" + ] + } + ], + "execution_count": 107 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Settings", + "id": "498ea58297522db3" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:44:54.196562Z", + "start_time": "2026-02-11T23:44:54.185422Z" + } + }, + "cell_type": "code", + "source": [ + "ao_enabled = True\n", + "\n", + "seeing = 650*u.mas\n", + "zenith_angle = 55 * u.deg\n", + "slit_width = 750 * u.mas if not ao_enabled else 325 * u.mas\n", + "slit_height = 10e3 *u.mas\n", + "\n", + "rotator_miscentration = u.Quantity((45*u.mas, 45*u.mas))\n", + "slit_miscentration = u.Quantity((-60*u.mas, 0*u.mas))\n", + "rotator_error = 360/400 * u.deg\n", + "adc_zenith_error = 360/400 * u.deg" + ], + "id": "f42de0c57c151265", + "outputs": [], + "execution_count": 124 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Base PSF", + "id": "23c0c5ef15012b7f" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:33:28.395229Z", + "start_time": "2026-02-11T23:33:27.878993Z" + } + }, + "cell_type": "code", + "source": [ + "psf = psf_cube(seeing, zenith_angle, sky_points, wavelengths, ao=ao_enabled)\n", + "plt.imshow(psf.sum(2).value)" + ], + "id": "c651fd69c7abcaf4", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 90 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Shift PSF by Atmospheric Dispersion", + "id": "4d80cf67cba6ebba" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:33:33.471076Z", + "start_time": "2026-02-11T23:33:33.419988Z" + } + }, + "cell_type": "code", + "source": [ + "ad = ad_shift(zenith_angle, wavelengths, wave_ref)\n", + "plt.plot(wavelengths, ad.to('arcsec'))" + ], + "id": "c7af62be554db09f", + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 91 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:33:50.093908Z", + "start_time": "2026-02-11T23:33:35.224887Z" + } + }, + "cell_type": "code", + "source": [ + "chunk_w = int(wavelengths.size/max(int(sky_points.size*wavelengths.size*4/1024**3),1))\n", + "shifted = shift_cube_xy_mapcoords_chunked(psf, np.zeros(ad.size), (ad/sky_step_size[1]).value, chunk_w=chunk_w)\n", + "plt.imshow(shifted.sum(2).value)" + ], + "id": "6aab1f8d78206b1f", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 92 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## (De)Rotate the field", + "id": "39a1ac0ff20606d9" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:33:50.977011Z", + "start_time": "2026-02-11T23:33:50.096106Z" + } + }, + "cell_type": "code", + "source": [ + "rotated = apply_field_rotation(shifted, 0*u.deg, rotator_miscentration, rotator_error, sky_points)\n", + "plt.imshow(rotated.sum(2).value)" + ], + "id": "648374104ed674ec", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 93 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Shift PSF by ADC correction", + "id": "81ba5a11ceede8b3" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:44:03.899586Z", + "start_time": "2026-02-11T23:44:03.841936Z" + } + }, + "cell_type": "code", + "source": [ + "adc = adc_correction(zenith_angle, adc_zenith_error, wavelengths, wave_ref, broadband=True)\n", + "adc2 = adc_correction(zenith_angle, adc_zenith_error, wavelengths, wave_ref, broadband=False)\n", + "plt.plot(wavelengths, ad+adc)\n", + "plt.plot(wavelengths, ad+adc2)" + ], + "id": "b6b2fd41f2d1938f", + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 120 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:44:37.138027Z", + "start_time": "2026-02-11T23:44:09.103200Z" + } + }, + "cell_type": "code", + "source": [ + "chunk_w = int(wavelengths.size/max(int(sky_points.size*wavelengths.size*4/1024**3),1))\n", + "corrected = shift_cube_xy_mapcoords_chunked(rotated, np.zeros(adc.size), (adc/sky_step_size[1]).value, chunk_w=chunk_w)\n", + "corrected_2slit = shift_cube_xy_mapcoords_chunked(rotated, np.zeros(adc.size), (adc2/sky_step_size[1]).value, chunk_w=chunk_w)" + ], + "id": "f39e7d26cfcbff8e", + "outputs": [], + "execution_count": 121 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:44:37.387222Z", + "start_time": "2026-02-11T23:44:37.146654Z" + } + }, + "cell_type": "code", + "source": [ + "plt.subplot(121)\n", + "plt.imshow(corrected.sum(2).value)\n", + "plt.colorbar()\n", + "plt.subplot(122)\n", + "plt.imshow(corrected.sum(2).value-psf.sum(2).value, vmin=0, vmax=corrected.sum(2).value.max())\n", + "plt.colorbar()\n", + "plt.tight_layout()" + ], + "id": "7c9f0e50a871da96", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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kpxOp0pLS/XRRx+pqalJFRUVysjIMPt0AXxGY2NjUGtvD33m5syZM/J6vSF3oqmpqSF3rH719fXd1ns8nsDdak81/n325bj+7HnnnXf0ve99T16vVwsXLgzjCvSOfAPsK5x8k2Ij40zv/P3kJz/RD37wAy1btkz/+I//qMLCQv34xz/Wv/7rvwZqCgsL9cADD2jZsmW67bbbVF9fr9dee01DhgwJ1JSUlGjmzJmaM2eOcnNzNWTIEL388suKi2OmGpAUsaUQPB6P9u/fr7y8vKDteXl52rNnT7e/U1NTE1I/depUuVwueb3eXmv8+7yc4/o5HA4lJiZe+sNdAvkGXCERXOolFjLO9GnfiRMnqqKiQjt37pQkHT9+XHPnztW4ceMCNffdd5/WrFmj7du3S5Lmz58vt9utefPm6amnnlJycrIWLlyou+66S7t27ZIk3XnnnTp58qSmTJkS8jAkEJM+x/pV3e6rD9avX6+ysjK5XC7V1NRo0aJFyszM1JYtWyRJxcXFysjI0Pz58yVJW7Zs0bJly7Ru3To9/fTTmjhxohYuXKi5c+cG9rlx40a99dZbKiwsVEVFhaZPn64pU6YErXF1qeMOGjRIDz30kF566SWdPn1aw4cP19KlS3Xdddfpv//7vz/nRSLfgCsmgvkmRX/GmX6b+fvf/17f+MY39KUvfUmSdMsttyg3NzcQlqNGjVJ6enpQwLW3t+vNN98MvM2Sk5Mjp9MZVHP69GkdPHiwxzdenE5nyJs8AKxRXl6u++67TytXrtS7776ryZMnKz8/XydOnJAkpaenKzMzM1B/7Ngx5efn64477tC7776rn/70p1q+fLlefPHFQE1NTY3mzJmjBQsW6E9/+pPuuecezZ49W/v27Qv7uB0dHRo9erReeOEFffDBB3r55Zf1xS9+UV/96ld16NChz/25I5VvEhkHXEnRnnGmj/z93//7fzV06FD95S9/UUdHhwYMGKCHHnpIW7dulaTAXHZ3b7Ncf/31gZq2tjZduHAhpKanN21WrFihhx9+2NwPA/Rjkf7uy82bN2vz5s3d/mzBggUh29566y3l5OT0us8XXnhBL7zwwmUft62tTd/97nd7/f3PI1L5JpFxiC2RzjcpujPO9JG/2bNn684779S8efN06623av78+frRj36ku+++O6iur2/RXKrm0UcfVXJycqDx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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 122 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Apply the slit", + "id": "794c6eaace384c97" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-11T23:47:30.047052Z", + "start_time": "2026-02-11T23:47:29.832607Z" + } + }, + "cell_type": "code", + "source": [ + "input_psf = apply_slit(corrected, sky_points, slit_width, slit_height, slit_miscentration)\n", + "input_psf2sl = apply_slit(corrected_2slit, sky_points, slit_width, slit_height, slit_miscentration)\n", + "input_psf2sl_nosliterror = apply_slit(corrected_2slit, sky_points, slit_width, slit_height, slit_miscentration*0)\n", + "plt.imshow(input_psf.sum(2).value)\n", + "plt.show()\n", + "plt.plot(wavelengths, input_psf.sum(axis=0).sum(axis=0)*sky_step_area, label='2 Slits')\n", + "plt.plot(wavelengths, input_psf2sl.sum(axis=0).sum(axis=0)*sky_step_area, label='3 Slits')\n", + "plt.show()\n", + "plt.plot(wavelengths, (input_psf-input_psf2sl).sum(axis=0).sum(axis=0)*sky_step_area, label='Diff')\n", + "plt.plot(wavelengths, (input_psf2sl-input_psf2sl_nosliterror).sum(axis=0).sum(axis=0)*sky_step_area, label='Diff vs perfect alignment')" + ], + "id": "db591e8f4bc0996", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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vv76axMZGemqrl27uuanpKSYoqIiM3XqVBMXF2fefPNNk52dbUJCQlzLLFy40Bw8eNBcccUVJj4+3nz66adm8+bNxt/f3/Lta481efJk84c//MFMnTrVGGPMdddd12B+a+2T5cuXm61bt5rRo0eb0aNHm61bt5qlS5davv3tpc60n15++WWzfPnyBu+tiIiIBsuwn9xbH3zwgZk+fboZNmyYGT58uFm2bJnJysoynTp1ci3D+8nz95GHvZes/6NR51epqalm8+bNzc7PyckxKSkpruc2m80UFhaaGTNmGEkmNDTUVFZWmmnTprmW6dGjh6murjZXXXWV5dvX3qupD9TW2CexsbHGGGMSExNdyyQlJRljjBk8eLDl293eqrng88477zS7Dvup7atr167GGGPGjRvnmsb7ybOqqX3kSe8lTnV5iUGDBik7O1t79+7Vm2++qX79+kmS+vXrpx49emjFihWuZZ1Op1avXq0xY8ZIkkaOHCmbzdZgmcOHD2vbtm2uZdB6WmufJCcny+FwaP369a5l0tPT5XA42G+t6LLLLlNeXp527typ559/Xt26dXPNYz+1vfrTGgUFBZJ4P3miU/dRPU95LxF8vEB6erpuu+02fec739FPfvITRUVFKS0tTV26dFFUVJQkKS8vr8E6eXl5rnlRUVGqrKyUw+Fodhm0ntbaJ1FRUcrPz2/0+vn5+ey3VvLBBx/o5ptv1sSJE3X//fcrISFBn332mWw2myT2kxXmzp2rL774Qtu3b5fE+8kTnbqPJM96L/nst7N7kw8//ND1eNu2bVq7dq327Nmj6dOna926dZIkY0yDdfz8/BpNO9XZLIOWa4190tTy7LfW869//cv1ePv27dq4caP279+v73//+3rnnXeaXY/95B4LFizQ8OHDNXbs2EbzeD95hub2kSe9lzji44WOHz+ur7/+WoMGDVJubq4kNUrD3bt3d/0fUm5uroKDgxUeHt7sMmg9rbVPcnNzFRkZ2ej1u3Xrxn5zk9zcXO3fv1+DBg1yPWc/tY358+fr2muv1eWXX67s7GzXdN5PnqO5fdQUq99Llg+Eolq3bDabOXjwoPntb39rpLqBfw8++KBrflBQUJMD/374wx+6lomKimJwcytVc4Obz3ef1A/0S0hIcC2TmJjIYMxW3E+nVpcuXUx5ebm59dZb2U9tWM8884w5dOiQGThwYJPzeT9ZX2faR6eWxe8l6/9g1PnVk08+acaPH2/69u1rEhMTzdKlS01RUZHp3bu3keou9SwsLDRTpkwxcXFx5vXXX2/yUs8DBw6YiRMnmvj4ePPJJ59wOft5VOfOnc2IESPMiBEjjDHG3HvvvWbEiBGmV69erbpPli9fbrZs2WKSkpJMUlKSycjI4PLbVtpPnTt3Nk8++aQZPXq06dOnj5kwYYJZs2aNOXjwIPupDetvf/ubKSwsNOPHj29wKXSHDh1cy/B+8ux95IHvJev/aNT5Vf09KyorK82hQ4fMkiVLzNChQxssk5qaanJyckx5eblZtWqViYuLazA/ODjYzJ8/3xw9etSUlZWZpUuXmp49e1q+be21JkyYYJry8ssvt+o+iYiIMIsXLzZFRUWmqKjILF682ISFhVm+/e2lTrefOnToYD788EOTl5dnKisrTVZWlnn55Zcb7QP2k3urOdOnT2+wHO8nz91HnvZe8jvxAAAAwOsxuBkAAPgMgg8AAPAZBB8AAOAzCD4AAMBnEHwAAIDPIPgAAACfQfABAAA+g+ADAAB8BsEHAAD4DIIPAADwGQQfAADgMwg+AADAZ/x/OTHEwySpEEsAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 127 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "5c210c7d51c52c54" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 78b4aee033c842a315b0c1c56c47b78428f1baa9 Mon Sep 17 00:00:00 2001 From: Yashvi-Sharma Date: Wed, 4 Mar 2026 17:50:52 -0800 Subject: [PATCH 3/6] Setting irdb path in notebook --- notebooks/playground_zshooter.ipynb | 107 ++++++++++++---------------- 1 file changed, 46 insertions(+), 61 deletions(-) diff --git a/notebooks/playground_zshooter.ipynb b/notebooks/playground_zshooter.ipynb index db21d08..a7f4dda 100644 --- a/notebooks/playground_zshooter.ipynb +++ b/notebooks/playground_zshooter.ipynb @@ -6,8 +6,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-12-10T20:11:20.235329Z", - "start_time": "2025-12-10T20:11:18.076352Z" + "end_time": "2026-03-05T01:47:44.185275Z", + "start_time": "2026-03-05T01:47:44.181350Z" } }, "source": [ @@ -20,38 +20,20 @@ "from astropy.table import Table\n", "from astropy.wcs import WCS\n", "import scopesim as sim\n", - "import scopesim_templates as sim_tp" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "\u001B[0m\n", - "\u001B[32mroot - \n", - "The spectrograph has been setup with the following properties:\n", - "\tl0: 515.0 nm\n", - "\tOrders: [18 19 20 21 22 23 24 25 26 27 28 29]\n", - "\tFocal length: 225.0 mm\n", - "\tIncidence angle: 64.200 deg\n", - "\tReflectance angle: 64.20 deg\n", - "\n", - "\tGroove length: 0.01 mm\n", - "\t# of pixels: 4096x4096\n", - "\tPixel size: 15.0 micron\n", - "\tPixels per res. element: 4.7\u001B[0m\n" - ] - } + "import scopesim_templates as sim_tp\n", + "\n", + "## Configure irdb path\n", + "sim.rc.__config__[\"!SIM.file.local_packages_path\"] = \"/Users/yashvi/Desktop/ZShooter/irdb/\"\n", + "sim.rc.__config__[\"!SIM.file.search_path\"].append(\"/Users/yashvi/Desktop/ZShooter/irdb/\")" ], - "execution_count": 1 + "outputs": [], + "execution_count": 7 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-12-10T20:11:20.282426Z", - "start_time": "2025-12-10T20:11:20.275928Z" + "end_time": "2026-03-05T01:47:46.058130Z", + "start_time": "2026-03-05T01:47:46.054619Z" } }, "cell_type": "code", @@ -69,20 +51,20 @@ ], "id": "2a7ab71a301cbffe", "outputs": [], - "execution_count": 2 + "execution_count": 8 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-12-10T20:11:21.697742Z", - "start_time": "2025-12-10T20:11:20.293161Z" + "end_time": "2026-03-05T01:49:44.229415Z", + "start_time": "2026-03-05T01:49:43.373949Z" } }, "cell_type": "code", "source": [ "## Set up ZShooter\n", "\n", - "cmd = sim.UserCommands(use_instrument=\"ZShooter\", set_modes=[\"SPEC\"])\n", + "cmd = sim.UserCommands(use_instrument=\"ZShooter_v1\", set_modes=[\"SPEC\"])\n", "zs = sim.OpticalTrain(cmd)\n", "\n", "waves = np.geomspace(100,350000,50000)\n", @@ -98,10 +80,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:169: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", + "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:166: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", " fov = thetrace.fov_grid()\n", "\u001B[0m\n", - "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:211: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", + "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:208: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", " vol = spt.fov_grid()\n", "\u001B[0m\n" ] @@ -114,16 +96,19 @@ "image/png": "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CgwMlNq1a7vLaKj5+uuvJSkpydRa/POf/5T58+eb17SZldLQobUuX331lVm0ZiMyMtI0tSrp8amEhAQTmqxFPxcA4NsCH/cOAACc7Y033pALFy7IwIEDTVMsrXqfMGGCvPvuu6YWQ7Vo0cIslp49e5r3aF+Rzz77rMTbjo+PN/1GLFoDQggBAN9GDQgAOECdOnWkYsWKkpqa6rVen4eFheX7Hl1fWHnr8WFl8nYCv3//vhkZyyqjfTz+8pe/mJGxtMmV1lh07drVvPbUU08VeExa5vz58yU+PlWpUiUTeDwXAIBvI4AAgAMEBwdLp06dTDMnizZ30uc9evTI9z263rO80pGsrPIRERHm4t6zjNYgaN8Oq4w+pqWlmf4Zll27dplta18RTxogGjRoYPb1iy++MO+tW7dugcd04sQJ0zSrpMcHAHAmmmABgENoU6PY2FjTIVxrDxYuXGhGuRo1apR5feTIkSYAaL8Ipc2gevfubfpjDBgwQNavXy9HjhyRlStXumsuJk6cKHPmzJHmzZubQDJz5kwzspUO16tatWolv//9700zK+3DoU2sxo0bZ0bI0nJW/40vv/zS9OnQ4XtXr15tRsTau3eve991X/Xz27RpY8qsWrXKBJnvvvuuyMcHAPAPBBAAcAgdVvf69etm4kBt5qQjSumQuFbHbR3y1upzYfWzWLduncyYMUOmT59uQsamTZukbdu27jJTp041F/k6r4fWdPTq1ct8pueoVp9//rkJHX379jWfP3ToUDN3iKe1a9eaoXx1aF+tsdBhd61mWNYoVzrc76+//momK2zfvr18//33Zmjeoh5fUVgjyzMaFgDYy/reLcoMH8wDAgAOmQcED6dD/9IJHQAen8uXL0vDhg0LLUMNCADAb2izMP3xq169umli5gTWyF263wTV/HGOHo5zVDjOT9mfI63TuHPnjrt5bmEIIAAAv6FNxB52581XMYrXw3GOHo5zVDjOT9meI23FVBSMggUAAADANgQQAAAAALYhgAAA8BjpZIqzZ882j8gf5+jhOEeF4/z41jliFCwAKCOMggUAwIOoAQEAAADgmwFk+fLlZvIoq3e8Tja1fft29+s6u+3YsWPlySeflGrVqpnJqlJTU8tivwEAAAD4ewDRoQ0/+OADOXr0qBw5ckReeOEFGTx4sJw+fdq8PmnSJNmyZYskJibK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lZUlR48elaioqP+/kQoVzPPk5OQHymdmZsrt27e9FgAAAAD+qdQDyI0bNyQnJ0dCQ0O91uvzlJSUB8onJCRIzZo13UujRo1Ke5cAAAAA+IjAx70D8fHxpr+IJT09XRo3biz3JVvE9Vh3DQAeifkeExGXiy8zAADKLIDUqVNHKlasKKmpqV7r9XlYWNgD5StVqmQWi9UEa79sK+1dA4DH4s6dO6aGFwAAlEEACQ4Olk6dOklSUpLExMSYdbm5ueb5uHHjHvr+8PBwuXz5slSvXt38aGuTLH1eo0YNcTINVv5yLP52PByL73L68WjNh36P6fcaAAAowyZY2qQqNjZWOnfuLF27dpWFCxdKRkaGGRXrYbTDesOGDc2fAwICzKNeeDjx4iM//nQs/nY8HIvvcvLxUPMBAIANAWTYsGFy/fp1mTVrlul43rFjR9mxY8cDHdMBAAAAlC9l1gldm1sVpckVAAAAgPKjTCYiLC3aOV1nU/fspO5U/nQs/nY8HIvv8rfjAQAAIgEuxocEAAAAYBOfrgEBAAAA4F8IIAAAAABsQwABAAAAYBsCCAAAAADbEEAAAAAA2MZnA8jSpUuladOmUrlyZenWrZscPnxYnGDfvn0yaNAgCQ8PNzO5b9q0yet1HXRMJ2isX7++hISESFRUlJw7d058UUJCgnTp0kWqV68u9erVk5iYGDl79qxXmXv37snYsWPlySeflGrVqsnQoUMlNTVVfM3y5culffv27hm1e/ToIdu3b3fcceTngw8+MP/WJk6c6Mjjeffdd83+ey4tW7Z05LEAAACHBpANGzZIXFycGf//2LFj0qFDB4mOjpZr166Jr8vIyDD7qwEqP3PnzpXFixfLihUr5NChQ1K1alVzbHqR5Wv27t1rLvwOHjwoO3fulOzsbOnXr585RsukSZNky5YtkpiYaMpfuXJFhgwZIr6mYcOG5kL96NGjcuTIEXnhhRdk8ODBcvr0aUcdR14//vijfPTRRyZceXLa8bRp00auXr3qXvbv3+/YYwEAAA/h8kFdu3Z1jR071v08JyfHFR4e7kpISHA5iZ7eb775xv08NzfXFRYW5po3b557XVpamqtSpUquL774wuXrrl27Zo5p79697n0PCgpyJSYmusv89NNPpkxycrLL1z3xxBOuVatWOfY47ty542revLlr586drt69e7smTJhg1jvteGbPnu3q0KFDvq857VgAAMDD+VwNSFZWlrlLrU2TLBUqVDDPk5OTxckuXrwoKSkpXsdWs2ZN08TMCceWnp5uHmvXrm0e9e9Ja0U8j0ebzjRu3NinjycnJ0fWr19vanK0KZZTj0NrpwYMGOC138qJx6PNELXZ4lNPPSUvv/yyXLp0ybHHAgAAChcoPubGjRvmAjE0NNRrvT4/c+aMOJmGD5XfsVmv+arc3FzTx+C5556Ttm3bmnW6z8HBwVKrVi1HHM/JkydN4NDmbtqX4JtvvpHWrVvLiRMnHHUcSgOUNk/UJlh5Oe3vRQP4mjVrpEWLFqb51Z/+9Cd5/vnn5dSpU447FgAA4MAAAt+9264XhJ5t851GL3A1bGhNzpdffimxsbGmT4HTXL58WSZMmGD65eggDU7Xv39/95+1L4sGkiZNmsjGjRvNQA0AAMC/+FwTrDp16kjFihUfGOVGn4eFhYmTWfvvtGMbN26cbN26VXbv3m06c1t0n7XJXFpamiOOR++kN2vWTDp16mRG+NLBAhYtWuS449BmSTogw7PPPiuBgYFm0SClgxvon7V2wEnHk5fWdjz99NNy/vx5x/3dAAAABwYQvUjUC8SkpCSv5j/6XJvPOFlERIS5aPI8ttu3b5vRsHzx2LQfvYYPbaq0a9cus/+e9O8pKCjI63h0mF5tv++Lx5OX/rvKzMx03HH07dvXNCfT2hxr6dy5s+k7Yf3ZSceT1927d+XChQtmqGqn/d0AAACHNsHSIXi1eYxeSHXt2lUWLlxoOgyPGjVKnHDxpHduPTue60WhdtzWjrPaj2LOnDnSvHlzc0E/c+ZM0/lW59jwxWZX69atk82bN5u5QKw299pxXpvG6OPo0aPN35cen86vMX78eHNh2L17d/El8fHxpqmP/h3cuXPHHNeePXvk22+/ddRxKP27sPrhWHQ4Z50nw1rvpOOZMmWKmTtHm13pELs6/LbWgo4YMcJxfzcAAKAIXD7qww8/dDVu3NgVHBxshuU9ePCgywl2795thgjNu8TGxrqH4p05c6YrNDTUDL/bt29f19mzZ12+KL/j0GX16tXuMr/99pvrv/7rv8yQtlWqVHH9+7//u+vq1asuX/Paa6+5mjRpYv491a1b15z37777znHHURDPYXiddjzDhg1z1a9f3/zdNGjQwDw/f/68I48FAAA8XID+pyhBBQAAAAD8rg8IAAAAAP9FAAEAAABgGwIIAAAAANsQQAAAAADYhgACAAAAwDYEEAAAAAC2IYAAAAAAsA0BBAAAAIBtCCAAAAAAbEMAAQAAAGAbAggAAAAAscv/A/xIsRNlq6piAAAAAElFTkSuQmCC" }, "metadata": {}, - "output_type": "display_data" + "output_type": "display_data", + "jetTransient": { + "display_id": null + } } ], - "execution_count": 3 + "execution_count": 11 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-12-10T20:11:21.968813Z", - "start_time": "2025-12-10T20:11:21.964226Z" + "end_time": "2026-03-05T01:49:51.759156Z", + "start_time": "2026-03-05T01:49:51.752868Z" } }, "cell_type": "code", @@ -141,57 +126,57 @@ " MaunaKea seeing_psf ... True\n", " keck telescope_reflection ... True\n", " ZShooter Selector ... True\n", - "zshooter_detectors detector_nir ... True\n", + " ZShooter_v1 dichroic_tree ... True\n", + " ZShooter_v1 slit_nir ... True\n", + " ZShooter_v1 slit_vis ... True\n", + " ZShooter_v1 slit_uvb ... True\n", + " ZShooter_v1 trace_eff ... True\n", + " ... ... ... ...\n", "zshooter_detectors detector_vis ... True\n", "zshooter_detectors detector_uvb ... True\n", "zshooter_detectors exposure_integration ... True\n", "zshooter_detectors dark_current ... True\n", - " ... ... ... ...\n", + "zshooter_detectors shot_noise ... True\n", + "zshooter_detectors detector_linearity ... False\n", + "zshooter_detectors border_reference_pixels ... True\n", "zshooter_detectors readout_noise ... True\n", "zshooter_detectors binning ... False\n", - "zshooter_detectors bias ... True\n", - " ZShooter dichroic_tree ... True\n", - " ZShooter slit_nir ... True\n", - " ZShooter slit_vis ... True\n", - " ZShooter slit_uvb ... True\n", - " ZShooter trace_eff ... True\n", - " ZShooter trace_list ... True\n", - " ZShooter detector_qe ... True" + "zshooter_detectors bias ... True" ], "text/html": [ "
Table length=22\n", - "\n", + "
\n", "\n", "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", "
elementnameclassincluded
str18str33str22bool
MaunaKeamaunakea_atmospheric_transmissionTERCurveTrue
MaunaKeaseeing_psfSeeingPSFTrue
kecktelescope_reflectionSurfaceListTrue
ZShooterSelectorSurfaceListTrue
zshooter_detectorsdetector_nirDetectorListTrue
ZShooter_v1dichroic_treeDichroicTreeTrue
ZShooter_v1slit_nirFoVSpecificApertureTrue
ZShooter_v1slit_visFoVSpecificApertureTrue
ZShooter_v1slit_uvbFoVSpecificApertureTrue
ZShooter_v1trace_effSpectralEfficiencyTrue
............
zshooter_detectorsdetector_visDetectorListTrue
zshooter_detectorsdetector_uvbDetectorListTrue
zshooter_detectorsexposure_integrationExposureIntegrationTrue
zshooter_detectorsdark_currentDarkCurrentTrue
............
zshooter_detectorsshot_noiseShotNoiseTrue
zshooter_detectorsdetector_linearityLinearityCurveFalse
zshooter_detectorsborder_reference_pixelsReferencePixelBorderTrue
zshooter_detectorsreadout_noiseBasicReadoutNoiseTrue
zshooter_detectorsbinningUnequalBinnedImageFalse
zshooter_detectorsbiasBiasTrue
ZShooterdichroic_treeDichroicTreeEffectTrue
ZShooterslit_nirFoVSpecificApertureTrue
ZShooterslit_visFoVSpecificApertureTrue
ZShooterslit_uvbFoVSpecificApertureTrue
ZShootertrace_effSpectralEfficiencyTrue
ZShootertrace_listSpectralTraceListTrue
ZShooterdetector_qeQuantumEfficiencyCurveTrue
" ] }, - "execution_count": 4, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "execution_count": 12 }, { "metadata": { From 941e1c6bb34907067b2d38591bbb697f955f00d7 Mon Sep 17 00:00:00 2001 From: Jeb Bailey Date: Fri, 6 Mar 2026 10:25:43 -0800 Subject: [PATCH 4/6] Update PSF ADC notebook: refine slit clipping logic and switch parameters --- notebooks/psf_adc.ipynb | 120 +++++++++++++++++++++++++++++++--------- 1 file changed, 93 insertions(+), 27 deletions(-) diff --git a/notebooks/psf_adc.ipynb b/notebooks/psf_adc.ipynb index 2b4c4da..61bd9bc 100644 --- a/notebooks/psf_adc.ipynb +++ b/notebooks/psf_adc.ipynb @@ -36,8 +36,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-02-11T22:43:21.307227Z", - "start_time": "2026-02-11T22:43:21.262468Z" + "end_time": "2026-02-26T22:13:33.172784Z", + "start_time": "2026-02-26T22:13:33.155516Z" } }, "cell_type": "code", @@ -133,13 +133,13 @@ ], "id": "dd7a41ed62731e47", "outputs": [], - "execution_count": 1 + "execution_count": 2 }, { "metadata": { "ExecuteTime": { - "end_time": "2026-02-11T23:43:54.138304Z", - "start_time": "2026-02-11T23:43:54.113962Z" + "end_time": "2026-02-26T22:39:35.719776Z", + "start_time": "2026-02-26T22:39:35.692894Z" } }, "cell_type": "code", @@ -360,17 +360,41 @@ " x0, x1 = xs.min(), xs.max() + 1\n", " y0, y1 = ys.min(), ys.max() + 1\n", "\n", + " return cube[x0:x1, y0:y1, :]\n", + "\n", + "\n", + "def apply_roundapp(cube:np.ndarray, spatial_grid:u.Quantity, diam:u.Quantity, miscentration: u.Quantity)-> np.ndarray:\n", + " \"\"\"\n", + " Clip out the portion of the cube that is in a round aperture\n", + "\n", + " Args:\n", + " cube:\n", + " spatial_grid:\n", + " slit_width:\n", + " slit_height:\n", + " slit_miscentration:\n", + "\n", + " Returns:\n", + "\n", + " \"\"\"\n", + " shifted = np.abs(spatial_grid+slit_miscentration[:, None, None])\n", + " in_slit = (shifted[1]**2+shifted[0]**2)<((diam/2)**2)\n", + "\n", + " xs, ys = np.nonzero(in_slit)\n", + " x0, x1 = xs.min(), xs.max() + 1\n", + " y0, y1 = ys.min(), ys.max() + 1\n", + "\n", " return cube[x0:x1, y0:y1, :]\n" ], "id": "6ce4c5638801e392", "outputs": [], - "execution_count": 119 + "execution_count": 27 }, { "metadata": { "ExecuteTime": { - "end_time": "2026-02-11T23:40:39.211317Z", - "start_time": "2026-02-11T23:40:39.200038Z" + "end_time": "2026-02-26T22:13:33.737299Z", + "start_time": "2026-02-26T22:13:33.703138Z" } }, "cell_type": "code", @@ -441,7 +465,7 @@ ], "id": "95c0f3ea6cadf186", "outputs": [], - "execution_count": 106 + "execution_count": 4 }, { "metadata": {}, @@ -452,8 +476,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-02-11T23:40:39.568614Z", - "start_time": "2026-02-11T23:40:39.547460Z" + "end_time": "2026-02-26T22:13:35.154718Z", + "start_time": "2026-02-26T22:13:35.126352Z" } }, "cell_type": "code", @@ -481,7 +505,7 @@ ] } ], - "execution_count": 107 + "execution_count": 5 }, { "metadata": {}, @@ -492,16 +516,16 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-02-11T23:44:54.196562Z", - "start_time": "2026-02-11T23:44:54.185422Z" + "end_time": "2026-02-26T22:16:04.158493Z", + "start_time": "2026-02-26T22:16:04.152478Z" } }, "cell_type": "code", "source": [ - "ao_enabled = True\n", + "ao_enabled = False\n", "\n", "seeing = 650*u.mas\n", - "zenith_angle = 55 * u.deg\n", + "zenith_angle = 0 * u.deg\n", "slit_width = 750 * u.mas if not ao_enabled else 325 * u.mas\n", "slit_height = 10e3 *u.mas\n", "\n", @@ -512,7 +536,7 @@ ], "id": "f42de0c57c151265", "outputs": [], - "execution_count": 124 + "execution_count": 11 }, { "metadata": {}, @@ -523,8 +547,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2026-02-11T23:33:28.395229Z", - "start_time": "2026-02-11T23:33:27.878993Z" + "end_time": "2026-02-26T22:16:09.192969Z", + "start_time": "2026-02-26T22:16:08.681742Z" } }, "cell_type": "code", @@ -537,10 +561,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 90, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, @@ -549,7 +573,7 @@ "text/plain": [ "
" ], - "image/png": "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" + "image/png": "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" }, "metadata": {}, "output_type": "display_data", @@ -558,7 +582,7 @@ } } ], - "execution_count": 90 + "execution_count": 12 }, { "metadata": {}, @@ -875,11 +899,53 @@ }, { "metadata": {}, + "cell_type": "markdown", + "source": "## Whats the ratio of a round slit to a narrow slit?", + "id": "3e3caeac8df9a7fc" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-26T22:40:12.989198Z", + "start_time": "2026-02-26T22:40:12.934781Z" + } + }, "cell_type": "code", - "outputs": [], - "execution_count": null, - "source": "", - "id": "5c210c7d51c52c54" + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "" + ], + "text/latex": "$1.9658834 \\; \\mathrm{}$" + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 29, + "source": [ + "b = apply_slit(psf, sky_points, slit_width/2, 1250*u.mas, slit_miscentration*0).sum(0).sum(0)*sky_step_area\n", + "c = apply_roundapp(psf, sky_points, 1200*u.mas, slit_miscentration[0]*0).sum(0).sum(0)*sky_step_area\n", + "plt.plot(wavelengths, c/b)\n", + "plt.title(f'Mean ration in optical: {(c/b)[wavelengths<1000*u.nm].mean():.2f}')\n", + "plt.show()" + ], + "id": "8905d7a6ca65cb4b" } ], "metadata": { From 567a75e36f8e7f98708cf95213b28770573afc69 Mon Sep 17 00:00:00 2001 From: Jeb Bailey Date: Fri, 6 Mar 2026 10:25:53 -0800 Subject: [PATCH 5/6] Refactor ZShooter notebook: enhance modularity in IRDB path configuration, switch to ZShooter_v2, and improve clarity with added markdown explanations. --- notebooks/playground_zshooter.ipynb | 2884 +++++++-------------------- 1 file changed, 676 insertions(+), 2208 deletions(-) diff --git a/notebooks/playground_zshooter.ipynb b/notebooks/playground_zshooter.ipynb index a7f4dda..7f11504 100644 --- a/notebooks/playground_zshooter.ipynb +++ b/notebooks/playground_zshooter.ipynb @@ -6,8 +6,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2026-03-05T01:47:44.185275Z", - "start_time": "2026-03-05T01:47:44.181350Z" + "end_time": "2026-03-06T18:16:43.348633Z", + "start_time": "2026-03-06T18:16:41.682971Z" } }, "source": [ @@ -21,2177 +21,697 @@ "from astropy.wcs import WCS\n", "import scopesim as sim\n", "import scopesim_templates as sim_tp\n", - "\n", - "## Configure irdb path\n", - "sim.rc.__config__[\"!SIM.file.local_packages_path\"] = \"/Users/yashvi/Desktop/ZShooter/irdb/\"\n", - "sim.rc.__config__[\"!SIM.file.search_path\"].append(\"/Users/yashvi/Desktop/ZShooter/irdb/\")" - ], - "outputs": [], - "execution_count": 7 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-05T01:47:46.058130Z", - "start_time": "2026-03-05T01:47:46.054619Z" - } - }, - "cell_type": "code", - "source": [ - "def plot_source(source):\n", - " wave = np.linspace(0.3, 2.5, 1001) * u.um\n", - " plt.figure(figsize=(10,4))\n", - " plt.subplot(1,2,1)\n", - " plt.imshow(source.fields[0].data, origin=\"lower\")\n", - " plt.subplot(2,2,2)\n", - " plt.plot(wave, source.spectra[0](wave))\n", - "\n", - "# gal = sim_tp.extragalactic.galaxies.spiral_two_component(extent=200*u.arcsec, fluxes=(15, 15)*u.mag)\n", - "# gal.shift(dy=-30*0.004)" - ], - "id": "2a7ab71a301cbffe", - "outputs": [], - "execution_count": 8 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-05T01:49:44.229415Z", - "start_time": "2026-03-05T01:49:43.373949Z" - } - }, - "cell_type": "code", - "source": [ - "## Set up ZShooter\n", - "\n", - "cmd = sim.UserCommands(use_instrument=\"ZShooter_v1\", set_modes=[\"SPEC\"])\n", - "zs = sim.OpticalTrain(cmd)\n", - "\n", - "waves = np.geomspace(100,350000,50000)\n", - "sp = sim.source.source_templates.ConstFlux1D(amplitude=1e-3)\n", - "flatsp = sim.source.source_templates.SourceSpectrum(sim.source.source_templates.Empirical1D, points=waves, lookup_table=sp(waves))\n", - "# flatsp = sim.source.source_templates.ab_spectrum(10)\n", - "flat = sim.source.source_templates.uniform_source(flatsp, extent=60)\n", - "plot_source(flat)" - ], - "id": "4d31f7ad0fb06026", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:166: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", - " fov = thetrace.fov_grid()\n", - "\u001B[0m\n", - "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:208: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", - " vol = spt.fov_grid()\n", - "\u001B[0m\n" - ] - }, - { - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAFfCAYAAAC2m6hVAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAANJpJREFUeJzt3Qtwjfe+//FvSELcq0jENT3U/dK6q25RqWwbI4fdg9OpVLWmPRiEqhiX7m496WbbLnWro0U7VaQXho1W4zYqqNsMdtkYU1oSbBLkVBLJ+s/3d+ZZ/7UiiSSSx3pW3q+Zp8t61m+t50LXej7P7xbgcrlcAgAAAAA2qGDHRgAAAABAEUAAAAAA2IYAAgAAAMA2BBAAAAAAtiGAAAAAALANAQQAAACAbQggAAAAAGwTKD4mNzdXrly5ItWrV5eAgIDHvTsAUGI6zdKdO3ckPDxcKlTgfo8d+A0BAN//zfO5AKI/HI0aNXrcuwEApeby5cvSsGHDx70b5QK/IQDg+795PhdA9K6V6iV/kEAJety7AwAldl+yZb9sc3+voexZ51p/AGvUqPG4dwcAyo3bt2+bG0BF+c3zuQBiVZlr+AgMIIAAcDDX/z3QFMg+1rnW8EEAAQD7FeU3j0bJAOAgS5culaZNm0rlypWlW7ducvjw4ULLJyYmSsuWLU35du3aybZt2x5osztr1iypX7++hISESFRUlJw7d86rzPvvvy89e/aUKlWqSK1atfLdzqVLl2TAgAGmTL169eTtt9+W+/fvu1/fs2eP+VHKu6SkpDzS8QEAnIcAAgAOsWHDBomLi5PZs2fLsWPHpEOHDhIdHS3Xrl3Lt/yBAwdkxIgRMnr0aDl+/LjExMSY5dSpU+4yc+fOlcWLF8uKFSvk0KFDUrVqVfOZ9+7dc5fJysqSl156Sd566618t5OTk2PCh5bTba5du1bWrFljgk1eZ8+elatXr7oXDSslPT4AgDMFuPT2l4+1H6tZs6ZEymCaYAFwtPuubNkjmyU9Pb1UmgNpjUCXLl1kyZIl7hGftL3t+PHjZdq0aQ+UHzZsmGRkZMjWrVvd67p37y4dO3Y0gUO//nW0ksmTJ8uUKVPM67qvoaGhJkAMHz7c6/N03cSJEyUtLc1r/fbt22XgwIGmA7i+V+nnv/POO3L9+nUJDg42NSB9+vSRW7duFViLUtzjK+w3pLTOOQBASv37lxoQAHAArV04evSoaSJl0WEO9XlycnK+79H1nuWV1ihY5S9evGiaQHmW0R8PDQIFfWZB29HmXVb4sLajP0anT5/2KqvhR5t7vfjii/LDDz880vGpzMxMsx3PBQDg2wggAOAAN27cME2dPC/ylT7P24/CousLK289Fuczi7Mdz21o6NBaka+++sosWrMRGRlpmlqV9PhUQkKCCU3WwhC8AOD7fG4ULACA/2nRooVZLNqp/cKFC7JgwQL57LPPSvy58fHxpt9I3mEgAQC+ixoQAHCAOnXqSMWKFSU1NdVrvT4PCwvL9z26vrDy1mNxPrM42/HcRn66du0q58+fL/HxqUqVKrmH3GXoXQBwBgIIADiAduTu1KmTJCUluddpJ2193qNHj3zfo+s9y6udO3e6y0dERJiLe88yWoOgo2EV9JkFbefkyZNeo1XpdjQMtG7dusD3nThxwjTNKunxAQCciSZYAOAQ2tQoNjZWOnfubGoPFi5caEa5GjVqlHl95MiR0qBBA9MvQk2YMEF69+4t8+fPN8Pkrl+/Xo4cOSIrV640r+s8HDqq1Zw5c6R58+YmkMycOdOMjKXD9XrO8XHz5k3zqP00NDioZs2aSbVq1aRfv34maLzyyitmWF/tszFjxgwZO3asqaFQuq/6+W3atDFD/K5atUp27dol3333XZGPDwDgHwggAOAQOqyuDmur82voRb6OKLVjxw53x20NCDpylGc/i3Xr1pkwMH36dBMyNm3aJG3btnWXmTp1qrnIHzNmjBlet1evXuYzdSJAi25P5/awPPPMM+Zx9+7dpiO5Np3SoX51nhCtrdC5RDRIvPfee16jXOlwv7/++quZrLB9+/by/fffm6F5i3p8AAD/wDwgAOCQeUDwcMwDAgCPB/OAAAAAAPBJBBAAAAAAtiGAAAAAALANAQQAAACAbQggAAAAAGxDAAEAAABgGwIIAAAAANsQQAAAAADYhgACAAAAwDYEEAAAAAC2IYAAAAAAsA0BBAAAAIBtCCAAAAAAbEMAAQAAAGAbAggAAAAA2xBAAAAAANiGAAIAAADANgQQAAAAALYhgAAAAACwDQEEAAAAgG0IIAAAAABsQwABAAdZunSpNG3aVCpXrizdunWTw4cPF1o+MTFRWrZsacq3a9dOtm3b5vW6y+WSWbNmSf369SUkJESioqLk3LlzXmXef/996dmzp1SpUkVq1aqV73YuXbokAwYMMGXq1asnb7/9tty/f9/9+tdffy0vvvii1K1bV2rUqCE9evSQb7/91usz3n33XQkICPBadN8BAP6FAAIADrFhwwaJi4uT2bNny7Fjx6RDhw4SHR0t165dy7f8gQMHZMSIETJ69Gg5fvy4xMTEmOXUqVPuMnPnzpXFixfLihUr5NChQ1K1alXzmffu3XOXycrKkpdeekneeuutfLeTk5NjwoeW022uXbtW1qxZY4KNZd++fSaAaAA6evSo9OnTRwYNGmT2y1ObNm3k6tWr7mX//v2lcOYAAL4kwKW3v3zI7du3pWbNmhIpgyUwIOhx7w4AlNh9V7bskc2Snp5u7vo/Kq3x6NKliyxZssQ8z83NlUaNGsn48eNl2rRpD5QfNmyYZGRkyNatW93runfvLh07djSBQ7/+w8PDZfLkyTJlyhTzuu5raGioCRDDhw/3+jxdN3HiRElLS/Nav337dhk4cKBcuXLFvFfp57/zzjty/fp1CQ4Ozvd4NGzoPlpBRWtANm3aJCdOnCjyOcnMzDSL52+InpPSOucAgOJdwxfl+5caEABwAK1d0JoDbSJlqVChgnmenJyc73t0vWd5pbUbVvmLFy9KSkqKVxn98dCgU9BnFrQdbd5lhQ9rO/pjdPr06Xzfo+Hpzp07Urt2ba/12vxLQ9FTTz0lL7/8smnaVZiEhASzz9ai4QMA4NsIIADgADdu3DBNnTwv8pU+1xCRH11fWHnrsTifWZzteG4jr7/+9a9y9+5d+Y//+A/3Og0+WsuyY8cOWb58uQlIzz//vAkqBYmPjzd326zl8uXLRd5vAMDjEfiYtgsAKKfWrVsnf/rTn2Tz5s2mw7qlf//+7j+3b9/eBJImTZrIxo0bTT+W/FSqVMksAADnoAYEABygTp06UrFiRUlNTfVar8/DwsLyfY+uL6y89ViczyzOdjy3YVm/fr28/vrrJlTkbR6Wl4649fTTT8v58+eLvC8AAN9HAAEAB9CO3J06dZKkpCSvfhT6XIe0zY+u9yyvdu7c6S4fERFhAoJnGe23oaNhFfSZBW3n5MmTXqNx6Xa0E2Lr1q3d67744gsZNWqUedRRsx5Gm2hduHDBDBEMAPAfNMECAIfQIXhjY2Olc+fO0rVrV1m4cKEZ5Uov6tXIkSOlQYMGpmO2mjBhgvTu3Vvmz59vLvi19uHIkSOycuVK87rOs6GjWs2ZM0eaN29uAsnMmTNNJ3AdrteiHcFv3rxpHrUfijVKVbNmzaRatWrSr18/EzReeeUVM6yv9vuYMWOGjB071t08Sptd6b4vWrTINK2y+obo3CPaeVzpSFw6NK82u9IRtXS4Ya310aGEAQD+gwACAA6hQ9bqsLY6bK1ewOtwutph2+rwrQFBR8ay6OSBeuGvYWD69OkmZOgwt23btnWXmTp1qgkxY8aMMcPr9urVy3ymTlxo0e3p3B6WZ555xjzu3r1bIiMjTUjQoX51nhCtDdG5RDRsvPfee+73aOjRiQk1lOhi0XLa8Vz98ssvJmz861//MhMW6r4cPHjQ/BkAUE7nAdEx2rXjoKcWLVrImTNnzJ914iodT17vsum47DoM47Jlyx4YHaUwzAMCwF+U9jwgKN1x6AEADpkHpLBZaidNmiRbtmyRxMRE2bt3r6lCHzJkSMmOAgAAAIDfKXYTrMDAwHxHR9G08/HHH5vq/hdeeMGsW716tbRq1cpUoevsuwAAAADKt2LXgBQ0S63O0Judne01rGLLli2lcePGhc6oq021tMrGcwEAAADgn4oVQAqbpVY7ROowkTpue3Fm1NXRWrS9mLU0atSo5EcDAAAAwH+aYBU2S60OpVgS8fHxZmhJi9aAEEIAAAAA//RIExF6zlKr/UKysrLMMI7FmVFXx4jXnvKeCwAAAAD/9EgBxHOWWp2hNygoyGtG3bNnz5o+IsWZURcAAACA/ypWE6zCZqnV/hujR482zalq165tajLGjx9vwgcjYAEAAAAodgB52Cy1CxYsMLPwDh061GsiQgAAAAAo9kzodmAmdAD+gpnQ7cdM6ADghzOhAwAAAEBJEUAAAAAA2IYAAgAAAMA2BBAAAAAAtiGAAAAAALANAQQAAACAbQggAAAAAGxDAAEAAABgGwIIAAAAANsQQAAAAADYhgACAAAAwDYEEABwkKVLl0rTpk2lcuXK0q1bNzl8+HCh5RMTE6Vly5amfLt27WTbtm1er7tcLpk1a5bUr19fQkJCJCoqSs6dO+dV5v3335eePXtKlSpVpFatWvlu59KlSzJgwABTpl69evL222/L/fv3vcrs2bNHnn32WalUqZI0a9ZM1qxZ88jHBwBwnsDHvQMAgKLZsGGDxMXFyYoVK8zF+cKFCyU6OlrOnj1rLvrzOnDggIwYMUISEhJk4MCBsm7dOomJiZFjx45J27ZtTZm5c+fK4sWLZe3atRIRESEzZ840n/mPf/zDhACVlZUlL730kvTo0UM+/vjjB7aTk5NjwkdYWJjZ5tWrV2XkyJESFBQk//3f/23KXLx40ZR588035fPPP5ekpCR5/fXXTfDR7ZXk+EqbhrHfsnPKfDsA4MtCgipKQEBAmW4jwKXfuD7k9u3bUrNmTYmUwRIYEPS4dwcASuy+K1v2yGZJT0+XGjVqPPLn6UV5ly5dZMmSJeZ5bm6uNGrUSMaPHy/Tpk17oPywYcMkIyNDtm7d6l7XvXt36dixo7nI16//8PBwmTx5skyZMsW8rvsaGhpqaieGDx/u9Xm6buLEiZKWlua1fvv27SbgXLlyxbxX6ee/8847cv36dQkODjZ//vvf/y6nTp1yv08/Xz9rx44dJTo+lZmZaRbP3xB9T0nO+f9m3ZfWs74t1nsAwN/8471oqRIcWOJr+KJ8/9IECwAcQGshjh49appIWSpUqGCeJycn5/seXe9ZXmmNglVeayVSUlK8yuiPhwaBgj6zoO1o8y4rfFjb0R+j06dPF2lfSnJ8Smt3dJ+tRcMHAMC30QQLABzgxo0bpqmT50W+0udnzpzJ9z0aLvIrr+ut1611BZUpioK247mNgspoSPntt9/k1q1bxT4+FR8fb5pt5a0BKWmzA73zBwDlWUhQxTLfBgEEAOBY2qFdl9KgbZ5L0uwAAFA8NMECAAeoU6eOVKxYUVJTU73W63Pt/J0fXV9YeeuxOJ9ZnO14bqOgMtpOWEffKsnxAQCciQACAA6gHbk7depkRo+yaCdtfa6jU+VH13uWVzt37nSX11Gv9OLes4w2YTp06FCBn1nQdk6ePCnXrl3z2o6Gi9atWxdpX0pyfAAAZ6KuGQAcQvs6xMbGSufOnaVr165mmFod5WrUqFHmdR36tkGDBqZjtpowYYL07t1b5s+fb4bAXb9+vRw5ckRWrlzpbnKko1rNmTNHmjdv7h6GV0fG0uF6Pef4uHnzpnnUfhonTpww63Uuj2rVqkm/fv1M0HjllVfMsL7a32PGjBkyduxYd/MoHX5XR7eaOnWqvPbaa7Jr1y7ZuHGjGRmrqMcHAPAPBBAAcAgdVleHtdWJA/UiX4fT1SFsrY7bGhB05CiLTh6oc39oGJg+fboJGZs2bXLPAaI0EOhF/pgxY8yQuL169TKfac0BonR7Ok+I5ZlnnjGPu3fvlsjISNN0Sof6feutt0xtRdWqVU2QeO+999zv0XCjYWPSpEmyaNEiadiwoaxatco9B0hRjg8A4B+YBwQAHDIPCEp3HHoAQOlhHhAAAAAAPokAAgAAAMA2BBAAAAAAtiGAAAAAALANAQQAAACAbQggAAAAAGxDAAEAAABgGwIIAAAAANsQQAAAAADYhgACAAAAwDYEEAAAAAC2IYAAAAAAsA0BBAAAAIBtCCAAAAAAbEMAAQAAAGAbAggAAAAA2xBAAAAAANiGAAIAAADANgQQAAAAAM4IIB988IEEBATIxIkT3evu3bsnY8eOlSeffFKqVasmQ4cOldTU1NLYVwAAAADlNYD8+OOP8tFHH0n79u291k+aNEm2bNkiiYmJsnfvXrly5YoMGTKkNPYVAMq9pUuXStOmTaVy5crSrVs3OXz4cKHl9bu4ZcuWpny7du1k27ZtXq+7XC6ZNWuW1K9fX0JCQiQqKkrOnTvnVebmzZvy8ssvS40aNaRWrVoyevRouXv3rleZjRs3SseOHaVKlSrSpEkTmTdvntfrr776qrlhlXdp06aNu8y77777wOu67wAA/1KiAKI/PPpj9D//8z/yxBNPuNenp6fLxx9/LH/729/khRdekE6dOsnq1avlwIEDcvDgwXw/KzMzU27fvu21AAAetGHDBomLi5PZs2fLsWPHpEOHDhIdHS3Xrl3Lt7x+944YMcIEhuPHj0tMTIxZTp065S4zd+5cWbx4saxYsUIOHTokVatWNZ+ptdkW/b4/ffq07Ny5U7Zu3Sr79u2TMWPGuF/fvn27KfPmm2+az162bJksWLBAlixZ4i6zaNEiuXr1qnu5fPmy1K5dW1566SWvfdZA4llu//79pXwWAQCODCDaxGrAgAHmTpmno0ePSnZ2ttd6vXvVuHFjSU5OzvezEhISpGbNmu6lUaNGJdklAPB7enPnjTfekFGjRknr1q1NaNAah08++STf8nrR//vf/17efvttadWqlfz5z3+WZ5991h0MtPZj4cKFMmPGDBk8eLCp0f70009NzfWmTZtMmZ9++kl27Nghq1atMjUuvXr1kg8//FDWr19vyqnPPvvMBBsNIE899ZT5fYiPj5e//OUvZhtKv9/DwsLcy5EjR+TWrVvmWDwFBgZ6latTp04Zn1UAgM8HEP3R0TtvGhzySklJkeDgYFNF7yk0NNS8lh/9kdKaE2vRu2IAAG9ZWVnmJo/nDZ4KFSqY5wXd4NH1eW8Uae2GVf7ixYvmu9mzjAYFDRpWGX3U7/TOnTu7y2h53bbWmFg12drEy5M25/rll1/k559/znfftLZcP0eba3nS5l/h4eEmyGityqVLlwo9L9SiA4CfBxANBxMmTJDPP//8gR+bkqpUqZJpV+y5AAC83bhxQ3JycswNnaLe4NH1hZW3Hh9Wpl69eg/UUmjzKauMhpqvv/5akpKSJDc3V/75z3/K/PnzzWvajCovrTnRZluvv/6613oNPmvWrDE1LsuXLzcB6fnnn5c7d+4UeF6oRQcAPw8gevdN2xprFb7+AOmiHc21/bD+WX+09C5dWlqa1/t0FCytSgcA+B9tFjZu3DgZOHCgqQXv3r27DB8+3LymNSV5rV271tSqaLMtT/379zd9QrQpmIYa7TCvvyfawb0g1KIDgJ8HkL59+8rJkyflxIkT7kWr5bWa3PpzUFCQuQtmOXv2rKlC79GjR1nsPwCUC9oXomLFig8Ma17YDR5dX1h56/FhZfJ2cr9//74ZGcsqo6NVaX8PHaBEm1xpzUjXrl3Na9qUypP2CdE+K6+88ooJK4XRkPL000/L+fPnCyxDLToA+HkAqV69urRt29Zr0RFTdM4P/bNWf+toKzpKy+7du02NiXYw1PChd8QAACWjF+s6sqDnDR5t7qTPC7rBo+s9yysdycoqHxERYUKEZxntQ6F9O6wy+qi1EPp9btm1a5fZtjaZ8qQBqUGDBmZfv/jiC/PeunXrepXRWnMNFPpb8TAaaC5cuGCGCAYA+I/A0v5AHXpRq9x1AkLtHKjV6DokIwDg0ejNndjYWFPbrDUMOoJVRkaGeySpkSNHmgBgDRKiffZ69+5t+mPoyFQ6iIiOPrVy5UrzujWR7Jw5c6R58+YmkMycOdN0AreaR+noWTqSljaz0lG3dKRDbW6lTay0nNU/5csvv5TIyEgzfK8Ov27NBZVf53MNLnrTKq8pU6bIoEGDTMd07Seiww1rqNGhhAEA/uORA8iePXu8nmvndJ0oSxcAQOkZNmyYXL9+3UwcqM2cdOI/7bBtdSLX5q6efS569uwp69atM8PsTp8+3YQMHV7X8+J/6tSpJsTovB5a06HD7Opneg40ogOPaOjQZrjWDSbt+5e3X4cGCG1ipTUf+ttgNcOyaB+Nr776ygwPnB8dNUvDxr/+9S9Tc6L7onNI5a1FAQA4W4DLGqTdR2j1vzblipTBEhgQ9Lh3BwBK7L4rW/bIZnPhTd8Ee39DOOcA4LvfvyWaiBAAAAAASoIAAgAAAMA2BBAAAAAAtiGAAAAAALANAQQAAACAbQggAAAAAGxDAAEAAABgGwIIAAAAANsQQAAAAADYhgACAAAAwDYEEAAAAAC2IYAAAAAAsA0BBAAAAIBtCCAAAAAAbEMAAQAAAGAbAggAAAAA2xBAAAAAANiGAAIAAADANgQQAAAAALYhgAAAAACwDQEEAAAAgG0IIADgIEuXLpWmTZtK5cqVpVu3bnL48OFCyycmJkrLli1N+Xbt2sm2bdu8Xne5XDJr1iypX7++hISESFRUlJw7d86rzM2bN+Xll1+WGjVqSK1atWT06NFy9+5drzIbN26Ujh07SpUqVaRJkyYyb948r9f37NkjAQEBDywpKSmPdHwAAOchgACAQ2zYsEHi4uJk9uzZcuzYMenQoYNER0fLtWvX8i1/4MABGTFihAkMx48fl5iYGLOcOnXKXWbu3LmyePFiWbFihRw6dEiqVq1qPvPevXvuMho+Tp8+LTt37pStW7fKvn37ZMyYMe7Xt2/fbsq8+eab5rOXLVsmCxYskCVLljywT2fPnpWrV6+6l3r16pX4+AAAzhTg0ttfPuT27dtSs2ZNiZTBEhgQ9Lh3BwBK7L4rW/bIZklPTze1B49KawS6dOnivrDPzc2VRo0ayfjx42XatGkPlB82bJhkZGSY0GDp3r27qanQwKFf/+Hh4TJ58mSZMmWKeV33NTQ0VNasWSPDhw+Xn376SVq3bi0//vijdO7c2ZTZsWOH/OEPf5BffvnFvP8///M/JTs729S2WD788EMTbi5dumRqOrQGpE+fPnLr1i1Ti1Iax1fYb0hpnXMAgJT69y81IADgAFlZWXL06FHTRMpSoUIF8zw5OTnf9+h6z/JKaxSs8hcvXjRNoDzL6I+HBgGrjD5qYLDCh9Lyum2tMVGZmZmmyZQnbc6lAeXnn3/2Wq/hR5t7vfjii/LDDz880vFZ29YfPc8FAODbCCAA4AA3btyQnJwcUzvhSZ/n7Udh0fWFlbceH1bGs5mUCgwMlNq1a7vLaKj5+uuvJSkpydRa/POf/5T58+eb17SZldLQobUuX331lVm0ZiMyMtI0tSrp8amEhAQTmqxFPxcA4NsCH/cOAACc7Y033pALFy7IwIEDTVMsrXqfMGGCvPvuu6YWQ7Vo0cIslp49e5r3aF+Rzz77rMTbjo+PN/1GLFoDQggBAN9GDQgAOECdOnWkYsWKkpqa6rVen4eFheX7Hl1fWHnr8WFl8nYCv3//vhkZyyqjfTz+8pe/mJGxtMmV1lh07drVvPbUU08VeExa5vz58yU+PlWpUiUTeDwXAIBvI4AAgAMEBwdLp06dTDMnizZ30uc9evTI9z263rO80pGsrPIRERHm4t6zjNYgaN8Oq4w+pqWlmf4Zll27dplta18RTxogGjRoYPb1iy++MO+tW7dugcd04sQJ0zSrpMcHAHAmmmABgENoU6PY2FjTIVxrDxYuXGhGuRo1apR5feTIkSYAaL8Ipc2gevfubfpjDBgwQNavXy9HjhyRlStXumsuJk6cKHPmzJHmzZubQDJz5kwzspUO16tatWolv//9700zK+3DoU2sxo0bZ0bI0nJW/40vv/zS9OnQ4XtXr15tRsTau3eve991X/Xz27RpY8qsWrXKBJnvvvuuyMcHAPAPBBAAcAgdVvf69etm4kBt5qQjSumQuFbHbR3y1upzYfWzWLduncyYMUOmT59uQsamTZukbdu27jJTp041F/k6r4fWdPTq1ct8pueoVp9//rkJHX379jWfP3ToUDN3iKe1a9eaoXx1aF+tsdBhd61mWNYoVzrc76+//momK2zfvr18//33Zmjeoh5fUVgjyzMaFgDYy/reLcoMH8wDAgAOmQcED6dD/9IJHQAen8uXL0vDhg0LLUMNCADAb2izMP3xq169umli5gTWyF263wTV/HGOHo5zVDjOT9mfI63TuHPnjrt5bmEIIAAAv6FNxB52581XMYrXw3GOHo5zVDjOT9meI23FVBSMggUAAADANgQQAAAAALYhgAAA8BjpZIqzZ882j8gf5+jhOEeF4/z41jliFCwAKCOMggUAwIOoAQEAAADgmwFk+fLlZvIoq3e8Tja1fft29+s6u+3YsWPlySeflGrVqpnJqlJTU8tivwEAAAD4ewDRoQ0/+OADOXr0qBw5ckReeOEFGTx4sJw+fdq8PmnSJNmyZYskJibK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lZUlR48elaioqP+/kQoVzPPk5OQHymdmZsrt27e9FgAAAAD+qdQDyI0bNyQnJ0dCQ0O91uvzlJSUB8onJCRIzZo13UujRo1Ke5cAAAAA+IjAx70D8fHxpr+IJT09XRo3biz3JVvE9Vh3DQAeifkeExGXiy8zAADKLIDUqVNHKlasKKmpqV7r9XlYWNgD5StVqmQWi9UEa79sK+1dA4DH4s6dO6aGFwAAlEEACQ4Olk6dOklSUpLExMSYdbm5ueb5uHHjHvr+8PBwuXz5slSvXt38aGuTLH1eo0YNcTINVv5yLP52PByL73L68WjNh36P6fcaAAAowyZY2qQqNjZWOnfuLF27dpWFCxdKRkaGGRXrYbTDesOGDc2fAwICzKNeeDjx4iM//nQs/nY8HIvvcvLxUPMBAIANAWTYsGFy/fp1mTVrlul43rFjR9mxY8cDHdMBAAAAlC9l1gldm1sVpckVAAAAgPKjTCYiLC3aOV1nU/fspO5U/nQs/nY8HIvv8rfjAQAAIgEuxocEAAAAYBOfrgEBAAAA4F8IIAAAAABsQwABAAAAYBsCCAAAAADbEEAAAAAA2MZnA8jSpUuladOmUrlyZenWrZscPnxYnGDfvn0yaNAgCQ8PNzO5b9q0yet1HXRMJ2isX7++hISESFRUlJw7d058UUJCgnTp0kWqV68u9erVk5iYGDl79qxXmXv37snYsWPlySeflGrVqsnQoUMlNTVVfM3y5culffv27hm1e/ToIdu3b3fcceTngw8+MP/WJk6c6Mjjeffdd83+ey4tW7Z05LEAAACHBpANGzZIXFycGf//2LFj0qFDB4mOjpZr166Jr8vIyDD7qwEqP3PnzpXFixfLihUr5NChQ1K1alVzbHqR5Wv27t1rLvwOHjwoO3fulOzsbOnXr585RsukSZNky5YtkpiYaMpfuXJFhgwZIr6mYcOG5kL96NGjcuTIEXnhhRdk8ODBcvr0aUcdR14//vijfPTRRyZceXLa8bRp00auXr3qXvbv3+/YYwEAAA/h8kFdu3Z1jR071v08JyfHFR4e7kpISHA5iZ7eb775xv08NzfXFRYW5po3b557XVpamqtSpUquL774wuXrrl27Zo5p79697n0PCgpyJSYmusv89NNPpkxycrLL1z3xxBOuVatWOfY47ty542revLlr586drt69e7smTJhg1jvteGbPnu3q0KFDvq857VgAAMDD+VwNSFZWlrlLrU2TLBUqVDDPk5OTxckuXrwoKSkpXsdWs2ZN08TMCceWnp5uHmvXrm0e9e9Ja0U8j0ebzjRu3NinjycnJ0fWr19vanK0KZZTj0NrpwYMGOC138qJx6PNELXZ4lNPPSUvv/yyXLp0ybHHAgAAChcoPubGjRvmAjE0NNRrvT4/c+aMOJmGD5XfsVmv+arc3FzTx+C5556Ttm3bmnW6z8HBwVKrVi1HHM/JkydN4NDmbtqX4JtvvpHWrVvLiRMnHHUcSgOUNk/UJlh5Oe3vRQP4mjVrpEWLFqb51Z/+9Cd5/vnn5dSpU447FgAA4MAAAt+9264XhJ5t851GL3A1bGhNzpdffimxsbGmT4HTXL58WSZMmGD65eggDU7Xv39/95+1L4sGkiZNmsjGjRvNQA0AAMC/+FwTrDp16kjFihUfGOVGn4eFhYmTWfvvtGMbN26cbN26VXbv3m06c1t0n7XJXFpamiOOR++kN2vWTDp16mRG+NLBAhYtWuS449BmSTogw7PPPiuBgYFm0SClgxvon7V2wEnHk5fWdjz99NNy/vx5x/3dAAAABwYQvUjUC8SkpCSv5j/6XJvPOFlERIS5aPI8ttu3b5vRsHzx2LQfvYYPbaq0a9cus/+e9O8pKCjI63h0mF5tv++Lx5OX/rvKzMx03HH07dvXNCfT2hxr6dy5s+k7Yf3ZSceT1927d+XChQtmqGqn/d0AAACHNsHSIXi1eYxeSHXt2lUWLlxoOgyPGjVKnHDxpHduPTue60WhdtzWjrPaj2LOnDnSvHlzc0E/c+ZM0/lW59jwxWZX69atk82bN5u5QKw299pxXpvG6OPo0aPN35cen86vMX78eHNh2L17d/El8fHxpqmP/h3cuXPHHNeePXvk22+/ddRxKP27sPrhWHQ4Z50nw1rvpOOZMmWKmTtHm13pELs6/LbWgo4YMcJxfzcAAKAIXD7qww8/dDVu3NgVHBxshuU9ePCgywl2795thgjNu8TGxrqH4p05c6YrNDTUDL/bt29f19mzZ12+KL/j0GX16tXuMr/99pvrv/7rv8yQtlWqVHH9+7//u+vq1asuX/Paa6+5mjRpYv491a1b15z37777znHHURDPYXiddjzDhg1z1a9f3/zdNGjQwDw/f/68I48FAAA8XID+pyhBBQAAAAD8rg8IAAAAAP9FAAEAAABgGwIIAAAAANsQQAAAAADYhgACAAAAwDYEEAAAAAC2IYAAAAAAsA0BBAAAAIBtCCAAAAAAbEMAAQAAAGAbAggAAAAAscv/A/xIsRNlq6piAAAAAElFTkSuQmCC" - }, - "metadata": {}, - "output_type": "display_data", - "jetTransient": { - "display_id": null - } - } - ], - "execution_count": 11 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-05T01:49:51.759156Z", - "start_time": "2026-03-05T01:49:51.752868Z" - } - }, - "cell_type": "code", - "source": "zs.effects", - "id": "63e1aa9017dce2a2", - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - " element name ... included\n", - " str18 str33 ... bool \n", - "------------------ --------------------------------- ... --------\n", - " MaunaKea maunakea_atmospheric_transmission ... True\n", - " MaunaKea seeing_psf ... True\n", - " keck telescope_reflection ... True\n", - " ZShooter Selector ... True\n", - " ZShooter_v1 dichroic_tree ... True\n", - " ZShooter_v1 slit_nir ... True\n", - " ZShooter_v1 slit_vis ... True\n", - " ZShooter_v1 slit_uvb ... True\n", - " ZShooter_v1 trace_eff ... True\n", - " ... ... ... ...\n", - "zshooter_detectors detector_vis ... True\n", - "zshooter_detectors detector_uvb ... True\n", - "zshooter_detectors exposure_integration ... True\n", - "zshooter_detectors dark_current ... True\n", - "zshooter_detectors shot_noise ... True\n", - "zshooter_detectors detector_linearity ... False\n", - "zshooter_detectors border_reference_pixels ... True\n", - "zshooter_detectors readout_noise ... True\n", - "zshooter_detectors binning ... False\n", - "zshooter_detectors bias ... True" - ], - "text/html": [ - "
Table length=22\n", - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
elementnameclassincluded
str18str33str22bool
MaunaKeamaunakea_atmospheric_transmissionTERCurveTrue
MaunaKeaseeing_psfSeeingPSFTrue
kecktelescope_reflectionSurfaceListTrue
ZShooterSelectorSurfaceListTrue
ZShooter_v1dichroic_treeDichroicTreeTrue
ZShooter_v1slit_nirFoVSpecificApertureTrue
ZShooter_v1slit_visFoVSpecificApertureTrue
ZShooter_v1slit_uvbFoVSpecificApertureTrue
ZShooter_v1trace_effSpectralEfficiencyTrue
............
zshooter_detectorsdetector_visDetectorListTrue
zshooter_detectorsdetector_uvbDetectorListTrue
zshooter_detectorsexposure_integrationExposureIntegrationTrue
zshooter_detectorsdark_currentDarkCurrentTrue
zshooter_detectorsshot_noiseShotNoiseTrue
zshooter_detectorsdetector_linearityLinearityCurveFalse
zshooter_detectorsborder_reference_pixelsReferencePixelBorderTrue
zshooter_detectorsreadout_noiseBasicReadoutNoiseTrue
zshooter_detectorsbinningUnequalBinnedImageFalse
zshooter_detectorsbiasBiasTrue
" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 12 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-12-10T20:11:23.569638Z", - "start_time": "2025-12-10T20:11:23.567858Z" - } - }, - "cell_type": "code", - "source": [ - "# for effect in ['maunakea_atmospheric_transmission','seeing_psf','telescope_reflection','Selector','trace_eff','detector_qe']:\n", - "# zs[effect].include = False\n", - "# zs.effects" + "import importlib.resources\n", + "import pathlib" ], - "id": "33dd6f25c485877", - "outputs": [], - "execution_count": 5 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-12-10T20:11:24.380015Z", - "start_time": "2025-12-10T20:11:24.378317Z" - } - }, - "cell_type": "code", - "source": "", - "id": "feb54b3d420b5613", "outputs": [], - "execution_count": null + "execution_count": 1 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-12-10T20:11:40.342404Z", - "start_time": "2025-12-10T20:11:25.163288Z" - } - }, - "cell_type": "code", - "source": "zs.observe(flat, update=True)", - "id": "77af92dabffbfb7", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001B[35mpy.warnings - WARNING: /Users/yashvi/Desktop/ZShooter/ScopeSim/scopesim/effects/spectral_trace_list.py:211: DeprecationWarning: The fov_grid method is deprecated and will be removed in a future release.\n", - " vol = spt.fov_grid()\n", - "\u001B[0m\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " FOVs: 0%| | 0/68 [00:00\n", + " element name ... included\n", + " str18 str33 ... bool \n", + "------------------ --------------------------------- ... --------\n", + " MaunaKea maunakea_atmospheric_transmission ... True\n", + " MaunaKea seeing_psf ... True\n", + " keck telescope_reflection ... True\n", + " ZShooter Selector ... True\n", + " ZShooter_v1 dichroic_tree ... True\n", + " ZShooter_v1 slit_nir ... True\n", + " ZShooter_v1 slit_vis ... True\n", + " ZShooter_v1 slit_uvb ... True\n", + " ZShooter_v1 trace_eff ... True\n", + " ... ... ... ...\n", + "zshooter_detectors detector_vis ... True\n", + "zshooter_detectors detector_uvb ... True\n", + "zshooter_detectors exposure_integration ... True\n", + "zshooter_detectors dark_current ... True\n", + "zshooter_detectors shot_noise ... True\n", + "zshooter_detectors detector_linearity ... False\n", + "zshooter_detectors border_reference_pixels ... True\n", + "zshooter_detectors readout_noise ... True\n", + "zshooter_detectors binning ... False\n", + "zshooter_detectors bias ... True" + ], + "text/html": [ + "
Table length=22\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
elementnameclassincluded
str18str33str22bool
MaunaKeamaunakea_atmospheric_transmissionTERCurveTrue
MaunaKeaseeing_psfSeeingPSFTrue
kecktelescope_reflectionSurfaceListTrue
ZShooterSelectorSurfaceListTrue
ZShooter_v1dichroic_treeDichroicTreeTrue
ZShooter_v1slit_nirFoVSpecificApertureTrue
ZShooter_v1slit_visFoVSpecificApertureTrue
ZShooter_v1slit_uvbFoVSpecificApertureTrue
ZShooter_v1trace_effSpectralEfficiencyTrue
............
zshooter_detectorsdetector_visDetectorListTrue
zshooter_detectorsdetector_uvbDetectorListTrue
zshooter_detectorsexposure_integrationExposureIntegrationTrue
zshooter_detectorsdark_currentDarkCurrentTrue
zshooter_detectorsshot_noiseShotNoiseTrue
zshooter_detectorsdetector_linearityLinearityCurveFalse
zshooter_detectorsborder_reference_pixelsReferencePixelBorderTrue
zshooter_detectorsreadout_noiseBasicReadoutNoiseTrue
zshooter_detectorsbinningUnequalBinnedImageFalse
zshooter_detectorsbiasBiasTrue
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 12, + "source": "zs.effects", + "id": "c8e7adc8015b9a7e" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Tweak what is included if desired", + "id": "35bb74748ba38b7" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-12-10T20:11:23.569638Z", + "start_time": "2025-12-10T20:11:23.567858Z" + } + }, + "cell_type": "code", + "outputs": [], + "execution_count": 5, + "source": [ + "# for effect in ['maunakea_atmospheric_transmission','seeing_psf','telescope_reflection','Selector','trace_eff','detector_qe']:\n", + "# zs[effect].include = False\n", + "# zs.effects" + ], + "id": "9fafb5c02b1caf68" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Build the opical train", + "id": "cb256da39c7347a9" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-06T18:16:44.359488Z", + "start_time": "2026-03-06T18:16:43.441921Z" + } + }, + "cell_type": "code", + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "here\n", - "here\n", - "here\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - " FOV effects: 100%|██████████| 5/5 [00:00<00:00, 24.14it/s]\u001B[A" + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_ubvis_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_ubvis_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_nir_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_nir_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_vis_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_vis_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_yj_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_yj_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_hk_dichroic.dat\u001B[0m\n", + "\u001B[31m\u001B[1mastar.scopesim.utils - ERROR: File cannot be found: dichroics/TER_hk_dichroic.dat\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 427.77751955647926 nm\n", + "\tOrders: [66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n", + " 90 91]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.02 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 615.7741780934598 nm\n", + "\tOrders: [46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69\n", + " 70 71]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.02 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 1018.6218341042404 nm\n", + "\tOrders: [28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.02 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 1367.2838763698182 nm\n", + "\tOrders: [56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79\n", + " 80]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.04 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 1920.9733470130295 nm\n", + "\tOrders: [40 41 42 43 44 45 46 47 48 49 50 51]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.04 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 2487.55942728014 nm\n", + "\tOrders: [31 32 33 34 35 36 37 38 39]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.04 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 427.77751955647926 nm\n", + "\tOrders: [66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n", + " 90 91]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.02 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 615.7741780934598 nm\n", + "\tOrders: [46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69\n", + " 70 71]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.02 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 1018.6218341042404 nm\n", + "\tOrders: [28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.02 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 1367.2838763698182 nm\n", + "\tOrders: [56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79\n", + " 80]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.04 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 1920.9733470130295 nm\n", + "\tOrders: [40 41 42 43 44 45 46 47 48 49 50 51]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.04 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[32mroot - \n", + "The spectrograph has been setup with the following properties:\n", + "\tl0: 2487.55942728014 nm\n", + "\tOrders: [31 32 33 34 35 36 37 38 39]\n", + "\tFocal length: 225.0 mm\n", + "\tIncidence angle: 65.600 deg\n", + "\tReflectance angle: 65.60 deg\n", + "\n", + "\tGroove length: 0.04 mm\n", + "\t# of pixels: 2028x2028\n", + "\tPixel size: 0.015 mm\n", + "\tPixels per res. element: 4.5\u001B[0m\n", + "\u001B[31m\u001B[1mastar.bug_report - ERROR: Unhandled exception occured, see log file for details.\u001B[0m\n", + "Traceback (most recent call last):\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/utils.py\", line 900, in wrapper\n", + " output = func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/optics/optical_train.py\", line 124, in __init__\n", + " self.load(cmds)\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/optics/optical_train.py\", line 162, in load\n", + " self.optics_manager = OpticsManager(self.yaml_dicts, self.cmds)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/optics/optics_manager.py\", line 52, in __init__\n", + " self.load_effects(yaml_dicts, **self.meta)\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/optics/optics_manager.py\", line 99, in load_effects\n", + " self.optical_elements.extend(\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/optics/optics_manager.py\", line 100, in \n", + " OpticalElement(dic, cmds=self.cmds, **kwargs)\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/optics/optical_element.py\", line 85, in __init__\n", + " self.effects.append(make_effect(eff_dic, self.cmds,\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/effects_utils.py\", line 40, in make_effect\n", + " effect = effect_cls(cmds=cmds, **effect_kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/spectral_trace_list.py\", line 561, in __init__\n", + " super().__init__(**kwargs)\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/spectral_trace_list.py\", line 139, in __init__\n", + " self.make_spectral_traces()\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/spectral_trace_list.py\", line 153, in make_spectral_traces\n", + " spec_traces[row[\"description\"]] = SpectralTrace(hdu, **params)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/spectral_trace_list_utils.py\", line 83, in __init__\n", + " self.compute_interpolation_functions()\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/spectral_trace_list_utils.py\", line 133, in compute_interpolation_functions\n", + " self.xy2xi = Transform2D.fit(x_arr, y_arr, xi_arr)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/src/ScopeSim/scopesim/effects/spectral_trace_list_utils.py\", line 870, in fit\n", + " fit = fitter(pinit, xin, yin, xout)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/miniforge3/envs/zshooter2/lib/python3.11/site-packages/astropy/modeling/fitting.py\", line 301, in wrapper\n", + " return func(self, model, x, y, z=z, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/jibailey/miniforge3/envs/zshooter2/lib/python3.11/site-packages/astropy/modeling/fitting.py\", line 764, in __call__\n", + " lhs /= scl\n", + " File \"/Users/jibailey/miniforge3/envs/zshooter2/lib/python3.11/site-packages/numpy/ma/core.py\", line 4497, in __itruediv__\n", + " self._mask |= new_mask\n", + " ^^^^^^^^^^\n", + "AttributeError: 'MaskedColumn' object has no attribute '_mask'\n", + "\u001B[31m\u001B[1mastar.bug_report - ERROR: Python:\n", + "3.11.12 | packaged by conda-forge | (main, Apr 10 2025, 22:18:52) [Clang 18.1.8 ]\n", + "\n", + "Installed Python packages:\n", + " anisocado: 0.4.0\n", + " astar-utils: 0.4.0\n", + " astropy: 6.1.7\n", + " beautifulsoup4: 4.13.4\n", + " docutils: 0.22.2\n", + " httpx: 0.28.1\n", + " lxml: 5.4.0\n", + " matplotlib: 3.10.1\n", + " more-itertools: 10.7.0\n", + " numpy: 2.2.6\n", + " packaging: 25.0\n", + " pooch: 1.8.2\n", + " pyyaml: 6.0.2\n", + " scipy: 1.16.2\n", + " scopesim: 0.11.1a1\n", + " scopesim_data: could not be loaded.\n", + " scopesim_templates: 0.7.0\n", + " skycalc-ipy: 0.6.0\n", + " synphot: 1.6.0\n", + " tqdm: 4.67.1\n", + "\n", + "Installed IRDB packages:\n", + " MaunaKea: version number not available.\n", + " KMOS: version number not available.\n", + " MOSAIC: version number not available.\n", + " VLT: version number not available.\n", + " NACO: version number not available.\n", + " LaPalma: version number not available.\n", + " MUSE: version number not available.\n", + " LFOA: version number not available.\n", + " METIS: version number not available.\n", + " MICADO: version number not available.\n", + " ZShooter_v1: version number not available.\n", + " VISIR: version number not available.\n", + " MORFEO: version number not available.\n", + " Armazones: version number not available.\n", + " IRDB: version number not available.\n", + " FORS: version number not available.\n", + " Keck: version number not available.\n", + " NIRCam: version number not available.\n", + " UVES: version number not available.\n", + " OSIRIS: version number not available.\n", + " ViennaLT: version number not available.\n", + " ERIS: version number not available.\n", + " HAWKI: version number not available.\n", + " test_package: version number not available.\n", + " HARMONI: version number not available.\n", + " MICADO_Sci: version number not available.\n", + " GTC: version number not available.\n", + " JWST: version number not available.\n", + " WFC3: version number not available.\n", + " Paranal: version number not available.\n", + " ZShooter_v2: version number not available.\n", + " HST: version number not available.\n", + " ELT: version number not available.\n", + " MCIFU: version number not available.\n", + "\n", + "Operating System info:\n", + " System: Darwin\n", + " Release: 25.3.0\n", + " Version: Darwin Kernel Version 25.3.0: Wed Jan 28 20:47:03 PST 2026; root:xnu-12377.81.4~5/RELEASE_ARM64_T6031\n", + " Machine: arm64\n", + "\u001B[0m\n" ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001B[32mastar.scopesim.optics.image_plane - No BUNIT found in added HDU.\u001B[0m\n" + "ename": "AttributeError", + "evalue": "'MaskedColumn' object has no attribute '_mask'", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mAttributeError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[5]\u001B[39m\u001B[32m, line 1\u001B[39m\n\u001B[32m----> \u001B[39m\u001B[32m1\u001B[39m zs = \u001B[43msim\u001B[49m\u001B[43m.\u001B[49m\u001B[43mOpticalTrain\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcmd\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/utils.py:900\u001B[39m, in \u001B[36mtop_level_catch..wrapper\u001B[39m\u001B[34m(*args, **kwargs)\u001B[39m\n\u001B[32m 897\u001B[39m \u001B[38;5;129m@functools\u001B[39m.wraps(func)\n\u001B[32m 898\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mwrapper\u001B[39m(*args, **kwargs):\n\u001B[32m 899\u001B[39m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m900\u001B[39m output = \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[43m*\u001B[49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 901\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[32m 902\u001B[39m \u001B[38;5;66;03m# FIXME: This try-except should not be necessary, but\u001B[39;00m\n\u001B[32m 903\u001B[39m \u001B[38;5;66;03m# logger.exception has an issue in some versions.\u001B[39;00m\n\u001B[32m 904\u001B[39m \u001B[38;5;28;01mtry\u001B[39;00m:\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/optics/optical_train.py:124\u001B[39m, in \u001B[36mOpticalTrain.__init__\u001B[39m\u001B[34m(self, cmds)\u001B[39m\n\u001B[32m 121\u001B[39m \u001B[38;5;28mself\u001B[39m._last_source = \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[32m 123\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m cmds \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m124\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mload\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/optics/optical_train.py:162\u001B[39m, in \u001B[36mOpticalTrain.load\u001B[39m\u001B[34m(self, user_commands)\u001B[39m\n\u001B[32m 149\u001B[39m \u001B[38;5;66;03m# FIXME: Setting rc.__currsys__ to user_commands causes many problems:\u001B[39;00m\n\u001B[32m 150\u001B[39m \u001B[38;5;66;03m# UserCommands used NestedMapping internally, but is itself not\u001B[39;00m\n\u001B[32m 151\u001B[39m \u001B[38;5;66;03m# an instance or subclas thereof. So rc.__currsys__ actually\u001B[39;00m\n\u001B[32m (...)\u001B[39m\u001B[32m 159\u001B[39m \u001B[38;5;66;03m# yet. So it is commented out.\u001B[39;00m\n\u001B[32m 160\u001B[39m \u001B[38;5;66;03m# rc.__currsys__ = user_commands\u001B[39;00m\n\u001B[32m 161\u001B[39m \u001B[38;5;28mself\u001B[39m.yaml_dicts = \u001B[38;5;28mself\u001B[39m.cmds.yaml_dicts\n\u001B[32m--> \u001B[39m\u001B[32m162\u001B[39m \u001B[38;5;28mself\u001B[39m.optics_manager = \u001B[43mOpticsManager\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43myaml_dicts\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 163\u001B[39m \u001B[38;5;28mself\u001B[39m.update()\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/optics/optics_manager.py:52\u001B[39m, in \u001B[36mOpticsManager.__init__\u001B[39m\u001B[34m(self, yaml_dicts, cmds, **kwargs)\u001B[39m\n\u001B[32m 49\u001B[39m \u001B[38;5;28mself\u001B[39m.cmds = rc.__currsys__\n\u001B[32m 51\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m yaml_dicts \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m---> \u001B[39m\u001B[32m52\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mload_effects\u001B[49m\u001B[43m(\u001B[49m\u001B[43myaml_dicts\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mmeta\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 54\u001B[39m \u001B[38;5;28mself\u001B[39m.set_derived_parameters()\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/optics/optics_manager.py:99\u001B[39m, in \u001B[36mOpticsManager.load_effects\u001B[39m\u001B[34m(self, yaml_dicts, **kwargs)\u001B[39m\n\u001B[32m 97\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(yaml_dicts, Sequence):\n\u001B[32m 98\u001B[39m yaml_dicts = [yaml_dicts]\n\u001B[32m---> \u001B[39m\u001B[32m99\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43moptical_elements\u001B[49m\u001B[43m.\u001B[49m\u001B[43mextend\u001B[49m\u001B[43m(\u001B[49m\n\u001B[32m 100\u001B[39m \u001B[43m \u001B[49m\u001B[43mOpticalElement\u001B[49m\u001B[43m(\u001B[49m\u001B[43mdic\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m=\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 101\u001B[39m \u001B[43m \u001B[49m\u001B[38;5;28;43;01mfor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mdic\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01min\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43myaml_dicts\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mif\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[33;43meffects\u001B[39;49m\u001B[33;43m\"\u001B[39;49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01min\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mdic\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/optics/optics_manager.py:100\u001B[39m, in \u001B[36m\u001B[39m\u001B[34m(.0)\u001B[39m\n\u001B[32m 97\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(yaml_dicts, Sequence):\n\u001B[32m 98\u001B[39m yaml_dicts = [yaml_dicts]\n\u001B[32m 99\u001B[39m \u001B[38;5;28mself\u001B[39m.optical_elements.extend(\n\u001B[32m--> \u001B[39m\u001B[32m100\u001B[39m \u001B[43mOpticalElement\u001B[49m\u001B[43m(\u001B[49m\u001B[43mdic\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m=\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 101\u001B[39m \u001B[38;5;28;01mfor\u001B[39;00m dic \u001B[38;5;129;01min\u001B[39;00m yaml_dicts \u001B[38;5;28;01mif\u001B[39;00m \u001B[33m\"\u001B[39m\u001B[33meffects\u001B[39m\u001B[33m\"\u001B[39m \u001B[38;5;129;01min\u001B[39;00m dic)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/optics/optical_element.py:85\u001B[39m, in \u001B[36mOpticalElement.__init__\u001B[39m\u001B[34m(self, yaml_dict, cmds, **kwargs)\u001B[39m\n\u001B[32m 82\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m eff_dic.get(\u001B[33m\"\u001B[39m\u001B[33mname\u001B[39m\u001B[33m\"\u001B[39m) \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mgetattr\u001B[39m(\u001B[38;5;28mself\u001B[39m.cmds, \u001B[33m\"\u001B[39m\u001B[33mignore_effects\u001B[39m\u001B[33m\"\u001B[39m, []):\n\u001B[32m 83\u001B[39m eff_dic[\u001B[33m\"\u001B[39m\u001B[33minclude\u001B[39m\u001B[33m\"\u001B[39m] = \u001B[38;5;28;01mFalse\u001B[39;00m\n\u001B[32m---> \u001B[39m\u001B[32m85\u001B[39m \u001B[38;5;28mself\u001B[39m.effects.append(\u001B[43mmake_effect\u001B[49m\u001B[43m(\u001B[49m\u001B[43meff_dic\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m 86\u001B[39m \u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mproperties\u001B[49m\u001B[43m)\u001B[49m)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/effects_utils.py:40\u001B[39m, in \u001B[36mmake_effect\u001B[39m\u001B[34m(effect_dict, cmds, **properties)\u001B[39m\n\u001B[32m 37\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[33m\"\u001B[39m\u001B[33mkwargs\u001B[39m\u001B[33m\"\u001B[39m \u001B[38;5;129;01min\u001B[39;00m effect_dict:\n\u001B[32m 38\u001B[39m effect_kwargs.update(effect_dict[\u001B[33m\"\u001B[39m\u001B[33mkwargs\u001B[39m\u001B[33m\"\u001B[39m]) \u001B[38;5;66;03m# individual effect kwargs\u001B[39;00m\n\u001B[32m---> \u001B[39m\u001B[32m40\u001B[39m effect = \u001B[43meffect_cls\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m=\u001B[49m\u001B[43mcmds\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43meffect_kwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 42\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m effect\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/spectral_trace_list.py:561\u001B[39m, in \u001B[36mEchelleSpectralTraceList.__init__\u001B[39m\u001B[34m(self, **kwargs)\u001B[39m\n\u001B[32m 559\u001B[39m hdulist = \u001B[38;5;28mself\u001B[39m._generate_trace_hdulist(trace_params)\n\u001B[32m 560\u001B[39m kwargs[\u001B[33m\"\u001B[39m\u001B[33mhdulist\u001B[39m\u001B[33m\"\u001B[39m] = hdulist\n\u001B[32m--> \u001B[39m\u001B[32m561\u001B[39m \u001B[38;5;28;43msuper\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m.\u001B[49m\u001B[34;43m__init__\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/spectral_trace_list.py:139\u001B[39m, in \u001B[36mSpectralTraceList.__init__\u001B[39m\u001B[34m(self, **kwargs)\u001B[39m\n\u001B[32m 136\u001B[39m \u001B[38;5;28mself\u001B[39m.meta.update(kwargs)\n\u001B[32m 138\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m._file \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m139\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mmake_spectral_traces\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 141\u001B[39m \u001B[38;5;28mself\u001B[39m.update_meta()\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/spectral_trace_list.py:153\u001B[39m, in \u001B[36mSpectralTraceList.make_spectral_traces\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 151\u001B[39m params.update(\u001B[38;5;28mself\u001B[39m.meta)\n\u001B[32m 152\u001B[39m hdu = \u001B[38;5;28mself\u001B[39m._file[row[\u001B[33m\"\u001B[39m\u001B[33mextension_id\u001B[39m\u001B[33m\"\u001B[39m]]\n\u001B[32m--> \u001B[39m\u001B[32m153\u001B[39m spec_traces[row[\u001B[33m\"\u001B[39m\u001B[33mdescription\u001B[39m\u001B[33m\"\u001B[39m]] = \u001B[43mSpectralTrace\u001B[49m\u001B[43m(\u001B[49m\u001B[43mhdu\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mparams\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 155\u001B[39m \u001B[38;5;28mself\u001B[39m.spectral_traces = spec_traces\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/spectral_trace_list_utils.py:83\u001B[39m, in \u001B[36mSpectralTrace.__init__\u001B[39m\u001B[34m(self, trace_tbl, cmds, **kwargs)\u001B[39m\n\u001B[32m 79\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m 80\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[33m\"\u001B[39m\u001B[33mtrace_tbl must be one of (fits.BinTableHDU, \u001B[39m\u001B[33m\"\u001B[39m\n\u001B[32m 81\u001B[39m \u001B[33m\"\u001B[39m\u001B[33mfits.TableHDU, astropy.Table) but is \u001B[39m\u001B[33m\"\u001B[39m\n\u001B[32m 82\u001B[39m \u001B[33mf\u001B[39m\u001B[33m\"\u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mtype\u001B[39m(trace_tbl)\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m\"\u001B[39m)\n\u001B[32m---> \u001B[39m\u001B[32m83\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mcompute_interpolation_functions\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 85\u001B[39m \u001B[38;5;66;03m# Declaration of other attributes\u001B[39;00m\n\u001B[32m 86\u001B[39m \u001B[38;5;28mself\u001B[39m._xilamimg = \u001B[38;5;28;01mNone\u001B[39;00m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/spectral_trace_list_utils.py:133\u001B[39m, in \u001B[36mSpectralTrace.compute_interpolation_functions\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 130\u001B[39m \u001B[38;5;28mself\u001B[39m.wave_min = quantify(np.min(lam_arr), u.um).value\n\u001B[32m 131\u001B[39m \u001B[38;5;28mself\u001B[39m.wave_max = quantify(np.max(lam_arr), u.um).value\n\u001B[32m--> \u001B[39m\u001B[32m133\u001B[39m \u001B[38;5;28mself\u001B[39m.xy2xi = \u001B[43mTransform2D\u001B[49m\u001B[43m.\u001B[49m\u001B[43mfit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mx_arr\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my_arr\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mxi_arr\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 134\u001B[39m \u001B[38;5;28mself\u001B[39m.xy2lam = Transform2D.fit(x_arr, y_arr, lam_arr)\n\u001B[32m 135\u001B[39m \u001B[38;5;28mself\u001B[39m.xilam2x = Transform2D.fit(xi_arr, lam_arr, x_arr)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/src/ScopeSim/scopesim/effects/spectral_trace_list_utils.py:870\u001B[39m, in \u001B[36mTransform2D.fit\u001B[39m\u001B[34m(cls, xin, yin, xout, degree)\u001B[39m\n\u001B[32m 868\u001B[39m pinit = Polynomial2D(degree=degree)\n\u001B[32m 869\u001B[39m fitter = fitting.LinearLSQFitter()\n\u001B[32m--> \u001B[39m\u001B[32m870\u001B[39m fit = \u001B[43mfitter\u001B[49m\u001B[43m(\u001B[49m\u001B[43mpinit\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mxin\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43myin\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mxout\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 871\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m Transform2D(fit2matrix(fit))\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/miniforge3/envs/zshooter2/lib/python3.11/site-packages/astropy/modeling/fitting.py:301\u001B[39m, in \u001B[36mfitter_unit_support..wrapper\u001B[39m\u001B[34m(self, model, x, y, z, **kwargs)\u001B[39m\n\u001B[32m 296\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mNotImplementedError\u001B[39;00m(\n\u001B[32m 297\u001B[39m \u001B[33m\"\u001B[39m\u001B[33mThis model does not support being fit to data with units.\u001B[39m\u001B[33m\"\u001B[39m\n\u001B[32m 298\u001B[39m )\n\u001B[32m 300\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m301\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmodel\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mz\u001B[49m\u001B[43m=\u001B[49m\u001B[43mz\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/miniforge3/envs/zshooter2/lib/python3.11/site-packages/astropy/modeling/fitting.py:764\u001B[39m, in \u001B[36mLinearLSQFitter.__call__\u001B[39m\u001B[34m(self, model, x, y, z, weights, rcond)\u001B[39m\n\u001B[32m 761\u001B[39m rhs = rhs * weights\n\u001B[32m 763\u001B[39m scl = (lhs * lhs).sum(\u001B[32m0\u001B[39m)\n\u001B[32m--> \u001B[39m\u001B[32m764\u001B[39m \u001B[43mlhs\u001B[49m\u001B[43m \u001B[49m\u001B[43m/\u001B[49m\u001B[43m=\u001B[49m\u001B[43m \u001B[49m\u001B[43mscl\u001B[49m\n\u001B[32m 766\u001B[39m masked = np.any(np.ma.getmask(rhs))\n\u001B[32m 767\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m weights \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m masked \u001B[38;5;129;01mand\u001B[39;00m np.any(np.isnan(lhs)):\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/miniforge3/envs/zshooter2/lib/python3.11/site-packages/numpy/ma/core.py:4497\u001B[39m, in \u001B[36mMaskedArray.__itruediv__\u001B[39m\u001B[34m(self, other)\u001B[39m\n\u001B[32m 4494\u001B[39m (_, fval) = ufunc_fills[np.true_divide]\n\u001B[32m 4495\u001B[39m other_data = np.where(\n\u001B[32m 4496\u001B[39m dom_mask, other_data.dtype.type(fval), other_data)\n\u001B[32m-> \u001B[39m\u001B[32m4497\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m_mask\u001B[49m |= new_mask\n\u001B[32m 4498\u001B[39m other_data = np.where(\u001B[38;5;28mself\u001B[39m._mask, other_data.dtype.type(\u001B[32m1\u001B[39m), other_data)\n\u001B[32m 4499\u001B[39m \u001B[38;5;28mself\u001B[39m._data.\u001B[34m__itruediv__\u001B[39m(other_data)\n", + "\u001B[31mAttributeError\u001B[39m: 'MaskedColumn' object has no attribute '_mask'" ] - }, + } + ], + "execution_count": 5, + "source": "zs = sim.OpticalTrain(cmd)", + "id": "948e7c235c877f43" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "# Make a source", + "id": "8b720a66e8c20197" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-05T15:55:39.572187Z", + "start_time": "2026-03-05T15:55:39.500436Z" + } + }, + "cell_type": "code", + "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - " FOVs: 100%|██████████| 68/68 [00:14<00:00, 4.58it/s]\n" - ] + "data": { + "text/plain": [ + "
" + ], + "image/png": "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ine+v4yjXbt2evbZZzVy5EiVl5efczl/Gc/q1au9X+/cuVObNm3S/v37NWHCBG3evFmS/4wFAACcn88dgnX06FFVVVXV2tsRGxtb66+g/iY/P1+S/G5sCxYs0JgxY3T11VfL4XB4p/vbeCorK7V//35t27ZNM2bMUFZWlh566CG/G0e/fv0UFxenbdu2qbKyUpWVlRoxYoQefPBBVVZWenv2l/GcyePx6PPPP1eXLl387t8GAACcn88FkMrKSm3btk2pqak1pqempiojI8OirhrGgQMHlJeXV2NswcHBSklJ8dmxPffcc7rxxht1zTXX6ODBgzXm+eN4visgIEChoaF+N461a9eqR48e6t27t7f+97//admyZerdu7dycnL8ajxnCgkJ0RVXXKG8vDy/+7cBAAAXxvIz4c+s05fhvfvuu43LL7/cmDt3ruF2u40OHTpY3tv5ymazGb169TJ69eplGIZhPPzww0avXr28lxCeOnWqUVRUZNxwww1G9+7djWXLlvnsJUUXLVpkFBUVGcOHD69xidSwsDDvMv4ynlmzZhlDhw41OnbsaPTo0cN48sknjaqqKuPaa6/1q3Gcq868CpY/jeeZZ54xhg8fbnTq1MkYOHCgsXLlSqO4uNj7/92fxkJRFEVR1AWV5Q2ctSZNmmQcOHDAOH78uJGZmVnj0q++XCkpKcbZvPrqq95lZs6caeTm5hplZWXG+vXrje7du1ve99nqXCZMmFBjOX8Yz1//+lfv9uR0Oo01a9Z4w4c/jeNcdWYA8afxnL6vR3l5uXH48GHjn//8p3HFFVf45VgoiqIoijp/BZz6AgAAAAAanc+dAwIAAACg6SKAAAAAADANAQQAAACAaQggAAAAAExDAAEAAABgGgIIAAAAANMQQAAAAACYhgACAAAAwDQEEAAAAACmIYAAAAAAMA0BBAAAAIBp/h+ekFz7I4PjlAAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } } ], - "execution_count": 6 + "execution_count": 34, + "source": [ + "# waves = np.geomspace(200,5000,num=50000)\n", + "# sp = sim.source.source_templates.ConstFlux1D(amplitude=1e-3)\n", + "# flatsp = sim.source.source_templates.SourceSpectrum(sim.source.source_templates.Empirical1D, points=waves, lookup_table=sp(waves))\n", + "# gal = sim_tp.extragalactic.galaxies.spiral_two_component(extent=200*u.arcsec, fluxes=(15, 15)*u.mag)\n", + "# gal.shift(dy=-30*0.004)\n", + "\n", + "flatsp = sim.source.source_templates.SourceSpectrum(sim.source.source_templates.ConstFlux1D, amplitude=22 * u.ABmag)\n", + "flat = sim.source.source_templates.uniform_source(flatsp, extent=60)\n", + "plot_source(flat)" + ], + "id": "adc0d14904e47a2b" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Simulate it!", + "id": "a427222f3b354100" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "zs.observe(flat, update=True)", + "id": "cd6e0ab80ac8a647" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "#### Read it out", + "id": "2ea3cfdb53e8fcd2" }, { "metadata": { @@ -2216,6 +736,12 @@ ], "execution_count": 7 }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Show it", + "id": "d033d178bb1c0d61" + }, { "metadata": { "ExecuteTime": { @@ -2259,30 +785,6 @@ ], "execution_count": 8 }, - { - "metadata": {}, - "cell_type": "code", - "source": "", - "id": "70131c135705036f", - "outputs": [], - "execution_count": null - }, - { - "metadata": {}, - "cell_type": "code", - "source": "", - "id": "da8a3b0ae66a3e84", - "outputs": [], - "execution_count": null - }, - { - "metadata": {}, - "cell_type": "code", - "source": "", - "id": "465d5498f3512497", - "outputs": [], - "execution_count": null - }, { "metadata": {}, "cell_type": "markdown", @@ -2433,40 +935,6 @@ } ], "execution_count": 62 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-12-10T20:13:32.530098Z", - "start_time": "2025-12-10T20:13:32.528492Z" - } - }, - "cell_type": "code", - "source": "", - "id": "fbe5bbf9f3a15e85", - "outputs": [], - "execution_count": null - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-12-10T20:13:35.567576Z", - "start_time": "2025-12-10T20:13:35.565940Z" - } - }, - "cell_type": "code", - "source": "", - "id": "612e1efd133ba1ca", - "outputs": [], - "execution_count": null - }, - { - "metadata": {}, - "cell_type": "code", - "outputs": [], - "execution_count": null, - "source": "", - "id": "4c5b1ea62e0197ee" } ], "metadata": { From 9cc12b671c4e86e9ce9882580c954d7647a1aaeb Mon Sep 17 00:00:00 2001 From: Jeb Bailey Date: Fri, 6 Mar 2026 10:26:34 -0800 Subject: [PATCH 6/6] Update IntelliJ IDEA configurations: add `ScopeSim` module, link `irdb` in VCS mappings, and configure `zshooter2` SDK. --- .idea/misc.xml | 3 +++ .idea/modules.xml | 1 + .idea/vcs.xml | 1 + .idea/zs-scopesim.iml | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 79c3328..2cb3701 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 4fb4b1a..62b247a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,6 +2,7 @@ + diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 029a89b..edbe72e 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -3,5 +3,6 @@ + \ No newline at end of file diff --git a/.idea/zs-scopesim.iml b/.idea/zs-scopesim.iml index 457aaa4..925c9cb 100644 --- a/.idea/zs-scopesim.iml +++ b/.idea/zs-scopesim.iml @@ -1,10 +1,10 @@ - +