Source code for marxs.missions.chandra.hrma_py

'''A pure-python approximation of the Chandra mirror.

This approximation is crude, but it's useful to have for running
examples in environments where  `classic MARX`_ is not installed.
'''
import numpy as np
import astropy.units as u

from .data import NOMINAL_FOCALLENGTH
from ...import optics


mirror_radii = np.array([[598., 610.], [481, 491], [424, 433], [315, 322]])


[docs] class Aperture(optics.MultiAperture): '''Chandra opening aperture of four rings above the mirror shells. ''' def __init__(self, **kwargs): if 'id_col' not in kwargs: kwargs['id_col'] = 'mirror_shell' if 'elements' not in kwargs: kwargs['elements'] = [optics.CircleAperture(position=[NOMINAL_FOCALLENGTH, 0, 0], zoom=[1, r[1], r[1]], r_inner=r[0]) for r in mirror_radii] super().__init__(**kwargs)
class HRMA(optics.FlatStack): '''High-resolution mirror assembly in a pure Python implementation This class delivers a rough approximation (a few percent for on-axis sources) to the Chandra mirror. Many important effects are missing (e.g. the mirror reflectivity in this module is not energy dependent, neither is the mirror scatter). Use `marxs.optics.MarxMirror` if possible. ''' def __init__(self, **kwargs): 'asf' kwargs['position'] = [NOMINAL_FOCALLENGTH, 0, 0] kwargs['zoom'] = [1, 650., 650] kwargs['elements'] = [optics.PerfectLens, optics.RadialMirrorScatter, optics.EnergyFilter] kwargs['keywords'] = [{'focallength': NOMINAL_FOCALLENGTH}, {'inplanescatter': 3.6e-6 * u.rad, 'perpplanescatter': 1.2e-6 * u.rad}, {'filterfunc': lambda x: np.ones_like(x) * 0.66, 'name': 'support spider, reflectivity, et al.'}] super().__init__(**kwargs)