调用dplus计算后端

dplus-api的Python项目详细描述


学术许可协议

d+软件("软件")由耶路撒冷希伯来大学("huj")的uri raviv教授("开发人员")小组的贡献研究人员开发,并通过huj提供,供您进行内部非盈利研究使用。开发人员允许您所在机构的研究人员在以下条件下运行、显示、复制和修改软件:

在你的监督下参与研究的学生。

如果您希望获得用于任何商业目的的软件,包括收费服务项目,您将需要与耶路撒冷希伯来大学有限公司的Yissum研究开发公司签订单独的许可协议,并支付费用。在这种情况下,请联系:uri.raviv@mail.huji.ac.il或info@yissum.co.il.


您在软件中保留了huj和开发人员提供的任何对软件的修改、版权、商标或与软件有关的其他通知。

在您的研究中使用该软件,并且允许开发人员和huj在对软件进行更改时使用您提供的任何信息。所有错误报告和技术问题均应发送至电子邮件地址:uri.raviv@mail.huji.ac.il.


您承认,开发人员、huj及其被许可方可能会对软件进行与您对软件所做的修改大致相同的修改,并且开发商、HUJ及其被许可方在开发商、HUJ或其被许可方使用或管理此类修改时,不应受到任何限制。您承认开发人员和HUJ有权准备和发布与您的修改和改进在本质上相似或功能上等同的软件修改,如果您对软件的任何修改或改进获得专利保护,您将Gree不指控开发者、Huj或任何Huj或Yissum的被许可人从Huj或开发者处获得并使用对软件的修改或改进,或试图禁止对软件进行此类修改或改进,从而侵犯您的专利。

yo你同意承认开发者和软件对你的研究做出的贡献,并在你的出版物中引用有关软件的适当参考资料。特别值得一提的是:ginsburg a,ben nun t,asor r,shemesh a,ringel i,raviv u.互易网格:计算超分子配合物高分辨率x射线散射曲线的分层算法。化学信息与建模杂志。2016;56(8):1518-1527。


您和您的机构承担在您的机构使用本软件的所有风险。本软件在性质上是实验性的,作为"原样"的研究礼节提供,HUJ或开发人员没有义务提供伴随的服务或支持。


HUJ和开发人员明确否认任何和所有关于本软件的保证,无论是明示的还是默示的,包括但不限于与非侵权、适销性或特定用途适用性相关的保证。




客户服务
如有任何问题,请联系Uri Raviv教授
电话:+972-2-6586030
电子邮件:uri.raviv@mail.huji.ac.il


des描述:本文档最后一次更新是在2018年4月2日,版本4.3.1


位置。

python api在windows和linux上都可以工作。


它可能与旧版本的python一起工作,尽管python 2可能不受支持。


文件必须与脚本本身位于同一目录中,
或者可以修改代码以包含文件位置的完整路径。

