CCL Home Page
Up Directory CCL tterm.java
/**
 * tterm.java - MM2-style torsion energy term
 * Copyright (c) 1997 Will Ware, all rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    or its derived works must display the following acknowledgement:
 * 	This product includes software developed by Will Ware.
 * 
 * This software is provided "as is" and any express or implied warranties,
 * including, but not limited to, the implied warranties of merchantability
 * or fitness for any particular purpose are disclaimed. In no event shall
 * Will Ware be liable for any direct, indirect, incidental, special,
 * exemplary, or consequential damages (including, but not limited to,
 * procurement of substitute goods or services; loss of use, data, or
 * profits; or business interruption) however caused and on any theory of
 * liability, whether in contract, strict liability, or tort (including
 * negligence or otherwise) arising in any way out of the use of this
 * software, even if advised of the possibility of such damage.
 */

import java.lang.Math;
import java.util.Vector;
import atom;

public class tterm extends term
{
  public static final String rcsid =
  "$Id: tterm.java,v 1.12 1997/10/17 14:49:09 wware Exp $";
  private double v1, v2, v3;
  public tterm (atom a1, atom a2, atom a3, atom a4)
  {
    int i;
    boolean found;
    myAtoms = new atom[4];
    myAtoms[0] = a1;
    myAtoms[1] = a2;
    myAtoms[2] = a3;
    myAtoms[3] = a4;
    for (i = 0, found = false; i < torsionCoeffs.length && !found; i++)
      if ((a1.atomicNumber () == torsionCoeffs[i][0] &&
	   a1.hybridization == torsionCoeffs[i][1] &&
	   a2.atomicNumber () == torsionCoeffs[i][2] &&
	   a2.hybridization == torsionCoeffs[i][3] &&
	   a3.atomicNumber () == torsionCoeffs[i][4] &&
	   a3.hybridization == torsionCoeffs[i][5] &&
	   a4.atomicNumber () == torsionCoeffs[i][6] &&
	   a4.hybridization == torsionCoeffs[i][7]) ||
	  (a1.atomicNumber () == torsionCoeffs[i][6] &&
	   a1.hybridization == torsionCoeffs[i][7] &&
	   a2.atomicNumber () == torsionCoeffs[i][4] &&
	   a2.hybridization == torsionCoeffs[i][5] &&
	   a3.atomicNumber () == torsionCoeffs[i][2] &&
	   a3.hybridization == torsionCoeffs[i][3] &&
	   a4.atomicNumber () == torsionCoeffs[i][0] &&
	   a4.hybridization == torsionCoeffs[i][1]))
	{
	  found = true;
	  // convert table numbers from maJ to aJ (10^-18 joules)
	  v1 = 0.001 * torsionCoeffs[i][8];
	  v2 = 0.001 * torsionCoeffs[i][9];
	  v3 = 0.001 * torsionCoeffs[i][10];
	}
    if (!found)
      v1 = v2 = v3 = 0.0;
  }

