shesha.ao

Python package for AO operations on COMPASS simulation

Functions for modal basis (DM basis, KL, Btt, etc…)

shesha.ao.basis.command_on_Btt(rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_dms: list, p_geom: shesha.config.PGEOM.Param_geom, nfilt: int)

Compute a command matrix in Btt modal basis (see error breakdown) and set it on the sutra_rtc. It computes by itself the volts to Btt matrix.

Parameters:

rtc: (Rtc) : rtc object

dms: (Dms): dms object

p_dms: (list of Param_dm): dms settings

p_geom: (Param_geom): geometry settings

nfilt: (int): number of modes to filter

shesha.ao.basis.command_on_KL(rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_controller: shesha.config.PCONTROLLER.Param_controller, p_dms: List[shesha.config.PDMS.Param_dm], p_geom: shesha.config.PGEOM.Param_geom, p_atmos: shesha.config.PATMOS.Param_atmos, p_tel: shesha.config.PTEL.Param_tel, nfilt: int)

Compute a command matrix in KL modal basis and set it on the sutra_rtc. It computes by itself the volts to KL matrix.

Parameters:

rtc: (Rtc) : rtc object

dms: (Dms): dms object

p_dms: (list of Param_dm): dms settings

p_geom: (Param_geom): geometry settings

p_atmos : (Param_atmos) : atmos parameters

p_tel : (Param_tel) : telescope parameters

nfilt: (int): number of modes to filter

shesha.ao.basis.compute_Btt(IFpzt, IFtt)

Returns Btt to Volts and Volts to Btt matrices

Parameters:

IFpzt : (csr_matrix) : influence function matrix of pzt DM, sparse and arrange as (Npts in pup x nactus)

IFtt : (np.ndarray(ndim=2,dtype=np.float32)) : Influence function matrix of the TT mirror arrange as (Npts in pup x 2)

Returns:

Btt : (np.ndarray(ndim=2,dtype=np.float32)) : Btt to Volts matrix

P : (np.ndarray(ndim=2,dtype=np.float32)) : Volts to Btt matrix

shesha.ao.basis.compute_DMbasis(g_dm, p_dm: shesha.config.PDMS.Param_dm, p_geom: shesha.config.PGEOM.Param_geom)
Compute a the DM basis as a sparse matrix :
  • push on each actuator
  • get the corresponding dm shape
  • apply pupil mask and store in a column
Parameters:

g_dm: (Dm) : Dm object

p_dm: (Param_dm) : dm settings

p_geom: (Param_geom) : geom settings

Returns:

IFbasis = (csr_matrix) : DM IF basis

shesha.ao.basis.compute_IFsparse(g_dm: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_dms: list, p_geom: shesha.config.PGEOM.Param_geom)
Compute the influence functions of all DMs as a sparse matrix :
  • push on each actuator
  • get the corresponding dm shape
  • apply pupil mask and store in a column
Parameters:

g_dm: (Dms) : Dms object

p_dms: (Param_dms) : dms settings

p_geom: (Param_geom) : geom settings

Returns:

IFbasis = (csr_matrix) : DM IF basis

shesha.ao.basis.compute_KL2V(p_controller: shesha.config.PCONTROLLER.Param_controller, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_dms: list, p_geom: shesha.config.PGEOM.Param_geom, p_atmos: shesha.config.PATMOS.Param_atmos, p_tel: shesha.config.PTEL.Param_tel)

Compute the Karhunen-Loeve to Volt matrix (transfer matrix between the KL space and volt space for a pzt dm)

Parameters:

p_controller: (Param_controller) : p_controller settings

dms : (shesha_dms) : Dms object

p_dms: (list of Param_dm) : dms settings

p_geom : (Param_geom) : geometry parameters

p_atmos : (Param_atmos) : atmos parameters

p_tel : (Param_tel) : telescope parameters

Returns:

KL2V : (np.array(np.float32,dim=2)) : KL to Volt matrix

shesha.ao.basis.compute_cmat_with_Btt(rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, Btt: numpy.ndarray, nfilt: int)

Compute a command matrix on the Btt basis and load it in the GPU

Parameters:

rtc: (Rtc): rtc object

Btt: (np.ndarray[ndim=2, dtype=np.float32]) : volts to Btt matrix

nfilt: (int): number of modes to filter

shesha.ao.basis.compute_cmat_with_KL(rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, KL2V: numpy.ndarray, nfilt: int)

Compute a command matrix on the KL basis and load it in the GPU

Parameters:

rtc: (Rtc): rtc object

KL2V: (np.ndarray[ndim=2, dtype=np.float32]) : volts to KL matrix

nfilt: (int): number of modes to filter

