示例#1
0
def create_specsheet(conjugate_type, **inputs):
    if conjugate_type == 'finite':
        # setup finite conjugate defaults
        fev = create_etendue_dict()
        fev['field']['object'] = dict([('height', None)])
        fev['aperture']['object'] = dict([('f/#', None), ('NA', None)])
        fev['field']['image'] = dict([('height', None)])
        fev['aperture']['image'] = dict([('f/#', None), ('NA', None)])
        fss = SpecSheet('finite', etendue_values=fev, **inputs)
        return fss

    elif conjugate_type == 'infinite':
        # setup infinite conjugate defaults
        imager_inputs = {'s': -math.inf}
        imager = IdealImager(None, -math.inf, None, None, None)

        iev = create_etendue_dict()
        iev['field']['object'] = dict([('angle', None)])
        iev['aperture']['object'] = dict([('pupil', None)])
        iev['field']['image'] = dict([('height', None)])
        iev['aperture']['image'] = dict([('f/#', None), ('NA', None)])

        ifss = SpecSheet('infinite',
                         imager=imager,
                         imager_inputs=imager_inputs,
                         frozen_imager_inputs=[True, True, True, True, False],
                         etendue_values=iev,
                         **inputs)
        return ifss

    else:
        print('create_specsheet: conjugate_type not recognized',
              conjugate_type)
        return None
示例#2
0
    def __init__(self, conjugate_type,
                 imager=None, imager_inputs=None, frozen_imager_inputs=None,
                 etendue_inputs=None, etendue_values=None):
        self.conjugate_type = conjugate_type

        if imager is None:
            imager = IdealImager(None, None, None, None, None)
        self.imager = imager

        self.imager_inputs = imager_inputs if imager_inputs else {}

        self.frozen_imager_inputs = (frozen_imager_inputs
                                     if frozen_imager_inputs
                                     else [False]*5)

        self.etendue_inputs = (etendue_inputs if etendue_inputs
                               else create_etendue_dict())
        self.etendue_values = (etendue_values if etendue_values
                               else create_etendue_dict())

        self.partition_defined()
示例#3
0
    def generate_from_inputs(self, imgr_inputs, etendue_inputs):
        """ compute imager and etendue values given input dicts """
        max_partition, max_num_inputs = self.partition_defined()
        num_imager_inputs = self.partitions['imager']
        num_field_inputs = self.partitions['field']
        num_aperture_inputs = self.partitions['aperture']

        conj_type = self.conjugate_type

        imager_inputs = {}
        if max_num_inputs <= 1:
            # fill in imager_inputs with any previous calculations for m or f
            if conj_type == 'finite':
                if num_imager_inputs < 2 and self.imager.m is not None:
                    imager_inputs['m'] = self.imager.m
            else:
                if num_imager_inputs < 2 and self.imager.f is not None:
                    imager_inputs['f'] = self.imager.f

        # update imager_inputs with user entries
        imager_inputs.update(imgr_inputs)
        imager_inputs = {
            k: v
            for (k, v) in imager_inputs.items() if v is not None
        }

        # calculate an ideal imager for imager_inputs
        imager = ideal_imager_setup(**imager_inputs)
        # fill in remaining None values with previous imager data
        imager = IdealImager(*[
            self.imager[i] if p is None else imager[i]
            for i, p in enumerate(imager)
        ])

        if conj_type == 'finite':
            imager_defined = True if imager.m is not None else False
        else:
            imager_defined = True if imager.f is not None else False

        etendue_values = self.etendue_values

        for fa_key, fa_value in etendue_inputs.items():
            for oi_key, oi_value in fa_value.items():
                if conj_type == 'finite':
                    conj = 'finite'
                elif conj_type == 'afocal':
                    conj = 'infinite'
                elif conj_type == 'infinite':
                    conj = 'finite' if oi_key == 'image' else conj_type
                etendue.fill_in_etendue_data(conj, imager, fa_key,
                                             etendue_inputs[fa_key][oi_key],
                                             etendue_values[fa_key][oi_key])

        if imager_defined:
            if num_field_inputs >= 1 and num_aperture_inputs >= 1:
                # we have enough data to calculate all of the etendue grid
                ii = etendue.do_etendue_via_imager(conj_type, imager,
                                                   etendue_inputs,
                                                   etendue_values)

                if ii:
                    imager_inputs[ii[0]] = ii[1]
                    imager = ideal_imager_setup(**imager_inputs)
                    etendue.do_etendue_via_imager(conj_type, imager,
                                                  etendue_inputs,
                                                  etendue_values)
            elif num_field_inputs == 1:
                # we have enough data to calculate all of the etendue grid
                row = dict2d.row(etendue_inputs, 'field')
                obj_img_key = 'object' if len(row['object']) else 'image'
                etendue.do_field_via_imager(conj_type, imager, etendue_inputs,
                                            obj_img_key, etendue_values)
            elif num_aperture_inputs == 1:
                # we have enough data to calculate all of the etendue grid
                row = dict2d.row(etendue_inputs, 'aperture')
                obj_img_key = 'object' if len(row['object']) else 'image'
                etendue.do_aperture_via_imager(conj_type, imager,
                                               etendue_inputs, obj_img_key,
                                               etendue_values)
        else:  # imager not specified
            if num_field_inputs == 2 or num_aperture_inputs == 2:
                fld_ape_key = 'field' if num_field_inputs == 2 else 'aperture'
                # solve for imager
                ii = etendue.do_etendue_to_imager(fld_ape_key, etendue_inputs,
                                                  etendue_values)
                imager_inputs[ii[0]] = ii[1]
                imager = ideal_imager_setup(**imager_inputs)
                # update etendue grid
                etendue.do_etendue_via_imager(conj_type, imager,
                                              etendue_inputs, etendue_values)

        self.imager = imager
        self.etendue_values = etendue_values
        return imager, etendue_values
示例#4
0
 def sync_to_restore(self, opt_model):
     # imager is exported as a list. convert back to an IdealImager
     self.imager = IdealImager(*self.imager)