Changeset 256dfe1 in sasmodels for sasmodels/convert.py


Ignore:
Timestamp:
Jul 18, 2016 12:42:29 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:
c5ac2b2
Parents:
46ed760
Message:

allow comparison of multiplicity models with sasview 3.x

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/convert.py

    r7ae2b7f r256dfe1  
    22Convert models to and from sasview. 
    33""" 
     4from __future__ import print_function 
     5 
    46from os.path import join as joinpath, abspath, dirname 
    57import warnings 
     
    2830] 
    2931 
     32MODELS_WITHOUT_VOLFRACTION = [ 
     33    'fractal', 
     34    'vesicle', 
     35    'multilayer_vesicle', 
     36    'core_multi_shell', 
     37] 
     38 
     39 
    3040# Convert new style names for polydispersity info to old style names 
    3141PD_DOT = [ 
     
    103113    # model name mapping 
    104114 
     115def _unscale(par, scale): 
     116    return [pk*scale for pk in par] if isinstance(par, list) else par*scale 
     117 
    105118def _unscale_sld(pars): 
    106119    """ 
     
    109122    new model definition end with sld. 
    110123    """ 
    111     return dict((p, (v*1e-6 if p.startswith('sld') or p.endswith('sld') 
    112                      else v*1e15 if 'ndensity' in p 
     124    return dict((p, (_unscale(v,1e-6) if p.startswith('sld') or p.endswith('sld') 
     125                     else _unscale(v,1e15) if 'ndensity' in p 
    113126                     else v)) 
    114127                for p, v in pars.items()) 
     
    155168    return oldname 
    156169 
    157 def _get_old_pars(model_info): 
     170def _get_translation_table(model_info): 
    158171    _read_conversion_table() 
    159     oldname, oldpars = CONVERSION_TABLE.get(model_info.id, [None, {}]) 
     172    _, translation = CONVERSION_TABLE.get(model_info.id, [None, {}]) 
     173    translation = translation.copy() 
     174    for p in model_info.parameters.kernel_parameters: 
     175        if p.length > 1: 
     176            newid = p.id 
     177            oldid = translation.get(p.id, p.id) 
     178            del translation[newid] 
     179            for k in range(1, p.length+1): 
     180                translation[newid+str(k)] = oldid+str(k) 
     181    # Remove control parameter from the result 
     182    if model_info.control: 
     183        translation[model_info.control] = None 
     184    return translation 
     185 
     186def _trim_vectors(model_info, pars, oldpars): 
     187    _read_conversion_table() 
     188    _, translation = CONVERSION_TABLE.get(model_info.id, [None, {}]) 
     189    for p in model_info.parameters.kernel_parameters: 
     190        if p.length_control is not None: 
     191            n = int(pars[p.length_control]) 
     192            oldname = translation.get(p.id, p.id) 
     193            for k in range(n+1, p.length+1): 
     194                for _, old in PD_DOT: 
     195                    oldpars.pop(oldname+str(k)+old, None) 
    160196    return oldpars 
    161197 
     
    174210            raise NotImplementedError("cannot convert to sasview sum") 
    175211    else: 
    176         oldpars = _get_old_pars(model_info) 
    177     oldpars = _revert_pars(_unscale_sld(pars), oldpars) 
     212        translation = _get_translation_table(model_info) 
     213    oldpars = _revert_pars(_unscale_sld(pars), translation) 
     214    oldpars = _trim_vectors(model_info, pars, oldpars) 
    178215 
    179216 
     
    194231    namelist = name.split('*') if '*' in name else [name] 
    195232    for name in namelist: 
     233        if name in MODELS_WITHOUT_VOLFRACTION: 
     234            del oldpars['volfraction'] 
    196235        if name == 'stacked_disks': 
    197236            _remove_pd(oldpars, 'n_stacking', name) 
     
    211250        elif name in ['mono_gauss_coil','poly_gauss_coil']: 
    212251            del oldpars['i_zero'] 
    213         elif name == 'fractal': 
    214             del oldpars['volfraction'] 
    215         elif name == 'vesicle': 
    216             del oldpars['volfraction'] 
    217         elif name == 'multilayer_vesicle': 
    218             del oldpars['volfraction'] 
    219252 
    220253    return oldpars 
     
    240273    namelist = name.split('*') if '*' in name else [name] 
    241274    for name in namelist: 
     275        if name in MODELS_WITHOUT_VOLFRACTION: 
     276            pars['volfraction'] = 1 
    242277        if name == 'pearl_necklace': 
    243278            pars['string_thickness_pd_n'] = 0 
     
    252287        elif name == 'poly_gauss_coil': 
    253288            pars['i_zero'] = 1 
    254         elif name == 'fractal': 
    255             pars['volfraction'] = 1 
    256         elif name == 'vesicle': 
    257             pars['volfraction'] = 1 
    258         elif name == 'multilayer_vesicle': 
    259             pars['volfraction'] = 1 
    260              
     289 
Note: See TracChangeset for help on using the changeset viewer.