GLYLIB
0.3.0b
|
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