[5d4777d] | 1 | """ |
---|
| 2 | Convert models to and from sasview. |
---|
| 3 | """ |
---|
| 4 | PARAMETER_MAP = { |
---|
| 5 | 'CylinderModel': dict( |
---|
| 6 | name='cylinder', |
---|
| 7 | cyl_theta='theta', cyl_phi='phi', |
---|
| 8 | sldCyl='sld', sldSolv='solvent_sld', |
---|
| 9 | ), |
---|
| 10 | 'EllipsoidModel': dict( |
---|
| 11 | name='ellipsoid', |
---|
| 12 | axis_theta='theta', axis_phi='phi', |
---|
| 13 | sldEll='sld', sldSolv='solvent_sld', |
---|
| 14 | radius_a='rpolar', radius_b='requatorial', |
---|
| 15 | ), |
---|
| 16 | 'CoreShellCylinderModel': dict( |
---|
| 17 | name='core_shell_cylinder', |
---|
| 18 | axis_theta='theta', axis_phi='phi', |
---|
| 19 | ), |
---|
| 20 | 'TriaxialEllipsoidModel': dict( |
---|
| 21 | name='triaxial_ellipsoid', |
---|
| 22 | axis_theta='theta', axis_phi='phi', axis_psi='psi', |
---|
| 23 | sldEll='sld', sldSolv='solvent_sld', |
---|
| 24 | semi_axisA='req_minor', semi_axisB='req_major', semi_axisC='rpolar', |
---|
| 25 | ), |
---|
| 26 | 'LamellarModel': dict( |
---|
| 27 | name='lamellar', |
---|
| 28 | sld_bi='sld', sld_sol='solvent_sld', |
---|
| 29 | bi_thick='thickness', |
---|
| 30 | ), |
---|
| 31 | 'CappedCylinderModel': dict( |
---|
| 32 | name='capped_cylinder', |
---|
| 33 | sld_capcyl='sld', sld_solv='solvent_sld', |
---|
| 34 | len_cyl='length', rad_cyl='radius', rad_cap='cap_radius', |
---|
| 35 | ), |
---|
| 36 | 'SphereModel': dict( |
---|
| 37 | name='sphere', |
---|
| 38 | sldSph='sld', sldSolv='solvent_sld', |
---|
[f4cf580] | 39 | radius='radius', # listing identical parameters is optional |
---|
[5d4777d] | 40 | ), |
---|
| 41 | } |
---|
| 42 | |
---|
| 43 | def _reverse_map(): |
---|
| 44 | retval = {} |
---|
| 45 | for old_name,old_map in PARAMETER_MAP.items(): |
---|
| 46 | new_name = old_map['name'] |
---|
| 47 | new_map = dict((v,k) for k,v in old_map.items() if k != 'name') |
---|
| 48 | new_map['name'] = old_name |
---|
| 49 | retval[new_name] = new_map |
---|
| 50 | return retval |
---|
| 51 | REVERSE_MAP = _reverse_map() |
---|
| 52 | del _reverse_map |
---|
| 53 | |
---|
| 54 | |
---|
| 55 | def _rename_pars(pars, mapping): |
---|
| 56 | """ |
---|
| 57 | Rename the parameters and any associated polydispersity attributes. |
---|
| 58 | """ |
---|
| 59 | newpars = pars.copy() |
---|
| 60 | for old,new in mapping.items(): |
---|
[f4cf580] | 61 | if old == new: continue |
---|
[5d4777d] | 62 | # Bumps style parameter names |
---|
| 63 | for variant in ("", "_pd", "_pd_n", "_pd_nsigma", "_pd_type"): |
---|
| 64 | if old+variant in newpars: |
---|
| 65 | newpars[new+variant] = pars[old+variant] |
---|
| 66 | del newpars[old+variant] |
---|
| 67 | # Sasview style parameter names |
---|
| 68 | for variant in (".width", ".nsigmas", ".type", ".npts"): |
---|
| 69 | if old+variant in newpars: |
---|
| 70 | newpars[new+variant] = pars[old+variant] |
---|
| 71 | del newpars[old+variant] |
---|
| 72 | return newpars |
---|
| 73 | |
---|
| 74 | def _rescale_sld(pars): |
---|
| 75 | """ |
---|
| 76 | rescale all sld parameters in the new model definition by 1e6 so the |
---|
| 77 | numbers are nicer. Relies on the fact that all sld parameters in the |
---|
| 78 | new model definition end with sld. |
---|
| 79 | """ |
---|
| 80 | return dict((p, (v*1e6 if p.endswith('sld') else v)) |
---|
| 81 | for p,v in pars.items()) |
---|
| 82 | |
---|
| 83 | def convert_model(name, pars): |
---|
| 84 | """ |
---|
| 85 | Convert model from old style parameter names to new style. |
---|
| 86 | """ |
---|
| 87 | mapping = PARAMETER_MAP[name] |
---|
| 88 | newname = mapping['name'] |
---|
| 89 | newpars = _rescale_sld(_rename_pars(pars, mapping)) |
---|
| 90 | return newname, newpars |
---|
| 91 | |
---|
| 92 | def _unscale_sld(pars): |
---|
| 93 | """ |
---|
| 94 | rescale all sld parameters in the new model definition by 1e6 so the |
---|
| 95 | numbers are nicer. Relies on the fact that all sld parameters in the |
---|
| 96 | new model definition end with sld. |
---|
| 97 | """ |
---|
| 98 | return dict((p, (v*1e-6 if p.endswith('sld') else v)) |
---|
| 99 | for p,v in pars.items()) |
---|
| 100 | |
---|
| 101 | def revert_model(name, pars): |
---|
| 102 | """ |
---|
| 103 | Convert model from new style parameter names to old style. |
---|
| 104 | """ |
---|
| 105 | mapping = REVERSE_MAP[name] |
---|
| 106 | oldname = mapping['name'] |
---|
| 107 | oldpars = _rename_pars(_unscale_sld(pars), mapping) |
---|
| 108 | return oldname, oldpars |
---|
| 109 | |
---|