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 _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
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)
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)
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
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', ), ))
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', ] }))