source: sasmodels/sasmodels/convert.py @ 03582f9

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 03582f9 was 03582f9, checked in by butler, 8 years ago

Add binary_hard_sphere to list that does not have a scale factor added.

  • Property mode set to 100644
File size: 4.6 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 and 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', 'two_lorentzian', 'gel_fit',
101                'binary_hard_sphere'):
102        if oldpars.pop('scale', 1.0) != 1.0:
103            warnings.warn("parameter scale not used in sasview %s"%name)
104    elif name in ('guinier',):
105        if oldpars.pop('background', 0.0) != 0.0:
106            warnings.warn("parameter background not used in sasview %s"%name)
107    elif getattr(model_definition, 'category', None) == 'structure-factor':
108        if oldpars.pop('scale', 1.0) != 1.0:
109            warnings.warn("parameter scale not used in sasview %s"%name)
110        if oldpars.pop('background', 0.0) != 0.0:
111            warnings.warn("parameter background not used in sasview %s"%name)
112    elif name == 'pearl_necklace':
113        _remove_pd(oldpars, 'num_pearls', name)
114        _remove_pd(oldpars, 'thick_string', name)
115    elif name == 'rpa':
116        # convert scattering lengths from femtometers to centimeters
117        for p in "La", "Lb", "Lc", "Ld":
118            if p in oldpars: oldpars[p] *= 1e-13
119
120    return oldname, oldpars
121
122def constrain_new_to_old(model_definition, pars):
123    """
124    Restrict parameter values to those that will match sasview.
125    """
126    # Note: update convert.revert_model to match
127    name = model_definition.name
128    if name in ('teubner_strey','broad_peak', 'two_lorentzian', 'gel_fit'):
129        pars['scale'] = 1
130    elif name in ('guinier',):
131        pars['background'] = 0
132    elif name == 'pearl_necklace':
133        pars['string_thickness_pd_n'] = 0
134        pars['number_of_pearls_pd_n'] = 0
135    elif name == 'rpa':
136        pars['case_num'] = int(pars['case_num'])
137    elif getattr(model_definition, 'category', None) == 'structure-factor':
138        pars['scale'], pars['background'] = 1, 0
139
Note: See TracBrowser for help on using the repository browser.