在整个手册中,我们提到"状态文件"。状态文件是一个
javascript对象表示法(json)格式文件(https://www.json.org/),
,它描述了d+计算的参数树和计算设置。


状态文件可以从python接口(使用函数"export_all_parameters")中生成,
也可以从d+gui中创建(通过选择file>;export all parameters from the d+gui)。

**python api的总体流程如下:**

1。用于计算的数据由用户在"calculationinput"类的实例中生成。
"calculationinput"是"state"类的子类,表示程序状态。"state"既包括程序
首选项,如"domainpreferences",也包括由"models"组成的参数树。然后将计算输入传递给"calculationrunner"类("localrunner"或"webrunner"),并调用计算函数("generate"、"generate_async"、"fit"或"fit_async")。"calculationrunner"类返回一个"calculationresult"类的实例,
"fitResult"或"generateResult"。

lcculationrunner import localrunner

calc_data=calculationinput.load_from_state_file("mystate.state")
runner=localrunner()
result=runner.generate(calc_data)
print(result.graph)
````

下面是类类型及其用法的详细说明。


它有两个可选的初始化参数:

*`exe\u directory`是d+可执行文件的文件夹位置。
默认情况下,其值为"none"。在windows上,"none"的值将导致python接口自行搜索注册表中已安装的d+,但在linux上必须指定可执行文件目录。
*`session_directory`是存储计算参数以及来自c++可执行文件的输出结果、振幅文件和蛋白质数据库(pdb)文件的文件夹。
默认情况下,其值为"none",将使用自动生成的临时文件夹。

```
从dplus.calculationrunner导入localrunnersess_dir=r"sessions"
runner=localrunner(exe_dir,sess_dir)
也可以:
runner=localrunner()
runner=localrunner(exe_dir)
runner=localrunner(session_directory=sess_dir)
````

webrunner用于访问d+服务器的用户。它需要两个必需的初始化参数,没有默认值:

*`url`是服务器的地址。
*`token`是授予服务器访问权限的身份验证令牌。

```
` generate(calc_data)`,`generate_async(calc_data)`,`fit(calc_data)`,and`fit_async(calc_data)`.


所有四个方法都采用相同的单参数,`calc_data`-一个'calculationdata'类的实例。

`generate`和'fit`返回一个'calculationresult`.

`generate_async`以及"fit_async"返回"runningjob"。

使用"generate"或"fit"时,程序将等待调用完成并返回结果,然后继续。
它们的异步对应项("generate_async"和"fit_async")允许在后台运行d+计算(例如,用户可以调用"generate_async",告诉程序执行其他操作,
,然后返回并检查计算是否完成)。


runningjob


当从"calculationrunner"中的异步函数
(`generate_async`或`fit_async`)返回时,用户可以
使用以下方法与"runningjob"实例交互:

*`get_status()`:获取一个json字典,报告作业的当前状态
*`get_result(calc_data)`:获取`计算结果`。需要用于创建作业的"calculationinput"的副本。
只应在作业完成时调用。用户有责任在调用前用"get_status"验证作业完成情况

*`abort()`:结束当前运行的作业

``
从dplus.calculationinput import calculationinput
从dplus.calculationrunner import localrunner

calc_data=calculationinput.load_from_state撸file("mystate.state")
runner=localrunner()
job=runner.generate_async(calc_data)
start_time=datetime.datetime.now()
status=job.get_status()
while status['isrunning']:
status=job.get_status()
run_time=datetime.datetime.now()-start_time
if run_time>;datetime.timedelta(seconds=50):
job.abort()
raise timeouterror("job take too long")
result=job.get_result(calc_data)
`````

signal


表示信号的类。
对于y值只有x值和nan,它是未初始化的信号-例如在运行ge之前最新情况。



品名品名


` x向量的长度

作为方法:
*`graph`-返回x(q)点作为键,y点作为键的顺序字典值
*`create_x_vector`-接收qmax、qmin和生成的_点,并创建适合这些参数的信号实例
*`load_from_unordered_dictionary`-获取qs及其强度的无序指令,并返回适合指令的信号实例
*`load_from-unordered-pairs`-获取无序对的列表-qs及其强度,并返回适合列表的信号实例
*`read-from-file`-获取文件名并将文件作为信号类加载
*`get-validated`-返回没有负强度值的信号(rem当ys为负时,ove xs和ys)
*`apply戋resolution戋function`-获取sigma值并根据sigma对y应用resolution,返回新值为

类:domainpreferences、fittingpreferences和domain。
它们在后面的章节中有描述。

例如,`uniformhollowclinder`.
*`get mutable`u params`:返回state类中的一组'parameters',其属性'mutable'为'true`.
*`getmutable`u parameter`u values`:返回一组浮点值,与可变参数的值匹配。
*`set mutab`leu parameter_values`:给定一个浮点数列表,设置"state"的可变参数(按
"get mutable_parameter_values`)"给定的顺序)。
*"export_all_parameters`:给定一个文件名,将计算"state"保存到该文件中。
*"add_model`:一个惯例帮助将模型添加到"state"的参数树的ence函数。它接收模型并可选地
填充索引(默认值为0),并将该模型插入填充。
*`add_amplitude`:一个方便的函数,专门用于添加"amplitude"类的实例,如下所述。
它创建名为"振幅"的"amp"类的实例。然后,除了用该"amp"实例调用"add_model",它还更改"state"的"domainpreferences"(特别是"grid_size"、"q_max"和"use_grid"),以匹配"amplitude"的属性。
它返回它创建的"amp"实例。

