Changeset 9a66e65 in sasmodels for sasmodels/convert.py


Ignore:
Timestamp:
Dec 9, 2015 11:12:17 AM (8 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
716abe0
Parents:
dcef2ee
Message:

refactor sasmodels to sasview parameter conversion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/convert.py

    raa4946b r9a66e65  
    22Convert models to and from sasview. 
    33""" 
     4import warnings 
    45 
    5 def _rename_pars(pars, mapping): 
     6PD_DOT = [ 
     7    ("", ""), 
     8    ("_pd", ".width"), 
     9    ("_pd_n", ".npts"), 
     10    ("_pd_nsigma", ".nsigmas"), 
     11    ("_pd_type", ".type"), 
     12    ] 
     13def _convert_pars(pars, mapping): 
    614    """ 
    715    Rename the parameters and any associated polydispersity attributes. 
    816    """ 
    917    newpars = pars.copy() 
    10     for old,new in mapping.items(): 
     18    for new, old in mapping.items(): 
    1119        if old == new: continue 
    12         # Bumps style parameter names 
    13         for variant in ("", "_pd", "_pd_n", "_pd_nsigma", "_pd_type"): 
    14             if old+variant in newpars: 
     20        for pd, dot in PD_DOT: 
     21            if old+dot in newpars: 
    1522                if new is not None: 
    16                     newpars[new+variant] = pars[old+variant] 
    17                 del newpars[old+variant] 
    18         # Sasview style parameter names 
    19         for variant in (".width", ".nsigmas", ".type", ".npts"): 
    20             if old+variant in newpars: 
    21                 if new is not None: 
    22                     newpars[new+variant] = pars[old+variant] 
    23                 del newpars[old+variant] 
     23                    newpars[new+pd] = pars[old+dot] 
     24                del newpars[old+dot] 
    2425    return newpars 
    2526 
     
    5152                for p,v in pars.items()) 
    5253 
     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    for new, old in mapping.items(): 
     75        for pd, dot in PD_DOT: 
     76            if old+pd == new+dot: 
     77                continue 
     78            if new+pd in newpars: 
     79                if old is not None: 
     80                    newpars[old+dot] = pars[new+pd] 
     81                del newpars[new+pd] 
     82    return newpars 
     83 
    5384def revert_model(model_definition, pars): 
    5485    """ 
     
    5788    mapping = model_definition.oldpars 
    5889    oldname = model_definition.oldname 
    59     oldpars = _rename_pars(_unscale_sld(pars), mapping) 
     90    oldpars = _revert_pars(_unscale_sld(pars), mapping) 
     91 
     92    # Note: update compare.constrain_pars to match 
     93    name = model_definition.name 
     94    if name in ('teubner_strey', 'broad_peak'): 
     95        if oldpars.pop('scale', 1.0) != 1.0: 
     96            warnings.warn("parameter scale not used in sasview %s"%name) 
     97    elif name in ('guinier',): 
     98        if oldpars.pop('background', 0.0) != 0.0: 
     99            warnings.warn("parameter background not used in sasview %s"%name) 
     100    elif getattr(model_definition, 'category', None) == 'structure-factor': 
     101        if oldpars.pop('scale', 1.0) != 1.0: 
     102            warnings.warn("parameter scale not used in sasview %s"%name) 
     103        if oldpars.pop('background', 0.0) != 0.0: 
     104            warnings.warn("parameter background not used in sasview %s"%name) 
     105    elif name == 'pearl_necklace': 
     106        _remove_pd(oldpars, 'num_pearls', name) 
     107        _remove_pd(oldpars, 'thick_string', name) 
     108 
    60109    return oldname, oldpars 
    61110 
     111def constrain_new_to_old(model_definition, pars): 
     112    """ 
     113    Restrict parameter values to those that will match sasview. 
     114    """ 
     115    # Note: update convert.revert_model to match 
     116    name = model_definition.name 
     117    if name in ('teubner_strey','broad_peak'): 
     118        pars['scale'] = 1 
     119    elif name in ('guinier',): 
     120        pars['background'] = 0 
     121    elif name == 'pearl_necklace': 
     122        pars['string_thickness_pd_n'] = 0 
     123        pars['number_of_pearls_pd_n'] = 0 
     124    elif getattr(model_definition, 'category', None) == 'structure-factor': 
     125        pars['scale'], pars['background'] = 1, 0 
     126 
Note: See TracChangeset for help on using the changeset viewer.