第一个问题当然是模拟是否有你需要的信息。毕竟,如果我们不能发现这一点,那么我们就有问题了!
如果我们查看分析代码本身,我们可以看到它实际上所做的只是使用每一帧中水分子的 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 中绘制一系列点,您可以查看它,看看您所拥有的是否至少是合理的。