state、\u以及state中包含的每个类和子类(例如:首选项、模型、参数)都具有函数
"从字典加载"和"序列化"。

"从字典加载"设置一个类中各个字段的值。以匹配合适字典中包含的内容。
它可以根据需要递归地操作,例如,对于具有子级的模型。

`serialize`将类的内容保存到字典中。请注意,字典中可能有本文档中描述之外的其他字段,因为某些已失效(过时、不相关或尚未实现)字段仍保存在序列化字典中。









####domainpreferences
domainpreferences类包含从d+接口复制的属性。它们的用法在d+文档中有解释。


我们通过调用python初始化函数来创建一个新的domainpreferences实例:

`dom_pref=domainpreferences()`

初始化函数,所有属性都设置为默认值:

|---|---|---|
`signal``signal类的一个实例,qmin=0,qmax=7.5,生成的_points=800`
o(mersenne twister)` `"蒙特卡洛(mersenne twister)","自适应(维加斯)蒙特卡洛","自适应高斯-克朗罗德"`
"使用网格` `假` `真`,`假`
"q max ` 7.5正数。该值来自signal.q_max
`q_min 0正数。该值来自signal.q_min
generated_points 800正数。该值来自signal.generated_points
`x`符合信号q_min、q_max的qs列表和generated_point默认值的qs列表。来自signal.x
'y`,没有信号文件-无强度列表。来自signal.y

mber)它们将得到一个错误。



\fitting preferences类包含从d+接口复制的属性。它们的用法在d+文档中有解释。

我们通过调用python初始化函数来创建fittingpreferences的新实例:

`fit pref=fittingpreferences()`

离子函数,所有属性都设置为默认值:

20正整数
;所有损失均需支付_函数`除"平凡损失"外的值
"损失函数"为"容许损失"时所需的
"x射线残差"类型"正常残差"`"正常残差"、"比率残差"、"对数残差"`
"最小值"类型`"信任区"`|`"线路搜索"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域"、"信任区域br/>|`线搜索`"armijo"`"armijo","wolfe"`"minimizer_type`是`"线搜索"`"最陡下降"`"最陡下降","非线性共轭梯度","l-bfgs","bfgs"`"minimizer_type`是`"线搜索"。如果"line-search"类型是"armijo",则不能是"bfgs"或"l-bfgs"。|
``非线性共轭梯度` ` ` ` ` ` ` `"弗莱彻-里夫斯","波拉克-里比雷","海丝滕斯-斯蒂费尔"` ` ` ` ` ` ` `线性搜索方向` `是`"非线性共轭梯度"` ` `

然后可以轻松更改任何属性,例如,

rgence=0.5`



树的根是"domain"类。此类包含一个"population"类数组。
每个"population"可以包含多个"model"类。有些模特有孩子ICH也是模型。


总体可以包含模型的标准类型。

pacefillingsymmetry`
*`manualsymmetry`
*`pdb`-一个pdb文件
*`amp`-一个振幅网格文件

>您可以通过调用它的初始化来创建任何模型。

请注意,模型是从d+中可用的模型动态加载的。
因此,即使模型存在,代码编辑器也可能会用红色下划线标出模型。

所有模型都有"location_params"(位置参数)和"extra_params"(额外参数)。
一些模型(支持层)还包含"layer_params"(层参数)。
这些都是"parameter"类实例的集合,可以分别从
"model.location_params"、"model.extra_params"和"model.layer_params"访问它们。

。可以使用字典访问它们。
示例:

```
从dplus.datamodels.models导入uniformhollowclinder

uhc=uniformhollowclinder()
uhc.layer_params[1]["radius"]。value=2.0
uhc.extra_params["height"]。value=3.0
uhc.location_params["x"].value=2
```


`value`:默认值为"0"的浮点值

`sigma`:默认值为"0"的浮点值

