From: Josh Vermaas (vermaas2_at_illinois.edu)
Date: Wed May 13 2015 - 19:00:28 CDT

My understanding of how VMD works says that it cannot be done in a
single xyz file. Name, type, etc, are not allowed to vary per frame
(which works for 99.99% of all use cases). You want to let the identity
of the atoms vary, which is weird, and needs a weird workaround by
outputing each frame into a separate file.

set a [atomselect top "index < 1338 and name Si and y>9 and within 5 of
atom O]
set t [atomselect top all]

for { set i 0 } { $i < [molinfo top get numframes] } { incr i } {
$a frame $i ; #changes the frame the selection will be based on
$a update ; #Rechecks that its selecting the right stuff
$a set name C
$a set type C
$a set element C
$t frame $i
$t writexyz frame$i.xyz ; #You will get a ton of individual frames where
the Si atoms will be renamed.
#Reset everything to Si for the next frame
$a set name Si
$a set type Si
$a set element Si
}

This will work, but I really wanna know why on earth this is a
reasonable thing to do. Silicon doesn't magically become carbon, which
is why VMD assumes that atom identities are static.

-Josh Vermaas

On 05/13/2015 06:48 PM, JeJoon Yeon wrote:
> Yes, I want to do that "alchemy" using VMD. Swapping Si atoms to C
> atom, under specific conditions I want. I can do that job without any
> problem for a single frame. But what I really want to do is, do that
> "alchemy" for all frames of xyz file. (There are 100000 frame inside
> my file) Unfortunately, using my attempts, atoms didn't swapped, or
> incorrectly swapped.
>
> I think your mention "$a points always last frame in atomselection" is
> the key. Because, all my attempts finished with the weird results: all
> frame's target Si atoms were not properly swapped to C. Instead, the
> swapped Si atoms during all frames, are the target Si atoms of the
> last frame. As a result, my codes only properly swapped the last
> frame's target Si atoms. To me, it looks like "VMD swapped last
> frame's target Si atoms to C atom, then track those atom all the way
> to first frame"
>
> I put
>
> set a [atomselect top "index < 1338 and name Si and y>9 and within 5
> of atom O]
> set all [atomselect top all]
>
> these two lines out of the for-loop, but the results are the same.
> Only the last frame's target Si atoms were swapped properly. Others
> are just traceback of the last frame. For example, in the first frame
> of result file, 'some Si atoms' finished "alchemy", but they are not
> the target Si, instead they are trace back of last frame's target Si
> atom. I think this is because $a selected as the last frame, so VMD
> swapped all frame, but it is only based on the position of last
> frame's information. How can I escape from this situation?
>
>
> 2015-05-13 17:29 GMT-04:00 Josh Vermaas <vermaas2_at_illinois.edu
> <mailto:vermaas2_at_illinois.edu>>:
>
> That isn't a complete for loop (should have a closing brace.).
> Beyond that, atomselections should happen outside the loop if at
> all possible. Atomselections within a loop need to be deleted to
> free up VMD internal memory, as they aren't *just* tcl objects,
> but also create datastructures within VMD that are not
> automatically deleted when the tcl atomselection object goes out
> of scope. What exactly are you trying to do? The way I've
> interpreted the code, you have a bunch of Silicon atoms, but if
> they are close enough to an oxygen, you want them to be a carbon
> instead (alchemy! VMD doesn't like alchemy), and only for that
> frame. Is that correct? Now you've muddled it a bit, since your
> $all variable is never called outside of changing its frame, which
> does nothing, and $a points to an atomselection that is always at
> the last frame, so I can't read your intent. Could you perhaps
> elaborate on what problem you are trying to solve?
>
>
> On 05/13/2015 04:22 PM, JeJoon Yeon wrote:
>> There was mistake in previous email. My for-loop looks like
>>
>> for { set i 0 } { $i <= $nf } { incr i } {
>> set a [atomselect top "index < 1338 and name Si and y>9 and
>> within 5 of atom O]
>> set all [atomselect top all]
>> $all frame $i
>> $a set name C
>> $a set type C
>> $a set element C
>>
>> But I still think my way of writing is wrong...
>>
>> 2015-05-13 14:44 GMT-04:00 Josh Vermaas <vermaas2_at_illinois.edu
>> <mailto:vermaas2_at_illinois.edu>>:
>>
>> Also, you need to make sure your for loop is doing this
>> sanely. Here is how I'd approach it:
>>
>> set a [atomselect top "index < 1338 and name Si and y>9 and
>> within 5 of atom O]
>> set t [atomselect top all]
>>
>> for { set i 0 } { $i < [molinfo top get numframes] } { incr i } {
>>
>> $a frame $i ; #changes the frame the selection will be based on
>> $a update ; #Rechecks that its selecting the right stuff
>> $a set name C
>> $a set type C
>> $a set element C
>>
>> }
>>
>> However name, type, and element are not per-frame fields, so
>> you do know that you'll be changing it for all of them, right?
>> -Josh
>>
>>
>> On 05/13/2015 01:07 PM, Maxim Belkin wrote:
>>
>> Hi,
>>
>> Have you tried the following?
>>
>> animate write xyz output.xyz beg 0 end -1 waitfor all
>>
>> Maxim
>>
>>
>> On May 13, 2015, at 12:53 PM, JeJoon Yeon
>> <sonicturbulent_at_gmail.com
>> <mailto:sonicturbulent_at_gmail.com>> wrote:
>>
>> Hello all
>>
>> I can swap specific atoms for a single frame xyz
>> only. Like
>>
>> mol new test.xyz type xyz waitfor all
>> set a [atomselect top "index < 1338 and name Si and
>> y>9 and within 5 of atom O]
>> $a set name C
>> $a set type C
>> $a set element C
>> set t [atomselect top all]
>> $t writexyz swapped.xyz
>>
>>
>> But how can I do this with multiple frame? I tried to
>> use for loop but
>> 1) Sometimes it causes error
>> 2) Sometimes it swaps the specific atoms for all
>> frames, but the criteria is based on only last
>> frame's xyz position.
>>
>> So I don't know what to do anymore. Can anyone help
>> or modify that single frame code to work for multiple
>> frames? Is this coming from read / write problem?
>>
>> Thanks
>>
>> Best,
>>
>>
>>
>>
>
>