Первый вопрос, конечно, заключается в том, есть ли в симуляции нужная вам информация. В конце концов, если мы не можем этого обнаружить, то у нас проблемы!
Если мы посмотрим на сам код анализа, то увидим, что все, что он на самом деле делает, это использует координату 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, и вы можете посмотреть на это и посмотреть, является ли то, что у вас есть, по крайней мере разумным.
person
Donal Fellows
schedule
02.07.2020