`mutable`:默认值为"false"的布尔值

`constraints`:constraints类的一个实例,其默认值为默认值constraints`

用法:

````
p=parameter();创建值为"0"、sigma:"0"、可变值为"false"的参数和默认约束。
p=parameter(7)创建值为"7"、sigma:"0"、可变值为"false"的参数和默认约束。
p=parameter(sigma=2)值为"0"、sigma为"2"、可变值为"false"的eter和默认约束。
p.value=4将值修改为4。
p.mutable=true将可变值修改为"true"。
p.sigma=3将sigma修改为3。
p.constraints=constraints(min val=5)将约束设置为"constraints"实例w软管最小值(最小值)为5。
```
其用法类似于"parameter"类,例如:

```
c=constraints(min-val=5)创建一个"constraints"实例,其最小值为5,最大值为默认值("infinity")。
````

calculationinput

继承自"state"类,因此可以访问函数和属性。

此外,它还包含自己的以下属性:

*`x`:q值数组(self.domainpreferences.x)
*`y`:信号的强度值数组,可选。用于运行配件。(self.domainpreferences.y)
*`signal`:一个信号类实例。(self.domainpreferences.signal)
*`use_gpu`:默认值为true的布尔值,表示d+是否应使用gpu
*`args`:运行generate.exe或fit.exe所需参数的json字典


结构体。

le`接收包含序列化参数树(state)的文件的位置
*`从pdb加载'lationinput`

```
来自dplus.calculationinput import calculationinputr/>

具有这些参数的BianSphereGrid

具有以下属性(只读属性):


在2个q值之间




esfromindex,接收数据数组中振幅值的索引位置
返回q,theta和phi索引
*`get_data`-从c++数据数组读取数据并返回振幅值的numpy数组
*`get_param_json_string`-调用c++函数getparamjsonstring,返回gri的关键参数d作为json字符串
*`fill`-一个python函数,它接收指向计算模型振幅的函数的指针,并用这些值填充所有c++数据数组。
在最后,这个函数运行calculate撸样条函数。
*`calculate撸样条函数`-调用计算数据数组上样条函数的c++函数(应该填充后调用)
*`get_interplant_coefs`-从C++interplant coefs数组读取数据,并返回一个由interplant coefs值组成的numpy数组
*`interpolate_theta_phi plane`-调用C++函数interpolatethetaphiplane,接收ri、theta和phi angels
返回interpolation value





有两个类:
*`grid`
*`amplitude`包含类pyjacobianspheregrid的实例。

**请注意**:类amplitude与dplus.datamodels.models中的amp不相似。

le,以布尔值为中心,它可以被序列化并作为域参数树的一部分发送到d+。

相反,类"振幅"可用于生成振幅,然后将该振幅保存为振幅文件,
然后可以在D+中打开(或以AMP类的形式发送),但它本身不能直接添加到域参数树中。
如果要添加它,必须保存振幅to文件首先使用"save"方法
,然后可以使用状态函数"add_amplitude"将其添加到树中。



"网格"用于创建/描述由"q"、"theta"、"phi"角度值组成的网格。

可以使用两组索引来描述这些值:

1。总指数"m"
2。单个角度索引"i"、"j"、"k"

"网格"是在对等空间的球面坐标中创建的。
它有"n"个壳,参数"网格大小"等于"2n"。
索引"i"表示与"q"相关的壳数,即散射矢量的大小。
` q_max是最大的q值。索引"j"对应于"i"壳上的极轴(`theta`)角,索引"k"对应于"i"壳上的"j"极轴角的方位角"phi"。"grid"是非均匀的,"i"壳在其"theta"-"phi"平面中包含6i(3i+1)个点。
索引"m"是描述"grid"平面上每个点的单个索引。
索引从"grid"的原点开始,其中"m=0"继续到下一个壳,而每个壳都排列在"phi"主存储器或der.
这两种索引方法之间有一对一的关系。

`grid`有以下方法:

*`create_grid`:返回'q'、'theta'、'phi'角度的生成器-主顺序l`q`,`theta`,and`phi`索引:`i`,`j`,`k`
*`angles`u from`u index`:接收总索引'm`,并返回匹配的'q`,`theta`,and`phi`角度值
*`angles`u from`u index`:接收angle索引'i`,`j`,`k`并返回它们的'q`,`theta`,and`phi`角度值
*`index`u from`u index`:接收角度索引"i"、"j"、"k"并返回与之匹配的总索引"m"
*"从角度索引":接收角度"q"、"θ"、"phi",并返回匹配的索引"i"、"j"、"k"
*"从角度索引":接收角度"q"、"θ"、"phi",并返回匹配的总索引"m"



```
从dplus。振幅导入网格

g=网格(5,100)
对于q,theta,phi in g。创建网格():
打印(g.index_from_angles(q,theta,phi))
````
振幅

类振幅有一个cjacobianspheregrid实例。它是一个用来描述模型/函数振幅的类,可以将这些值保存到振幅文件(可由d+读取)中,也可以读取振幅文件(如由d+创建的文件)


rtie:
*`值`-r从实例cjacobianspheregrid的c++数据数组中返回一个numpy数组(调用函数cjacobianspheregrid.get_data())
*`complex撸amplitude撸array`-从值返回一个复杂numpy数组-当idx为偶数时,每对数据[idx],数据[idx+1]是一个复数(data[idx]+j*data[idx+1])
*`default_header`-用新创建的振幅的数据构建头列表
*`headers`-返回默认头是振幅是新的,当振幅从文件加载时返回外部头
*`description`-用户可以用振幅类的数据填充的可选字符串(例如模型)。"描述"属性将被添加到标题中。

振幅也有以下方法:
*"保存"将振幅类中的信息保存到振幅文件中,然后可以将该文件传递到d+以计算其信号或执行拟合。
*"加载"或者振幅有一个静态方法"load",它接收振幅文件的文件名,并返回一个振幅实例
,其中已加载该文件中的值。
*`fill`-对于新振幅,此函数计算cjacobianspheregrid数据数组的振幅值(调用cjacobianspheregrid.fill())
*`interpoate_theta_phi_plane`-调用cjacobianspheregrid.interpolatethetaphiplane函数,从dplus接收ri、theta和phi天使
返回内极化值

```
。振幅导入振幅
my amp=Amplitude.load("myamp.ampj")
对于my amp.complex振幅数组中的c:
print(c)
````

```
nc)
a.save("myfile.ampj")
```

r/>*`sph2cart`接收r,theta,phi并返回x,y,z
*`cart2sph`从dplus接收x,y,z并返回r,theta,phi

```
。振幅从dplus导入sph2cart,cart2sph

x,y,z=sph2cart(q,theta,phi)

```

此外,该模块还包含两个函数,它们将旧的".amp"文件插入".ampj"文件,反之亦然
*`amp`u to`u ampj`converter`-接收amp文件并将其保存为ampj文件,返回新文件名
*`ampj`u to`u ampj`converter`-接收ampj文件并将其保存为amp文件,返回新文件名ame



\calculationresult

calculationresult类由calculationrunner返回。
用户通常不应该自己实例化类。

基"calculationresult"类由"generateresult"和"fitresult"继承

"calculationresult"具有以下属性:

*"graph":键为x值、值为y值的ordereddict。
*"y":结果中y值的原始列表。ts json
*`error`:从dplus运行返回json错误报告

此外,calculationresults还有以下函数:

*`get_amp(model_ptr,destination_folder)`:返回文件位置给定"model_ptr"的振幅文件。
"destination_folder"的默认值为"none",但如果提供,振幅文件将复制到该位置,
,然后返回其地址。
*`get_amps(destination_folder)`:返回在d+
计算过程中创建的每个振幅文件的文件位置数组。`"目标文件夹"的默认值为"无",但如果提供,振幅文件
将复制到该位置。
*`get_pdb(mod_ptr,destination_folder)`:返回给定'model_ptr'的pdb文件的文件位置。
`destination_folder`的默认值为'none',但如果提供了,pdb文件将复制到该位置,
,然后返回其地址
*`save_to_out_file(file name)`:接收文件名,并将结果保存到文件。


除上述内容外:

`generateresult`还有一个属性"headers",由d+创建,用于描述
运行的作业。它是一个有序字典,其键是modelptrs,其值是关联的头。

"fitResult"还有两个附加属性,
*"parameter_tree":参数的json(可以使用state的"load_from_dictionary"创建新的"state")。
仅存在于fitting中,而不是generate中,results
*`result\u state`:calculationinput`其'domain'包含从fitting中获得的优化参数



