Changeset e3571cb in sasmodels


Ignore:
Timestamp:
Oct 21, 2017 8:57:43 PM (6 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
2bccb5a
Parents:
6773b02
Message:

allow comparison of 1D with integrated 2D

Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/compare.py

    r3c24ccd re3571cb  
    8383    -pars/-nopars* prints the parameter set or not 
    8484    -default/-demo* use demo vs default parameters 
     85    -sphere[=150] set up spherical integration over theta/phi using n points 
    8586 
    8687    === calculation options === 
    87     -mono*/-poly force monodisperse or allow polydisperse demo parameters 
     88    -mono*/-poly force monodisperse or allow polydisperse random parameters 
    8889    -cutoff=1e-5* cutoff value for including a point in polydispersity 
    8990    -magnetic/-nonmagnetic* suppress magnetism 
     
    279280        # orientation in [-180,180], orientation pd in [0,45] 
    280281        if p.endswith('_pd'): 
    281             return 0., 45. 
     282            return 0., 180. 
    282283        else: 
    283284            return -180., 180. 
     
    434435 
    435436 
     437def limit_dimensions(model_info, pars, maxdim): 
     438    # type: (ModelInfo, ParameterSet, float) -> None 
     439    """ 
     440    Limit parameters of units of Ang to maxdim. 
     441    """ 
     442    for p in model_info.parameters.call_parameters: 
     443        value = pars[p.name] 
     444        if p.units == 'Ang' and value > maxdim: 
     445            pars[p.name] = maxdim*10**np.random.uniform(-3,0) 
     446 
    436447def constrain_pars(model_info, pars): 
    437448    # type: (ModelInfo, ParameterSet) -> None 
     
    496507    Format the parameter list for printing. 
    497508    """ 
     509    is2d = True 
    498510    lines = [] 
    499511    parameters = model_info.parameters 
     
    817829 
    818830 
    819 def compare(opts, limits=None): 
     831def compare(opts, limits=None, maxdim=np.inf): 
    820832    # type: (Dict[str, Any], Optional[Tuple[float, float]]) -> Tuple[float, float] 
    821833    """ 
     
    828840    as the values are adjusted, making it easier to see the effects of the 
    829841    parameters. 
     842 
     843    *maxdim* is the maximum value for any parameter with units of Angstrom. 
    830844    """ 
    831845    for k in range(opts['sets']): 
    832         opts['pars'] = parse_pars(opts) 
     846        if k > 1: 
     847            # print a separate seed for each dataset for better reproducibility 
     848            new_seed = np.random.randint(1000000) 
     849            print("Set %d uses -random=%i"%(k+1,new_seed)) 
     850            np.random.seed(new_seed) 
     851        opts['pars'] = parse_pars(opts, maxdim=maxdim) 
    833852        if opts['pars'] is None: 
    834853            return 
     
    971990        #err,errstr = base/comp,"ratio" 
    972991        plot_theory(data, None, resid=err, view=errview, use_data=use_data) 
    973         if view == 'linear': 
    974             plt.xscale('linear') 
     992        plt.xscale('log' if view == 'log' else linear) 
     993        plt.legend(['P%d'%(k+1) for k in range(setnum+1)], loc='best') 
    975994        plt.title("max %s = %.3g"%(errstr, abs(err).max())) 
    976995        #cbar_title = errstr if errview=="linear" else "log "+errstr 
     
    10191038    'demo', 'default',  # TODO: remove demo/default 
    10201039    'nopars', 'pars', 
     1040    'sphere', 'sphere=', # integrate over a sphere in 2d with n points 
    10211041 
    10221042    # Calculation options 
     
    11531173        'sets'      : 0, 
    11541174        'engine'    : 'default', 
    1155         'evals'     : '1', 
     1175        'count'     : '1', 
    11561176        'show_weights' : False, 
     1177        'sphere'    : 0, 
    11571178    } 
    11581179    for arg in flags: 
     
    11791200        elif arg.startswith('-data='):     opts['datafile'] = arg[6:] 
    11801201        elif arg.startswith('-engine='):   opts['engine'] = arg[8:] 
    1181         elif arg.startswith('-neval='):    opts['evals'] = arg[7:] 
     1202        elif arg.startswith('-neval='):    opts['count'] = arg[7:] 
     1203        elif arg.startswith('-sphere'): 
     1204            opts['sphere'] = int(arg[8:]) if len(arg) > 7 else 150 
     1205            opts['is2d'] = True 
    11821206        elif arg == '-random':  opts['seed'] = np.random.randint(1000000) 
    11831207        elif arg == '-preset':  opts['seed'] = -1 
     
    12381262 
    12391263    if PAR_SPLIT in opts['engine']: 
    1240         engine_types = opts['engine'].split(PAR_SPLIT, 2) 
     1264        opts['engine'] = opts['engine'].split(PAR_SPLIT, 2) 
    12411265        comparison = True 
    12421266    else: 
    1243         engine_types = [opts['engine']]*2 
    1244  
    1245     if PAR_SPLIT in opts['evals']: 
    1246         evals = [int(k) for k in opts['evals'].split(PAR_SPLIT, 2)] 
     1267        opts['engine'] = [opts['engine']]*2 
     1268 
     1269    if PAR_SPLIT in opts['count']: 
     1270        opts['count'] = [int(k) for k in opts['count'].split(PAR_SPLIT, 2)] 
    12471271        comparison = True 
    12481272    else: 
    1249         evals = [int(opts['evals'])]*2 
     1273        opts['count'] = [int(opts['count'])]*2 
    12501274 
    12511275    if PAR_SPLIT in opts['cutoff']: 
    1252         cutoff = [float(k) for k in opts['cutoff'].split(PAR_SPLIT, 2)] 
     1276        opts['cutoff'] = [float(k) for k in opts['cutoff'].split(PAR_SPLIT, 2)] 
    12531277        comparison = True 
    12541278    else: 
    1255         cutoff = [float(opts['cutoff'])]*2 
    1256  
    1257     base = make_engine(model_info[0], data, engine_types[0], cutoff[0]) 
     1279        opts['cutoff'] = [float(opts['cutoff'])]*2 
     1280 
     1281    base = make_engine(model_info[0], data, opts['engine'][0], opts['cutoff'][0]) 
    12581282    if comparison: 
    1259         comp = make_engine(model_info[1], data, engine_types[1], cutoff[1]) 
     1283        comp = make_engine(model_info[1], data, opts['engine'][1], opts['cutoff'][1]) 
    12601284    else: 
    12611285        comp = None 
     
    12661290        'data'      : data, 
    12671291        'name'      : names, 
    1268         'def'       : model_info, 
    1269         'count'     : evals, 
     1292        'info'      : model_info, 
    12701293        'engines'   : [base, comp], 
    12711294        'values'    : values, 
     
    12731296    # pylint: enable=bad-whitespace 
    12741297 
     1298    # Set the integration parameters to the half sphere 
     1299    if opts['sphere'] > 0: 
     1300        set_spherical_integration_parameters(opts, opts['sphere']) 
     1301 
    12751302    return opts 
    12761303 
    1277 def parse_pars(opts): 
    1278     model_info, model_info2 = opts['def'] 
     1304def set_spherical_integration_parameters(opts, steps): 
     1305    """ 
     1306    Set integration parameters for spherical integration over the entire 
     1307    surface in theta-phi coordinates. 
     1308    """ 
     1309    # Set the integration parameters to the half sphere 
     1310    opts['values'].extend([ 
     1311        'theta=90', 
     1312        'theta_pd=%g'%(90/np.sqrt(3)), 
     1313        'theta_pd_n=%d'%steps, 
     1314        'theta_pd_type=rectangle', 
     1315        'phi=0', 
     1316        'phi_pd=%g'%(180/np.sqrt(3)), 
     1317        'phi_pd_n=%d'%(2*steps), 
     1318        'phi_pd_type=rectangle', 
     1319        #'background=0', 
     1320    ]) 
     1321    if 'psi' in opts['info'][0].parameters: 
     1322        opts['values'].append('psi=0') 
     1323 
     1324def parse_pars(opts, maxdim=np.inf): 
     1325    model_info, model_info2 = opts['info'] 
    12791326 
    12801327    # Get demo parameters from model definition, or use default parameters 
     
    12871334    if opts['seed'] > -1: 
    12881335        pars = randomize_pars(model_info, pars) 
     1336        limit_dimensions(model_info, pars, maxdim) 
    12891337        if model_info != model_info2: 
    12901338            pars2 = randomize_pars(model_info2, pars2) 
     1339            limit_dimensions(model_info, pars2, maxdim) 
    12911340            # Share values for parameters with the same name 
    12921341            for k, v in pars.items(): 
     
    13651414    from . import rst2html 
    13661415 
    1367     info = opts['def'][0] 
     1416    info = opts['info'][0] 
    13681417    html = make_html(info) 
    13691418    path = os.path.dirname(info.filename) 
     
    14161465        opts['pars'] = list(opts['pars']) 
    14171466        p1, p2 = opts['pars'] 
    1418         m1, m2 = opts['def'] 
     1467        m1, m2 = opts['info'] 
    14191468        self.fix_p2 = m1 != m2 or p1 != p2 
    14201469        model_info = m1 
  • sasmodels/data.py

    rfbb9397 re3571cb  
    363363    if hasattr(data, 'isSesans') and data.isSesans: 
    364364        _plot_result_sesans(data, None, None, use_data=True, limits=limits) 
    365     elif hasattr(data, 'qx_data'): 
     365    elif hasattr(data, 'qx_data') and not getattr(data, 'radial', False): 
    366366        _plot_result2D(data, None, None, view, use_data=True, limits=limits) 
    367367    else: 
     
    391391    if hasattr(data, 'isSesans') and data.isSesans: 
    392392        _plot_result_sesans(data, theory, resid, use_data=True, limits=limits) 
    393     elif hasattr(data, 'qx_data'): 
     393    elif hasattr(data, 'qx_data') and not getattr(data, 'radial', False): 
    394394        _plot_result2D(data, theory, resid, view, use_data, limits=limits) 
    395395    else: 
     
    425425    import matplotlib.pyplot as plt  # type: ignore 
    426426    from numpy.ma import masked_array, masked  # type: ignore 
     427 
     428    if getattr(data, 'radial', False): 
     429        radial_data.x = radial_data.q_data 
     430        radial_data.y = radial_data.data 
    427431 
    428432    use_data = use_data and data.y is not None 
  • sasmodels/modelinfo.py

    r8698a0d re3571cb  
    502502            raise KeyError("unknown parameter %r"%key) 
    503503        return par 
     504 
     505    def __contains__(self, key): 
     506        for par in self.call_parameters: 
     507            if par.name == key: 
     508                return True 
     509        else: 
     510            return False 
    504511 
    505512    def _set_vector_lengths(self): 
Note: See TracChangeset for help on using the changeset viewer.