Windows备份添加网络位置的0x80070544错误

在使用Linux配置的Samba服务器作为Windows备份的储存位置时,可能会出现0x80070544错误。参考这篇post,在输入用户名时添加一个主机名前缀即可。

例如Linux主机名cpu-node0,对应SMB用户名someone,那么在Windows备份中输入的用户名应该是cpu-node0\someone

Grid Engine初探

软件包安装

这里主要介绍在Ubuntu 18.04/20.04下安装grid engine。首先在Ubuntu的软件仓库中是存在gridengine-*软件包的,只不过因为一些bug(见tracker),虽然Ubuntu 14.04下参照这篇blog可以成功安装,但在18.04/20.04下会在setting up package的时候出现segment fault而处于无法使用的状况。依据这篇blog,我们可以让Ubuntu使用Debian的软件仓库从而正确安装并初始化grid engine。主要操作如下:

# 添加 /etc/apt/sources.list.d/debian.list 文件
# 内容如下

deb http://ftp.debian.org/debian/ stretch main contrib non-free
deb http://security.debian.org/debian-security/ stretch/updates main contrib non-free

# 添加 /etc/apt/preferences.d/debian 文件
# 内容如下

Package: gridengine-*
Pin: release o=Debian
Pin-Priority: 1000

Package: *
Pin: release o=Debian
Pin-Priority: 10

# 通过以下命令安装Debian软件仓库的公钥
sudo apt-get install debian-archive-keyring
sudo apt-key add /usr/share/keyrings/debian-archive-keyring.gpg

# 通过以下命令修复qmon
sudo mkdir /var/lib/gridengine/qmon
sudo ln -s /usr/share/gridengine/pixmaps /var/lib/gridengine/qmon/PIXMAPS

LOEWE模型

此模型主要定义如下:

    \[\frac{d_1}{D_{\gamma,1}} + \frac{d_2}{D_{\gamma,2}} = 1\]


左式等于1为加性(即既不协同,也不拮抗);大于1为拮抗;小于1为协同。 d_i 其中表示产生药效 \gamma 时,某药物组分的剂量; D_{\gamma,1} 表示为了达到药效 \gamma ,单独使用某药物所需要达到的剂量。以下做一些讨论,最后推导得到的式子没有交换等号左右项,等号换成大于号或小于号,其意义等同于上述含义:

  1. 当1组分与2组分效价相当时,即 D_{\gamma,1} \approx D_{\gamma,2} ,如果要求两组分间无相互作用,不妨设 d_1=d_2 ,那么有

        \[2d_1=D_{\gamma,1}\]

    即使用1当量1组分和1当量2组分,产生药效,而单独使用1或2组分要达到同样药效需要2当量。
  2. 当1组分效价远大于2组分时,即 D_{\gamma,1} \ll D_{\gamma,2} ,如果要求两组分间无相互作用,不妨设 d_1=d_2=d ,那么有

        \[(D_{\gamma,1}+D_{\gamma,2})d=D_{\gamma,1}D_{\gamma,2}\]

        \[D_{\gamma,2}d=D_{\gamma,1}D_{\gamma,2}\]

        \[d_1=D_{\gamma,1}\]

    即使用1当量1组分和1当量2组分,产生药效\gamma,而单独使用1组分要达到同样药效需要1当量。
  3. 当2组分单独使用并无药效时,即 D_{\gamma,2} 无定义,或者D_{\gamma,2} \rightarrow \infty,如果要求两组分间无相互作用,那么有

        \[\frac{d_1}{D_{\gamma,1}}=1\]

  4. 当1、2组分合用的效力大于各组分单独使用的效力,即在某药效 \gamma 处, D_{\gamma,1} D_{\gamma,2} 无定义,或者D_{\gamma,1} \rightarrow \infty, D_{\gamma,2} \rightarrow \infty。此时规定左式等于0。

NAMD执行分子动力学模拟:跑起来

由于专业原因,执行分子动力学模拟一般不会仅仅局限于标准的氨基酸、脂质、核酸之类的分子。更多的时候会去模拟分子力场所没有定义的小分子,执行蛋白-配体复合物的动力学模拟。

NAMD基础

一般建议从NAMD的官方基础教程开始,从UIUC处下载NAMD Tutorial(传送门),非常建议同时下载tutorial files用于动手实际操作一下。本节讨论一下该教程不会论述的东西——把NAMD安装上,当然也会提一下其他需要下载的资源。

VMD、NAMD工具链