  // need these routines to make sure a bond doesn't already exist
  public boolean redundant (tterm t)
  {
	  if ((t.myAtoms[0] == myAtoms[0] &&
	       t.myAtoms[1] == myAtoms[1] &&
	       t.myAtoms[2] == myAtoms[2] &&
	       t.myAtoms[3] == myAtoms[3]) ||
	      (t.myAtoms[3] == myAtoms[0] &&
	       t.myAtoms[2] == myAtoms[1] &&
	       t.myAtoms[1] == myAtoms[2] &&
	       t.myAtoms[0] == myAtoms[3]))
	    return true;
    return false;
  }
  public void enumerate (Vector atomList, Vector termList)
  {
    int i, j, k, l;
    for (i = 0; i < atomList.size (); i++)
      {
	atom a1 = (atom) atomList.elementAt (i);
	if (a1 != null)
	  for (j = 0; j < a1.bonds.size (); j++)
	    {
	      atom a2 = (atom) a1.bonds.elementAt (j);
	      if (a2 != null)
		for (k = 0; k < a2.bonds.size (); k++)
		  {
		    atom a3 = (atom) a2.bonds.elementAt (k);
		    if (a3 != null)
		      for (l = 0; l < a3.bonds.size (); l++)
			{
			  atom a4 = (atom) a3.bonds.elementAt (l);
			  if (a4 != null)
			    if (a1 != a2 && a1 != a3 && a2 != a3 &&
				a1 != a4 && a2 != a4 && a3 != a4)
			      {
				tterm t = new tterm (a1, a2, a3, a4);
				if (!t.redundant (termList))
				  {
				    termList.addElement (t);
				  }
			      }
			}
		  }
	    }
      }
  }
  private final static double PI = 3.14159265258979;
  // I found, much to my dismay, that I had been miscalculating torsion
  // forces for years! How embarassing. Now I've decided to just steal the
  // correct torsion code from the NAMD program and translate it from C++
  // to Java.
  public void computeForces ()
  {
    double r12[], r23[], r34[];	//  Vectors between atoms
    double f1[], f2[], f3[];	//  Forces 1 through 3
    double A[], B[], C[];		//  Cross product vectors
    double dcosdA[];		//  Derivative d(cos(phi))/dA
    double dcosdB[];		//  Derivative d(cos(phi))/dB
    double dsindC[];		//  Derivative d(sin(phi))/dC
    double dsindB[];		//  Derivative d(sin(phi))/dB
    double rA, rB, rC;	//  Length of vectors A, B, and C
    double phi;		//  angle between the plans
    double cos_phi;	//  cos(phi)
    double sin_phi;	//  sin(phi)
    double delta;		//  Phase shift of the current dihedral
    double k;			//  Force constant of the current dihedral
    int n;			//  Periodicity
    double K, K1;		//  Calculated factor
    double diff;		//  Difference between phi and phi0
    int mult_num;		//  Current multiple we are calculating
	
    if (v1 == 0.0 && v2 == 0.0 && v3 == 0.0)
      return;

    r12 = new double[3];
    r23 = new double[3];
    r34 = new double[3];
    f1 = new double[3];
    f2 = new double[3];
    f3 = new double[3];
    A = new double[3];
    B = new double[3];
    C = new double[3];
    dcosdA = new double[3];
    dcosdB = new double[3];
    dsindC = new double[3];
    dsindB = new double[3];

    // Calculate the vectors between atoms
    r12[0] = myAtoms[0].x[0] - myAtoms[1].x[0];
    r12[1] = myAtoms[0].x[1] - myAtoms[1].x[1];
    r12[2] = myAtoms[0].x[2] - myAtoms[1].x[2];
    
    r23[0] = myAtoms[1].x[0] - myAtoms[2].x[0];
    r23[1] = myAtoms[1].x[1] - myAtoms[2].x[1];
    r23[2] = myAtoms[1].x[2] - myAtoms[2].x[2];
    
    r34[0] = myAtoms[2].x[0] - myAtoms[3].x[0];
    r34[1] = myAtoms[2].x[1] - myAtoms[3].x[1];
    r34[2] = myAtoms[2].x[2] - myAtoms[3].x[2];
    
    //  Calculate the cross products
    A[0] =  r12[1]*r23[2] - r23[1]*r12[2];
    A[1] = -r12[0]*r23[2] + r23[0]*r12[2];
    A[2] =  r12[0]*r23[1] - r23[0]*r12[1];
    
    B[0] =  r23[1]*r34[2] - r34[1]*r23[2];
    B[1] = -r23[0]*r34[2] + r34[0]*r23[2];
    B[2] =  r23[0]*r34[1] - r34[0]*r23[1];
    
    C[0] =  r23[1]*A[2] - A[1]*r23[2];
    C[1] = -r23[0]*A[2] + A[0]*r23[2];
    C[2] =  r23[0]*A[1] - A[0]*r23[1];
    
    //  Calculate the distances
    rA = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]);
    rB = Math.sqrt(B[0]*B[0] + B[1]*B[1] + B[2]*B[2]);
    rC = Math.sqrt(C[0]*C[0] + C[1]*C[1] + C[2]*C[2]);
    
    //  Calculate the sin and cos
    //  cos = A*B/(rA*rB)
    //  sin = C*B/(rC*rB)
    cos_phi = (A[0]*B[0] + A[1]*B[1] + A[2]*B[2])/(rA*rB);
    sin_phi = (C[0]*B[0] + C[1]*B[1] + C[2]*B[2])/(rC*rB);
    
    //  Normalize B
    rB = 1/rB;
    
    B[0] *= rB;
    B[1] *= rB;
    B[2] *= rB;
    
    //  Get phi, assign the sign based on the sine value
    
    //  Make sure that the cosine value is acceptable.  With roundoff, you
    //  can get values like 1.0+2e-16, which makes acos puke.  So instead,
    //  just set these kinds of values to exactly 1.0
    //		if (cos_phi>1.0)
    //			cos_phi = 1.0;
    //		else if (cos_phi < -1.0)
    //			cos_phi = -1.0;
    
    //		phi = acos(cos_phi);
    //		CHECK_DOMAIN();
    //		phi = -copysign(phi, sin_phi);
    
    // I think atan2 will do all the above stuff accurately
    // RKB
    phi = -Math.atan2(sin_phi,cos_phi);
    // CHECK_DOMAIN(); ??????
    
    // if (fabs(sin_phi) > 0.1)
    if (sin_phi > 0.1 || sin_phi < -0.1)
      {
	//  Normalize A
	rA = 1/rA;
	
	A[0] *= rA;
	A[1] *= rA;
	A[2] *= rA;
	
	dcosdA[0] = -rA*(B[0] - cos_phi*A[0]);
	dcosdA[1] = -rA*(B[1] - cos_phi*A[1]);
	dcosdA[2] = -rA*(B[2] - cos_phi*A[2]);
	
	dcosdB[0] = -rB*(A[0] - cos_phi*B[0]);
	dcosdB[1] = -rB*(A[1] - cos_phi*B[1]);
	dcosdB[2] = -rB*(A[2] - cos_phi*B[2]);
      }
    else
      {
	//  Normalize C
	rC = 1/rC;
	
	C[0] *= rC;
	C[1] *= rC;
	C[2] *= rC;
	
	dsindC[0] = -rC*(B[0]-sin_phi*C[0]);
	dsindC[1] = -rC*(B[1]-sin_phi*C[1]);
	dsindC[2] = -rC*(B[2]-sin_phi*C[2]);
	
	dsindB[0] = -rB*(C[0]-sin_phi*B[0]);
	dsindB[1] = -rB*(C[1]-sin_phi*B[1]);
	dsindB[2] = -rB*(C[2]-sin_phi*B[2]);
      }
    
    //  Loop through the multiple parameter sets for this
    //  bond.  We will only loop more than once if this
    //  has multiple parameter sets from Charmm22
    for (mult_num=0; mult_num < 3; mult_num++)
      {
	switch (mult_num)
	  {
	  case 0:
	    n = 1;
	    k = v1;
	    break;
	  case 1:
	    n = 2;
	    k = -v2;
	    break;
	  default:
	    n = 3;
	    k = v3;
	    break;
	  }
	delta = 0;

	if (k != 0.0)
	  {
	    //  Calculate the energy
	    K = k*(1+Math.cos(n*phi + delta));
	    K1 = -n*k*Math.sin(n*phi + delta);
	    
	    //  Next, we want to calculate the forces.  In order
	    //  to do that, we first need to figure out whether the
	    //  sin or cos form will be more stable.  For this,
	    //  just look at the value of phi
	    // if (fabs(sin_phi) > 0.1)
	    if (sin_phi > 0.1 || sin_phi < -0.1)
	      {
		//  use the sin version to avoid 1/cos terms
		K1 = K1/sin_phi;
		
		f1[0] = K1*(r23[1]*dcosdA[2] - r23[2]*dcosdA[1]);
		f1[1] = K1*(r23[2]*dcosdA[0] - r23[0]*dcosdA[2]);
		f1[2] = K1*(r23[0]*dcosdA[1] - r23[1]*dcosdA[0]);
		
		f3[0] = K1*(r23[2]*dcosdB[1] - r23[1]*dcosdB[2]);
		f3[1] = K1*(r23[0]*dcosdB[2] - r23[2]*dcosdB[0]);
		f3[2] = K1*(r23[1]*dcosdB[0] - r23[0]*dcosdB[1]);
		
		f2[0] = K1*(r12[2]*dcosdA[1] - r12[1]*dcosdA[2] 
+ r34[1]*dcosdB[2] - r34[2]*dcosdB[1]);
		f2[1] = K1*(r12[0]*dcosdA[2] - r12[2]*dcosdA[0] 
+ r34[2]*dcosdB[0] - r34[0]*dcosdB[2]);
		f2[2] = K1*(r12[1]*dcosdA[0] - r12[0]*dcosdA[1] 
+ r34[0]*dcosdB[1] - r34[1]*dcosdB[0]);
	      }
	    else
	      {
		//  This angle is closer to 0 or 180 than it is to 
		//  90, so use the cos version to avoid 1/sin terms
		K1 = -K1/cos_phi;
		
		f1[0] = K1*( (r23[1]*r23[1] + r23[2]*r23[2])*dsindC[0] 
- r23[0]*r23[1]*dsindC[1] - r23[0]*r23[2]*dsindC[2]);
		f1[1] = K1*( (r23[2]*r23[2] + r23[0]*r23[0])*dsindC[1] 
- r23[1]*r23[2]*dsindC[2] - r23[1]*r23[0]*dsindC[0]);
		f1[2] = K1*( (r23[0]*r23[0] + r23[1]*r23[1])*dsindC[2] 
- r23[2]*r23[0]*dsindC[0] - r23[2]*r23[1]*dsindC[1]);
		
		f3[0] = K1*(dsindB[1]*r23[2] - r23[1]*dsindB[2]);
		f3[1] = K1*(dsindB[2]*r23[0] - r23[2]*dsindB[0]);
		f3[2] = K1*(dsindB[0]*r23[1] - r23[0]*dsindB[1]);
		
		f2[0] = K1*(-(r23[1]*r12[1] + r23[2]*r12[2])*dsindC[0]
			    + (2.0*r23[0]*r12[1] - r12[0]*r23[1])*dsindC[1]
			    + (2.0*r23[0]*r12[2] - r12[0]*r23[2])*dsindC[2]
+ dsindB[2]*r34[1] - dsindB[1]*r34[2]);
		f2[1] = K1*(-(r23[2]*r12[2] + r23[0]*r12[0])*dsindC[1]
			    +(2.0*r23[1]*r12[2] - r12[1]*r23[2])*dsindC[2]
			    +(2.0*r23[1]*r12[0] - r12[1]*r23[0])*dsindC[0]
+dsindB[0]*r34[2] - dsindB[2]*r34[0]);
		f2[2] = K1*(-(r23[0]*r12[0] + r23[1]*r12[1])*dsindC[2]
			    +(2.0*r23[2]*r12[0] - r12[2]*r23[0])*dsindC[0]
			    +(2.0*r23[2]*r12[1] - r12[2]*r23[1])*dsindC[1]
+dsindB[1]*r34[0] - dsindB[0]*r34[1]);
	      }
	    
	    myAtoms[0].f[0] += f1[0];
	    myAtoms[0].f[1] += f1[1];
	    myAtoms[0].f[2] += f1[2];
	    
	    myAtoms[1].f[0] += f2[0] - f1[0];
	    myAtoms[1].f[1] += f2[1] - f1[1];
	    myAtoms[1].f[2] += f2[2] - f1[2];
	    
	    myAtoms[2].f[0] += f3[0] - f2[0];
	    myAtoms[2].f[1] += f3[1] - f2[1];
	    myAtoms[2].f[2] += f3[2] - f2[2];
	    
	    myAtoms[3].f[0] -= f3[0];
	    myAtoms[3].f[1] -= f3[1];
	    myAtoms[3].f[2] -= f3[2];
	  }
      }
  }
  private final static double[][] torsionCoeffs =
  {
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  0.200, 0.270, 0.093 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  0.170, 0.270, 0.093 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  C, atom.SP,   0.200, -0.260, 0.093 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  H, atom.NONE, 0.000, 0.000, 0.267 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  0.100, 0.100, 0.180 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  0.100, 0.400, 0.500 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  0.000, 0.000, 0.400 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  0.100, 0.400, 0.500 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  2.100, 0.270, 0.093 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  C, atom.SP,   0.000, 0.000, 0.093 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  H, atom.NONE, 0.000, 0.000, 0.500 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  0.000, 0.000, 0.180 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  0.000, 0.000, 0.180 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  0.000, 0.000, 0.180 },
    { C, atom.SP,   C, atom.SP3,  C, atom.SP3,  C, atom.SP,   1.000, 0.000, 0.093 },
    { C, atom.SP,   C, atom.SP3,  C, atom.SP3,  H, atom.NONE, 0.000, 0.000, 0.400 },
    { C, atom.SP,   C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  0.000, -0.400, 0.180 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP3,  H, atom.NONE, 0.000, 0.000, 0.237 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  0.000, 0.000, 0.180 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  -0.150, 0.000, 0.150 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  0.000, 0.000, 0.400 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  -0.150, 0.000, 0.150 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP3,  O, atom.SP2,  0.000, 0.000, 0.180 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  0.000, -0.600, 0.300 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  0.000, 0.000, 0.000 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  0.000, 0.000, 0.000 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  0.000, -0.600, 0.300 },
    { N, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  -0.400, -1.100, 1.200 },
    { N, atom.SP3,  C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  1.170, -1.263, 2.064 },
    { N, atom.SP2,  C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  0.000, 0.000, -0.500 },
    { O, atom.SP2,  C, atom.SP3,  C, atom.SP3,  O, atom.SP2,  0.000, -0.600, 0.300 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP3,  0.400, 0.030, 0.500 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  -0.440, 0.240, 0.060 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP,   -0.440, 0.240, 0.060 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  H, atom.NONE, 0.000, 0.000, 0.010 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP2,  O, atom.SP3,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.300 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  0.100, 0.000, 0.500 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP2,  H, atom.NONE, 0.000, 0.000, 0.600 },
    { C, atom.SP2,  C, atom.SP3,  C, atom.SP2,  O, atom.SP3,  0.000, 0.000, 0.000 },
    { C, atom.SP,   C, atom.SP3,  C, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.780 },
    { C, atom.SP,   C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.100 },
    { C, atom.SP,   C, atom.SP3,  C, atom.SP2,  H, atom.NONE, 0.000, 0.000, 0.780 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.540 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  0.000, 0.000, -0.240 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP2,  C, atom.SP,   0.000, 0.000, -0.240 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP2,  H, atom.NONE, 0.000, 0.000, 0.520 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP2,  O, atom.SP3,  0.000, 0.000, 0.540 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.000 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { O, atom.SP3,  C, atom.SP3,  C, atom.SP2,  H, atom.NONE, 0.000, 0.000, 0.000 },
    { N, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.000 },
    { N, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { N, atom.SP3,  C, atom.SP3,  C, atom.SP2,  H, atom.NONE, 0.000, 0.000, 0.000 },
    { N, atom.SP3,  C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { C, atom.SP3,  C, atom.SP3,  C, atom.SP,   C, atom.SP,   0.000, 0.001, 0.000 },
    { H, atom.NONE, C, atom.SP3,  C, atom.SP,   C, atom.SP,   0.000, 0.001, 0.000 },
    { C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  C, atom.SP3,  0.400, 0.520, 0.467 },
    { C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  C, atom.SP2,  0.000, 0.000, 0.400 },
    { C, atom.SP3,  C, atom.SP3,  O, atom.SP3,  O, atom.SP3,  0.000, 0.000, 0.400 },
    { C, atom.SP2,  C, atom.SP3,  O, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.403 },
    { H, atom.NONE, C, atom.SP3,  O, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.530 },
    { H, atom.NONE, C, atom.SP3,  O, atom.SP3,  C, atom.SP2,  0.000, 0.000, 0.530 },
    { H, atom.NONE, C, atom.SP3,  O, atom.SP3,  O, atom.SP3,  0.000, 0.000, 0.465 },
    { O, atom.SP3,  C, atom.SP3,  O, atom.SP3,  C, atom.SP3,  -0.170, -1.200, 0.000 },
    { O, atom.SP3,  C, atom.SP3,  O, atom.SP3,  O, atom.SP3,  0.000, 0.000, 0.403 },
    { C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  -0.200, 0.730, 0.800 },
    { C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  N, atom.SP3,  -0.200, 0.730, 0.800 },
    { C, atom.SP2,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP3,  N, atom.SP3,  N, atom.SP3,  0.000, 0.000, 0.000 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.520 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP3,  C, atom.SP2,  0.000, 0.000, 0.450 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP3,  N, atom.SP3,  0.000, 0.000, 0.520 },
    { N, atom.SP3,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.350 },
    { N, atom.SP3,  C, atom.SP3,  N, atom.SP3,  N, atom.SP3,  0.000, 0.000, 0.350 },
    { N, atom.SP3,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.350 },
    { C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.910 },
    { C, atom.SP3,  C, atom.SP3,  N, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP2,  C, atom.SP3,  0.000, 0.000, -0.200 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.650 },
    { C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  -0.200, 0.730, 0.800 },
    { C, atom.SP3,  C, atom.SP3,  N, atom.SP3,  H, atom.NONE, 0.000, 0.120, 0.100 },
    { C, atom.SP2,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP3,  N, atom.SP3,  H, atom.NONE, 0.000, 0.000, 0.000 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.520 },
    { H, atom.NONE, C, atom.SP3,  N, atom.SP3,  H, atom.NONE, 0.000, 0.000, 0.250 },
    { N, atom.SP3,  C, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.000, 0.000, 0.350 },
    { C, atom.SP3,  C, atom.SP3,  O, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.400 },
    { H, atom.NONE, C, atom.SP3,  O, atom.SP2,  C, atom.SP2,  0.000, 0.000, 0.350 },
    { C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  C, atom.SP3,  -0.100, 10.000, 0.000 },
    { C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  -0.270, 10.000, 0.000 },
    { C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  H, atom.NONE, 0.000, 12.500, 0.000 },
    { C, atom.SP3,  C, atom.SP2,  C, atom.SP2,  O, atom.SP3,  -1.200, 16.250, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  -0.930, 8.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  C, atom.SP,   0.000, 15.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  H, atom.NONE, 0.000, 9.000, -1.060 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  O, atom.SP3,  0.000, 16.250, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  N, atom.SP3,  0.000, 15.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  N, atom.SP2,  0.000, 12.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP2,  O, atom.SP2,  0.000, 15.000, 0.000 },
    { C, atom.SP,   C, atom.SP2,  C, atom.SP2,  H, atom.NONE, 0.000, 15.000, 0.000 },
    { H, atom.NONE, C, atom.SP2,  C, atom.SP2,  H, atom.NONE, 0.000, 15.000, 0.000 },
    { H, atom.NONE, C, atom.SP2,  C, atom.SP2,  O, atom.SP3,  0.000, 16.250, 0.000 },
    { H, atom.NONE, C, atom.SP2,  C, atom.SP2,  N, atom.SP3,  0.000, 15.000, 0.000 },
    { H, atom.NONE, C, atom.SP2,  C, atom.SP2,  N, atom.SP2,  0.000, 12.000, 0.000 },
    { H, atom.NONE, C, atom.SP2,  C, atom.SP2,  O, atom.SP2,  0.000, 15.000, 0.000 },
    { O, atom.SP3,  C, atom.SP2,  C, atom.SP2,  O, atom.SP3,  -2.000, 16.250, 0.000 },
    { O, atom.SP2,  C, atom.SP2,  C, atom.SP2,  O, atom.SP2,  -2.000, 15.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  C, atom.SP,   C, atom.SP,   0.000, 0.001, 0.000 },
    { C, atom.SP3,  C, atom.SP2,  O, atom.SP3,  C, atom.SP3,  2.300, 4.000, 0.000 },
    { C, atom.SP3,  C, atom.SP2,  O, atom.SP3,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  O, atom.SP3,  C, atom.SP3,  3.530, 2.300, -3.530 },
    { C, atom.SP2,  C, atom.SP2,  O, atom.SP3,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { H, atom.NONE, C, atom.SP2,  O, atom.SP3,  C, atom.SP3,  3.000, 3.100, 0.000 },
    { H, atom.NONE, C, atom.SP2,  O, atom.SP3,  C, atom.SP2,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  N, atom.SP3,  C, atom.SP3,  -1.570, 3.200, 0.000 },
    { H, atom.NONE, C, atom.SP2,  N, atom.SP3,  C, atom.SP3,  1.570, 1.690, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  N, atom.SP2,  C, atom.SP3,  0.000, 2.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  N, atom.SP2,  C, atom.SP2,  0.000, 0.000, 1.490 },
    { N, atom.SP2,  C, atom.SP2,  N, atom.SP2,  C, atom.SP3,  0.000, 0.000, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  O, atom.SP2,  C, atom.SP3,  0.000, 9.200, 0.000 },
    { C, atom.SP2,  C, atom.SP2,  O, atom.SP2,  C, atom.SP2,  0.000, 8.300, -0.800 },
    { H, atom.NONE, C, atom.SP2,  O, atom.SP2,  C, atom.SP3,  -0.820, 9.200, 3.700 },
    { H, atom.NONE, C, atom.SP2,  O, atom.SP2,  C, atom.SP2,  -0.460, 2.700, 0.700 },
    { C, atom.SP3,  C, atom.SP,   C, atom.SP,   C, atom.SP2,  0.000, 0.001, 0.000 },
    { C, atom.SP3,  C, atom.SP,   C, atom.SP,   C, atom.SP,   0.000, 0.001, 0.000 },
    { C, atom.SP2,  C, atom.SP,   C, atom.SP,   C, atom.SP2,  0.000, 0.001, 0.000 },
    { C, atom.SP2,  C, atom.SP,   C, atom.SP,   C, atom.SP,   0.000, 0.001, 0.000 },
    { C, atom.SP2,  C, atom.SP,   C, atom.SP,   H, atom.NONE, 0.000, 0.001, 0.000 },
    { C, atom.SP,   C, atom.SP,   C, atom.SP,   C, atom.SP,   0.000, 0.001, 0.000 },
    { C, atom.SP3,  O, atom.SP3,  O, atom.SP3,  C, atom.SP3,  2.095, -2.155, -0.113 },
    { C, atom.SP3,  N, atom.SP3,  N, atom.SP3,  C, atom.SP3,  0.900, -6.800, 0.210 },
  };
}
Modified: Sat Jan 17 17:00:00 1998 GMT
Page accessed 4000 times since Wed Feb 5 08:53:15 2003 GMT