Changeset f3d7abd in sasmodels
- Timestamp:
- Mar 19, 2016 6:52:55 AM (9 years ago)
- 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:
- 01eece6
- Parents:
- 72a081d (diff), d459d4e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
example/sesansfit.py
rbfea0c2 rd459d4e 42 42 dy = err_data 43 43 sample = Sample() 44 needs_all_q= acceptance_angle is not None44 has_no_finite_acceptance = acceptance_angle is not None 45 45 data = SESANSData1D() 46 46 data.acceptance_angle = acceptance_angle 47 47 48 data. needs_all_q= acceptance_angle is not None48 data.has_no_finite_acceptance = acceptance_angle is not None 49 49 if "radius" in initial_vals: 50 50 radius = initial_vals.get("radius") -
sasmodels/sesans.py
ra06430c rd459d4e 1 1 """ 2 Conversion of scattering cross section from SANS in absolute 3 units into SESANS using a Hankel transformation 2 Conversion of scattering cross section from SANS (I(q), or rather, ds/dO) in absolute 3 units (cm-1)into SESANS correlation function G using a Hankel transformation, then converting 4 the SESANS correlation function into polarisation from the SESANS experiment 4 5 5 Everything is in units of metres except specified otherwise 6 Everything is in units of metres except specified otherwise (NOT TRUE!!!) 7 Everything is in conventional units (nm for spin echo length) 6 8 7 9 Wim Bouwman (w.g.bouwman@tudelft.nl), June 2013 … … 18 20 r""" 19 21 Return a $q$ vector suitable for SESANS covering from $2\pi/ (10 R_{\max})$ 20 to $q_max$. 22 to $q_max$. This is the integration range of the Hankel transform; bigger range and 23 more points makes a better numerical integration. 24 Smaller q_min will increase reliable spin echo length range. 25 Rmax is the "radius" of the largest expected object and can be set elsewhere. 26 q_max is determined by the acceptance angle of the SESANS instrument. 21 27 """ 22 28 q_min = dq = 0.1 * 2*pi / Rmax … … 24 30 25 31 def make_all_q(data): 26 if not data.needs_all_q: 32 """ 33 Return a $q$ vector suitable for calculating the total scattering cross section for 34 calculating the effect of finite acceptance angles on Time of Flight SESANS instruments. 35 If no acceptance is given, or unwanted (set "unwanted" flag in paramfile), no all_q vector is needed. 36 If the instrument has a rectangular acceptance, 2 all_q vectors are needed. 37 If the instrument has a circular acceptance, 1 all_q vector is needed 38 39 """ 40 if not data.has_no_finite_acceptance: 27 41 return [] 28 elif needs_Iqxy(data):42 elif data.has_yz_acceptance(data): 29 43 # compute qx, qy 30 44 Qx, Qy = np.meshgrid(qx, qy) … … 32 46 else: 33 47 # else only need q 48 # data.has_z_acceptance 34 49 return [q] 35 50 36 51 def transform(data, q_calc, Iq_calc, qmono, Iq_mono): 52 """ 53 Decides which transform type is to be used, based on the experiment data file contents (header) 54 (2016-03-19: currently controlled from parameters script) 55 nqmono is the number of q vectors to be used for the detector integration 56 """ 37 57 nqmono = len(qmono) 38 58 if nqmono == 0: … … 62 82 q_calc, Iq_calc) 63 83 64 def Cosine2D(data, q_calc, Iq_calc, qx, qy, Iq_mono):84 def call_Cosine2D(data, q_calc, Iq_calc, qx, qy, Iq_mono): 65 85 return hankel(data.x, data.y, data.lam * 1e-9, 66 86 data.sample.thickness / 10, -
sasmodels/compare.py
raf92b73 r72a081d 369 369 model = MultiplicationModel(P, S) 370 370 else: 371 raise ValueError(" mixture models not handled yet")371 raise ValueError("sasview mixture models not supported by compare") 372 372 else: 373 373 model = get_model(model_info['oldname']) … … 424 424 Return a model calculator using the OpenCL calculation engine. 425 425 """ 426 def builder(model_info): 427 try: 428 return core.build_model(model_info, dtype=dtype, platform="ocl") 429 except Exception as exc: 430 print(exc) 431 print("... trying again with single precision") 432 return core.build_model(model_info, dtype='single', platform="ocl") 433 if model_info['composition']: 434 composition_type, parts = model_info['composition'] 435 if composition_type == 'product': 436 P, S = [builder(p) for p in parts] 437 model = product.ProductModel(P, S) 438 else: 439 raise ValueError("mixture models not handled yet") 440 else: 441 model = builder(model_info) 426 try: 427 model = core.build_model(model_info, dtype=dtype, platform="ocl") 428 except Exception as exc: 429 print(exc) 430 print("... trying again with single precision") 431 model = core.build_model(model_info, dtype='single', platform="ocl") 442 432 calculator = DirectModel(data, model, cutoff=cutoff) 443 433 calculator.engine = "OCL%s"%DTYPE_MAP[dtype] … … 450 440 if dtype == 'quad': 451 441 dtype = 'longdouble' 452 def builder(model_info): 453 return core.build_model(model_info, dtype=dtype, platform="dll") 454 455 if model_info['composition']: 456 composition_type, parts = model_info['composition'] 457 if composition_type == 'product': 458 P, S = [builder(p) for p in parts] 459 model = product.ProductModel(P, S) 460 else: 461 raise ValueError("mixture models not handled yet") 462 else: 463 model = builder(model_info) 442 model = core.build_model(model_info, dtype=dtype, platform="dll") 464 443 calculator = DirectModel(data, model, cutoff=cutoff) 465 444 calculator.engine = "OMP%s"%DTYPE_MAP[dtype] … … 715 694 print("expected parameters: model N1 N2") 716 695 717 def _get_info(name):718 try:719 model_info = core.load_model_info(name)720 except ImportError, exc:721 print(str(exc))722 print("Use one of:\n " + models)723 sys.exit(1)724 return model_info725 726 696 name = args[0] 727 if '*' in name: 728 parts = [_get_info(k) for k in name.split('*')] 729 model_info = product.make_product_info(*parts) 730 else: 731 model_info = _get_info(name) 697 try: 698 model_info = core.load_model_info(name) 699 except ImportError, exc: 700 print(str(exc)) 701 print("Could not find model; use one of:\n " + models) 702 sys.exit(1) 732 703 733 704 invalid = [o[1:] for o in flags … … 749 720 'res' : 0.0, 750 721 'accuracy' : 'Low', 751 'cutoff' : 1e-5,722 'cutoff' : 0.0, 752 723 'seed' : -1, # default to preset 753 724 'mono' : False, -
sasmodels/core.py
rd5ba841 r72a081d 3 3 """ 4 4 5 from os.path import basename, dirname, join as joinpath 5 from os.path import basename, dirname, join as joinpath, splitext 6 6 from glob import glob 7 import imp 7 8 8 9 import numpy as np … … 11 12 from . import weights 12 13 from . import generate 13 14 # TODO: remove circular references between product and core 15 # product uses call_ER/call_VR, core uses make_product_info/ProductModel 16 #from . import product 17 from . import mixture 14 18 from . import kernelpy 15 19 from . import kerneldll … … 46 50 Load model info and build model. 47 51 """ 52 return build_model(load_model_info(model_name), **kw) 53 54 def load_model_info_from_path(path): 55 # Pull off the last .ext if it exists; there may be others 56 name = basename(splitext(path)[0]) 57 58 # Not cleaning name since don't need to be able to reload this 59 # model later 60 # Should probably turf the model from sys.modules after we are done... 61 62 # Placing the model in the 'sasmodels.custom' name space, even 63 # though it doesn't actually exist. imp.load_source doesn't seem 64 # to care. 65 kernel_module = imp.load_source('sasmodels.custom.'+name, path) 66 67 # Now that we have the module, we can load it as usual 68 model_info = generate.make_model_info(kernel_module) 69 return model_info 70 71 def load_model_info(model_name): 72 """ 73 Load a model definition given the model name. 74 75 This returns a handle to the module defining the model. This can be 76 used with functions in generate to build the docs or extract model info. 77 """ 48 78 parts = model_name.split('+') 49 79 if len(parts) > 1: 50 from .mixture import MixtureModel 51 models = [load_model(p, **kw) for p in parts] 52 return MixtureModel(models) 80 model_info_list = [load_model_info(p) for p in parts] 81 return mixture.make_mixture_info(model_info_list) 53 82 54 83 parts = model_name.split('*') 55 84 if len(parts) > 1: 85 from . import product 56 86 # Note: currently have circular reference 57 from .product import ProductModel58 87 if len(parts) > 2: 59 88 raise ValueError("use P*S to apply structure factor S to model P") 60 P, Q = [load_model(p, **kw) for p in parts] 61 return ProductModel(P, Q) 62 63 return build_model(load_model_info(model_name), **kw) 64 65 def load_model_info(model_name): 66 """ 67 Load a model definition given the model name. 68 69 This returns a handle to the module defining the model. This can be 70 used with functions in generate to build the docs or extract model info. 71 """ 89 P_info, Q_info = [load_model_info(p) for p in parts] 90 return product.make_product_info(P_info, Q_info) 91 72 92 #import sys; print "\n".join(sys.path) 73 93 __import__('sasmodels.models.'+model_name) … … 95 115 otherwise it uses the default "ocl". 96 116 """ 97 source = generate.make_source(model_info) 98 if dtype is None: 99 dtype = 'single' if model_info['single'] else 'double' 100 if callable(model_info.get('Iq', None)): 101 return kernelpy.PyModel(model_info) 117 composition = model_info.get('composition', None) 118 if composition is not None: 119 composition_type, parts = composition 120 models = [build_model(p, dtype=dtype, platform=platform) for p in parts] 121 if composition_type == 'mixture': 122 return mixture.MixtureModel(model_info, models) 123 elif composition_type == 'product': 124 from . import product 125 P, S = parts 126 return product.ProductModel(model_info, P, S) 127 else: 128 raise ValueError('unknown mixture type %s'%composition_type) 102 129 103 130 ## for debugging: … … 109 136 # open(model_info['name']+'.c','w').write(source) 110 137 # source = open(model_info['name']+'.cl','r').read() 111 138 source = generate.make_source(model_info) 139 if dtype is None: 140 dtype = 'single' if model_info['single'] else 'double' 141 if callable(model_info.get('Iq', None)): 142 return kernelpy.PyModel(model_info) 112 143 if (platform == "dll" 113 144 or not HAVE_OPENCL -
sasmodels/models/hayter_msa_kernel.c
rd529d93 rce43de0 14 14 15 15 double Iq(double QQ, 16 double radius_effective, double zz, double VolFrac, double Temp, double csalt, double dialec)16 double radius_effective, double VolFrac, double zz, double Temp, double csalt, double dialec) 17 17 { 18 18 double gMSAWave[17]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; -
sasmodels/product.py
rd5ba841 r72a081d 68 68 69 69 class ProductModel(object): 70 def __init__(self, P, S): 70 def __init__(self, model_info, P, S): 71 self.info = model_info 71 72 self.P = P 72 73 self.S = S 73 self.info = make_product_info(P.info, S.info)74 74 75 75 def __call__(self, q_vectors): -
sasmodels/sasview_model.py
r08376e7 r72a081d 16 16 import math 17 17 from copy import deepcopy 18 import warnings19 18 import collections 20 19 … … 22 21 23 22 from . import core 23 from . import generate 24 from . import custom 24 25 25 26 def standard_models(): 26 27 return [make_class(model_name) for model_name in core.list_models()] 27 28 28 def make_class(model_name, namestyle='name'): 29 # TODO: rename to make_class_from_name and update sasview 30 def make_class(model_name): 29 31 """ 30 32 Load the sasview model defined in *kernel_module*. … … 37 39 """ 38 40 model_info = core.load_model_info(model_name) 41 return make_class_from_info(model_info) 42 43 def make_class_from_file(path): 44 model_info = core.load_model_info_from_path(path) 45 return make_class_from_info(model_info) 46 47 def make_class_from_info(model_info): 39 48 def __init__(self, multfactor=1): 40 49 SasviewModel.__init__(self) 41 50 attrs = dict(__init__=__init__, _model_info=model_info) 42 ConstructedModel = type(model_info[ namestyle], (SasviewModel,), attrs)51 ConstructedModel = type(model_info['name'], (SasviewModel,), attrs) 43 52 return ConstructedModel 44 53
Note: See TracChangeset
for help on using the changeset viewer.