Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

AtomRep.C

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr                                                                       
00003  *cr            (C) Copyright 1995-2019 The Board of Trustees of the           
00004  *cr                        University of Illinois                       
00005  *cr                         All Rights Reserved                        
00006  *cr                                                                   
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  * RCS INFORMATION:
00011  *
00012  *      $RCSfile: AtomRep.C,v $
00013  *      $Author: johns $        $Locker:  $                $State: Exp $
00014  *      $Revision: 1.134 $      $Date: 2019/01/17 21:20:58 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  * 
00019  * Parse and maintain the data for how a molecule should be represented.
00020  *
00021  ***************************************************************************/
00022 
00023 #include <string.h>
00024 #include <stdlib.h>
00025 #include "AtomRep.h"
00026 #include "Inform.h"
00027 #include "utilities.h"
00028 #include "config.h"
00029 
00030 /***********************  NOTES on ADDING NEW REPRESENTATIONS ************
00031  So, you wanna add a new representation ... here's what you have to do:
00032  1. Choose a a name for the rep, and decide how many parameters it needs.
00033     This object has support for up to MAX_ATOMREP_DATA parameters.
00034  2. Choose the order in which these will be specified in the text command.
00035  3. Add a new identifier in the main RepMethod enumeration for this new
00036     rep.  The order is important; where you put the new item is where it
00037     will appear in lists of the different representations.
00038  4. Add a new element to the AtomRepInfo structure array (below).  This element
00039     defines the name of the new rep, and gives info about all the parameters
00040     needed for that rep.  You must put the item into the array in the same
00041     position where the new enum value was inserted into RepMethod.
00042  5. Once this structure is properly defined, the GUI and text interface will
00043     properly process and display the info for the new rep.  At this point,
00044     you must add the code to display the new rep in DrawMolItem.
00045  6. Sit back and enjoy ...
00046 
00047  FORMAT for AtomRepInfo STRUCTURE:
00048  ---------------------------------
00049  Easiest thing to do is to copy an item with the same number of parameters,
00050  and change the necessary values.  The items in each structure are:
00051         a. Integer enum code for the rep (same as was put in RepMethod enum)
00052         b. Name of rep (should be a single small word; this is the name
00053            used in the GUI list, and what the user calls the rep when typing
00054            in a command to change to this rep)
00055         c. Number of parameters required.
00056         d. An array of Structures which define how each parameter is used
00057            for the representation.  The format for these items are:
00058                 1. Index of the parameter in the AtomRep internal data
00059                    storage array.  This should be used when retrieving the
00060                    data; call 'get_data' with this index value to retrieve
00061                    the value for this parameter.  Each parameter for the
00062                    representation should have a different index, and they
00063                    should be in the range 0 ... MAX_ATOMREP_DATA-1.
00064                    There is an enumeration giving names for these indices,
00065                    which is used right now primarily for historical reasons.
00066                    Older parts of VMD used explicit calls to routines to get
00067                    values for things such as the line thickness and sphere
00068                    resolution, and these routines are still present.  But
00069                    since new reps may not necessarily have characteristics
00070                    which map to these items, this should not be used in the
00071                    future.
00072                 2. Default value
00073  ***************************************************************************/
00074 
00075 // default res of cartoon cylinders
00076 #define DEF_CART_RES 12.0  
00077 
00078 // default res of bond cylinders
00079 #define DEF_BOND_RES 12.0
00080 
00081 // default res of spheres
00082 #define DEF_SPH_RES  12.0 
00083 
00084 // default res of licorice reps
00085 #define DEF_LIC_RES  12.0 
00086 
00087 // default thickness of lines
00088 #define DEF_LINE_RES 1.0 
00089 
00090 // default point size
00091 #define DEF_POINT_SIZE 1.0 
00092 
00093 //const AtomRepDataInfo UNUSED = {0, 0.0};
00094 #define UNUSED {0, 0.0}
00095 
00096 // define structures which indicate what data is needed by each rep
00097 const AtomRepParamStruct AtomRepInfo[AtomRep::TOTAL] = {
00098   //
00099   // Bond-oriented reps
00100   //
00101 
00102   // Lines
00103   { "Lines", 2, {
00104     {  AtomRep::LINETHICKNESS, DEF_LINE_RES },
00105     {  AtomRep::ISOLINETHICKNESS, 0.0f },
00106     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00107     UNUSED, UNUSED, UNUSED }
00108   },
00109 
00110   // Bonds
00111   { "Bonds", 2, {
00112     {  AtomRep::BONDRAD, 0.3f },
00113     {  AtomRep::BONDRES, DEF_BOND_RES },
00114     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00115     UNUSED, UNUSED, UNUSED }
00116   },
00117 
00118   // DynamicBonds
00119   { "DynamicBonds", 3, {
00120     {  AtomRep::SPHERERAD, 3.0f },  // distance
00121     {  AtomRep::BONDRAD, 0.3f },
00122     {  AtomRep::BONDRES, DEF_BOND_RES },
00123     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00124     UNUSED, UNUSED, UNUSED }
00125   },
00126 
00127   // HBonds
00128   { "HBonds", 3, {
00129     {  AtomRep::BONDRAD, 3.0f},     // distance
00130     {  AtomRep::SPHERERAD, 20.0f},  // angle
00131     {  AtomRep::LINETHICKNESS, 1.0f}, 
00132     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00133     UNUSED, UNUSED, UNUSED }
00134   },
00135 
00136 
00137   //
00138   // Atom-oriented reps
00139   //
00140 
00141   // Points
00142   { "Points", 1, { 
00143     {  AtomRep::LINETHICKNESS, DEF_POINT_SIZE},  // size
00144     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, 
00145     UNUSED, UNUSED, UNUSED, UNUSED }
00146   },
00147 
00148   // VDW
00149   { "VDW", 2, {
00150     {  AtomRep::SPHERERAD, 1.0f},
00151     {  AtomRep::SPHERERES, DEF_SPH_RES },
00152     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00153     UNUSED, UNUSED, UNUSED }
00154   },
00155 
00156   // CPK
00157   { "CPK", 5, {
00158     {  AtomRep::SPHERERAD, 1.0f},
00159     {  AtomRep::BONDRAD, 0.3f},
00160     {  AtomRep::SPHERERES, DEF_SPH_RES},
00161     {  AtomRep::BONDRES, DEF_BOND_RES},
00162     {  AtomRep::ISOLINETHICKNESS, 0.0f },
00163     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED }
00164   },
00165 
00166   // Licorice
00167   { "Licorice", 4, {
00168     {  AtomRep::BONDRAD, 0.3f },
00169     {  AtomRep::SPHERERES, DEF_LIC_RES},
00170     {  AtomRep::BONDRES, DEF_LIC_RES},
00171     {  AtomRep::ISOLINETHICKNESS, 0.0f }, // if nonzero, cutoff distance
00172     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00173     UNUSED, UNUSED, UNUSED }
00174   },
00175 
00176 
00177 #ifdef VMDPOLYHEDRA
00178   // Polyhedra
00179   { "Polyhedra", 1, {
00180     {  AtomRep::SPHERERAD, 3.0f },  // distance
00181     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, 
00182     UNUSED, UNUSED, UNUSED, UNUSED }
00183   },
00184 #endif
00185 
00186   //
00187   // Secondary structure reps
00188   //
00189 
00190   // C-alpha trace
00191   { "Trace", 2, {
00192     {  AtomRep::BONDRAD, 0.3f},
00193     {  AtomRep::BONDRES, DEF_BOND_RES},
00194     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00195     UNUSED, UNUSED, UNUSED }
00196   },
00197 
00198   // Tube
00199   { "Tube", 2, {
00200     {  AtomRep::BONDRAD, 0.3f },
00201     {  AtomRep::BONDRES, DEF_BOND_RES},
00202     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00203     UNUSED, UNUSED, UNUSED }
00204   },
00205 
00206   // Ribbons
00207   { "Ribbons", 3, {
00208     {  AtomRep::BONDRAD, 0.3f},
00209     {  AtomRep::BONDRES, DEF_BOND_RES},
00210     {  AtomRep::LINETHICKNESS, 2.0f},
00211     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00212     UNUSED, UNUSED, UNUSED }
00213   },
00214 
00215   // NewRibbons
00216   { "NewRibbons", 4, {
00217     {  AtomRep::BONDRAD, 0.3f },
00218     {  AtomRep::BONDRES, 12.0f },
00219     {  AtomRep::LINETHICKNESS, 3.0f},
00220     {  AtomRep::SPHERERAD, 0},  // spline basis
00221     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00222     UNUSED, UNUSED, UNUSED }
00223   },
00224 
00225   // Structure
00226   { "Cartoon", 3, {
00227     {  AtomRep::BONDRAD, 2.1f},
00228     {  AtomRep::BONDRES, 24.0f },
00229     {  AtomRep::LINETHICKNESS, 5.0f},
00230     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00231     UNUSED, UNUSED, UNUSED }
00232   },
00233 
00234   // NewCartoon
00235   { "NewCartoon", 4, {
00236     {  AtomRep::BONDRAD, 0.3f },
00237     {  AtomRep::BONDRES, 12.0f },
00238     {  AtomRep::LINETHICKNESS, 4.5f},
00239     {  AtomRep::SPHERERAD, 0},  // spline basis
00240     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00241     UNUSED, UNUSED, UNUSED }
00242   },
00243 
00244 #ifdef VMDWITHCARBS
00245   // PaperChain
00246   { "PaperChain", 2, {
00247     {  AtomRep::LINETHICKNESS, 1.0f }, // bipyramid_height : height of the pyramids drawn to represent rings
00248     {  AtomRep::ISOSTEPSIZE, 10 }, // maxringsize : maximum number of atoms in a small ring
00249     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, 
00250     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED }
00251   },
00252     
00253   // Twister
00254   { "Twister", 7, {
00255     {  AtomRep::LINETHICKNESS, 1 }, // start_end_centroid : 0 - start ribbons at the edge of the ring, 1 - start ribbons at the ring centroids
00256     {  AtomRep::BONDRES, 0 }, // hide_shared_links: 0 - show all linkage paths, 1 - hide linkage paths which share edges with other paths
00257     {  AtomRep::SPHERERAD, 10 }, // rib_steps : number of steps to use when drawing ribbons
00258     {  AtomRep::BONDRAD, 0.3f }, // rib_width : width of the ribbon
00259     {  AtomRep::SPHERERES, 0.05f }, // rib_height : height of the ribbon
00260     {  AtomRep::ISOSTEPSIZE, 10 }, // maxringsize : maximum number of atoms in a small ring
00261     {  AtomRep::ISOLINETHICKNESS, 5 }, // maxpathlength : maximum number of atoms in a path joining two small rings
00262     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED }
00263   },
00264 #endif
00265 
00266 
00267   //
00268   // Surface, Isosurface, and Solvent reps
00269   //
00270 
00271 #ifdef VMDQUICKSURF
00272   // QuickSurf
00273   { "QuickSurf", 4, {
00274     {  AtomRep::SPHERERAD, 1.0f },  // sphere radius multiplier
00275     {  AtomRep::BONDRAD,   0.5f },  // density isovalue for surface
00276     {  AtomRep::GRIDSPACING, 1.0f}, // lattice grid spacing 
00277     {  AtomRep::BONDRES, 0 },       // quality
00278     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00279     UNUSED, UNUSED, UNUSED }
00280   },
00281 #endif
00282 
00283 #ifdef VMDMSMS
00284   // MSMS surface
00285   { "MSMS", 4, {
00286     {  AtomRep::SPHERERAD, 1.5f }, // probe radius
00287     {  AtomRep::SPHERERES, 1.5f }, // density
00288     {  AtomRep::LINETHICKNESS, 0}, // all atoms
00289     {  AtomRep::BONDRES, 0},       // wireframe
00290     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00291     UNUSED, UNUSED, UNUSED }
00292   },
00293 #endif
00294 
00295 #ifdef VMDNANOSHAPER
00296   // NanoShaper surface
00297   { "NanoShaper", 6, {
00298     {  AtomRep::LINETHICKNESS, 0},  // surface type
00299     {  AtomRep::BONDRES, 0},        // wireframe
00300     {  AtomRep::GRIDSPACING, 0.5f}, // lattice grid spacing 
00301     {  AtomRep::SPHERERAD, 1.40f }, // probe radius
00302     {  AtomRep::SPHERERES, 0.45f }, // skin parm
00303     {  AtomRep::BONDRAD,    0.5f }, // blob parm
00304     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00305     UNUSED, UNUSED, UNUSED }
00306   },
00307 #endif
00308 
00309 #ifdef VMDSURF
00310   // Surf
00311   { "Surf", 2, {
00312     {  AtomRep::SPHERERAD, 1.4f }, // probe radius
00313     {  AtomRep::BONDRES, 0},       // wireframe
00314     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00315     UNUSED, UNUSED, UNUSED }
00316   },
00317 #endif
00318 
00319   // Slice of volumetric data
00320   { "VolumeSlice", 4, {
00321     { AtomRep::SPHERERAD,  0.5f }, // slice
00322     { AtomRep::SPHERERES,     0 }, // VolID
00323     { AtomRep::LINETHICKNESS, 0 }, // slice axis
00324     { AtomRep::BONDRES,       2 },  // quality
00325     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00326     UNUSED, UNUSED, UNUSED }
00327   },
00328 
00329   // Isosurface of volumetric data
00330   { "Isosurface", 6, {
00331     { AtomRep::SPHERERAD,    0.5f }, // isoval
00332     { AtomRep::SPHERERES,        0}, // VolID
00333     { AtomRep::LINETHICKNESS,    2}, // draw box and isosurface by default
00334     { AtomRep::BONDRES,          2}, // use points method by default
00335     { AtomRep::ISOSTEPSIZE,      1}, // use step size of one by default
00336     { AtomRep::ISOLINETHICKNESS, 1}, // lines are thickness one by default
00337     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00338     UNUSED, UNUSED, UNUSED }
00339   },
00340 
00341   // Volumetric gradient field lines
00342   { "FieldLines", 8, {
00343     { AtomRep::SPHERERES,      0},  // VolID
00344     { AtomRep::SPHERERAD,   1.8f},  // seed value
00345     { AtomRep::BONDRAD,    10.0f},  // minimum line length
00346     { AtomRep::BONDRES,    50.0f},  // maximum line length
00347     { AtomRep::LINETHICKNESS,  1},  // line thickness
00348     { AtomRep::FIELDLINESTYLE, 0},  // field lines drawn as lines
00349     { AtomRep::FIELDLINESEEDUSEGRID, 0}, // field line seed type
00350     { AtomRep::FIELDLINEDELTA, 0.25},  // field lines integrator stepsize
00351     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}
00352   },
00353 
00354   // Molecular orbital
00355   { "Orbital", 10, {
00356     { AtomRep::SPHERERAD,     0.05f}, // isoval
00357     { AtomRep::SPHERERES,         0}, // Orbital ID
00358     { AtomRep::LINETHICKNESS,     0}, // draw only isosurface by default
00359     { AtomRep::BONDRES,           0}, // use solid method by default
00360     { AtomRep::GRIDSPACING,  0.075f}, // default orbital grid spacing
00361     { AtomRep::ISOLINETHICKNESS,  1}, // lines are thickness one by default
00362     { AtomRep::WAVEFNCTYPE,       0}, // default wavefunction type 
00363     { AtomRep::WAVEFNCSPIN,       0}, // default wavefunction spin
00364     { AtomRep::WAVEFNCEXCITATION, 0}, // default wavefunction excitation
00365     { AtomRep::ISOSTEPSIZE,       1}, // use step size of one by default
00366     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED }
00367   },
00368 
00369   // Beads 
00370   { "Beads", 2, {
00371     {  AtomRep::SPHERERAD, 1.0f},
00372     {  AtomRep::SPHERERES, DEF_SPH_RES },
00373     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00374     UNUSED, UNUSED, UNUSED }
00375   },
00376 
00377   // Dotted
00378   { "Dotted", 2, {
00379     {  AtomRep::SPHERERAD, 1.0f},
00380     {  AtomRep::SPHERERES, DEF_SPH_RES},
00381     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00382     UNUSED, UNUSED, UNUSED }
00383   },
00384 
00385   // Dot surface
00386   { "Solvent", 3, {
00387     {  AtomRep::SPHERERAD, 0 }, // probe
00388     // the max value is set in the constructor for AtomRep, so don't
00389     // change things around too much!
00390     {  AtomRep::SPHERERES, 7.0f},  // detail
00391     {  AtomRep::LINETHICKNESS, 1.0f }, // method
00392     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00393     UNUSED, UNUSED, UNUSED }
00394 #ifdef VMDLATTICECUBES
00395   },
00396 
00397   // LatticeCubes
00398   { "LatticeCubes", 1, {
00399     {  AtomRep::SPHERERAD, 1.0f},
00400     UNUSED, 
00401     UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED,
00402     UNUSED, UNUSED, UNUSED }
00403   }
00404 #else
00405   }
00406 #endif
00407 
00408 };
00409 
00410 
00412 // constructor; parse string and see if OK
00413 AtomRep::AtomRep(void) {
00414   int i, j;
00415  
00416   // initialize variables
00417   repMethod  = DEFAULT_ATOMREP;
00418   repData = repDataStorage[repMethod];
00419   strcpy(cmdStr, AtomRepInfo[repMethod].name);
00420   for(j=0; j < TOTAL; j++) {
00421     memset(repDataStorage[j], 0, MAX_ATOMREP_DATA*sizeof(float));
00422     for(i=0; i < AtomRepInfo[j].numdata ; i++)
00423       repDataStorage[j][AtomRepInfo[j].repdata[i].index] =
00424         AtomRepInfo[j].repdata[i].defValue;
00425   }
00426 
00427 }
00428 
00429 AtomRep::~AtomRep(void) { }
00430 
00432 // parse the given command, and store results.  Return success.
00433 int AtomRep::parse_cmd(const char *newcmd) {
00434   int argc, i, j;
00435   char *argv[256], *cmdStrTok = NULL;
00436 
00437   // make sure the new command is not too long
00438   if(newcmd && strlen(newcmd) > MAX_ATOMREP_CMD) {
00439     msgErr << "Atom representation string is too long (over ";
00440     msgErr << MAX_ATOMREP_CMD << " characters)." << sendmsg;
00441     return FALSE;
00442   }
00443 
00444   // XXX Hack to make the "Off" rep work: alias to "Lines"
00445   if (!strupncmp(newcmd, "off", 3)) newcmd = "Lines";
00446 
00447   // tokenize the command
00448   if(!newcmd || !(cmdStrTok = str_tokenize(newcmd, &argc, argv))) {
00449     // no command; keep current settings
00450     return TRUE;
00451   }
00452 
00453   // see if the command matches a representation we know about
00454   for(i=0; i < AtomRep::TOTAL; i++) {
00455     const AtomRepParamStruct *ari = &(AtomRepInfo[i]);
00456 
00457     if(!strupncmp(argv[0], ari->name, CMDLEN)) {
00458       // the name matches; make sure we do not have too many arguments
00459       if((argc - 1) > ari->numdata) {
00460         msgErr << "Incorrect atom representation command '" << newcmd << "':";
00461         msgErr << "\n  '" << ari->name << "' only takes " << ari->numdata;
00462         msgErr << " arguments maximum." << sendmsg;
00463 
00464         delete [] cmdStrTok;
00465         return FALSE;
00466       }
00467 
00468       // indicate that we've changed to a new rep method
00469       repMethod = i;
00470       repData = repDataStorage[i];
00471 
00472       // copy out the data from the command and store it
00473       for(j=1; j < argc; j++) {
00474         // if a '-' is given, do not change that parameter
00475         if(!(argv[j][0] == '-' && argv[j][1] == '\0'))
00476           repData[ari->repdata[j-1].index] = (float) atof(argv[j]);
00477       }
00478 
00479       // found a match; break from for loop
00480       break;
00481     }
00482   }
00483 
00484   // if i is at the end of the list, we did not find a match
00485   if(i == AtomRep::TOTAL) {
00486     msgErr << "Unknown atom representation command '" << newcmd << "'.";
00487     msgErr << sendmsg;
00488 
00489     delete [] cmdStrTok;
00490     return FALSE;
00491   }
00492 
00493   // if we are here, everything went OK
00494   strcpy(cmdStr, newcmd);
00495 
00496   delete [] cmdStrTok;
00497   return TRUE;
00498 }
00499 
00500 
00502 
00503 // copy contents of another atomrep
00504 AtomRep &AtomRep::operator=(const AtomRep &ar) {
00505   strcpy(cmdStr, ar.cmdStr);
00506   repMethod = ar.repMethod;
00507   repData = repDataStorage[repMethod];
00508   for(int j=0; j < TOTAL; j++)
00509     for(int i=0; i < MAX_ATOMREP_DATA; i++)
00510       repDataStorage[j][i] = ar.repDataStorage[j][i];
00511 
00512   return *this;
00513 }
00514 

Generated on Wed Dec 11 02:44:28 2024 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002