shesha.ao.basis.compute_fourier(nActu: int, pitch: float, actu_x_pos: numpy.ndarray, actu_y_pos: numpy.ndarray, periodic='n')
Values you are looking for are:
config.p_dm0.nact config.p_dm0._pitch config.p_dm0._i1 config.p_dm0._j1

Computation implementations of command matrix

shesha.ao.cmats.cmat_init(ncontrol: int, rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_controller: shesha.config.PCONTROLLER.Param_controller, p_wfss: List[shesha.config.PWFS.Param_wfs], p_atmos: shesha.config.PATMOS.Param_atmos, p_tel: shesha.config.PTEL.Param_tel, p_dms: List[shesha.config.PDMS.Param_dm], nmodes: int = 0) → None

Compute the command matrix on the GPU

Parameters:

ncontrol: (int) :

rtc: (Rtc) :

p_controller: (Param_controller) : controller settings

p_wfss: (list of Param_wfs) : wfs settings

p_atmos: (Param_atmos) : atmos settings

p_tel : (Param_tel) : telescope settings

p_dms: (list of Param_dm) : dms settings

M2V : (np.ndarray[ndim=2, dtype=np.float32]): (optional) KL to volts matrix (for KL cmat)

nmodes: (int) : (optional) number of kl modes

shesha.ao.cmats.generic_imat_inversion(M2V: numpy.ndarray, modalIMat: numpy.ndarray, modeSelect: numpy.ndarray = None, modeGains: numpy.ndarray = None) → numpy.ndarray

Generic numpy modal interaction matrix inversion function

Parameters:

M2V: (nActu x nModes) : modal basis matrix

modalIMat: (nSlopes x nModes) : modal interaction matrix

modeSelect: (nModes, dtype=bool): (Optional): mode selection, mode at False is filtered

modeGains: (nModes, dtype=bool): (Optional): modal gains to apply. These are gain in the reconstruction sens, ie they are applied multiplicatively on the command matrix

Computation implementations of interaction matrix

shesha.ao.imats.imat_geom(wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_wfss: List[shesha.config.PWFS.Param_wfs], p_dms: List[shesha.config.PDMS.Param_dm], p_controller: shesha.config.PCONTROLLER.Param_controller, meth: int = 0) → numpy.ndarray

Compute the interaction matrix with a geometric method

Parameters:

wfs: (Sensors) : Sensors object

dms: (Dms) : Dms object

p_wfss: (list of Param_wfs) : wfs settings

p_dms: (list of Param_dm) : dms settings

p_controller: (Param_controller) : controller settings

meth: (int) : (optional) method type (0 or 1)

shesha.ao.imats.imat_geom_ts(wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_wfss: shesha.config.PWFS.Param_wfs, ind_TS: int, p_dms: List[shesha.config.PDMS.Param_dm], ind_DMs: List[int], meth: int = 0) → numpy.ndarray

Compute the interaction matrix with a geometric method for a single truth sensor

Parameters:

wfs: (Sensors) : Sensors object

dms: (Dms) : Dms object

p_wfss: (list of Param_wfs) : wfs settings

ind_TS: (int) : index of the truth sensor in the wfs settings list

p_dms: (list of Param_dm) : dms settings

ind_DMs: (list of int) : indices of used DMs

p_controller: (Param_controller) : controller settings

meth: (int) : (optional) method type (0 or 1)

shesha.ao.imats.imat_geom_ts_multiple_direction(wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_wfss: List[shesha.config.PWFS.Param_wfs], p_dms: List[shesha.config.PDMS.Param_dm], p_geom: shesha.config.PGEOM.Param_geom, ind_TS: int, p_tel: shesha.config.PTEL.Param_tel, x, y, meth: int = 0) → numpy.ndarray

Compute the interaction matrix with a geometric method for multiple truth sensors (with different direction)

Parameters:

wfs: (Sensors) : Sensors object

dms: (Dms) : Dms object

p_wfss: (list of Param_wfs) : wfs settings

ind_TS: (int) : index of the truth sensor in the wfs settings list

p_dms: (list of Param_dm) : dms settings

ind_DMs: (list of int) : indices of used DMs

p_controller: (Param_controller) : controller settings

meth: (int) : (optional) method type (0 or 1)

shesha.ao.imats.imat_init(ncontrol: int, rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_dms: list, wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_wfss: list, p_tel: shesha.config.PTEL.Param_tel, p_controller: shesha.config.PCONTROLLER.Param_controller, M2V=None, dataBase: dict = {}, use_DB: bool = False) → None

Initialize and compute the interaction matrix on the GPU

Parameters:

ncontrol: (int) : controller’s index

rtc: (Rtc) : Rtc object

dms: (Dms) : Dms object

p_dms: (Param_dms) : dms settings

wfs: (Sensors) : Sensors object

p_wfss: (list of Param_wfs) : wfs settings

p_tel: (Param_tel) : telescope settings

p_controller: (Param_controller) : controller settings

