source: sasmodels/sasmodels/convert.py @ 82c299f

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 82c299f was 82c299f, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

rpa model

  • Property mode set to 100644
File size: 4.5 KB
Line 
1"""
2Convert models to and from sasview.
3"""
4import warnings
5
6PD_DOT = [
7    ("", ""),
8    ("_pd", ".width"),
9    ("_pd_n", ".npts"),
10    ("_pd_nsigma", ".nsigmas"),
11    ("_pd_type", ".type"),
12    ]
13def _convert_pars(pars, mapping):
14    """
15    Rename the parameters and any associated polydispersity attributes.
16    """
17    newpars = pars.copy()
18    for new, old in mapping.items():
19        if old == new: continue
20        for pd, dot in PD_DOT:
21            if old+dot in newpars:
22                if new is not None:
23                    newpars[new+pd] = pars[old+dot]
24                del newpars[old+dot]
25    return newpars
26
27def _rescale_sld(pars):
28    """
29    rescale all sld parameters in the new model definition by 1e6 so the
30    numbers are nicer.  Relies on the fact that all sld parameters in the
31    new model definition end with sld.
32    """
33    return dict((p, (v*1e6 if p.endswith('sld') else v))
34                for p,v in pars.items())
35
36def convert_model(name, pars):
37    """
38    Convert model from old style parameter names to new style.
39    """
40    _,_ = name,pars # lint
41    raise NotImplementedError
42    # need to load all new models in order to determine old=>new
43    # model name mapping
44
45def _unscale_sld(pars):
46    """
47    rescale all sld parameters in the new model definition by 1e6 so the
48    numbers are nicer.  Relies on the fact that all sld parameters in the
49    new model definition end with sld.
50    """
51    return dict((p, (v*1e-6 if p.endswith('sld') else v))
52                for p,v in pars.items())
53
54def _remove_pd(pars, key, name):
55    """
56    Remove polydispersity from the parameter list.
57
58    Note: operates in place
59    """
60    # Bumps style parameter names
61    pd = pars.pop(key+".width", 0.0)
62    pd_n = pars.pop(key+".npts", 0)
63    if pd != 0.0 and pd_n != 0:
64        warnings.warn("parameter %s not polydisperse in sasview %s"%(key, name))
65    pars.pop(key+".nsigmas", None)
66    pars.pop(key+".type", None)
67    return pars
68
69def _revert_pars(pars, mapping):
70    """
71    Rename the parameters and any associated polydispersity attributes.
72    """
73    newpars = pars.copy()
74
75    for new, old in mapping.items():
76        for pd, dot in PD_DOT:
77            if old+pd == new+dot:
78                continue
79            if new+pd in newpars:
80                if old is not None:
81                    newpars[old+dot] = pars[new+pd]
82                del newpars[new+pd]
83    for k in list(newpars.keys()):
84        for pd, dot in PD_DOT[1:]:  # skip "" => ""
85            if k.endswith(pd):
86                newpars[k[:-len(pd)]+dot] = newpars[k]
87                del newpars[k]
88    return newpars
89
90def revert_model(model_definition, pars):
91    """
92    Convert model from new style parameter names to old style.
93    """
94    mapping = model_definition.oldpars
95    oldname = model_definition.oldname
96    oldpars = _revert_pars(_unscale_sld(pars), mapping)
97
98    # Note: update compare.constrain_pars to match
99    name = model_definition.name
100    if name in ('teubner_strey', 'broad_peak'):
101        if oldpars.pop('scale', 1.0) != 1.0:
102            warnings.warn("parameter scale not used in sasview %s"%name)
103    elif name in ('guinier',):
104        if oldpars.pop('background', 0.0) != 0.0:
105            warnings.warn("parameter background not used in sasview %s"%name)
106    elif getattr(model_definition, 'category', None) == 'structure-factor':
107        if oldpars.pop('scale', 1.0) != 1.0:
108            warnings.warn("parameter scale not used in sasview %s"%name)
109        if oldpars.pop('background', 0.0) != 0.0:
110            warnings.warn("parameter background not used in sasview %s"%name)
111    elif name == 'pearl_necklace':
112        _remove_pd(oldpars, 'num_pearls', name)
113        _remove_pd(oldpars, 'thick_string', name)
114    elif name == 'rpa':
115        # convert scattering lengths from femtometers to centimeters
116        for p in "La", "Lb", "Lc", "Ld":
117            if p in oldpars: oldpars[p] *= 1e-13
118
119    return oldname, oldpars
120
121def constrain_new_to_old(model_definition, pars):
122    """
123    Restrict parameter values to those that will match sasview.
124    """
125    # Note: update convert.revert_model to match
126    name = model_definition.name
127    if name in ('teubner_strey','broad_peak'):
128        pars['scale'] = 1
129    elif name in ('guinier',):
130        pars['background'] = 0
131    elif name == 'pearl_necklace':
132        pars['string_thickness_pd_n'] = 0
133        pars['number_of_pearls_pd_n'] = 0
134    elif name == 'rpa':
135        pars['case_num'] = int(pars['case_num'])
136    elif getattr(model_definition, 'category', None) == 'structure-factor':
137        pars['scale'], pars['background'] = 1, 0
138
Note: See TracBrowser for help on using the repository browser.