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