From: Axel Kohlmeyer (
Date: Tue Oct 16 2012 - 10:33:57 CDT

On Tue, Oct 16, 2012 at 5:11 PM, Vikas Varshney <> wrote:
> Dear Axel,
> Thank you for your email and the suggestions.
> As you mentioned, I can load the dump file in the same molecule. That should
> not be a problem. About the coloring scheme, I want to calculate the
> distance between all bonding pairs (3 pairs) for certain atom and then use
> the largest distance among the three as the measure of the color of the
> atom.
> After reading your email, this is what I should be done. Please let me know
> if that makes sense.
> 1. Read the data file using topotools
> 2. Retrieve the bond information (Please let me know in which variable the
> list of lists for bonding information is stored).

you have to choose the variable.

set bondlist [topo getbondlist none]

> Question: Is this list of lists based on the bond index (as in lammps)
> or for each atom (as in each sub-list contains information about all of its
> bonds)

no, the lammps bond index is lost. VMD stores bonds in a very peculiar format
that is optimized for fast display. you get a list where each entry has the
atom indices that form a bond.

> 3. If bond retrival list is like lammps (index based), Create a new list of
> lists for each atom bond (each sublist will contain information about one
> atom's bonding partners). Lets call this list bond3. This will be done only
> one time.

this information is readily available from VMD and how it stores the
bond information.
if that is what you are after, then you don't need topo getbonds, but
rather create
a selection for all atoms and then do

set bondlist [$sel getbonds]

in this case $bondlist will contain a list of lists with one entry per atom
where each entry is the list of bonding partners of this atom.

> 4. Then, for a certain frame, calculate the 3 distances for each atom (using
> bond3 list of lists). Get the magnitude of the longest bond. Then color that
> atom based on that distance.


> 5. Do this for each frame.
> Please let me know if you think is more appropriate. Thanks for your help.

with my proposed augmentations, that should work.


> Best Regards,
> Vikas
> On Mon, Oct 15, 2012 at 3:12 PM, Axel Kohlmeyer <> wrote:
>> i am adding some comments below.
>> On Mon, Oct 15, 2012 at 5:53 PM, Vikas Varshney <> wrote:
>> > Dear John, Axel,
>> >
>> > I have a trajectory of my system of interest (CNTs) which I want to
>> > visualize with certain color scheme associated with retrival of bonds
>> > information.
>> >
>> > Basically, I am stretching a CNT and would like to color the atoms based
>> > on
>> > the longest bond distance. I have looked over the forum to get some
>> > insights
>> > on how to color atoms based on user defined parameters and have the
>> > following TCl script which hopefully will do the job. I need some help
>> > with
>> > how to retrive bond information so that I can calculated bond lengths
>> > for
>> > each atom with its bonding pairs.
>> >
>> > I am using Axel's topotools package to load the lammps data file which I
>> > think is loading bond information as well. Below is the template of the
>> > TCl
>> > script
>> >
>> > -------------------
>> > #/usr/bin/tclsh
>> >
>> > set lmpdata [atomselect 0 all] #This contains topology information
>> > set lmptrj [atomselect 1 all] #This is the trajectory file
>> this looks as if you are loading the dump into a different (vmd)
>> "molecule".
>> it would be much better to load the trajectory "into" the same "molecule".
>> if your dump contains the atom ids, the order should be preserved.
>> > for {set i 0} {$i < [molinfo 1 get numframes]} {incr i} {
>> > $lmptrj frame $i
>> > foreach atomind [$allsel get index] {
>> > set csel [atomselect 1 "index $atomind" frame $i]
>> > # Get indices of other atoms that are connected to atom "atomind"
>> this is hugely inefficient.
>> since you seem to be using a conventional force field
>> or at least a topology file that has contains bond information,
>> you can do the following.
>> topotools has a command to retrieve a "bond list" this is a
>> list of lists which contains a list of all bonds with each entry
>> containing the two atom indices forming the bond and additional
>> information, as requested. this information will not change
>> over the trajectory, so it can be retrieved up front and stored.
>> then you should take the selection for all atoms (also defined
>> outside the loop) and advance it to the current frame as in your
>> script fragment and then retrieve all coordinate triples via
>> $sel get {x y z}. this will also produce a list of lists.
>> now you can loop over the bond list and for each bond get
>> the two indices (e.g. using lassign) and then use lindex
>> on the coordinate list to get the two coordinate vectors and
>> use vecdist to compute the distance (i.e. bond length).
>> now the big question is, how do you want to convert this
>> information into a color code, since color is stored on a
>> per atom basis and each atom has multiple bonding partners
>> (3) and you have 4 user fields to store per atom per frame
>> information. so theoretically it should be possible with
>> 3 representations using one of 3 user fields to handle
>> this, but you'd have to figure out a way to select the bonds
>> accordingly, which i currently have no idea how to do.
>> > # Calculate distance of each bond pair with one atom "atomind" using
>> > vector
>> > operators or some other functions
>> > # Get the largest distance (ldist)
>> > # Color atom
>> > $csel set user $ldist
>> > $csel delete
>> creating and deleting selections during a loop and particularly
>> on a per atom basis, is going to be very slow, and in your
>> case not really needed.
>> axel.
>> > }
>> > }
>> >
>> > $lmpsdata delete
>> > $lmptrj delete
>> >
>> > -------------------
>> >
>> > I will highly appreciate any other suggestions as well.
>> >
>> > Best Regards,
>> > Vikas
>> --
>> Dr. Axel Kohlmeyer
>> International Centre for Theoretical Physics, Trieste. Italy.

Dr. Axel Kohlmeyer
International Centre for Theoretical Physics, Trieste. Italy.