M2V:(np.array) : KL_matrix

dataBase:(dict): (optional) dict containing paths to files to load

use_DB:(bool) : (optional) use dataBase flag

Functions used for modal optimization control

shesha.ao.modopti.openLoopSlp(tel: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, atmos: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, nrec: int, ncontrol: int, p_wfss: list)

Return a set of recorded open-loop slopes, usefull for initialize modal control optimization

Parameters:

tel: (Telescope) : Telescope object

atmos: (Atmos) : Atmos object

wfs: (Sensors) : Sensors object

rtc: (Rtc) : Rtc object

nrec: (int) : number of samples to record

ncontrol: (int) : controller’s index

p_wfss: (list of Param_wfs) : wfs settings

Computation of tomographic reconstructor

shesha.ao.tomo.create_nact_geom(p_dm: shesha.config.PDMS.Param_dm)

Compute the DM coupling matrix

Param:p_dm : (Param_dm) : dm parameters
Returns:Nact : (np.array(dtype=np.float64)) : the DM coupling matrix
shesha.ao.tomo.create_piston_filter(p_dm: shesha.config.PDMS.Param_dm)

Create the piston filter matrix

Parameters:p_dm: (Param_dm): dm settings
shesha.ao.tomo.do_tomo_matrices(ncontrol: int, rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_wfss: List[shesha.config.PWFS.Param_wfs], dms: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, atmos: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_controller: shesha.config.PCONTROLLER.Param_controller, p_geom: shesha.config.PGEOM.Param_geom, p_dms: list, p_tel: shesha.config.PTEL.Param_tel, p_atmos: shesha.config.PATMOS.Param_atmos)

Compute Cmm and Cphim matrices for the MV controller on GPU

Parameters:

ncontrol: (int): controller index

rtc: (Rtc) : rtc object

p_wfss: (list of Param_wfs) : wfs settings

dms: (Dms) : Dms object

atmos: (Atmos) : Atmos object

wfs: (Sensors) : Sensors object

p_controller: (Param_controller): controller settings

p_geom: (Param_geom) : geom settings

p_dms: (list of Param_dms) : dms settings

p_tel: (Param_tel) : telescope settings

p_atmos: (Param_atmos) : atmos settings

shesha.ao.tomo.selectDMforLayers(p_atmos: shesha.config.PATMOS.Param_atmos, p_controller: shesha.config.PCONTROLLER.Param_controller, p_dms: list)

For each atmos layer, select the DM which have to handle it in the Cphim computation for MV controller

Parameters:

p_atmos : (Param_atmos) : atmos parameters

p_controller : (Param_controller) : controller parameters

p_dms :(list of Param_dm) : dms parameters

Returns:

indlayersDM : (np.array(dtype=np.int32)) : for each atmos layer, the Dm number corresponding to it

On the fly modification of the WFS

shesha.ao.wfs.comp_new_fstop(wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, n: int, p_wfs: shesha.config.PWFS.Param_wfs, fssize: float, fstop: bytes)

Compute a new field stop for pyrhr WFS

Parameters:

n : (int) : WFS index

wfs : (Param_wfs) : WFS parameters

fssize : (float) : field stop size [arcsec]

fstop : (string) : “square” or “round” (field stop shape)

shesha.ao.wfs.comp_new_pyr_ampl(nwfs: int, ampli: float, wfs: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, rtc: shesha.sutra_wrap.smart_import.<locals>.tmp_cls, p_wfss: list, p_tel: shesha.config.PTEL.Param_tel, npts_force: int = None)

Set the pyramid modulation amplitude

Parameters:

nwfs : (int): WFS index

ampli : (float) : new amplitude in units of lambda/D

rtc: (Rtc): rtc object

p_centroider : (Param_centroider) : pyr centroider settings

p_wfss : (list of Param_wfs) : list of wfs parameters

p_tel : (Param_tel) : Telescope parameters

shesha.ao.wfs.noise_cov(nw: int, p_wfs: shesha.config.PWFS.Param_wfs, p_atmos: shesha.config.PATMOS.Param_atmos, p_tel: shesha.config.PTEL.Param_tel)

Compute the diagonal of the noise covariance matrix for a SH WFS (arcsec^2) Photon noise: (pi^2/2)*(1/Nphotons)*(d/r0)^2 / (2*pi*d/lambda)^2 Electronic noise: (pi^2/3)*(wfs.noise^2/N^2photons)*wfs.npix^2*(wfs.npix*wfs.pixsize*d/lambda)^2 / (2*pi*d/lambda)^2

Parameters:

nw: wfs number

p_wfs: (Param_wfs) : wfs settings

p_atmos: (Param_atmos) : atmos settings

p_tel: (Param_tel) : telescope settings

Returns:

cov : (np.ndarray(ndim=1,dtype=np.float64)) : noise covariance diagonal