Пример #1
0
 def _changref2(transforms, is_native):
     # list of cm or deg values
     for t in transforms:
         if t.transformType == 'none':
             continue
         if t.transformType in ('XS', 'YS', 'ZS'):
             t.transformValue = ModelUnits.scale_value(
                 t.transformValue, 'cm_to_m', is_native)
         elif t.transformType in ('XR', 'YR', 'ZR'):
             t.transformValue = ModelUnits.scale_value(
                 t.transformValue, 'deg_to_rad', is_native)
         else:
             assert False, 'invalid transformType: {}'.format(
                 t.transformType)
     return transforms
Пример #2
0
def _init_model_units():
    def _scale(v, factor, is_native):
        scale = 0.1**factor
        return v * scale if is_native else v / scale

    def _mm2_to_cm2(v, is_native):
        return _scale(v, 2, is_native)

    def _mm3_to_cm3(v, is_native):
        return _scale(v, 3, is_native)

    def _mm4_to_cm4(v, is_native):
        return _scale(v, 4, is_native)

    def _mm5_to_cm5(v, is_native):
        return _scale(v, 5, is_native)

    res = ModelUnits(
        PKDict({
            x: PKDict({y: 'cm_to_m'
                       for y in _CENTIMETER_FIELDS[x]})
            for x in _CENTIMETER_FIELDS.keys()
        }))
    res.unit_def.grating.pkupdate(
        PKDict({
            'rul_a1': _mm2_to_cm2,
            'rul_a2': _mm3_to_cm3,
            'rul_a3': _mm4_to_cm4,
            'rul_a4': _mm5_to_cm5,
            'rulingDensity': 'mm_to_cm',
            'rulingDensityCenter': 'mm_to_cm',
            'rulingDensityPolynomial': 'mm_to_cm',
        }))
    return res
Пример #3
0
 def _xpas(value, is_native):
     cm_to_m = lambda v: ModelUnits.scale_value(v, 'cm_to_m', is_native)
     if is_native:
         if re.search(r'^#', str(value)):
             value = re.sub(r'^#', '', value)
             return list(map(cm_to_m, value.split('|')))
     else:
         if type(value) is list:
             return '#' + '|'.join(
                 map(str, map(lambda v: int(cm_to_m(v)), value)))
     return cm_to_m(value)
Пример #4
0
 def _xpas(v, is_native):
     if is_native:
         if re.search(r'\#', v):
             return v
         v2 = zgoubi_parser.parse_float(v)
         if v2 > 1e10:
             # old step size format
             m = re.search(r'^0*(\d+)\.0*(\d+)', v)
             assert m, 'XPAS failed to parse step size: {}'.format(v)
             return '#{}|{}|{}'.format(m.group(2), m.group(1), m.group(2))
     else:
         if re.search(r'\#', str(v)):
             v = re.sub(r'^#', '', v)
             return '[{}]'.format(','.join(v.split('|')))
     return ModelUnits.scale_value(v, 'cm_to_m', is_native)
Пример #5
0
def test_model_units():
    from pykern.pkunit import pkeq
    from sirepo.template.template_common import ModelUnits
    import re

    def _xpas(value, is_native):
        cm_to_m = lambda v: ModelUnits.scale_value(v, 'cm_to_m', is_native)
        if is_native:
            if re.search(r'^#', str(value)):
                value = re.sub(r'^#', '', value)
                return list(map(cm_to_m, value.split('|')))
        else:
            if type(value) is list:
                return '#' + '|'.join(
                    map(str, map(lambda v: int(cm_to_m(v)), value)))
        return cm_to_m(value)

    units = ModelUnits({
        'CHANGREF': {
            'XCE': 'cm_to_m',
            'YCE': 'cm_to_m',
            'ALE': 'deg_to_rad',
            'XPAS': _xpas,
        },
    })
    native_model = {
        'XCE': 2,
        'YCE': 0,
        'ALE': 8,
        'XPAS': '******',
    }
    sirepo_model = units.scale_from_native('CHANGREF', native_model.copy())
    assert sirepo_model == {
        'XCE': 2e-2,
        'YCE': 0,
        'ALE': 0.13962634015954636,
        'XPAS': [2e-1, 2e-1, 2e-1],
    }

    assert native_model == units.scale_to_native('CHANGREF',
                                                 sirepo_model.copy())

    assert units.scale_from_native('CHANGREF', {
        'XPAS': '******',
    })['XPAS'] == 0.2

    assert ModelUnits.scale_value(2, 'cm_to_m', True) == 2e-2
    assert ModelUnits.scale_value(0.02, 'cm_to_m', False) == 2
