/*
 *  *******************************************************************
 *
 *  rmsd.h 
 *  (c) 2005 Bosco K Ho
 * 
 *  Implementation of the Kabsch algorithm to find the RMSD, and 
 *  the least-squares rotation matrix for a superposition between 
 *  two sets of vectors.
 *
 *  This implementation is completely self-contained. No other dependencies.
 *
 *  **************************************************************************
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published
 *  by the Free Software Foundation; either version 2.1 of the License, or (at
 *  your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,  but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details. 
 *  
 *  You should have received a copy of the GNU Lesser General Public License 
 *  along with this program; if not, write to the Free Software Foundation, 
 *  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *  **************************************************************************
 * 
 */

#ifndef _rmsd_h_
#define _rmsd_h_

/*
 * calculate_rotation_rmsd()
 *
 *   given two lists of x,y,z coordinates, constructs
 *    - mov_com: the centre of mass of the mov list
 *    - mov_to_ref: vector between the com of mov and ref
 *    - U: the rotation matrix for least-squares, usage of
 *         of the matrix U[3][3] is
 *           for (i=0; i<3; i++)
 *           {
 *             rotated_v[i] = 0.0; 
 *             for (j=0; j<3; j++)
 *               rotated_v[i] += U[i][j] * v[j];
 *           }
 *    - rmsd: measures similarity between the vectors
 */
void calculate_rotation_rmsd(double ref_xlist[][3],
                             double mov_xlist[][3], 
                             int n_list,
                             double mov_com[3],
                             double mov_to_ref[3],
                             double U[3][3],
                             double* rmsd);

/*
 * fast_rmsd()
 *
 * Fast calculation of rmsd w/o calculating a rotation matrix,
 * adapted from the BTK by Chris Saunders 11/2002. 
 */
void fast_rmsd(double ref_xlist[][3],
               double mov_xlist[][3], 
               int n_list,
               double* rmsd); 


#endif
