Changes in / [faf83f2:4c8a5b4] in sasmodels
- Location:
- sasmodels
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/conversion_table.py
rbb584b3 rfa6d6fc 5 5 names for each parameter in sasmodels. This is used by :mod:`convert` to 6 6 determine the equivalent parameter set when comparing a sasmodels model to 7 the models defined in previous versions of SasView and sasmodels. This is now 8 versioned based on the version number of SasView. 9 10 When any sasmodels parameter or model name is changed, this must be modified to 11 account for that. 12 13 Usage: 14 <old_Sasview_version> : { 15 <new_model_name> : [ 16 <old_model_name> , 17 { 18 <new_param_name_1> : <old_param_name_1>, 19 ... 20 <new_param_name_n> : <old_param_name_n> 21 } 22 ] 23 } 24 25 Any future parameter and model name changes can and should be given in this 26 table for future compatibility. 7 the models defined in SasView 3.1. 27 8 """ 28 9 10 29 11 CONVERSION_TABLE = { 30 (3,1,2) : {31 12 "adsorbed_layer": [ 32 13 "Core2ndMomentModel", … … 230 211 ], 231 212 "correlation_length": [ 232 "CorrLength ",213 "CorrLengthModel", 233 214 { 234 215 "porod_scale": "scale_p", … … 237 218 "lorentz_exp": "exponent_l", 238 219 "cor_length": "length_l" 239 }, 240 "CorrLengthModel" 220 } 241 221 ], 242 222 "cylinder": [ … … 319 299 ], 320 300 "fractal_core_shell": [ 321 "FractalCoreShell ",301 "FractalCoreShellModel", 322 302 { 323 303 "sld_core": "core_sld", … … 329 309 "cor_length": "cor_length", 330 310 "volfraction": "volfraction", 331 }, 332 "FractalCoreShellModel" 311 } 333 312 ], 334 313 "fuzzy_sphere": [ … … 342 321 ], 343 322 "gauss_lorentz_gel": [ 344 "GaussLorentzGel ",323 "GaussLorentzGelModel", 345 324 { 346 325 "gauss_scale": "scale_g", … … 349 328 "background": "background", 350 329 "lorentz_scale": "scale_l" 351 }, 352 "GaussLorentzGelModel" 330 } 353 331 ], 354 332 "gaussian_peak": [ 355 "Peak GaussModel",333 "PeakGaussModel", 356 334 { 357 335 "peak_pos": "q0", 358 336 "sigma": "B", 359 }, 360 "PeakGaussModel", 337 } 361 338 ], 362 339 "gel_fit": [ … … 366 343 "lorentz_scale": "lScale", 367 344 "guinier_scale": "gScale", 368 "fractal_dim": " FractalExp",345 "fractal_dim": "scale", 369 346 "cor_length": "zeta", 370 347 } 371 348 ], 372 349 "guinier": [ 373 "Guinier ",350 "GuinierModel", 374 351 { 375 352 "rg": "rg" 376 }, 377 "GuinierModel", 353 } 378 354 ], 379 355 "guinier_porod": [ 380 "GuinierPorod ",356 "GuinierPorodModel", 381 357 { 382 358 "s": "dim", … … 385 361 "scale": "scale", 386 362 "background": "background" 387 }, 388 "GuinierPorodModel", 363 } 389 364 ], 390 365 "hardsphere": [ … … 479 454 "d_spacing": "spacing", 480 455 "Caille_parameter": "caille", 481 "Nlayers": " n_plates",456 "Nlayers": "N_plates", 482 457 } 483 458 ], … … 511 486 ], 512 487 "lorentz": [ 513 "Lorentz ",488 "LorentzModel", 514 489 { 515 490 "cor_length": "length" 516 }, 517 "LorentzModel", 491 } 518 492 ], 519 493 "mass_fractal": [ … … 536 510 ], 537 511 "mono_gauss_coil": [ 538 "Debye ",512 "DebyeModel", 539 513 { 540 514 "rg": "rg", 541 515 "i_zero": "scale", 542 516 "background": "background", 543 }, 544 "DebyeModel", 517 } 545 518 ], 546 519 "multilayer_vesicle": [ … … 591 564 ], 592 565 "peak_lorentz": [ 593 "Peak LorentzModel",566 "PeakLorentzModel", 594 567 { 595 568 "peak_pos": "q0", 596 569 "peak_hwhm": "B" 597 }, 598 "PeakLorentzModel", 570 } 599 571 ], 600 572 "pearl_necklace": [ … … 830 802 ], 831 803 "two_lorentzian": [ 832 "TwoLorentzian ",804 "TwoLorentzianModel", 833 805 { 834 806 "lorentz_scale_1": "scale_1", … … 839 811 "lorentz_length_1": "length_1", 840 812 "background": "background" 841 }, 842 "TwoLorentzianModel", 813 } 843 814 ], 844 815 "two_power_law": [ 845 "TwoPowerLaw ",816 "TwoPowerLawModel", 846 817 { 847 818 "coefficent_1": "coef_A", … … 850 821 "background": "background", 851 822 "crossover": "qc" 852 }, 853 "TwoPowerLawModel", 823 } 854 824 ], 855 825 "unified_power_Rg": [ 856 "UnifiedPowerRg",857 dict(((field_new+str(index), field_old+str(index))858 for field_new, field_old in [("rg", "Rg"),859 ("power", "power"),860 ("G", "G"),861 ("B", "B"),]862 for index in range(11)),863 **{864 "background": "background",865 "scale": "scale",866 }),867 826 "UnifiedPowerRgModel", 827 { 828 } 868 829 ], 869 830 "vesicle": [ … … 874 835 } 875 836 ] 876 }877 837 } -
sasmodels/convert.py
r07c8d46 rf80f334 53 53 ("_pd_nsigma", ".nsigmas"), 54 54 ("_pd_type", ".type"), 55 (".lower", ".lower"),56 (".upper", ".upper"),57 (".fittable", ".fittable"),58 (".std", ".std"),59 (".units", ".units"),60 ("", "")61 55 ] 62 56 … … 70 64 if id.startswith('M0:'): 71 65 return True 66 if id.startswith('volfraction') or id.startswith('radius_effective'): 67 return False 72 68 if '_pd' in id or '.' in id: 73 69 return False … … 79 75 if p.id == id: 80 76 return p.type == 'sld' 81 r eturn False77 raise ValueError("unknown parameter %r in conversion"%id) 82 78 83 79 def _rescale_sld(model_info, pars, scale): … … 92 88 93 89 94 def _get_translation_table(model_info , version=(3,1,2)):95 conv_param = CONVERSION_TABLE.get(version, {}).get(model_info.id, [None, {}])96 translation = conv_param[1].copy()90 def _get_translation_table(model_info): 91 _, translation = CONVERSION_TABLE.get(model_info.id, [None, {}]) 92 translation = translation.copy() 97 93 for p in model_info.parameters.kernel_parameters: 98 94 if p.length > 1: … … 123 119 def _pd_to_underscores(pars): 124 120 return dict((_dot_pd_to_underscore_pd(k), v) for k, v in pars.items()) 121 122 def _convert_name(conv_dict, pars): 123 """ 124 Renames parameter values (upper, lower, etc) to v4.0 names 125 :param conv_dict: conversion dictionary mapping new name : old name 126 :param pars: parameters to convert 127 :return: 128 """ 129 new_pars = {} 130 i = 0 131 j = 0 132 for key_par, value_par in pars.iteritems(): 133 j += 1 134 for key_conv, value_conv in conv_dict.iteritems(): 135 if re.search(value_conv, key_par): 136 new_pars[key_par.replace(value_conv, key_conv)] = value_par 137 i += 1 138 break 139 elif re.search("background", key_par) or re.search("scale", key_par): 140 new_pars[key_par] = value_par 141 i += 1 142 break 143 if i != j: 144 new_pars[key_par] = value_par 145 i += 1 146 return new_pars 125 147 126 148 def _convert_pars(pars, mapping): … … 145 167 return newpars 146 168 147 def _conversion_target(model_name, version=(3,1,2)): 169 170 def _conversion_target(model_name): 148 171 """ 149 172 Find the sasmodel name which translates into the sasview name. … … 153 176 two variants in sasview. 154 177 """ 155 for sasmodels_name, sasview_dict in \ 156 CONVERSION_TABLE.get(version, {}).items(): 157 if sasview_dict[0] == model_name: 178 for sasmodels_name, [sasview_name, _] in CONVERSION_TABLE.items(): 179 if sasview_name == model_name: 158 180 return sasmodels_name 159 181 return None 160 182 161 def _hand_convert(name, oldpars, version=(3,1,2)): 162 if version == (3,1,2): 163 oldpars = _hand_convert_3_1_2_to_4_1(name, oldpars) 164 return oldpars 165 166 def _hand_convert_3_1_2_to_4_1(name, oldpars): 183 184 def _hand_convert(name, oldpars): 167 185 if name == 'core_shell_parallelepiped': 168 186 # Make sure pd on rim parameters defaults to zero … … 197 215 pd = oldpars['radius.width']*oldpars['radius']/thickness 198 216 oldpars['radius.width'] = pd 199 elif name == 'multilayer_vesicle':200 if 'scale' in oldpars:201 oldpars['volfraction'] = oldpars['scale']202 oldpars['scale'] = 1.0203 if 'scale.lower' in oldpars:204 oldpars['volfraction.lower'] = oldpars['scale.lower']205 if 'scale.upper' in oldpars:206 oldpars['volfraction.upper'] = oldpars['scale.upper']207 if 'scale.fittable' in oldpars:208 oldpars['volfraction.fittable'] = oldpars['scale.fittable']209 if 'scale.std' in oldpars:210 oldpars['volfraction.std'] = oldpars['scale.std']211 if 'scale.units' in oldpars:212 oldpars['volfraction.units'] = oldpars['scale.units']213 217 elif name == 'pearl_necklace': 214 218 pass … … 232 236 oldpars[p + ".upper"] /= 1e-13 233 237 elif name == 'spherical_sld': 234 j = 0 235 while "func_inter" + str(j) in oldpars: 236 name = "func_inter" + str(j) 237 new_name = "shape" + str(j + 1) 238 if oldpars[name] == 'Erf(|nu|*z)': 239 oldpars[new_name] = int(0) 240 elif oldpars[name] == 'RPower(z^|nu|)': 241 oldpars[new_name] = int(1) 242 elif oldpars[name] == 'LPower(z^|nu|)': 243 oldpars[new_name] = int(2) 244 elif oldpars[name] == 'RExp(-|nu|*z)': 245 oldpars[new_name] = int(3) 246 elif oldpars[name] == 'LExp(-|nu|*z)': 247 oldpars[new_name] = int(4) 248 else: 249 oldpars[new_name] = int(0) 250 oldpars.pop(name) 251 oldpars['n_shells'] = str(j + 1) 252 j += 1 238 oldpars["CONTROL"] += 1 253 239 elif name == 'teubner_strey': 254 240 # basically undoing the entire Teubner-Strey calculations here. … … 295 281 return oldpars 296 282 297 def convert_model(name, pars, use_underscore=False , model_version=(3,1,2)):283 def convert_model(name, pars, use_underscore=False): 298 284 """ 299 285 Convert model from old style parameter names to new style. 300 286 """ 301 newpars = pars 302 keys = sorted(CONVERSION_TABLE.keys()) 303 for i, version in enumerate(keys): 304 # Don't allow indices outside list 305 next_i = i + 1 306 if next_i == len(keys): 307 next_i = i 308 # If the save state is from a later version, skip the check 309 if model_version <= keys[next_i]: 310 newname = _conversion_target(name, version) 311 else: 312 newname = None 313 # If no conversion is found, move on 314 if newname is None: 315 newname = name 316 continue 317 if ':' in newname: # core_shell_ellipsoid:1 318 model_info = load_model_info(newname[:-2]) 319 # Know the table exists and isn't multiplicity so grab it directly 320 # Can't use _get_translation_table since that will return the 'bare' 321 # version. 322 translation = CONVERSION_TABLE.get(version, {})[newname][1] 323 else: 324 model_info = load_model_info(newname) 325 translation = _get_translation_table(model_info, version) 326 newpars = _hand_convert(newname, newpars, version) 327 newpars = _convert_pars(newpars, translation) 328 # TODO: Still not convinced this is the best check 329 if not model_info.structure_factor and version == (3,1,2): 330 newpars = _rescale_sld(model_info, newpars, 1e6) 331 newpars.setdefault('scale', 1.0) 332 newpars.setdefault('background', 0.0) 333 if use_underscore: 334 newpars = _pd_to_underscores(newpars) 335 name = newname 287 newname = _conversion_target(name) 288 if newname is None: 289 return name, pars 290 if ':' in newname: # core_shell_ellipsoid:1 291 model_info = load_model_info(newname[:-2]) 292 # Know that the table exists and isn't multiplicity so grab it directly 293 # Can't use _get_translation_table since that will return the 'bare' 294 # version. 295 translation = CONVERSION_TABLE[newname][1] 296 else: 297 model_info = load_model_info(newname) 298 translation = _get_translation_table(model_info) 299 newpars = _hand_convert(newname, pars.copy()) 300 newpars = _convert_name(translation, newpars) 301 newpars = _convert_pars(newpars, translation) 302 if not model_info.structure_factor: 303 newpars = _rescale_sld(model_info, newpars, 1e6) 304 newpars.setdefault('scale', 1.0) 305 newpars.setdefault('background', 0.0) 306 if use_underscore: 307 newpars = _pd_to_underscores(newpars) 336 308 return newname, newpars 309 337 310 338 311 # ========= BACKWARD CONVERSION sasmodels => sasview 3.x =========== -
sasmodels/kernelcl.py
rb8ddf2e r7fcdc9f 465 465 # architectures tested so far. 466 466 if self.is_2d: 467 # Note: 16 rather than 15 because result is 1 longer than input. 468 width = ((self.nq+16)//16)*16 467 # Note: 17 rather than 15 because results is 2 elements 468 # longer than input. 469 width = ((self.nq+17)//16)*16 469 470 self.q = np.empty((width, 2), dtype=dtype) 470 471 self.q[:self.nq, 0] = q_vectors[0] 471 472 self.q[:self.nq, 1] = q_vectors[1] 472 473 else: 473 # Note: 32 rather than 31 because result is 1 longer than input. 474 width = ((self.nq+32)//32)*32 474 # Note: 33 rather than 31 because results is 2 elements 475 # longer than input. 476 width = ((self.nq+33)//32)*32 475 477 self.q = np.empty(width, dtype=dtype) 476 478 self.q[:self.nq] = q_vectors[0] … … 522 524 self.dim = '2d' if q_input.is_2d else '1d' 523 525 # plus three for the normalization values 524 self.result = np.empty(q_input.nq+ 1, dtype)526 self.result = np.empty(q_input.nq+3, dtype) 525 527 526 528 # Inputs and outputs for each kernel call -
sasmodels/sasview_model.py
r64614ad r64614ad 57 57 import sas.models 58 58 from sasmodels.conversion_table import CONVERSION_TABLE 59 for new_name, conversion in CONVERSION_TABLE. get((3,1,2), {}).items():59 for new_name, conversion in CONVERSION_TABLE.items(): 60 60 # CoreShellEllipsoidModel => core_shell_ellipsoid:1 61 61 new_name = new_name.split(':')[0] 62 old_name = conversion[0] if len(conversion) < 3 else conversion[2]62 old_name = conversion[0] 63 63 module_attrs = {old_name: find_model(new_name)} 64 64 ConstructedModule = type(old_name, (), module_attrs)
Note: See TracChangeset
for help on using the changeset viewer.