scripting - 试图通过VMD找出嵌入脂质双层的AQP蛋白每个孔中的渗透事件
问题描述
我的项目基于对包含水箱和脂质双层的系统的 MD 模拟分析,其中嵌入了水通道蛋白。在该系统上进行时间步长 150 ns 的模拟,以研究水渗透和流过脂质双层的分析。我的工作分析之一需要计算通过这种嵌入蛋白质的每个通道的水渗透事件(这种蛋白质包含四个单体,形成四个水通道)。我正在使用 VMD 进行分析。
我从互联网上获得了这个脚本https://www.ks.uiuc.edu/Training/Tutorials/science/nanotubes/files/permeation.tcl 。但是这个脚本没有按照我的要求给出结果。
因为我想分别找出通过每个孔隙/水通道发生的渗透事件,这个脚本只是计算整个 AQP 层的水渗透事件。我没有足够的专业知识来根据我的要求更改此脚本。
解决方案
第一个问题当然是模拟是否有你需要的信息。毕竟,如果我们不能发现这一点,那么我们就有问题了!
如果我们查看分析代码本身,我们可以看到它实际上所做的只是使用每一帧中水分子的 Z 坐标并忽略其他坐标(估计使用了哪个孔需要)。它使用每个分子的一个很小的状态机来决定它们发生了什么。相关代码是这样的(在常规化输入之后):
for {set fr 0} {$fr < $numFrame} {incr fr} {
molinfo top set frame $fr
set oldList $labelList
set labelList {}
foreach z [$wat get z] oldLab $oldList segname $segList resid $ridList {
if {$z > $upperEnd} {
set newLab 2
if {$oldLab == -1} {
puts "$segname:$resid permeated through the nanotubes along +z direction at frame $fr"
if {$fr >= $skipFrame} {
incr num1
}
}
} elseif {$z < $lowerEnd} {
set newLab -2
if {$oldLab == 1} {
puts "$segname:$resid permeated through the nanotubes along -z direction at frame $fr"
if {$fr >= $skipFrame} {
incr num2
}
}
} elseif {abs($oldLab) > 1} {
set newLab [expr $oldLab / 2]
} else {
set newLab $oldLab
}
lappend labelList $newLab
}
}
也许一个开始是在凌日事件发生后立即收集分子的 X 和 Y 坐标并绘制它们?我不知道这是否会有所帮助,但也许?
for {set fr 0} {$fr < $numFrame} {incr fr} {
molinfo top set frame $fr
set oldList $labelList
set labelList {}
foreach x [$wat get x] y [$wat get y] z [$wat get z] oldLab $oldList segname $segList resid $ridList {
if {$z > $upperEnd} {
set newLab 2
if {$oldLab == -1} {
puts "$segname:$resid permeated through the nanotubes along +z direction at frame $fr"
if {$fr >= $skipFrame} {
incr num1
}
# Remember event for later
lappend permeateUpwards $x $y
}
} elseif {$z < $lowerEnd} {
set newLab -2
if {$oldLab == 1} {
puts "$segname:$resid permeated through the nanotubes along -z direction at frame $fr"
if {$fr >= $skipFrame} {
incr num2
}
# Remember event for later
lappend permeateDownwards $x $y
}
} elseif {abs($oldLab) > 1} {
set newLab [expr $oldLab / 2]
} else {
set newLab $oldLab
}
lappend labelList $newLab
}
}
现在我们有了这些列表,我们可以尝试将它们打印到文件中,以便您可以绘制它们:
set f [open "downwards.csv" w]
foreach {x y} $permeateDownwards {
puts $f "$x,$y"
}
close $f
set f [open "upwards.csv" w]
foreach {x y} $permeateUpwards {
puts $f "$x,$y"
}
close $f
有很多工具可以在 CSV 中绘制一系列点,您可以查看它,看看您所拥有的是否至少是合理的。
推荐阅读
- linux - 如何使用 shell 脚本打印解析 Json
- unit-testing - 如何从 CLI 单元测试将请求对象注入 Twig 模板?
- asp.net-mvc - 如何从 Web API 调用接口定义的方法
- html - 为什么文本在大断点处与图像重叠
- mysql - 用于设置条件语句的 SQL?
- python - SQL Alchemy:需要多少“Base = declarative_base()”语句?
- linux - curl:(60)SSL证书问题:无法获取本地颁发者证书以获取更多详细信息:https://curl.haxx.se/docs/sslcerts.html
- pandas - 根据python中另一列的值计算会话持续时间
- android-studio - 为什么 Android Drawable Importer 从 AS 3.5 开始忽略选择
- kubernetes - 在 kubernetes 中运行示例 yml 文件时,我遇到了这个错误。谁能帮我整理一下