#include "molfile_plugin.h" #include #include #include #include /* * API functions start here */ typedef struct { FILE *file; int natoms,nbonds,coords_read; int *from,*to; char *file_name; }vmfdata; static void *open_vmf_read(const char *filename, const char *filetype, int *natoms) { char input_line[80]; int i,nbonds; FILE *fd; vmfdata *vmf; fd = fopen(filename, "r"); if(!fd) return NULL; for(i=1;;) { fgets(input_line,sizeof(input_line),fd); if(strstr(input_line,"atom")) { *natoms=i; i++; } else if (strstr(input_line,"connect")) break; } rewind(fd); for(i=1;;) { fgets(input_line,1024,fd); if(strstr(input_line,"connect")) { nbonds=i; i++; } else if(strstr(input_line,"End")) break; else continue; } vmf=new vmfdata; vmf->file = fd; vmf->file_name=strdup(filename); vmf->natoms=*natoms; vmf->nbonds=nbonds; vmf->coords_read=0; vmf->from=NULL; vmf->to=NULL; return vmf; } static int read_vmf_structure(void *mydata, int *optflags, molfile_atom_t *atoms) { vmfdata *vmf = (vmfdata *)mydata; molfile_atom_t *atom; int i,j; char *k,filebuffer[1024]; *optflags = MOLFILE_CHARGE; rewind(vmf->file); for(i=0;i<4;i++) { fgets(filebuffer,1024,vmf->file); } for(i=0;inatoms;i++) { char fbuffer[1024]; k=fgets(fbuffer,1024,vmf->file); atom=atoms+i; j=sscanf(fbuffer,"%*s %*d %*s %*f %*f %*f %s %f", atom->type,&atom->charge); if (k==NULL) { fprintf(stderr,"vmf structure) missing atom(s) in file'%s'\n",vmf->file_name); fprintf(stderr, "vmf structure) expecting '%d' atoms, found only '%d'\n", vmf->natoms, i+1); return MOLFILE_ERROR; } else if(j<2) { fprintf(stderr,"vmf structure) missing type or coordinate(s) in file'%s'for atom'%d'\n",vmf->file_name,i+1); return MOLFILE_ERROR; } strcpy(atom->chain," "); strcpy(atom->segid," "); } return MOLFILE_SUCCESS; } static int read_bonds(void *v, int *nbonds, int **fromptr, int **toptr) { vmfdata *vmf = (vmfdata *)v; char line[1024],bond_type[16]; int i,match,bond_from,bond_to,bond_index,current_nbonds; if(vmf->nbonds == 0) { *nbonds=0; *fromptr = NULL; *toptr = NULL; return MOLFILE_SUCCESS; } vmf->from = new int[vmf->nbonds]; vmf->to = new int[vmf->nbonds]; current_nbonds=vmf->nbonds; rewind(vmf->file); for(i=0;i<4;i++) { fgets(line,1024,vmf->file); } for(i=0;inatoms;i++) { fgets(line,1024,vmf->file); } bond_index=0; for(i=0;inbonds;i++) { fgets(line,1024,vmf->file); if (ferror(vmf->file) || feof(vmf->file)) { fprintf(stderr,"vmfplugin: error occurred reading atom record.\n"); return MOLFILE_ERROR; } match=sscanf(line,"%*s %d %d %s",&bond_from,&bond_to,bond_type); if (match<3) { fprintf(stderr,"vmfplugin: improperly formatted bond record.\n"); return MOLFILE_ERROR; } if (strncmp(bond_type,"nc",2) == 0) { current_nbonds--; } else{ vmf->from[bond_index]=bond_from; vmf->to[bond_index]=bond_to; bond_index++; } } *nbonds=current_nbonds; *fromptr=vmf->from; *toptr=vmf->to; return MOLFILE_SUCCESS; } static int read_vmf_timestep(void *mydata, int natoms, molfile_timestep_t *ts) { vmfdata *vmf = (vmfdata *)mydata; int i,match; char line[1024]; float x, y, z; if (vmf->coords_read) { return MOLFILE_EOF; } rewind(vmf->file); for(i=0;i<4;i++) fgets(line,1024,vmf->file); for(i=0;inatoms;i++) { fgets(line,1024,vmf->file); if(ferror(vmf->file) || feof(vmf->file)) { fprintf(stderr,"vmfplugin:error occurred reading atom coordinates.\n"); return MOLFILE_ERROR; } match=sscanf(line,"%*s %*d %*s %f %f %f",&x, &y, &z); if (match<3) { fprintf(stderr,"vmfplugin: improperly formatted atom coordinates.\n"); return MOLFILE_ERROR; } if (ts) { ts->coords[3*i]=x; ts->coords[3*i+1]=y; ts->coords[3*i+2]=z; } } vmf->coords_read=1; return MOLFILE_SUCCESS; } static void close_vmf_read(void *mydata) { vmfdata *vmf = (vmfdata *)mydata; if(vmf) { if(vmf->file) fclose(vmf->file); if(vmf->from) delete [] vmf->from; if(vmf->to) delete [] vmf->to; delete vmf; } } /* registration stuff */ static molfile_plugin_t vmfplugin = { vmdplugin_ABIVERSION, MOLFILE_PLUGIN_TYPE, /* type */ "vmf", /* name */ "Mauricio Carrillo Tripp, John E. Stone, Axel Kohlmeyer", /* author */ 0, /* major version */ 6, /* minor version */ VMDPLUGIN_THREADSAFE, /* is reentrant */ "vmf", open_vmf_read, read_vmf_structure, read_bonds, read_vmf_timestep, close_vmf_read, 0, 0, 0, 0, 0, /* read_volumetric_metadata */ 0, /* read_volumetric_data */ 0 /* read_rawgraphics */ }; int VMDPLUGIN_init() { return VMDPLUGIN_SUCCESS; } int VMDPLUGIN_register(void *v, vmdplugin_register_cb cb) { (*cb)(v, (vmdplugin_t *)&vmfplugin); return VMDPLUGIN_SUCCESS; } int VMDPLUGIN_fini() { return VMDPLUGIN_SUCCESS; }