filereaders

api包含一个模块filereaders.

模块包含numpyhandlingencoder类。




\r/>从dplus.calculationrunner导入localrunner('spherefit.state')
result=runner.fit(input)
print(result.graph)
````

注释:
此程序从'spherefit.state'加载一个状态文件,与本地runner进行拟合,并打印结果的图形。

***示例二***

````
来自dplus.calculationinput import calculationinput
来自dplus.calculationrunner import localrunner
来自dplus.datamodels导入modelfactory,population
来自dplus.state导入state
fromdplus.datamodels.models导入uniformhollowclinder

runner=localrunner(session_directory=sess_directory)

caldata=calculationinput()
caldata.domain.popullations[0].add_model(uhc)

print(result.graph)
``````

**dplus.calculationrunner从dplus.calculationi导入localrunner
nput import calculationinput

runner=localrunner()
caldata=calculationinput.load\u from_pdb('1jff.pdb',5)
result=runner.generate(caldata)
print(result.graph)
`````
**example four***


```
从dplus.calculationrunner导入localrunner
从dplus.calculationinput导入calculationinput
runner=localrunner()
input=calculationinput.loadtate_file("uhc.state")
cylinder=input.get_model("test_cylinder")


print("原始半径为",cylinder.layer_params[1]['radius'].value)
result=runner.generate(input)

