Как найти двугранный угол по множеству декартовых координат - PullRequest
0 голосов
/ 27 декабря 2018

Я не очень хорош в питоне, но я смог абстрагировать длины от набора декартовых координат, и мне было интересно, есть ли какие-либо коды питона, доступные для абстрагирования двугранных углов от этих декартовых координат?

Например, у меня есть выходной файл с множеством декартовых координат, например:

Cartesian coordinates: (bohr)
I=    1 X=   1.089161712305D+00 Y=  -6.795658386274D-01 Z=   2.912662235164D+00
I=    2 X=   1.031796515496D+00 Y=  -2.381146835527D+00 Z=   5.335292839755D-01
I=    3 X=   1.149783510982D+00 Y=   2.340571359678D+00 Z=  -6.876555647869D-01
I=    4 X=   1.278468575364D+00 Y=   2.072538501526D+00 Z=   2.220316248303D+00
I=    5 X=  -4.171475147776D-01 Y=  -1.004865635312D+00 Z=   4.252321635652D+00
I=    6 X=   2.547199557318D+00 Y=  -1.259033236649D+00 Z=   4.204565916632D+00
I=    7 X=  -4.086320906666D-01 Y=   3.325945634419D+00 Z=   2.852114332848D+00
I=    8 X=   3.139057776797D+00 Y=   3.055463552677D+00 Z=   2.732226137725D+00
I=    9 X=  -1.409353483554D+00 Y=  -1.721937234077D+00 Z=  -1.137312724699D+00

Чтобы найти длину связи, скажем, I1 и I2, я сделаю это:

for f in logfile;
do
awk '/Cartesian coordinates: (bohr)/{x=NR+1}NR == x' $f > length1.dat
cut -c13-33 bond1.dat > bond1x.dat
cut -c37-57 bond1.dat > bond1y.dat
cut -c61-80 bond1.dat > bond1z.dat
paste bond1x.dat bond1y.dat bond1z.dat > bond1xyz.dat
sed -i -e 's/D/E/g' bond1xyz.dat
awk '/Cartesian coordinates: (bohr)/{x=NR+2}NR == x' $f > length2.dat
cut -c13-33 bond1.dat > bond2x.dat
cut -c37-57 bond1.dat > bond2y.dat
cut -c61-80 bond1.dat > bond2z.dat
paste bond2x.dat bond2y.dat bond2z.dat > bond2xyz.dat
sed -i -e 's/D/E/g' bond2xyz.dat
paste bond1xyz.dat bond2xyz.dat > bond12xyz.dat
awk '{print $1 - $4}' bond12xyz.dat > bond_x1.dat
awk '{print $2 - $5}' bond12xyz.dat > bond_y1.dat
awk '{print $3 - $6}' bond12xyz.dat > bond_z1.dat
paste bond_x1.dat bond_y1.dat bond_z1.dat > bond_xyz1.dat
awk '{print sqrt(($1)^2+($2)^2+($3)^2)}' bond_xyz1.dat > bond_xyz1val.dat       
awk -v factor=0.529177 '{print $1 * factor}' bond_xyz1val.dat > cart_xyz1.dat

Я знаю, что это далеко не элегантно, но у меня хорошо работает.

Я сейчас пытаюсь найти, например, двугранный угол I1 I2 I4 I5, и мне интересно, есть ли аналогичный способ сделать это по сравнению с методом, который я показал выше?

Спасибо за любые советы!

...