VMD和NAMD是联系非常紧密的两个工具,VMD是很重要的一个可视化工具,同时也是构建NAMD计算任务的一个必要工具。从UIUC下载即可。VMD 1.9.3版本之后就可以使用QwikMD,这是一个非常好用的动力学模拟任务生成插件,遗憾的是在处理CHARMM36力场且含配体小分子的任务中,不太好用。另外关于NAMD,有且仅有Nvidia图形卡加速的选项,亦即编译带CUDA的。需要注意的是,NAMD要求CUDA的Compute Capability等级不小于3.x。

Hardware GenerationCompute Capability
Turing7.5
Volta7.x
Pascal6.x
Maxwell5.x
Kepler3.x
Fermi2.x

因此需要确认显卡是否为开普勒及以上架构的,费米架构虽然能装上CUDA,但会由于等级不足,无法进行计算。

获得CHARMM36力场文件

虽然讲道理VMD 1.9.3之后QwikMD会自带CHARMM36力场文件,不过姑且提一下,对于常见的氨基酸、脂质以及核酸等的力场文件,可以通过MacKerell Lab的网站获得(传送门)。而对于小分子,通常是不会出现在CHARMM36力场文件中的,因此需要额外获得,通常文献里会提到 SwissParam 这个网站,但总感觉得到的文件和CHARMM36格格不入。因此建议使用CGenFF(传送门)或者CHARMM-GUI(传送门

构建计算任务的注意点

要构建一个能跑起来的计算任务倒也不是很难的问题,照着tutorial files一通抄就行了,只不过有那么几个小问题需要说明一下。

小分子力场文件微调

从CGenFF得到的小分子力场文件是str做后缀的Stream文件,本质上是拓扑文件和参数文件的混合体,因此在使用psfgen以及写NAMD计算文件的过程中,拓扑文件和参数文件都指向该Stream文件即可。psfgen并不会说Stream文件最后结尾处的Return是语法错误,但NAMD会,并且会把它当成一个Error,而不是一个Warning。因此需要把Stream文件最后一行 Return 删掉。

引入所有参数文件

由于CHARMM36的全新设计,在NAMD中使用Stream文件,需要引入所有参数文件(详见说明)。因此,无论是否体系中包含氨基酸、脂质或者核酸,都需要在NAMD计算任务文件中,引入Stream文件之前,引入其他所有参数文件,即

...
structure system-xplor.psf
paraTypeCharmm on
parameters par_all36_prot.prm
mergeCrossterms yes
parameters par_all36_lipid.prm
parameters par_all36_carb.prm
parameters par_all36_cgenff.prm
parameters molecule.str
parameters toppar_water_ions_namd.str
...

QwikMD报错

这里讨论的报错需要有这么一个前件:小分子力场参数由CGenFF生成。在这种情况下QwikMD提示子程序非正常退出,查看NAMD日志发现力场参数缺失。一般情况下,这是由于QwikMD自带的CHARMM36力场参数文件过于陈旧,重新下载CHARMM36,将力场参数文件覆盖进工作目录即可。

Windows挂载WebDAV二三事

首先WebDAV是个挺不错的协议,建立在HTTP之上,也提供了很多很完善功能,同时Windows也提供了原生支持。然而这个支持,槽点太多了。

找不到网络名?

首先第一步,使用文件资源管理器添加网络位置也好,还是在命令行用net use命令挂载也好,都会报一个很神秘的错误:

发生系统错误 67。

找不到网络名。

并不是中文翻译的问题,它英文就是这个意思

乍一看,难道是域名解析的问题,但问题是即使在URL中使用IP地址,也是会报这个错误的。这个时候需要参考官方文档中的troubleshoot(详见这里)。看,这个67错误,虽然叫找不到网络名,但没说为什么找不到网络名嘛,WebDAV客户端服务没开启,这不是也会造成找不到网络名嘛(文档中第3条)

Solution:在服务中打开WebClient服务即可,值得一提的是这个服务默认为手动触发,可能挂载的姿势不对,没能手动触发?

局域网里的WebDAV没开HTTPS不能挂载

是的,默认情况下使用Basic Auth并使用HTTP在公网上传输数据是令人难以想象的。然而,微软恐怕觉得用户会在局域网里使用WebDAV也是appalling的。也是呀,为什么不用SMB呢(灵魂拷问)?当然我们在局域网内用WebDAV通常是因为我们在局域网部署了之后,也会内网穿透到公网提供服务,这可是现代混合云发展理念(哈哈,微软你没想到吧)

Solution:打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters,修改键BasicAuthLevel值为2,即同时允许HTTP与HTTPS。

只能听音乐不能看视频?

那是因为通常音乐文件小于50MB,而视频文件普遍大于50MB。要问这个50MB限制是哪来的,上面说的,打开的注册表编辑器不要关,看一下键FileSizeLimitInBytes的值,是不是5后面跟了好几个0?只要把这个值调高一点,就可以了。

Solution: 打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters,修改键FileSizeLimitInBytes值为适当大小。

BTW: 你可能会注意到这个键是一个32位的DWORD,这意味着最大也就2的32次方字节,或者说是4.29GB(梦回FAT32)。把DWORD改成QWORD企图扩展到64位的尝试,也失败了。因此想看蓝光原盘的,得换个想法了。

Aria2c容器化部署(All in One)

之前做的分成三个部分的aria2c容器化部署(参见这里),WEB服务和Aria2c服务两个镜像还好,压缩后大小都不超过100MB。就是WebDAV服务选用了WsgiDAV,该镜像即使是压缩后,也高达390MB——太可怕了。接下来考虑如何最大限度地减小镜像大小

在Alpine发行版中编译Aira2

alpine可以说是Linux发行版中体积最小的,整个大小只有5MB。虽说体积小对于操作系统而言其实也没什么特别的好处,但当讨论到容器的时候,体积小就具有先天优势。不过有意思的是,alpine使用的标准C语言库和其他的发行版用的不一样,是musl-libc,这就造成没办法直接使用release中发布的二进制文件。
没办法,只能手动编译一个。鉴于alpine软件仓库里的aria2版本也很老了,手动编译其实也是很有必要性的。

Alpine dev软件包的小坑

照着Aria2的说明,只安装libxxx-dev这种软件包,当然在编译阶段是没有什么大问题的,必要的头文件都有;如果Aria2编译使用动态链接库,那也没什么大问题,必要的动态库也有。就是当需要编译一个静态链接的Aria2时,就会出现一串 ···ld: cannot find -lsqlite3 ···ld: cannot find -lintl 之类的报错。正常反应就是:欸?我明明装了sqlite-dev包,怎么还会缺sqlite3.a呢?其实,还有个sqlite-static的包。另外alpine上intl.agettext-static包里,而不在libintl——找这个静态库也是花了好大的力气。此外值得一提的是静态链接得到的aria2c,大小有133.8M。

静态链接还是动态链接

正如上面提到的那样,静态链接得到的aria2c还是稍微有一点点大的。动态链接得到的aria2c为108.1MB,减少了25.7MB。如果说一个容器中没有其他的组件,静态链接当然是更好的选择,但如果还有其他组件,动态链接就更好。然而仔细分析一下依赖情况,alpine软件包仓库中的nginx依赖于

  • busybox
  • libcrypto1.1
  • libssl1.1
  • musl
  • pcre
  • zlib

个个都是个头不超过2MB的家伙,因此从理性上,动态链接得到的总镜像大小应该降低得不是很多。然而一通分析猛如虎,实际上镜像大小从430MB降低到了378MB,减少了52MB,降幅12%。所以还是要动态链接。

从WebDAV协议换成S3协议

文件传输主要还是依赖FTP,SSH,HTTP这三类基本协议。一般来说,如果没有什么特别的需求,没人还会去用FTP协议做文件传输,因为FTP作为一个多端口协议,放在容器里就完蛋了。一般会考虑HTTP基础上的WebDAV,三个主要Web服务器都支持WebDAV协议,其中Apache2和IIS都是完整支持的;Nginx部分支持。如果要在容器当中部署WebDAV,那么首选使用Apache2作为Web服务器,也就省却了安装其他WebDAV服务器的必要。相对于之前装一个WsgiDAV还要完整的Python环境,整个镜像的大小可以有十分显著的减小。
那为什么还要执着于Nginx呢?其实只是单纯个人喜好问题,所以就要想办法解决衍生出来的文件传输的问题。总不能指望一个精简版的WebDAV协议能好用吧。

因此在这回的Aria2部署中选用了S3协议,那么实现了S3协议的MinIO就映入眼帘。当然S3协议并不是WebDAV协议的上位替代。另外对于S3协议而言,最大的缺点在于S3不能部署在子目录下,因为URL是需要签名,然后合并进请求头的,但是一般而言的子目录部署都是需要将前缀删除后,再反向代理给S3服务器。当然使用多个域名倒也是能解决这个问题,只不过有的时候内网部署的时候,通常不会去设置域名——一般是直接IP地址访问。
解决方法主要还是直接反代bucket名,然后反代/minio确保minio的Web UI可用。

实验室常用显色法

碘缸

  • 适用于不饱和或芳香族化合物
  • Recipe
    • 10g 碘
    • 30g 硅胶
    • 在棕色广口瓶中放置上述原料即可

碱性高锰酸钾

  • 主要是利用高锰酸钾的氧化性,氧化后颜色由红变黄,适用于还原性化合物,但寿命较短
  • Recipe
    • 150mg 高锰酸钾
    • 1000mg 碳酸钾
    • 12.5mg 氢氧化钠
    • 20mL 水
    • 将固体混合后用水溶解装瓶即可

磷钼酸

  • 可能对共轭结构显色,属于广谱显色剂
  • Recipe
    • 10g 磷钼酸
    • 100mL 乙醇
    • 混合后装瓶

紫外

通常用于含荧光剂的色谱板,或用于检查物质的紫外激发荧光,目标物质应当有共轭结构

硫酸铈

  • 主要用于检查生物碱
  • Recipe
    • 10g 硫酸铈(IV)
    • 15g 硫酸
    • 200g 水
    • 混合后装瓶

氯化铁

  • 著名的苯酚类显色剂
  • Recipe
    • 1g 氯化铁
    • 50g 乙醇
    • 50g 水

羟基黄酮

  • 广谱显色剂
  • Recipe
    • 0.1g 桑色素
    • 100g 甲醇

茚三酮

  • 经典的氨基酸显色剂
  • Recipe
    • 1.5g 茚三酮
    • 100mL 正丁醇
    • 3mL 乙酸

二硝基苯肼

  • 可检测醛酮类化合物
  • Recipe
    • 12g 二硝基苯肼
    • 60mL 浓硫酸
    • 80mL 水
    • 200mL 乙醇

香草醛

  • 广谱显色剂
  • Recipe
    • 15g 香草醛
    • 250mL 乙醇
    • 2.5mL 硫酸

溴甲酚绿

  • 用于检查pKa<5的羧酸
  • Recipe
    • 0.04g 溴甲酚绿
    • 100mL 乙醇
    • 0.1M 氢氧化钠
    • 规定量的溴甲酚绿和乙醇混合后,滴加规定浓度氢氧化钠溶液至蓝色恰好出现

钼酸铈

  • 广谱显色剂
  • Recipe
    • 12g 钼酸铵
    • 0.5g 钼酸铈铵
    • 15mL 硫酸
    • 235mL 水

茴香醛

  • 广谱显色剂
  • Recipe
    • 3.7mL 茴香醛
    • 1.5mL 乙酸
    • 5mL 硫酸
    • 135mL 乙醇

PyMOL学习日志(二):插件(蛋白质-配体建模)

承接上文介绍可视化与分析增强插件,本文讨论蛋白质-配体建模类插件。

Optimize

代码仓库位置: https://github.com/Pymol-Scripts/Pymol-script-repo/
最后一次更新:2017/01/14(截止2019/07/18)
目标Python版本:Python3/Python2
版权声明:MIT

可以最小化选定部分的能量

tCONCOORD‐GUI

代码仓库位置:不适用
==>项目位置:http://wwwuser.gwdg.de/~dseelig/tconcoord.html
最后一次更新:未知(截止2019/07/18)
目标Python版本:未知
版权声明:未知

404 Not Found

LigAlign

代码仓库位置:不适用
==>项目位置:http://compbio.cs.toronto.edu/ligalign/index.html
最后一次更新:2010/08/24(截止2019/07/18)
目标Python版本:Python2
版权声明:类似MIT

可能那个时代还不流行单元测试吧,需要对下载下来的1.0.0版做一些微调才能用:
1、ligalign/similarityDB/sim_85改名为ligalign/similarityDB/ligSimilarity_0.85.pdbIDlist
2、ligalign/ligand_alignment.py中的1356行,except CmdException块中,无论如何将error变量置为False
这样就能用了。

LigAlign

Kabsch

代码仓库位置:不适用
最后一次更新:未知(截止2019/07/18)
目标Python版本:未知
版权声明:未知

对齐蛋白,推荐使用PyMOL内置的指令fit、cealign或者super。详见https://pymolwiki.org/index.php/Kabsch

PharmDock

代码仓库位置:不适用
==>项目位置:https://people.pharmacy.purdue.edu/~mlill/index.shtml
最后一次更新:2013/07/15(截止2019/07/18)
目标Python版本:Python2
版权声明:未知

仍需要Debug

MLP GLOD

代码仓库位置:不适用
==>项目位置:http://mlptools.altervista.org/
最后一次更新:未知(截止2019/07/18)
目标Python版本:未知
版权声明:未知

404 Not Found

LIQUID

代码仓库位置:不适用
==>项目位置:http://gecco.org.chemie.uni-frankfurt.de/liquid/index.html
最后一次更新:未知(截止2019/07/18)
目标Python版本:未知
版权声明:未知

404 Not Found

DrugOn

代码仓库位置:不适用
==>项目位置:http://bioinfoteam.com/software.html
==>曲线救国:https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4304849/#supplemental-informationtitle
最后一次更新:2015/01/13(截止2019/07/18)
目标Python版本:不依赖Python
版权声明:未知

依赖北京大学分子设计实验室开发的LigBuilder。有点想弃之食锅。

POCKETPICKER

代码仓库位置:不适用
==>项目位置:http://gecco.org.chemie.uni-frankfurt.de/pocketpicker/index.html
最后一次更新:未知(截止2019/07/18)
目标Python版本:未知
版权声明:未知

404 Not Found

AutoDock/VINA

代码仓库位置:https://github.com/Pymol-Scripts/Pymol-script-repo/
最后一次更新:2018/06/27(截止2019/07/18)
目标Python版本:Python3/Python2
版权声明:类似CC署名

作为调用AutoDock/VINA的插件,需要外部安装AutoDock/VINA方可使用。

FlexAID

代码仓库位置:不适用
==> 项目位置:http://biophys.umontreal.ca/nrg/resources.html
最后一次更新:未知(截止2019/07/18)
目标Python版本:Python2
版权声明:未知

建议直接替换为同实验室出品的NRGsuite,此外对配体有最多200个原子的限制。

PyMOL & NRGsuite

PyMod

代码仓库位置:不适用
==> 项目位置:http://schubert.bio.uniroma1.it/pymod/index.html
最后一次更新:2017/11/03(截止2019/07/18)
目标Python版本:Python2
版权声明:未知

用于蛋白质序列相似度搜索,多序列-结构对齐,同源建模。——译自项目首页。所以这和蛋白质-配体建模有什么关系┑( ̄Д  ̄)┍

大型XML解析初探(以Drugbank为例)

这些年,大家都喜欢谈论大数据,那我们也来看看所谓大数据下,常规思路是如何走入困境,又应该如何化解矛盾。在这里我们以DrugBank的数据库为例子,讨论一下如何用Python解析大型的XML。

0b0. 上车前系好安全带

一般大家会在发生内存泄漏,填满所有可用内存之前把程序停掉。又或者在申请内存空间时,返回空间不足,从而导致程序意外终止。在内存不足的情况下,Python可不会管你,如果不自己加点保护措施,会直接把系统搞崩。因此,首先要用Python的resource模块上一个内存使用的保险。例如我们将该Python进程最大可使用内存设为3GB,超过3GB将抛出Memory Error异常。

import resource

# Max Memory Used 3GB
MAX_MEM = 5*1024*1024*1024

_ = resource.prlimit(0,resource.RLIMIT_AS,(MAX_MEM,MAX_MEM))

0b1. 开车啦

传统的parse无法正确加载
系好安全带之后会抛出异常而不是计算机崩溃

然后就翻车了
这就是大数据所面临的经典问题

贫穷的你,内存不够大

当然其实内存大了也没用

0b10. 分而治之

针对drugbank数据库,简单分析可以看出,这个数据库是由一个drugbank标签包围的一堆drug标签所构成的。无法在普通计算机中直接读入到内存也只是因为drug标签稍微有一点多——虽然也不是那么地多,毕竟才一万多个。那么一个非常直观的想法就是只解析每个drug标签,而不必把这一万多个drug标签一起解析。这就相当于我们不去直接加载整个数据库,而一条一条数据加载、处理、释放内存。

仔细观察drugbank的xml文件可以看出:其一,以drug单词开头的标签还有不少;其二,文件格式还是不错的,不同标签都正确换行,且不同层次的标签缩进空格也有。那么根据这两个特征,我们可以通过打开文件,逐行分析drug标签的开闭,截取需要的drug标签片段,然后解析。值得注意的是,drug标签里会在drug-interaction标签里再包含一个drug标签,因此如果文件格式不太妙的话,可能还要注意一下premature end of data in tag drug 的问题,需要额外判断一下标签开闭状态。当然drugbank的数据文件还不错,只需要简单地截取就可以了。下面给出一个函数原型,权当抛砖引玉。

from lxml.etree import parse
import tarfile
from io import BytesIO

def drugs(place='drugbank.tar.xz'):
    raw_zip = tarfile.open(name=place)
    XML = raw_zip.extractfile(raw_zip.getmember('full database.xml'))

    buf = None
    enter = False

    for line in XML:
        if line.startswith(b'<drug '):
            buf = BytesIO()
            enter = True
        if enter:
            buf.write(line)
        if line.startswith(b'</drug>'):
            buf.seek(0)
            enter = False
            yield parse(buf)