Пример #6
0
def _init_model_units():
    # Convert element units (m, rad) to the required zgoubi units (cm, mrad, degrees)

    def _changref2(transforms, is_native):
        # list of cm or deg values
        for t in transforms:
            if t.transformType == 'none':
                continue
            if t.transformType in ('XS', 'YS', 'ZS'):
                t.transformValue = ModelUnits.scale_value(
                    t.transformValue, 'cm_to_m', is_native)
            elif t.transformType in ('XR', 'YR', 'ZR'):
                t.transformValue = ModelUnits.scale_value(
                    t.transformValue, 'deg_to_rad', is_native)
            else:
                assert False, 'invalid transformType: {}'.format(
                    t.transformType)
        return transforms

    def _il(v, is_native):
        if v == '0':
            return v
        if is_native:
            return '1' if v == '2' else '0'
        return '2' if v == '1' else '0'

    def _marker_plot(v, is_native):
        if is_native:
            return v
        else:
            return '"{}"'.format('.plt' if int(v) else '')

    def _xpas(v, is_native):
        if is_native:
            if re.search(r'\#', v):
                return v
            v2 = zgoubi_parser.parse_float(v)
            if v2 > 1e10:
                # old step size format
                m = re.search(r'^0*(\d+)\.0*(\d+)', v)
                assert m, 'XPAS failed to parse step size: {}'.format(v)
                return '#{}|{}|{}'.format(m.group(2), m.group(1), m.group(2))
        else:
            if re.search(r'\#', str(v)):
                v = re.sub(r'^#', '', v)
                return '[{}]'.format(','.join(v.split('|')))
        return ModelUnits.scale_value(v, 'cm_to_m', is_native)

    return ModelUnits(
        PKDict(
            bunch=PKDict(
                YR='cm_to_m',
                TR='mrad_to_rad',
                ZR='cm_to_m',
                PR='mrad_to_rad',
                SR='cm_to_m',
            ),
            AUTOREF=PKDict(
                XCE='cm_to_m',
                YCE='cm_to_m',
                ALE='mrad_to_rad',
            ),
            BEND=PKDict(
                l='cm_to_m',
                IL=_il,
                X_E='cm_to_m',
                LAM_E='cm_to_m',
                X_S='cm_to_m',
                LAM_S='cm_to_m',
                XPAS=_xpas,
                XCE='cm_to_m',
                YCE='cm_to_m',
            ),
            CAVITE=PKDict(),
            CHANGREF=PKDict(
                ALE='deg_to_rad',
                XCE='cm_to_m',
                YCE='cm_to_m',
            ),
            CHANGREF2=PKDict(subElements=_changref2, ),
            COLLIMA=PKDict(
                C1='cm_to_m',
                C2='cm_to_m',
                C3='cm_to_m',
                C4='cm_to_m',
            ),
            DIPOLE=PKDict(
                AT='deg_to_rad',
                ACN='deg_to_rad',
                RM='cm_to_m',
                LAM_E='cm_to_m',
                SHIFT_E='cm_to_m',
                OMEGA_E='deg_to_rad',
                THETA_E='deg_to_rad',
                R1_E='cm_to_m',
                U1_E='cm_to_m',
                U2_E='cm_to_m',
                R2_E='cm_to_m',
                LAM_S='cm_to_m',
                SHIFT_S='cm_to_m',
                OMEGA_S='deg_to_rad',
                THETA_S='deg_to_rad',
                R1_S='cm_to_m',
                U1_S='cm_to_m',
                U2_S='cm_to_m',
                R2_S='cm_to_m',
                LAM_L='cm_to_m',
                SHIFT_L='cm_to_m',
                OMEGA_L='deg_to_rad',
                THETA_L='deg_to_rad',
                R1_L='cm_to_m',
                U1_L='cm_to_m',
                U2_L='cm_to_m',
                R2_L='cm_to_m',
                R3_L='cm_to_m',
                RE='cm_to_m',
                TE='deg_to_rad',
                RS='cm_to_m',
                TS='deg_to_rad',
            ),
            DRIFT=PKDict(l='cm_to_m', ),
            ffaDipole=PKDict(
                ACN='deg_to_rad',
                DELTA_RM='cm_to_m',
                G0_E='cm_to_m',
                SHIFT_E='cm_to_m',
                OMEGA_E='deg_to_rad',
                THETA_E='deg_to_rad',
                R1_E='cm_to_m',
                U1_E='cm_to_m',
                U2_E='cm_to_m',
                R2_E='cm_to_m',
                G0_S='cm_to_m',
                SHIFT_S='cm_to_m',
                OMEGA_S='deg_to_rad',
                THETA_S='deg_to_rad',
                R1_S='cm_to_m',
                U1_S='cm_to_m',
                U2_S='cm_to_m',
                R2_S='cm_to_m',
                G0_L='cm_to_m',
                SHIFT_L='cm_to_m',
                OMEGA_L='deg_to_rad',
                THETA_L='deg_to_rad',
                R1_L='cm_to_m',
                U1_L='cm_to_m',
                U2_L='cm_to_m',
                R2_L='cm_to_m',
            ),
            ffaSpiDipole=PKDict(
                ACN='deg_to_rad',
                DELTA_RM='cm_to_m',
                G0_E='cm_to_m',
                SHIFT_E='cm_to_m',
                OMEGA_E='deg_to_rad',
                XI_E='deg_to_rad',
                G0_S='cm_to_m',
                SHIFT_S='cm_to_m',
                OMEGA_S='deg_to_rad',
                XI_S='deg_to_rad',
                G0_L='cm_to_m',
                SHIFT_L='cm_to_m',
                OMEGA_L='deg_to_rad',
                XI_L='deg_to_rad',
            ),
            FFA=PKDict(
                IL=_il,
                AT='deg_to_rad',
                RM='cm_to_m',
                XPAS='******',
                RE='cm_to_m',
                RS='cm_to_m',
            ),
            FFA_SPI=PKDict(
                IL=_il,
                AT='deg_to_rad',
                RM='cm_to_m',
                XPAS='******',
                RE='cm_to_m',
                RS='cm_to_m',
            ),
            MARKER=PKDict(plt=_marker_plot, ),
            MULTIPOL=PKDict(
                l='cm_to_m',
                IL=_il,
                R_0='cm_to_m',
                X_E='cm_to_m',
                LAM_E='cm_to_m',
                X_S='cm_to_m',
                LAM_S='cm_to_m',
                XPAS=_xpas,
                XCE='cm_to_m',
                YCE='cm_to_m',
            ),
            particleCoordinate=PKDict(
                Y='cm_to_m',
                Z='cm_to_m',
                S='cm_to_m',
                T='mrad_to_rad',
                P='mrad_to_rad',
            ),
            QUADRUPO=PKDict(
                l='cm_to_m',
                IL=_il,
                R_0='cm_to_m',
                X_E='cm_to_m',
                LAM_E='cm_to_m',
                X_S='cm_to_m',
                XPAS=_xpas,
                LAM_S='cm_to_m',
                XCE='cm_to_m',
                YCE='cm_to_m',
            ),
            SEXTUPOL=PKDict(
                l='cm_to_m',
                IL=_il,
                R_0='cm_to_m',
                X_E='cm_to_m',
                LAM_E='cm_to_m',
                X_S='cm_to_m',
                XPAS=_xpas,
                LAM_S='cm_to_m',
                XCE='cm_to_m',
                YCE='cm_to_m',
            ),
            SOLENOID=PKDict(
                l='cm_to_m',
                IL=_il,
                R_0='cm_to_m',
                X_E='cm_to_m',
                X_S='cm_to_m',
                XPAS=_xpas,
                XCE='cm_to_m',
                YCE='cm_to_m',
            ),
            TOSCA=PKDict(
                IL=_il,
                A='cm_to_m',
                B='cm_to_m',
                C='cm_to_m',
                XPAS=_xpas,
                XCE='cm_to_m',
                YCE='cm_to_m',
                RE='cm_to_m',
                RS='cm_to_m',
            ),
        ))
Пример #7
0
    horizontalSize='rx_slit[0]',
    internalOutlineMajorAxis='rwidx1',
    internalOutlineMinorAxis='rlen1',
    rulingDensity='ruling',
    rulingDensityCenter='ruling',
    rulingDensityPolynomial='ruling',
    singleEnergyValue='ph1',
    verticalOffset='cz_slit[0]',
    verticalSize='rz_slit[0]',
)

_LOWERCASE_FIELDS = set(['focal_x', 'focal_z'])

_MODEL_UNITS = ModelUnits(
    PKDict({
        x: PKDict({y: 'cm_to_m'
                   for y in _CENTIMETER_FIELDS[x]})
        for x in _CENTIMETER_FIELDS.keys()
    }))
_MODEL_UNITS.unit_def.grating.pkupdate(
    PKDict({
        x: 'mm_to_cm'
        for x in [
            'rulingDensity',
            'rulingDensityPolynomial',
            'rul_a1',
            'rul_a2',
            'rul_a3',
            'rul_a4',
        ]
    }))