Hi everyone
I tried to the H-bond length of every H-bond between two sets of atoms, I modified Jason's hbond-life scipt to following:
#!perl
use strict;
use Getopt::Long;
use MaterialsScript qw(:all);
# Calculates hydrogen bond lifetime from a trajectory
# Considers only hydrogen bonds between two user defined sets
# User inputs
my \\\$doc = \\\$Documents{"Cs-0.5(2).xtd"};
my \\\$setA = \\\$doc->UnitCell->Sets("H");
my \\\$setB = \\\$doc->UnitCell->Sets("O");
# Relabel the atoms so names are unique (and hbond names will be unique)
my \\\$i=0;
foreach (@{\\\$doc->UnitCell->Atoms}) { \\\$i++; \\\$_->Name = \\\$_->ElementSymbol . \\\$i; }
# Label the atoms in sets A and B so they can be identified in the hbond names
foreach (@{\\\$setA->Atoms}) { \\\$_->Name .= "_HBSETA"; }
foreach (@{\\\$setB->Atoms}) { \\\$_->Name .= "_HBSETB"; }
# Calculate the initial batch of hbonds and store names
my \\\$trj = \\\$doc->Trajectory;
\\\$trj->CurrentFrame = 1;
\\\$doc->UnitCell->CalculateHBonds;
my \\\$hbonds = \\\$doc->UnitCell->HydrogenBonds;
my @hbnames;
foreach (@\\\$hbonds)
{
my \\\$a1 = \\\$_->Atom1->Name;
my \\\$a2 = \\\$_->Atom2->Name;
if (( \\\$a1 =~ /_HBSETA/ and \\\$a2 =~ /_HBSETB/) or
( \\\$a1 =~ /_HBSETB/ and \\\$a2 =~ /_HBSETA/))
{
push @hbnames, \\\$_->Name;
}
}
# H-bond length
my \\\$i=0;
foreach (@hbnames)
{
\\\$i++;
\\\$hbonds->Length;
printf "%4d %30s %8.2f\\n", \\\$i, \\\$_, \\\$hbonds;
}
# Discard changes so atom labels are not permanent
\\\$doc->Discard;
But I got the following error when I debug the script:
There is no function or property named "Length" on type "Collection" at -e line 53.
which is:
\\\$hbonds->Length;
I'm confused here, I checked the function list, there isn't this one, but Stephen did use this function in his hydrogen bond analysis script.
Does anyone have an idea how to get h-bond length?
Thank you.
Jingjing Bu
