Changeset f88e248 in sasmodels for sasmodels/product.py
- Timestamp:
- Mar 6, 2017 11:40:14 AM (7 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 7e4a633
- Parents:
- 0c2da4b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/product.py
r9951a86 rf88e248 45 45 # structure factor calculator. Structure factors should not 46 46 # have any magnetic parameters 47 assert(s_info.parameters.kernel_parameters[0].id == ER_ID) 48 assert(s_info.parameters.kernel_parameters[1].id == VF_ID) 49 assert(s_info.parameters.magnetism_index == []) 47 if not s_info.parameters.kernel_parameters[0].id == ER_ID: 48 raise TypeError("S needs %s as first parameter"%ER_ID) 49 if not s_info.parameters.kernel_parameters[1].id == VF_ID: 50 raise TypeError("S needs %s as second parameter"%VF_ID) 51 if not s_info.parameters.magnetism_index == []: 52 raise TypeError("S should not have SLD parameters") 50 53 p_id, p_name, p_pars = p_info.id, p_info.name, p_info.parameters 51 54 s_id, s_name, s_pars = s_info.id, s_info.name, s_info.parameters 52 p_set = set(p.id for p in p_pars.call_parameters) 53 s_set = set(p.id for p in s_pars.call_parameters) 54 55 if p_set & s_set: 56 # there is some overlap between the parameter names; tag the 57 # overlapping S parameters with name_S. 58 # Skip the first parameter of s, which is effective radius 59 s_list = [(suffix_parameter(par) if par.id in p_set else par) 60 for par in s_pars.kernel_parameters[1:]] 61 else: 62 # Skip the first parameter of s, which is effective radius 63 s_list = s_pars.kernel_parameters[1:] 55 56 # Create list of parameters for the combined model. Skip the first 57 # parameter of S, which we verified above is effective radius. If there 58 # are any names in P that overlap with those in S, modify the name in S 59 # to distinguish it. 60 p_set = set(p.id for p in p_pars.kernel_parameters) 61 s_list = [(_tag_parameter(par) if par.id in p_set else par) 62 for par in s_pars.kernel_parameters[1:]] 63 # Check if still a collision after renaming. This could happen if for 64 # example S has volfrac and P has both volfrac and volfrac_S. 65 if any(p.id in p_set for p in s_list): 66 raise TypeError("name collision: P has P.name and P.name_S while S has S.name") 67 64 68 translate_name = dict((old.id, new.id) for old, new 65 69 in zip(s_pars.kernel_parameters[1:], s_list)) 66 70 demo = {} 67 demo.update((k, v) for k, v in p_info.demo.items() 68 if k not in ("background", "scale")) 71 demo.update(p_info.demo.items()) 69 72 demo.update((translate_name[k], v) for k, v in s_info.demo.items() 70 73 if k not in ("background", "scale") and not k.startswith(ER_ID)) … … 90 93 # Remember the component info blocks so we can build the model 91 94 model_info.composition = ('product', [p_info, s_info]) 92 model_info.demo = {} 95 model_info.demo = demo 96 97 ## Show the parameter table with the demo values 98 #from .compare import get_pars, parlist 99 #print("==== %s ====="%model_info.name) 100 #values = get_pars(model_info, use_demo=True) 101 #print(parlist(model_info, values, is2d=True)) 93 102 return model_info 94 103 95 def suffix_parameter(par, suffix): 104 def _tag_parameter(par): 105 """ 106 Tag the parameter name with _S to indicate that the parameter comes from 107 the structure factor parameter set. This is only necessary if the 108 form factor model includes a parameter of the same name as a parameter 109 in the structure factor. 110 """ 96 111 par = copy(par) 97 par.name = par.name + " S" 112 # Protect against a vector parameter in S by appending the vector length 113 # to the renamed parameter. Note: haven't tested this since no existing 114 # structure factor models contain vector parameters. 115 vector_length = par.name[len(par.id):] 98 116 par.id = par.id + "_S" 117 par.name = par.id + vector_length 99 118 return par 100 119
Note: See TracChangeset
for help on using the changeset viewer.