cylinder=input.get_model("测试气缸")
气缸。层参数[1]['radius'].value=2
气缸。层参数[1]['radius'].mutable=true
输入。fittingpreferences.convergence=0.5
输入。使用_gpu=true
拟合结果=runner.fit(输入)
优化ed_input=fit_result.result_state
result_cylinder=optimized_input.get_model("test_cylinder")
print(fit_result.parameter_tree)
print("result radius is",result_cylinder.layer_params[1]['radius'.value)

````

comments:
"fit_result.result_state"是拟合返回的优化状态(即优化参数树)(runner.fit(input))。您可以从该参数树中获取名为"test_cylinder"的圆柱体,以查看其新的优化参数是什么。



最小默认参数,在实际使用中,用户可以将这些参数设置为可编辑的属性,以便在方便时进行更改。

````
来自dplus。振幅导入振幅
导入数学
导入numpy作为np

类uniformSphere:
定义初始化(self):
self.extraparams=[1,0]
self.ed=[333400]
self.r=[0,1]

@属性
定义nLayers(self):
返回len(self.ed)

def calculate(self,vq,vtheta,vphi):
cos=math.cos
sin=math.sin
nlayers=self.nlayers
ed=self.ed
extraparams=self.extraparams
r=self.r
def接近零(x):
返回(math.fabs(x)<;100.0*2.2204460492503131e-16)

如果接近零(q):
el电子数=0.0
对于范围内的i(1,n层):
电子数+=(ed[i]-ed[0])*(4.0/3.0)*math.pi*(r[i]**3-r[i-1]**3)
返回np.complex64(电子数*附加参数[0]+附加参数[1]+0.0j)

res=0.0

i in range(nlayers-1):
res-=(ed[i]-ed[i+1])*(cos(q*r[i])*q*r[i]-sin(q*r[i]))
res-=(ed[nlayers-1]-ed[0])*(cos(q*r[nlayers-1])*q*r[nlayers-1]-sin(q*r[nlayers-1]))

res*=4.0*math.pi/(q*q*q)


res*=extraparams[0];乘以scale
res+=extraparams[1];加上background
返回np.complex64(res+0.0j)


sphere=uniformsphere()
a=振幅(7.5200)
a.fill(sphere.calculate)
a.save("sphere.ampj")


input=calculationinput()
amp廑model=input.add廑振幅(a)
amp廑model.centered=true
runner=localrunner()
result=runner.generate(input)
````

```


class symmetricslab:
def\uu init(self):
self.scale=1
self.background=0
self.xdomain=10
self.ydomain=10
self.ed=[333280]
self.width=[0,1]
self.organizeparameters()

@property
def nlayers(self):
return len(self.ed)

def organizeparameters(self):
self.width[0]=0.0
self.xdomain*=0.5
self.ydomain*=0.5
对于范围(2,self.nlayers):
self.width[i]+=self.width[i-1];

def calculate(self,q,theta,phi):
def接近零(x):
返回(math.fabs(x)<;100.0*2.2204460492503131e-16)
从dplus。振幅导入sph2cart
从math导入sin,cos
从numpy导入sinc
将numpy导入为np
qx,qy,qz=q,theta,phi
res=np.complex128(0+0j)
if(接近零(qz)):
对于范围内的i(self.nlayers):
res+=(self.ed[i]-self.ed[0])*2。*(self.width[i]-self.width[i-1])
返回res*4。*sinc((qx*self.xdomain)/np.pi)*self.xdomain*sinc((qy*self.ydomain)/np.pi)*self.ydomain

prevsin=np.float64(0.0)
currsin=np.float64(0.0)
i in range(1,self.nlayers):
currsin=sin(self.width[i]*qz)
res+=(self.eD[I]-自我教育[0])*2。*(currsin-prevsin)/qz
prevsin=currsin
res*=4。*sinc((qx*self.xdomain)/np.pi)*self.xdomain*sinc((qy*self.ydomain)/np.pi)*self.ydomain
返回res*self.scale+self.background;乘以scale并从dplus添加background




lus.calculationrunner从dplus导入localrunner从generate和numpy内置的最小化/曲线拟合函数。
所需要的只是包装接口代码,以便它按照scipy期望的方式接收和返回参数(如numpy数组)

py import optimize
从dplus.calculationinput import calculationinput
从dplus.calculationrunner import localrunner

input=calculationinput.load_from_state_file(r"2_pops.state")
generate_runner=localrunner()

def run_generate(扩展数据,*参数):
"
scipy的优化算法需要一个接收x数组和参数数组的函数,并返回一个y数组。
此函数将被重复调用,直到scipy的优化完成。
"
"输入。设置可变参数值(params)e由scipy给出的参数,并将它们放在我们的参数树中
generate懔results=generate懔runner.generate(input)懔call generate
return np.array(generate懔results.y)懔return the results of the generate call

x懔data=input.x
y懔data=input.y
p0=input.get懔mutableeter_values()
method='lm'lenenberg marquadt(参见scipy文档)
popt,pcov=优化.曲线拟合(运行生成,x_数据,y_data,p0=p0,method=method)

#我们可以运行generate来获得与它们一起生成的结果科学/研究
分类器:许可证::其他/专有许可证
分类器:操作系统::操作系统无关
分类器:编程语言::python
分类器:编程语言::python::3.4
分类器:主题::科学/工程::化学

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java从服务器中的jsp页面读取参数   java构造函数会话(字符串,int)不可见   在java中计算特定字符,但我的程序只读取单词中的第一个字符   在java中转换为json的Hashmap的Hashmap。当发送到jsp时,我用javascript解析它。但它在javascript中的解析不正确   JavaSpringDataREST并没有保存实体的所有字段   java如何通过inten共享图像   eclipse是Java所需要的。即使已定义,也要运行的类文件   rest MapStruct Java流   java在OpenJDK 11的源代码上运行DocumentationTool   比较两个ArrayList索引时的java IndexOutOfBoundsException   java为什么Spring验证器需要将错误对象传递给应用程序(富客户端)并由其处理?   java Android从sms垃圾邮件文件夹或列表中检索垃圾邮件号码   java从匿名类参数访问类的实例   java MethodHandle与通用非类返回筛选器?   指定队列顺序的java