Source code for desimodel.inputs.gfa

# Licensed under a 3-clause BSD style license - see LICENSE.rst
# -*- coding: utf-8 -*-
"""
desimodel.inputs.gfa
====================

Utilities for updating GFA data.
"""
import os.path
import numpy as np
from ..focalplane import get_radius_deg, get_radius_mm, xy2qs
from ..io import datadir

[docs]def build_gfa_table(testdir=None): ''' Builds the GFA table given the data from DESI-0530-v14 Excel spreadsheet and writes an .ecsv file using the astropy table library. The GFA corners come from the P1-P4 "Reference projection of active area" in rows 26-29 of columns C-E of DESI-0530-v14. The saved table has columns PETAL,CORNER,X,Y,Z,Q,S,RADIUS_DEG. Args: testdir: If not None, write files here instead of standard locations under $DESIMODEL/data/ ''' from desiutil.log import get_logger log = get_logger() if testdir is None: outdir = os.path.join(datadir(), 'focalplane') else: outdir = testdir if not os.path.isdir(outdir): raise ValueError("Missing directory {}".format(testdir)) # Uses the reference projection of active area to create data table of GFAs from astropy.table import Table # Initial x and y coordinates for the GFAs # Data obtained from DESI-0530-v14 Excel spreadsheet, which is for petal 3 x = [318.703, 331.075, 349.121, 336.748] y = [225.816, 234.805, 209.944, 200.955] z = [-17.053, -18.487, -18.631, -17.198] def get_rotatemat(angle): ''' Return a rotation matrix for angle in degrees ''' a = np.radians(angle) rotatemat = np.zeros(shape=(2,2)) rotatemat[0] = [np.cos(a), -np.sin(a)] rotatemat[1] = [np.sin(a), np.cos(a)] return rotatemat # Note: the corners are 0 indexed gfatable = Table(names = ('PETAL', 'CORNER', 'X', 'Y', 'Z', 'Q', 'S', 'RADIUS_DEG'), dtype = ('int', 'int', 'float', 'float', 'float', 'float', 'float', 'float')) # Sets the units for the GFA table gfatable['X'].unit = 'mm' gfatable['Y'].unit = 'mm' gfatable['Z'].unit = 'mm' gfatable['Q'].unit = 'degrees' gfatable['S'].unit = 'mm' gfatable['RADIUS_DEG'].unit = 'degrees' for petal in range(10): #- x,y,z from DESI-0530 starts at petal 3 angle = petal*36 - 3*36 R = get_rotatemat(angle) xx, yy = R.dot([x,y]) assert len(xx) == len(x) assert len(yy) == len(y) q, s = xy2qs(xx, yy) r_deg = get_radius_deg(xx, yy) for i in range(len(xx)): gfatable.add_row([petal, i, xx[i], yy[i], z[i], q[i], s[i], r_deg[i]]) # Saves the table of data as an ecsv file outfile = os.path.join(outdir, 'gfa.ecsv') gfatable.write(outfile, format='ascii.ecsv') log.info('Wrote {}'.format(outfile))