GLYLIB  0.3.0b
modes.h
Go to the documentation of this file.
00001 /** \file  modes.h
00002 \brief  Header file for vibrational modes.
00003 
00004 Begun 20070519 by Lachele Foley
00005 This file contains structures to be used for descriptions of
00006 vibrational modes.  Most of the definitions should be obvious
00007 to most folks who are concerned with vibrations.  But, a few,
00008 like the "extent of" descriptors, will not be so evident.  
00009 Eventually, I'll document how they are determined -- they
00010 basically boil down to normalized dot products, but the exact
00011 definitions might be more subtle. */
00012 
00013 #if !defined(GLYLIB_MODES)
00014 #define GLYLIB_MODES
00015 //#include "molecules.h"
00016 
00017 /** \addtogroup VIBRATIONS
00018  * @{
00019  */
00020 typedef struct {
00021         int i; ///< array index
00022         int j; ///< internal index 
00023         int k; ///< some other index
00024 } intset; ///< intended to use in assignment arrays for indexing to mode details
00025 
00026 typedef struct {
00027         int ct; ///< mode class type (see docs)
00028 // Class types are indexed by number, e.g.:
00029 //      0       stretch  
00030 //      1       bend 
00031 //      2       torsion 
00032 //      3       ringmotion
00033         int ce; ///< class entry ... 
00034         int i ; ///< other index
00035 // the index for of a certain type (e.g., stretch) in the vibmode array
00036         int C; ///< complexity for this mode entry
00037         double w; ///< weight (intensity, extent, etc.) for this mode
00038 } vibindex;
00039 
00040 typedef struct{
00041         int i; ///< general index
00042         int nv; ///< number of va's
00043         vibindex *vi; ///< indices for mode details
00044         molindex mi; ///< info about the atom
00045 } vibaddr; ///< for holding addresses in a vibmode array
00046 
00047 typedef struct {
00048         int i; ///< index
00049         char *Desc; ///< free-form description for mode 
00050         double I; ///< intensity of the motion (user-defined...)
00051         double e; ///< extent of stretch in motion
00052         molindex  A,B;
00053         coord_3D c; ///< e.g., for describing motions in i,j,k 
00054 } stretch; ///< description of stretch
00055 
00056 typedef struct {
00057         int i; ///< index
00058         char *Desc; ///< free-form description for mode 
00059         double I; ///< intensity of the motion (user-defined...)
00060         double e; ///< extent of angle bend in motion
00061         molindex  A,B,C; 
00062         coord_3D c; ///< e.g., for describing motions in i,j,k 
00063 } bend; 
00064 
00065 typedef struct {
00066         int i; ///< index
00067         char *Desc; ///< free-form description for mode 
00068         double I; ///< intensity of the motion (user-defined...)
00069         double e; ///< extent of torsion in motion
00070         molindex  A,B,C;
00071         coord_3D c; ///< e.g., for describing motions in i,j,k 
00072 } torsion; ///< description of torsion
00073 
00074 typedef struct {
00075         int i; ///< index
00076         char *Desc; ///< free-form description for mode
00077         char *RingDesc; ///< Description of ring type, e.g. phenyl, 0GB, etc.
00078         double I; ///< intensity of the motion (user-defined...)
00079         double e; ///< extent of ring-portion of overall motion
00080         double pvp; ///< motion parallel (~0) or perpendicular (~1) to plane
00081         double par; ///< breathing-type or side-to-side motion (if parallel)
00082         double sym; ///< symmetric (~1) or antisymmetric (~0) (par or perp)
00083         int symZ,symXY; ///< symmetries in the Z direction and XY plane
00084         int na; ///< number of main atoms involved
00085         molindex  *mi; ///<na of these
00086         int nc; ///< number of vectormag_3D sets 
00087         vectormag_3D *c; ///< nc of these (e.g., direction intensities of atoms)
00088 } ringmotion; ///< description of ring-related motion
00089 
00090 typedef struct {
00091         int i,j,k; ///< indices -- molecule number, file entry number, etc.
00092         double f; ///< frequency for this mode (usually in wavenumbers)
00093         double I; ///< intensity of mode, user-defined
00094         double IR; ///< IR intensity of the mode (absorption, preferrably)
00095         double RA; ///< RAMAN intensity of the mode (absorption, preferrably)
00096         char *Desc; ///< free-form description
00097         int C; ///< complexity factor (number of different motions represented)
00098         int ns; ///< number of stretches in mode
00099         int nb; ///< number of angle bends in mode
00100         int nt; ///< number of torsions in mode
00101         int nr; ///< number of ring-related motions in mode
00102         stretch *s; ///< stretches (ns of these)
00103         bend *b; ///< number of angle bends (na of these)
00104         torsion *t; ///< torsions (nt of these)
00105         ringmotion *r; ///< ring-related motions (nr of these)
00106         double te; ///< extent of translational character in mode
00107         double re; ///< extent of rotational character in mode
00108         char ismoltors; ///< 'y' if the whole molecule is torsioning, 'n' if not
00109         vectormag_3D tv, rv, mvs; ///< translation vec, rotation vec, sum of motion vectors
00110         double maxmag; ///< maximum vector magnitude in native set
00111         double modemax; ///< maximum s-a-t score in mode set (used to scale vectors to max of 1)
00112         double maxmodemag; ///< vector magnitude for the modemax vector
00113         double maxKEmag; ///< for the larges s-a-t assignment, the KE along that assignment
00114         double TOTmag; ///< Total magnitude of all motions, all molecules
00115         double TRmag; ///< Total translation-removed magnitude, all molecules
00116         double MRmag; ///< Total molecule-rotation-removed magnitude, all molecules
00117         double RRmag; ///< Total residue-rotation-removed magnitude, all molecules
00118 } vibmode; ///< description of a vibrational mode 
00119 
00120 
00121 typedef struct { // human-readable-assignment structure for two equivalent atoms
00122         int C; ///<complexity
00123         int ns2,nb2,nt2; ///< for atom list with unknown symmetry
00124         intset *s2,*b2,*t2; 
00125         int ns2s;
00126         intset *s2s; ///< stretches with two equivalent atoms -- symmetric
00127         int ns2a;
00128         intset *s2a; ///< stretches with two equivalent atoms -- asymmetric
00129         int nb2s;
00130         intset *b2s; ///< stretches with two equivalent atoms -- symmetric
00131         int nb2a;
00132         intset *b2a; ///< stretches with two equivalent atoms -- asymmetric 
00133         int nt2s;
00134         intset *t2s; ///< stretches with two equivalent atoms -- symmetric
00135         int nt2a;
00136         intset *t2a; ///< stretches with two equivalent atoms -- asymmetric
00137         double s2se,s2ae,b2se,b2ae,t2se,t2ae; ///< these are "extents" for each of the above motions
00138 } twoassign; ///< description of a vibrational mode 
00139 typedef struct { // human-readable-assignment structure for two ring-related motions
00140         int C; ///<complexity
00141         int nopsA;
00142         intset *opsA; ///< Out of plane stretch (axial atoms), single atom info
00143 //      -- these point to ringmotion structures relating to the atoms above
00144         int nopss;
00145         intset  *opss; ///< Out of plane stretch (axial atoms) -- symmetric
00146         int nopsa;
00147         intset  *opsa; ///< Out of plane stretch (axial atoms) -- asymmetric
00148         double opsSe,opsPe,opsDe; ///< these are "extents" for each of the above motions
00149         int nopdA;
00150         intset  *opdA; ///< Out of plane distortion (ring atoms), single atom info
00151 //      -- these point to ringmotion structures relating to the atoms above
00152         int nopdA1G;
00153         intset  *opdA1G; ///< Out of plane distortion (ring atoms) -- A-1-G symmetry
00154         int nopdOth;
00155         intset  *opdOth; ///< Out of plane distortion (ring atoms) -- some other symmetry
00156         double opdse,opdae; ///< these are "extents" for each of the above motions
00157         int nrbA;
00158         intset  *rbA; ///< ring breathing motion, single atom info
00159 //      -- these point to ringmotion structures relating to the atoms above
00160         int nrbs;
00161         intset  *rbs; ///< ring breathing motion, symmetric
00162         int nrba;
00163         intset  *rba; ///< ring breathing motion, asymmetric
00164 // REGARDING O and P assignments:
00165 //      Atom A is exocyclic and bound to endocyclic B
00166 //      R is the vector for the radius from ring center to B
00167 //      T is the tangent at B, always oriented the same, e.g. (counter)clockwise
00168 //      M is the cross product of R and T (M points perpendicular to the ring plane)
00169 // If the motion vector is orthogonal to M, it is type O (moves along ring perimeter)
00170 // If the motion vector is parallel to M, it is type P (moves _|_ to ring perimeter)
00171         int nroA;
00172         intset  *roA; ///< ring-related O motion (not stretch), single atom info
00173 //      -- these point to ringmotion structures relating to the atoms above
00174         int nros;
00175         intset  *ros; ///< ring-related O motion, symmetric
00176         int nroa;
00177         intset  *roa; ///< ring-related O motion, asymmetric
00178         double rbAe,rbse,rbae,roAe,rose,roae;  ///< these are "extents" for each of the above motions
00179         int nrpA;
00180         intset  *rpA; ///< ring-related P motion, (not breathing) single atom info
00181 //      -- these point to ringmotion structures relating to the atoms above
00182         int nrps;
00183         intset  *rps; ///< ring-related P motion, symmetric
00184         int nrpa;
00185         intset  *rpa; ///< ring-related P motion, asymmetric
00186         int nrso;
00187         intset  *rso; ///< other ring-related stretches
00188         double rpAe,rpse,rpae,rsoe;  ///< these are "extents" for each of the above motions
00189 } ringassign; ///< description of a vibrational mode 
00190 typedef struct { // human-readable-assignment structure
00191         int i; ///< index
00192         int n; ///< index (intended as atom index for per-atom info)
00193         int loc; ///< location index (endocyclic, exocyclic H, etc.)
00194         char *Desc; ///< free-form description
00195         int C; ///< complexity = number of motion types present 
00196 // the following pairs are the number per each and their index in an external vibmode array
00197 //      Simple motions
00198         int ns;
00199         intset *s; ///< plain stretches in mode 
00200         int nb;
00201         intset *b; ///< plain angle bends in mode
00202         int nt;
00203         intset *t; ///< plain torsions in mode
00204         int nw;
00205         intset *w; ///< number of plain wags, pointers to locations
00206         int nrk;
00207         intset *rk; ///< number of plain rocks, pointers to locations
00208         double se,be,te,we,rke; ///< these are "extents" for each of the above motions
00209 //      Motions of two coupled atoms and motions involving rings
00210         int nr, ntwo; ///< numbers of rings or pairs of coupled atoms
00211         ringassign *r; ///< ring assignment structures
00212         twoassign *two; ///< structures for coupled motions
00213 } assignment;
00214 
00215 typedef struct{
00216         int i,j,k; ///< indices
00217         molindex mi; ///< where this atom is
00218         double a,b,c; ///< numbers of interest
00219         char *Desc; ///< description 
00220         //intset aset,bset; // oh, why not...
00221 } assn_brief;
00222 
00223 typedef struct { // info tied to atom number
00224         int i,j; ///< index (to an assignment array, perhaps)
00225         double I; ///< normalized motion intensity for this atom (regular intensity is elsewhere)
00226         int ns, *s; ///< number of significant stretches, indices for those in VS
00227         int nb, *b; ///< number of significant bends, indices for those in VS
00228         int nt, *t; ///< number of significant torsions, indices for those in VS
00229         int loc; // the location of this atom
00230 } atommode;
00231 
00232 void get_transition_intensity(molecule *M, int xl, int vl, vibmode *v, atype *ATYPE, FILE *F);
00233 /** @}*/
00234 #endif
 All Classes Files Functions Variables Typedefs Defines