diff --git a/lib/molfile/molfile_plugin.h b/lib/molfile/molfile_plugin.h index 714b06539..c79e7a5ab 100644 --- a/lib/molfile/molfile_plugin.h +++ b/lib/molfile/molfile_plugin.h @@ -1,903 +1,903 @@ /*************************************************************************** *cr *cr (C) Copyright 1995-2006 The Board of Trustees of the *cr University of Illinois *cr All Rights Reserved *cr ***************************************************************************/ /*************************************************************************** * RCS INFORMATION: * * $RCSfile: molfile_plugin.h,v $ * $Author: johns $ $Locker: $ $State: Exp $ * $Revision: 1.108 $ $Date: 2016/02/26 03:17:01 $ * ***************************************************************************/ -/** @file +/** @file * API for C extensions to define a way to load structure, coordinate, - * trajectory, and volumetric data files - */ + * trajectory, and volumetric data files + */ #ifndef MOL_FILE_PLUGIN_H #define MOL_FILE_PLUGIN_H #include "vmdplugin.h" #if defined(DESRES_READ_TIMESTEP2) /* includes needed for large integer types used for frame counts */ #include <sys/types.h> typedef ssize_t molfile_ssize_t; /**< for frame counts */ #endif /** * Define a common plugin type to be used when registering the plugin. */ #define MOLFILE_PLUGIN_TYPE "mol file reader" /** * File converter plugins use the same API but register under a different * type so that regular file readers can have priority. */ #define MOLFILE_CONVERTER_PLUGIN_TYPE "mol file converter" /* File plugin symbolic constants for better code readability */ #define MOLFILE_SUCCESS 0 /**< succeeded in reading file */ #define MOLFILE_EOF -1 /**< end of file */ #define MOLFILE_ERROR -1 /**< error reading/opening a file */ #define MOLFILE_NOSTRUCTUREDATA -2 /**< no structure data in this file */ #define MOLFILE_NUMATOMS_UNKNOWN -1 /**< unknown number of atoms */ #define MOLFILE_NUMATOMS_NONE 0 /**< no atoms in this file type */ /** * Maximum string size macro */ #define MOLFILE_BUFSIZ 81 /**< maximum chars in string data */ #define MOLFILE_BIGBUFSIZ 4096 /**< maximum chars in long strings */ #define MOLFILE_MAXWAVEPERTS 25 /**< maximum number of wavefunctions * per timestep */ /** * Hard-coded direct-I/O page size constants for use by both VMD * and the plugins that want to use direct, unbuffered I/O for high - * performance with SSDs etc. We use two constants to define the - * range of hardware page sizes that we can support, so that we can - * add support for larger 8KB or 16KB page sizes in the future + * performance with SSDs etc. We use two constants to define the + * range of hardware page sizes that we can support, so that we can + * add support for larger 8KB or 16KB page sizes in the future * as they become more prevalent in high-end storage systems. * * At present, VMD uses a hard-coded 4KB page size to reduce memory * fragmentation, but these constants will make it easier to enable the * use of larger page sizes in the future if it becomes necessary. */ #define MOLFILE_DIRECTIO_MIN_BLOCK_SIZE 4096 #define MOLFILE_DIRECTIO_MAX_BLOCK_SIZE 4096 /** * File level comments, origin information, and annotations. */ typedef struct { char database[81]; /**< database of origin, if any */ char accession[81]; /**< database accession code, if any */ char date[81]; /**< date/time stamp for this data */ char title[81]; /**< brief title for this data */ int remarklen; /**< length of remarks string */ char *remarks; /**< free-form remarks about data */ } molfile_metadata_t; -/* - * Struct for specifying atoms in a molecular structure. The first - * six components are required, the rest are optional and their presence is +/* + * Struct for specifying atoms in a molecular structure. The first + * six components are required, the rest are optional and their presence is * indicating by setting the corresponding bit in optsflag. When omitted, - * the application (for read_structure) or plugin (for write_structure) - * must be able to supply default values if the missing parameters are + * the application (for read_structure) or plugin (for write_structure) + * must be able to supply default values if the missing parameters are * part of its internal data structure. * Note that it is not possible to specify coordinates with this structure. - * This is intentional; all coordinate I/O is done with the read_timestep and - * write_timestep functions. + * This is intentional; all coordinate I/O is done with the read_timestep and + * write_timestep functions. */ /** * Per-atom attributes and information. */ typedef struct { /* these fields absolutely must be set or initialized to empty */ char name[16]; /**< required atom name string */ char type[16]; /**< required atom type string */ char resname[8]; /**< required residue name string */ int resid; /**< required integer residue ID */ char segid[8]; /**< required segment name string, or "" */ #if 0 && vmdplugin_ABIVERSION > 17 /* The new PDB file formats allows for much larger structures, */ /* which can therefore require longer chain ID strings. The */ /* new PDBx/mmCIF file formats do not have length limits on */ /* fields, so PDB chains could be arbitrarily long strings */ /* in such files. At present, we know we need at least 3-char */ /* chains for existing PDBx/mmCIF files. */ char chain[4]; /**< required chain name, or "" */ #else char chain[2]; /**< required chain name, or "" */ #endif /* rest are optional; use optflags to specify what's present */ char altloc[2]; /**< optional PDB alternate location code */ char insertion[2]; /**< optional PDB insertion code */ float occupancy; /**< optional occupancy value */ float bfactor; /**< optional B-factor value */ float mass; /**< optional mass value */ float charge; /**< optional charge value */ float radius; /**< optional radius value */ int atomicnumber; /**< optional element atomic number */ #if 0 char complex[16]; char assembly[16]; int qmregion; int qmregionlink; int qmlayer; int qmlayerlink; int qmfrag; int qmfraglink; string qmecp; int qmadapt; int qmect; /**< boolean */ int qmparam; int autoparam; #endif #if defined(DESRES_CTNUMBER) int ctnumber; /**< mae ct block, 0-based, including meta */ #endif } molfile_atom_t; /*@{*/ /** Plugin optional data field availability flag */ #define MOLFILE_NOOPTIONS 0x0000 /**< no optional data */ #define MOLFILE_INSERTION 0x0001 /**< insertion codes provided */ #define MOLFILE_OCCUPANCY 0x0002 /**< occupancy data provided */ #define MOLFILE_BFACTOR 0x0004 /**< B-factor data provided */ #define MOLFILE_MASS 0x0008 /**< Atomic mass provided */ #define MOLFILE_CHARGE 0x0010 /**< Atomic charge provided */ #define MOLFILE_RADIUS 0x0020 /**< Atomic VDW radius provided */ #define MOLFILE_ALTLOC 0x0040 /**< Multiple conformations present */ #define MOLFILE_ATOMICNUMBER 0x0080 /**< Atomic element number provided */ #define MOLFILE_BONDSSPECIAL 0x0100 /**< Only non-standard bonds provided */ #if defined(DESRES_CTNUMBER) #define MOLFILE_CTNUMBER 0x0200 /**< ctnumber provided */ #endif #define MOLFILE_BADOPTIONS 0xFFFFFFFF /**< Detect badly behaved plugins */ - + /*@}*/ /*@{*/ /** Flags indicating availability of optional data fields * for QM timesteps */ #define MOLFILE_QMTS_NOOPTIONS 0x0000 /**< no optional data */ #define MOLFILE_QMTS_GRADIENT 0x0001 /**< energy gradients provided */ #define MOLFILE_QMTS_SCFITER 0x0002 /*@}*/ typedef struct molfile_timestep_metadata { unsigned int count; /**< total # timesteps; -1 if unknown */ unsigned int avg_bytes_per_timestep; /** bytes per timestep */ int has_velocities; /**< if timesteps have velocities */ } molfile_timestep_metadata_t; /* * Per-timestep atom coordinates and periodic cell information - */ + */ typedef struct { float *coords; /**< coordinates of all atoms, arranged xyzxyzxyz */ float *velocities; /**< space for velocities of all atoms; same layout */ /**< NULL unless has_velocities is set */ - /*@{*/ + /*@{*/ /** * Unit cell specification of the form A, B, C, alpha, beta, gamma. * notes: A, B, C are side lengths of the unit cell * alpha = angle between b and c * beta = angle between a and c * gamma = angle between a and b - */ - float A, B, C, alpha, beta, gamma; - /*@}*/ + */ + float A, B, C, alpha, beta, gamma; + /*@}*/ double physical_time; /**< physical time point associated with this frame */ #if defined(DESRES_READ_TIMESTEP2) /* HACK to support generic trajectory information */ double total_energy; double potential_energy; double kinetic_energy; double extended_energy; double force_energy; double total_pressure; #endif } molfile_timestep_t; /** * Metadata for volumetric datasets, read initially and used for subsequent - * memory allocations and file loading. + * memory allocations and file loading. */ typedef struct { char dataname[256]; /**< name of volumetric data set */ float origin[3]; /**< origin: origin of volume (x=0, y=0, z=0 corner */ /* * x/y/z axis: * These the three cell sides, providing both direction and length * (not unit vectors) for the x, y, and z axes. In the simplest - * case, these would be <size,0,0> <0,size,0> and <0,0,size) for + * case, these would be <size,0,0> <0,size,0> and <0,0,size) for * an orthogonal cubic volume set. For other cell shapes these * axes can be oriented non-orthogonally, and the parallelpiped * may have different side lengths, not just a cube/rhombus. */ - float xaxis[3]; /**< direction (and length) for X axis */ + float xaxis[3]; /**< direction (and length) for X axis */ float yaxis[3]; /**< direction (and length) for Y axis */ float zaxis[3]; /**< direction (and length) for Z axis */ /* - * x/y/z size: + * x/y/z size: * Number of grid cells along each axis. This is _not_ the * physical size of the box, this is the number of voxels in each - * direction, independent of the shape of the volume set. + * direction, independent of the shape of the volume set. */ int xsize; /**< number of grid cells along the X axis */ int ysize; /**< number of grid cells along the Y axis */ int zsize; /**< number of grid cells along the Z axis */ #if vmdplugin_ABIVERSION > 16 int has_scalar; /**< flag indicating presence of scalar volume */ int has_gradient; /**< flag indicating presence of vector volume */ int has_variance; /**< flag indicating presence of variance map */ #endif int has_color; /**< flag indicating presence of voxel color data */ } molfile_volumetric_t; #if vmdplugin_ABIVERSION > 16 /** * Volumetric dataset read/write structure with both flag/parameter sets * and VMD-allocated pointers for fields to be used by the plugin. */ typedef struct { int setidx; /**< volumetric dataset index to load/save */ float *scalar; /**< scalar density/potential field data */ float *gradient; /**< gradient vector field */ float *variance; /**< variance map indicating signal/noise */ float *rgb3f; /**< RGB floating point color texture map */ unsigned char *rgb3u; /**< RGB unsigned byte color texture map */ } molfile_volumetric_readwrite_t; #endif /************************************************************** ************************************************************** **** **** **** Data structures for QM files **** **** **** ************************************************************** **************************************************************/ /* macros for the convergence status of a QM calculation. */ #define MOLFILE_QMSTATUS_UNKNOWN -1 /* don't know yet */ #define MOLFILE_QMSTATUS_OPT_CONV 0 /* optimization converged */ #define MOLFILE_QMSTATUS_SCF_NOT_CONV 1 /* SCF convergence failed */ #define MOLFILE_QMSTATUS_OPT_NOT_CONV 2 /* optimization not converged */ #define MOLFILE_QMSTATUS_FILE_TRUNCATED 3 /* file was truncated */ /* macros describing the SCF method (SCFTYP in GAMESS) */ #define MOLFILE_SCFTYPE_UNKNOWN -1 /* no info about the method */ #define MOLFILE_SCFTYPE_NONE 0 /* calculation didn't make use of SCF */ #define MOLFILE_SCFTYPE_RHF 1 /* restricted Hartree-Fock */ #define MOLFILE_SCFTYPE_UHF 2 /* unrestricted Hartree-Fock */ #define MOLFILE_SCFTYPE_ROHF 3 /* restricted open-shell Hartree-Fock */ #define MOLFILE_SCFTYPE_GVB 4 /* generalized valence bond orbitals */ #define MOLFILE_SCFTYPE_MCSCF 5 /* multi-configuration SCF */ #define MOLFILE_SCFTYPE_FF 6 /* classical force-field based sim. */ /* macros describing the type of calculation (RUNTYP in GAMESS) */ #define MOLFILE_RUNTYPE_UNKNOWN 0 /* single point run */ #define MOLFILE_RUNTYPE_ENERGY 1 /* single point run */ #define MOLFILE_RUNTYPE_OPTIMIZE 2 /* geometry optimization */ #define MOLFILE_RUNTYPE_SADPOINT 3 /* saddle point search */ #define MOLFILE_RUNTYPE_HESSIAN 4 /* Hessian/frequency calculation */ #define MOLFILE_RUNTYPE_SURFACE 5 /* potential surface scan */ #define MOLFILE_RUNTYPE_GRADIENT 6 /* energy gradient calculation */ #define MOLFILE_RUNTYPE_MEX 7 /* minimum energy crossing */ #define MOLFILE_RUNTYPE_DYNAMICS 8 /* Any type of molecular dynamics * e.g. Born-Oppenheimer, Car-Parinello, * or classical MD */ #define MOLFILE_RUNTYPE_PROPERTIES 9 /* Properties were calculated from a * wavefunction that was read from file */ /** * Sizes of various QM-related, timestep independent data arrays * which must be allocated by the caller (VMD) so that the plugin * can fill in the arrays with data. */ typedef struct { /* hessian data */ int nimag; /**< number of imaginary modes */ int nintcoords; /**< number internal coordinates */ int ncart; /**< number cartesian coordinates */ /* orbital/basisset data */ int num_basis_funcs; /**< number of uncontracted basis functions in basis array */ int num_basis_atoms; /**< number of atoms in basis set */ int num_shells; /**< total number of atomic shells */ int wavef_size; /**< size of the wavefunction * i.e. size of secular eq. or * # of cartesian contracted * gaussian basis functions */ /* everything else */ int have_sysinfo; int have_carthessian; /**< hessian in cartesian coords available */ int have_inthessian; /**< hessian in internal coords available */ int have_normalmodes; /**< normal modes available */ } molfile_qm_metadata_t; /** * QM run info. Parameters that stay unchanged during a single file. - */ + */ typedef struct { int nproc; /**< number of processors used. */ - int memory; /**< amount of memory used in Mbyte. */ + int memory; /**< amount of memory used in Mbyte. */ int runtype; /**< flag indicating the calculation method. */ int scftype; /**< SCF type: RHF, UHF, ROHF, GVB or MCSCF wfn. */ int status; /**< indicates wether SCF and geometry optimization * have converged properly. */ int num_electrons; /**< number of electrons. XXX: can be fractional in some DFT codes */ int totalcharge; /**< total charge of system. XXX: can be fractional in some DFT codes */ int num_occupied_A; /**< number of occupied alpha orbitals */ int num_occupied_B; /**< number of occupied beta orbitals */ double *nuc_charge; /**< array(natom) containing the nuclear charge of atom i */ char basis_string[MOLFILE_BUFSIZ]; /**< basis name as "nice" string. */ char runtitle[MOLFILE_BIGBUFSIZ]; /**< title of run. */ char geometry[MOLFILE_BUFSIZ]; /**< type of provided geometry, XXX: remove? * e.g. UNIQUE, ZMT, CART, ... */ char version_string[MOLFILE_BUFSIZ]; /**< QM code version information. */ } molfile_qm_sysinfo_t; /** * Data for QM basis set */ typedef struct { int *num_shells_per_atom; /**< number of shells per atom */ int *num_prim_per_shell; /**< number of shell primitives shell */ float *basis; /**< contraction coeffients and exponents for * the basis functions in the form * {exp(1), c-coeff(1), exp(2), c-coeff(2), ...}; * array size = 2*num_basis_funcs * The basis must NOT be normalized. */ int *atomic_number; /**< atomic numbers (chem. element) of atoms in basis set */ - int *angular_momentum; /**< 3 ints per wave function coefficient do describe the + int *angular_momentum; /**< 3 ints per wave function coefficient do describe the * cartesian components of the angular momentum. - * E.g. S={0 0 0}, Px={1 0 0}, Dxy={1 1 0}, or Fyyz={0 2 1}. + * E.g. S={0 0 0}, Px={1 0 0}, Dxy={1 1 0}, or Fyyz={0 2 1}. */ int *shell_types; /**< type for each shell in basis */ } molfile_qm_basis_t; /** * Data from QM Hessian/normal mode runs * * A noteworthy comment from one of Axel's emails: * The molfile_qm_hessian_t, I'd rename to molfile_hessian_t (one * can do vibrational analysis without QM) and would make this a * completely separate entity. This could then be also used to * read in data from, say, principal component analysis or normal * mode analysis and VMD could contain code to either project a * trajectory on the contained eigenvectors or animate them and * so on. There is a bunch of possible applications... */ typedef struct { double *carthessian; /**< hessian matrix in cartesian coordinates (ncart)*(ncart) * as a single array of doubles (row(1), ...,row(natoms)) */ int *imag_modes; /**< list(nimag) of imaginary modes */ double *inthessian; /**< hessian matrix in internal coordinates * (nintcoords*nintcoords) as a single array of * doubles (row(1), ...,row(nintcoords)) */ float *wavenumbers; /**< array(ncart) of wavenumbers of normal modes */ float *intensities; /**< array(ncart) of intensities of normal modes */ float *normalmodes; /**< matrix(ncart*ncart) of normal modes */ } molfile_qm_hessian_t; /** * QM related information that is timestep independent */ typedef struct { molfile_qm_sysinfo_t run; /* system info */ molfile_qm_basis_t basis; /* basis set info */ molfile_qm_hessian_t hess; /* hessian info */ } molfile_qm_t; /** * Enumeration of all of the wavefunction types that can be read * from QM file reader plugins. * * CANON = canonical (i.e diagonalized) wavefunction * GEMINAL = GVB-ROHF geminal pairs * MCSCFNAT = Multi-Configuration SCF natural orbitals * MCSCFOPT = Multi-Configuration SCF optimized orbitals * CINATUR = Configuration-Interaction natural orbitals * BOYS = Boys localization * RUEDEN = Ruedenberg localization * PIPEK = Pipek-Mezey population localization * * NBO related localizations: * -------------------------- * NAO = Natural Atomic Orbitals * PNAO = pre-orthogonal NAOs * NBO = Natural Bond Orbitals * PNBO = pre-orthogonal NBOs * NHO = Natural Hybrid Orbitals * PNHO = pre-orthogonal NHOs * NLMO = Natural Localized Molecular Orbitals * PNLMO = pre-orthogonal NLMOs * * UNKNOWN = Use this for any type not listed here * You can use the string field for description */ enum molfile_qm_wavefunc_type { MOLFILE_WAVE_CANON, MOLFILE_WAVE_GEMINAL, MOLFILE_WAVE_MCSCFNAT, MOLFILE_WAVE_MCSCFOPT, MOLFILE_WAVE_CINATUR, MOLFILE_WAVE_PIPEK, MOLFILE_WAVE_BOYS, MOLFILE_WAVE_RUEDEN, - MOLFILE_WAVE_NAO, MOLFILE_WAVE_PNAO, MOLFILE_WAVE_NHO, - MOLFILE_WAVE_PNHO, MOLFILE_WAVE_NBO, MOLFILE_WAVE_PNBO, - MOLFILE_WAVE_PNLMO, MOLFILE_WAVE_NLMO, MOLFILE_WAVE_MOAO, + MOLFILE_WAVE_NAO, MOLFILE_WAVE_PNAO, MOLFILE_WAVE_NHO, + MOLFILE_WAVE_PNHO, MOLFILE_WAVE_NBO, MOLFILE_WAVE_PNBO, + MOLFILE_WAVE_PNLMO, MOLFILE_WAVE_NLMO, MOLFILE_WAVE_MOAO, MOLFILE_WAVE_NATO, MOLFILE_WAVE_UNKNOWN }; /** * Enumeration of all of the supported QM related charge * types */ enum molfile_qm_charge_type { MOLFILE_QMCHARGE_UNKNOWN, MOLFILE_QMCHARGE_MULLIKEN, MOLFILE_QMCHARGE_LOWDIN, MOLFILE_QMCHARGE_ESP, MOLFILE_QMCHARGE_NPA }; /** * Sizes of various QM-related, per-timestep data arrays * which must be allocated by the caller (VMD) so that the plugin * can fill in the arrays with data. */ typedef struct molfile_qm_timestep_metadata { unsigned int count; /**< total # timesteps; -1 if unknown */ unsigned int avg_bytes_per_timestep; /**< bytes per timestep */ int has_gradient; /**< if timestep contains gradient */ int num_scfiter; /**< # scf iterations for this ts */ int num_orbitals_per_wavef[MOLFILE_MAXWAVEPERTS]; /**< # orbitals for each wavefunction */ int has_orben_per_wavef[MOLFILE_MAXWAVEPERTS]; /**< orbital energy flags */ int has_occup_per_wavef[MOLFILE_MAXWAVEPERTS]; /**< orbital occupancy flags */ int num_wavef ; /**< # wavefunctions in this ts */ - int wavef_size; /**< size of one wavefunction + int wavef_size; /**< size of one wavefunction * (# of gaussian basis fctns) */ int num_charge_sets; /**< # of charge values per atom */ } molfile_qm_timestep_metadata_t; /** * QM wavefunction */ typedef struct { int type; /**< MOLFILE_WAVE_CANON, MOLFILE_WAVE_MCSCFNAT, ... */ int spin; /**< 1 for alpha, -1 for beta */ int excitation; /**< 0 for ground state, 1,2,3,... for excited states */ int multiplicity; /**< spin multiplicity of the state, zero if unknown */ char info[MOLFILE_BUFSIZ]; /**< string for additional type info */ double energy; /**< energy of the electronic state. * i.e. HF-SCF energy, CI state energy, * MCSCF energy, etc. */ float *wave_coeffs; /**< expansion coefficients for wavefunction in the * form {orbital1(c1),orbital1(c2),.....,orbitalM(cN)} */ float *orbital_energies; /**< list of orbital energies for wavefunction */ float *occupancies; /**< orbital occupancies */ int *orbital_ids; /**< orbital ID numbers; If NULL then VMD will * assume 1,2,3,...num_orbs. */ } molfile_qm_wavefunction_t; /** * QM per trajectory timestep info * Note that each timestep can contain multiple wavefunctions. */ typedef struct { molfile_qm_wavefunction_t *wave; /**< array of wavefunction objects */ float *gradient; /**< force on each atom (=gradient of energy) */ double *scfenergies; /**< energies from the SCF cycles */ double *charges; /**< per-atom charges */ int *charge_types; /**< type of each charge set */ } molfile_qm_timestep_t; /************************************************************** **************************************************************/ /** * Enumeration of all of the supported graphics objects that can be read * from graphics file reader plugins. */ enum molfile_graphics_type { - MOLFILE_POINT, MOLFILE_TRIANGLE, MOLFILE_TRINORM, MOLFILE_NORMS, - MOLFILE_LINE, MOLFILE_CYLINDER, MOLFILE_CAPCYL, MOLFILE_CONE, + MOLFILE_POINT, MOLFILE_TRIANGLE, MOLFILE_TRINORM, MOLFILE_NORMS, + MOLFILE_LINE, MOLFILE_CYLINDER, MOLFILE_CAPCYL, MOLFILE_CONE, MOLFILE_SPHERE, MOLFILE_TEXT, MOLFILE_COLOR, MOLFILE_TRICOLOR }; /** * Individual graphics object/element data - */ + */ typedef struct { int type; /* One of molfile_graphics_type */ int style; /* A general style parameter */ float size; /* A general size parameter */ float data[9]; /* All data for the element */ } molfile_graphics_t; /* * Types for raw graphics elements stored in files. Data for each type * should be stored by the plugin as follows: type data style size ---- ---- ----- ---- point x, y, z pixel size -triangle x1,y1,z1,x2,y2,z2,x3,y3,z3 -trinorm x1,y1,z1,x2,y2,z2,x3,y3,z3 +triangle x1,y1,z1,x2,y2,z2,x3,y3,z3 +trinorm x1,y1,z1,x2,y2,z2,x3,y3,z3 the next array element must be NORMS -tricolor x1,y1,z1,x2,y2,z2,x3,y3,z3 +tricolor x1,y1,z1,x2,y2,z2,x3,y3,z3 the next array elements must be NORMS the following element must be COLOR, with three RGB triples -norms x1,y1,z1,x2,y2,z2,x3,y3,z3 +norms x1,y1,z1,x2,y2,z2,x3,y3,z3 line x1,y1,z1,x2,y2,z2 0=solid pixel width 1=stippled cylinder x1,y1,z1,x2,y2,z2 resolution radius capcyl x1,y1,z1,x2,y2,z2 resolution radius sphere x1,y1,z1 resolution radius text x, y, z, up to 24 bytes of text pixel size color r, g, b */ /** * Main file reader API. Any function in this struct may be NULL * if not implemented by the plugin; the application checks this to determine - * what functionality is present in the plugin. - */ + * what functionality is present in the plugin. + */ typedef struct { /** - * Required header + * Required header */ vmdplugin_HEAD /** - * Filename extension for this file type. May be NULL if no filename + * Filename extension for this file type. May be NULL if no filename * extension exists and/or is known. For file types that match several * common extensions, list them in a comma separated list such as: * "pdb,ent,foo,bar,baz,ban" * The comma separated list will be expanded when filename extension matching * is performed. If multiple plugins solicit the same filename extensions, - * the one that lists the extension earliest in its list is selected. In the + * the one that lists the extension earliest in its list is selected. In the * case of a "tie", the first one tried/checked "wins". */ const char *filename_extension; /** * Try to open the file for reading. Return an opaque handle, or NULL on - * failure. Set the number of atoms; if the number of atoms cannot be - * determined, set natoms to MOLFILE_NUMATOMS_UNKNOWN. + * failure. Set the number of atoms; if the number of atoms cannot be + * determined, set natoms to MOLFILE_NUMATOMS_UNKNOWN. * Filetype should be the name under which this plugin was registered; * this is provided so that plugins can provide the same function pointer * to handle multiple file types. */ - void *(* open_file_read)(const char *filepath, const char *filetype, + void *(* open_file_read)(const char *filepath, const char *filetype, int *natoms); - + /** * Read molecular structure from the given file handle. atoms is allocated * by the caller and points to space for natoms. - * On success, place atom information in the passed-in pointer. + * On success, place atom information in the passed-in pointer. * optflags specifies which optional fields in the atoms will be set by * the plugin. */ int (*read_structure)(void *, int *optflags, molfile_atom_t *atoms); /** * Read bond information for the molecule. On success the arrays from * and to should point to the (one-based) indices of bonded atoms. * Each unique bond should be specified only once, so file formats that list * bonds twice will need post-processing before the results are returned to * the caller. - * If the plugin provides bond information, but the file loaded doesn't + * If the plugin provides bond information, but the file loaded doesn't * actually contain any bond info, the nbonds parameter should be * set to 0 and from/to should be set to NULL to indicate that no bond * information was actually present, and automatic bond search should be - * performed. + * performed. * * If the plugin provides bond order information, the bondorder array * will contain the bond order for each from/to pair. If not, the bondorder - * pointer should be set to NULL, in which case the caller will provide a + * pointer should be set to NULL, in which case the caller will provide a * default bond order value of 1.0. * * If the plugin provides bond type information, the bondtype array * will contain the bond type index for each from/to pair. These numbers * are consecutive integers starting from 0. * the bondtypenames list, contains the corresponding names, if available, * as a NULL string terminated list. nbondtypes is provided for convenience * and consistency checking. * * These arrays must be freed by the plugin in the close_file_read function. - * This function can be called only after read_structure(). - * Return MOLFILE_SUCCESS if no errors occur. + * This function can be called only after read_structure(). + * Return MOLFILE_SUCCESS if no errors occur. */ - int (*read_bonds)(void *, int *nbonds, int **from, int **to, float **bondorder, + int (*read_bonds)(void *, int *nbonds, int **from, int **to, float **bondorder, int **bondtype, int *nbondtypes, char ***bondtypename); /** - * XXX this function will be augmented and possibly superceded by a + * XXX this function will be augmented and possibly superceded by a * new QM-capable version named read_timestep(), when finished. * - * Read the next timestep from the file. Return MOLFILE_SUCCESS, or - * MOLFILE_EOF on EOF. If the molfile_timestep_t argument is NULL, then - * the frame should be skipped. Otherwise, the application must prepare - * molfile_timestep_t by allocating space in coords for the corresponding - * number of coordinates. - * The natoms parameter exists because some coordinate file formats - * (like CRD) cannot determine for themselves how many atoms are in a + * Read the next timestep from the file. Return MOLFILE_SUCCESS, or + * MOLFILE_EOF on EOF. If the molfile_timestep_t argument is NULL, then + * the frame should be skipped. Otherwise, the application must prepare + * molfile_timestep_t by allocating space in coords for the corresponding + * number of coordinates. + * The natoms parameter exists because some coordinate file formats + * (like CRD) cannot determine for themselves how many atoms are in a * timestep; the app must therefore obtain this information elsewhere * and provide it to the plugin. */ int (* read_next_timestep)(void *, int natoms, molfile_timestep_t *); /** * Close the file and release all data. The handle cannot be reused. */ void (* close_file_read)(void *); - + /** * Open a coordinate file for writing using the given header information. * Return an opaque handle, or NULL on failure. The application must - * specify the number of atoms to be written. + * specify the number of atoms to be written. * filetype should be the name under which this plugin was registered. */ - void *(* open_file_write)(const char *filepath, const char *filetype, + void *(* open_file_write)(const char *filepath, const char *filetype, int natoms); - + /** * Write structure information. Return success. */ int (* write_structure)(void *, int optflags, const molfile_atom_t *atoms); /** * Write a timestep to the coordinate file. Return MOLFILE_SUCCESS if no - * errors occur. If the file contains structure information in each - * timestep (like a multi-entry PDB), it will have to cache the information + * errors occur. If the file contains structure information in each + * timestep (like a multi-entry PDB), it will have to cache the information * from the initial calls from write_structure. */ int (* write_timestep)(void *, const molfile_timestep_t *); - + /** * Close the file and release all data. The handle cannot be reused. */ void (* close_file_write)(void *); /** * Retrieve metadata pertaining to volumetric datasets in this file. * Set nsets to the number of volumetric data sets, and set *metadata * to point to an array of molfile_volumetric_t. The array is owned by * the plugin and should be freed by close_file_read(). The application * may call this function any number of times. */ - int (* read_volumetric_metadata)(void *, int *nsets, + int (* read_volumetric_metadata)(void *, int *nsets, molfile_volumetric_t **metadata); - /** - * Read the specified volumetric data set into the space pointed to by - * datablock. The set is specified with a zero-based index. The space + /** + * Read the specified volumetric data set into the space pointed to by + * datablock. The set is specified with a zero-based index. The space * allocated for the datablock must be equal to - * xsize * ysize * zsize. No space will be allocated for colorblock + * xsize * ysize * zsize. No space will be allocated for colorblock * unless has_color is nonzero; in that case, colorblock should be * filled in with three RGB floats per datapoint. */ - int (* read_volumetric_data)(void *, int set, float *datablock, + int (* read_volumetric_data)(void *, int set, float *datablock, float *colorblock); #if vmdplugin_ABIVERSION > 16 int (* read_volumetric_data_ex)(void *, molfile_volumetric_readwrite_t *v); #endif /** * Read raw graphics data stored in this file. Return the number of data - * elements and the data itself as an array of molfile_graphics_t in the - * pointer provided by the application. The plugin is responsible for + * elements and the data itself as an array of molfile_graphics_t in the + * pointer provided by the application. The plugin is responsible for * freeing the data when the file is closed. */ int (* read_rawgraphics)(void *, int *nelem, const molfile_graphics_t **data); /** * Read molecule metadata such as what database (if any) this file/data * came from, what the accession code for the database is, textual remarks * and other notes pertaining to the contained structure/trajectory/volume * and anything else that's informative at the whole file level. - */ + */ int (* read_molecule_metadata)(void *, molfile_metadata_t **metadata); - + /** * Write bond information for the molecule. The arrays from * and to point to the (one-based) indices of bonded atoms. - * Each unique bond will be specified only once by the caller. - * File formats that list bonds twice will need to emit both the + * Each unique bond will be specified only once by the caller. + * File formats that list bonds twice will need to emit both the * from/to and to/from versions of each. - * This function must be called before write_structure(). + * This function must be called before write_structure(). * * Like the read_bonds() routine, the bondorder pointer is set to NULL - * if the caller doesn't have such information, in which case the + * if the caller doesn't have such information, in which case the * plugin should assume a bond order of 1.0 if the file format requires * bond order information. * * Support for bond types follows the bondorder rules. bondtype is * an integer array of the size nbonds that contains the bond type * index (consecutive integers starting from 0) and bondtypenames * contain the corresponding strings, in case the naming/numbering * scheme is different from the index numbers. * if the pointers are set to NULL, then this information is not available. * bondtypenames can only be used of bondtypes is also given. - * Return MOLFILE_SUCCESS if no errors occur. + * Return MOLFILE_SUCCESS if no errors occur. */ - int (* write_bonds)(void *, int nbonds, int *from, int *to, float *bondorder, + int (* write_bonds)(void *, int nbonds, int *from, int *to, float *bondorder, int *bondtype, int nbondtypes, char **bondtypename); /** - * Write the specified volumetric data set into the space pointed to by + * Write the specified volumetric data set into the space pointed to by * datablock. The * allocated for the datablock must be equal to - * xsize * ysize * zsize. No space will be allocated for colorblock + * xsize * ysize * zsize. No space will be allocated for colorblock * unless has_color is nonzero; in that case, colorblock should be * filled in with three RGB floats per datapoint. */ int (* write_volumetric_data)(void *, molfile_volumetric_t *metadata, float *datablock, float *colorblock); #if vmdplugin_ABIVERSION > 16 int (* write_volumetric_data_ex)(void *, molfile_volumetric_t *metadata, molfile_volumetric_readwrite_t *v); #endif - /** + /** * Read in Angles, Dihedrals, Impropers, and Cross Terms and optionally types. - * (Cross terms pertain to the CHARMM/NAMD CMAP feature) + * (Cross terms pertain to the CHARMM/NAMD CMAP feature) */ int (* read_angles)(void *handle, int *numangles, int **angles, int **angletypes, int *numangletypes, char ***angletypenames, int *numdihedrals, int **dihedrals, int **dihedraltypes, int *numdihedraltypes, - char ***dihedraltypenames, int *numimpropers, int **impropers, + char ***dihedraltypenames, int *numimpropers, int **impropers, int **impropertypes, int *numimpropertypes, char ***impropertypenames, int *numcterms, int **cterms, int *ctermcols, int *ctermrows); - /** + /** * Write out Angles, Dihedrals, Impropers, and Cross Terms - * (Cross terms pertain to the CHARMM/NAMD CMAP feature) + * (Cross terms pertain to the CHARMM/NAMD CMAP feature) */ int (* write_angles)(void *handle, int numangles, const int *angles, const int *angletypes, int numangletypes, const char **angletypenames, int numdihedrals, const int *dihedrals, const int *dihedraltypes, int numdihedraltypes, - const char **dihedraltypenames, int numimpropers, + const char **dihedraltypenames, int numimpropers, const int *impropers, const int *impropertypes, int numimpropertypes, - const char **impropertypenames, int numcterms, const int *cterms, + const char **impropertypenames, int numcterms, const int *cterms, int ctermcols, int ctermrows); /** * Retrieve metadata pertaining to timestep independent * QM datasets in this file. * * The metadata are the sizes of the QM related data structure - * arrays that will be populated by the plugin when + * arrays that will be populated by the plugin when * read_qm_rundata() is called. Since the allocation of these * arrays is done by VMD rather than the plugin, VMD needs to * know the sizes beforehand. Consequently read_qm_metadata() * has to be called before read_qm_rundata(). */ int (* read_qm_metadata)(void *, molfile_qm_metadata_t *metadata); /** * Read timestep independent QM data. * * Typical data that are defined only once per trajectory are - * general info about the calculation (such as the used method), + * general info about the calculation (such as the used method), * the basis set and normal modes. * The data structures to be populated must have been allocated * before by VMD according to sizes obtained through * read_qm_metadata(). */ int (* read_qm_rundata)(void *, molfile_qm_t *qmdata); /** - * Read the next timestep from the file. Return MOLFILE_SUCCESS, or + * Read the next timestep from the file. Return MOLFILE_SUCCESS, or * MOLFILE_EOF on EOF. If the molfile_timestep_t or molfile_qm_metadata_t - * arguments are NULL, then the coordinate or qm data should be skipped. - * Otherwise, the application must prepare molfile_timestep_t and - * molfile_qm_timestep_t by allocating space for the corresponding + * arguments are NULL, then the coordinate or qm data should be skipped. + * Otherwise, the application must prepare molfile_timestep_t and + * molfile_qm_timestep_t by allocating space for the corresponding * number of coordinates, orbital wavefunction coefficients, etc. - * Since it is common for users to want to load only the final timestep + * Since it is common for users to want to load only the final timestep * data from a QM run, the application may provide any combination of - * valid, or NULL pointers for the molfile_timestep_t and + * valid, or NULL pointers for the molfile_timestep_t and * molfile_qm_timestep_t parameters, depending on what information the * user is interested in. - * The natoms and qm metadata parameters exist because some file formats - * cannot determine for themselves how many atoms etc are in a + * The natoms and qm metadata parameters exist because some file formats + * cannot determine for themselves how many atoms etc are in a * timestep; the app must therefore obtain this information elsewhere * and provide it to the plugin. */ int (* read_timestep)(void *, int natoms, molfile_timestep_t *, molfile_qm_metadata_t *, molfile_qm_timestep_t *); int (* read_timestep_metadata)(void *, molfile_timestep_metadata_t *); int (* read_qm_timestep_metadata)(void *, molfile_qm_timestep_metadata_t *); #if defined(DESRES_READ_TIMESTEP2) /** * Read a specified timestep! */ int (* read_timestep2)(void *, molfile_ssize_t index, molfile_timestep_t *); /** * write up to count times beginning at index start into the given * space. Return the number read, or -1 on error. */ molfile_ssize_t (* read_times)( void *, molfile_ssize_t start, molfile_ssize_t count, double * times ); #endif /** * Console output, READ-ONLY function pointer. * Function pointer that plugins can use for printing to the host * application's text console. This provides a clean way for plugins * to send message strings back to the calling application, giving the * caller the ability to prioritize, buffer, and redirect console messages * to an appropriate output channel, window, etc. This enables the use of * graphical consoles like TkCon without losing console output from plugins. * If the function pointer is NULL, no console output service is provided * by the calling application, and the output should default to stdout * stream. If the function pointer is non-NULL, all output will be * subsequently dealt with by the calling application. * * XXX this should really be put into a separate block of * application-provided read-only function pointers for any * application-provided services */ int (* cons_fputs)(const int, const char*); } molfile_plugin_t; #endif diff --git a/lib/molfile/vmdplugin.h b/lib/molfile/vmdplugin.h index bbbc53c9b..842d1e431 100644 --- a/lib/molfile/vmdplugin.h +++ b/lib/molfile/vmdplugin.h @@ -1,191 +1,191 @@ /*************************************************************************** *cr *cr (C) Copyright 1995-2006 The Board of Trustees of the *cr University of Illinois *cr All Rights Reserved *cr ***************************************************************************/ /*************************************************************************** * RCS INFORMATION: * * $RCSfile: vmdplugin.h,v $ * $Author: johns $ $Locker: $ $State: Exp $ * $Revision: 1.33 $ $Date: 2015/10/29 05:10:54 $ * ***************************************************************************/ /** @file * This header must be included by every VMD plugin library. It defines the - * API for every plugin so that VMD can organize the plugins it finds. + * API for every plugin so that VMD can organize the plugins it finds. */ #ifndef VMD_PLUGIN_H #define VMD_PLUGIN_H -/* +/* * Preprocessor tricks to make it easier for us to redefine the names of * functions when building static plugins. */ #if !defined(VMDPLUGIN) -/** - * macro defining VMDPLUGIN if it hasn't already been set to the name of +/** + * macro defining VMDPLUGIN if it hasn't already been set to the name of * a static plugin that is being compiled. This is the catch-all case. */ #define VMDPLUGIN vmdplugin #endif /** concatenation macro, joins args x and y together as a single string */ #define xcat(x, y) cat(x, y) /** concatenation macro, joins args x and y together as a single string */ -#define cat(x, y) x ## y +#define cat(x, y) x ## y /* - * macros to correctly define plugin function names depending on whether - * the plugin is being compiled for static linkage or dynamic loading. + * macros to correctly define plugin function names depending on whether + * the plugin is being compiled for static linkage or dynamic loading. * When compiled for static linkage, each plugin needs to have unique * function names for all of its entry points. When compiled for dynamic * loading, the plugins must name their entry points consistently so that * the plugin loading mechanism can find the register, register_tcl, init, * and fini routines via dlopen() or similar operating system interfaces. */ /*@{*/ /** Macro names entry points correctly for static linkage or dynamic loading */ #define VMDPLUGIN_register xcat(VMDPLUGIN, _register) #define VMDPLUGIN_register_tcl xcat(VMDPLUGIN, _register_tcl) #define VMDPLUGIN_init xcat(VMDPLUGIN, _init) #define VMDPLUGIN_fini xcat(VMDPLUGIN, _fini) /*@}*/ /** "WIN32" is defined on both WIN32 and WIN64 platforms... */ -#if (defined(WIN32)) +#if (defined(WIN32)) #define WIN32_LEAN_AND_MEAN #include <windows.h> #if !defined(STATIC_PLUGIN) #if defined(VMDPLUGIN_EXPORTS) -/** +/** * Only define DllMain for plugins, not in VMD or in statically linked plugins * VMDPLUGIN_EXPORTS is only defined when compiling dynamically loaded plugins */ BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } #define VMDPLUGIN_API __declspec(dllexport) #else #define VMDPLUGIN_API __declspec(dllimport) #endif /* VMDPLUGIN_EXPORTS */ #else /* ! STATIC_PLUGIN */ #define VMDPLUGIN_API #endif /* ! STATIC_PLUGIN */ #else /** If we're not compiling on Windows, then this macro is defined empty */ -#define VMDPLUGIN_API +#define VMDPLUGIN_API #endif /** define plugin linkage correctly for both C and C++ based plugins */ #ifdef __cplusplus #define VMDPLUGIN_EXTERN extern "C" VMDPLUGIN_API #else #define VMDPLUGIN_EXTERN extern VMDPLUGIN_API #endif /* __cplusplus */ -/* - * Plugin API functions start here +/* + * Plugin API functions start here */ -/** - * Init routine: called the first time the library is loaded by the +/** + * Init routine: called the first time the library is loaded by the * application and before any other API functions are referenced. * Return 0 on success. */ VMDPLUGIN_EXTERN int VMDPLUGIN_init(void); /** * Macro for creating a struct header used in all plugin structures. - * - * This header should be placed at the top of every plugin API definition + * + * This header should be placed at the top of every plugin API definition * so that it can be treated as a subtype of the base plugin type. * * abiversion: Defines the ABI for the base plugin type (not for other plugins) * type: A string descriptor of the plugin type. * name: A name for the plugin. * author: A string identifier, possibly including newlines. - * Major and minor version. + * Major and minor version. * is_reentrant: Whether this library can be run concurrently with itself. */ #define vmdplugin_HEAD \ int abiversion; \ const char *type; \ const char *name; \ const char *prettyname; \ const char *author; \ int majorv; \ int minorv; \ - int is_reentrant; + int is_reentrant; -/** +/** * Typedef for generic plugin header, individual plugins can - * make their own structures as long as the header info remains - * the same as the generic plugin header, most easily done by + * make their own structures as long as the header info remains + * the same as the generic plugin header, most easily done by * using the vmdplugin_HEAD macro. */ typedef struct { vmdplugin_HEAD } vmdplugin_t; /** * Use this macro to initialize the abiversion member of each plugin */ #define vmdplugin_ABIVERSION 17 /*@{*/ /** Use this macro to indicate a plugin's thread-safety at registration time */ #define VMDPLUGIN_THREADUNSAFE 0 #define VMDPLUGIN_THREADSAFE 1 /*@}*/ /*@{*/ /** Error return code for use in the plugin registration and init functions */ #define VMDPLUGIN_SUCCESS 0 #define VMDPLUGIN_ERROR -1 /*@}*/ -/** +/** * Function pointer typedef for register callback functions */ typedef int (*vmdplugin_register_cb)(void *, vmdplugin_t *); /** * Allow the library to register plugins with the application. * The callback should be called using the passed-in void pointer, which * should not be interpreted in any way by the library. Each vmdplugin_t * pointer passed to the application should point to statically-allocated * or heap-allocated memory and should never be later modified by the plugin. * Applications must be permitted to retain only a copy of the the plugin * pointer, without making any deep copy of the items in the struct. */ VMDPLUGIN_EXTERN int VMDPLUGIN_register(void *, vmdplugin_register_cb); /** - * Allow the library to register Tcl extensions. + * Allow the library to register Tcl extensions. * This API is optional; if found by dlopen, it will be called after first - * calling init and register. + * calling init and register. */ -VMDPLUGIN_EXTERN int VMDPLUGIN_register_tcl(void *, void *tcl_interp, +VMDPLUGIN_EXTERN int VMDPLUGIN_register_tcl(void *, void *tcl_interp, vmdplugin_register_cb); /** - * The Fini method is called when the application will no longer use - * any plugins in the library. + * The Fini method is called when the application will no longer use + * any plugins in the library. */ VMDPLUGIN_EXTERN int VMDPLUGIN_fini(void); #endif /* VMD_PLUGIN_H */