00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #include <stdio.h>
00055 #include <stdlib.h>
00056 #include <string.h>
00057 #include <ctype.h>
00058 #include "molfile_plugin.h"
00059 #include "periodic_table.h"
00060
00061 typedef struct {
00062 FILE *file;
00063 int numatoms;
00064 molfile_atom_t *atomlist;
00065 } mmcifdata;
00066
00067 static void *open_mmcif_read(const char *filename, const char *filetype,
00068 int *natoms) {
00069
00070 return NULL;
00071 }
00072
00073 static int read_mmcif_structure(void *mydata, int *optflags,
00074 molfile_atom_t *atoms) {
00075
00076 return MOLFILE_ERROR;
00077 }
00078
00079 static int read_mmcif_timestep(void *mydata, int natoms, molfile_timestep_t *ts) {
00080 mmcifdata *data = (mmcifdata *)mydata;
00081
00082
00083 return MOLFILE_ERROR;
00084 }
00085
00086 static void close_mmcif_read(void *mydata) {
00087 mmcifdata *data = (mmcifdata *)mydata;
00088 fclose(data->file);
00089 free(data);
00090 }
00091
00092
00093 static void *open_mmcif_write(const char *filename, const char *filetype,
00094 int natoms) {
00095 FILE *fd;
00096 mmcifdata *data;
00097
00098 fd = fopen(filename, "w");
00099 if (!fd) {
00100 fprintf(stderr, "mmcifplugin) Error: unable to open mmcif file %s for writing\n",
00101 filename);
00102 return NULL;
00103 }
00104
00105 data = (mmcifdata *)malloc(sizeof(mmcifdata));
00106 data->numatoms = natoms;
00107 data->file = fd;
00108 return data;
00109 }
00110
00111
00112 static molfile_plugin_t plugin;
00113
00114 VMDPLUGIN_API int VMDPLUGIN_init() {
00115 memset(&plugin, 0, sizeof(molfile_plugin_t));
00116 plugin.abiversion = vmdplugin_ABIVERSION;
00117 plugin.type = MOLFILE_PLUGIN_TYPE;
00118 plugin.name = "mmcif";
00119 plugin.prettyname = "mmCIF";
00120 plugin.author = "John Stone";
00121 plugin.majorv = 0;
00122 plugin.minorv = 2;
00123 plugin.is_reentrant = VMDPLUGIN_THREADSAFE;
00124 plugin.filename_extension = "cif";
00125 plugin.open_file_read = open_mmcif_read;
00126 plugin.read_structure = read_mmcif_structure;
00127 plugin.read_next_timestep = read_mmcif_timestep;
00128 plugin.close_file_read = close_mmcif_read;
00129 return VMDPLUGIN_SUCCESS;
00130 }
00131
00132 VMDPLUGIN_API int VMDPLUGIN_register(void *v, vmdplugin_register_cb cb) {
00133 (*cb)(v, (vmdplugin_t *)&plugin);
00134 return VMDPLUGIN_SUCCESS;
00135 }
00136
00137 VMDPLUGIN_API int VMDPLUGIN_fini() {
00138 return VMDPLUGIN_SUCCESS;
00139 }
00140
00141
00142 #ifdef TEST_PLUGIN
00143
00144 int main(int argc, char *argv[]) {
00145 molfile_timestep_t timestep;
00146 void *v;
00147 int natoms;
00148 int i, nsets, set;
00149
00150 while (--argc) {
00151 ++argv;
00152 v = open_mmcif_read(*argv, "mmcif", &natoms);
00153 if (!v) {
00154 fprintf(stderr, "open_mmcif_read failed for file %s\n", *argv);
00155 return 1;
00156 }
00157 fprintf(stderr, "open_mmcif_read succeeded for file %s\n", *argv);
00158 fprintf(stderr, "number of atoms: %d\n", natoms);
00159
00160 i = 0;
00161 timestep.coords = (float *)malloc(3*sizeof(float)*natoms);
00162 while (!read_mmcif_timestep(v, natoms, ×tep)) {
00163 i++;
00164 }
00165 fprintf(stderr, "ended read_next_timestep on frame %d\n", i);
00166
00167 close_mmcif_read(v);
00168 }
00169 return 0;
00170 }
00171
00172 #endif
00173
00174
00175
00176
00177