Files
PlantAI-dev/tools/pymol-open-source/contrib/uiuc/plugins/molfile_plugin/src/parm7plugin.cpp
T

182 lines
5.4 KiB
C++
Raw Normal View History

2026-08-03 18:42:47 +08:00
/* MACHINE GENERATED FILE, DO NOT EDIT! */
#define VMDPLUGIN molfile_parm7plugin
#define STATIC_PLUGIN 1
/***************************************************************************
*cr
*cr (C) Copyright 1995-2016 The Board of Trustees of the
*cr University of Illinois
*cr All Rights Reserved
*cr
***************************************************************************/
/***************************************************************************
* RCS INFORMATION:
*
* $RCSfile: parm7plugin.C,v $
* $Author: johns $ $Locker: $ $State: Exp $
* $Revision: 1.34 $ $Date: 2016/11/28 05:01:54 $
*
***************************************************************************/
#include <string.h>
#include "molfile_plugin.h"
#include "ReadPARM7.h"
namespace {
typedef struct {
parm7struct *prm;
int popn;
FILE *fd;
int nbonds;
int *from, *to;
} parmdata;
}
static void *open_parm7_read(const char *filename, const char *,int *natoms) {
FILE *fd;
int popn = 0;
if(!(fd = open_parm7_file(filename, &popn))) {
fprintf(stderr, "parm7plugin) Cannot open parm file '%s'\n", filename);
return NULL;
}
parm7struct *prm = read_parm7_header(fd);
if (!prm) {
close_parm7_file(fd, popn);
return NULL;
}
*natoms = prm->Natom;
parmdata *p = new parmdata;
memset(p, 0, sizeof(parmdata));
p->prm = prm;
p->popn = popn;
p->fd = fd;
p->from = new int[prm->Nbonh + prm->Nbona];
p->to = new int[prm->Nbonh + prm->Nbona];
return p;
}
static int read_parm7_structure(void *mydata, int *optflags, molfile_atom_t *atoms) {
parmdata *p = (parmdata *)mydata;
const parm7struct *prm = p->prm;
FILE *file = p->fd;
char buf[85];
char field[85];
char *resnames = NULL;
*optflags = MOLFILE_NOOPTIONS; /* no optional data to start with */
while (fgets(buf, 85, file)) {
// find the next line starting with %FLAG, indicating a new section
if (strncmp(buf, "%FLAG ", 6))
continue;
sscanf(buf+6, "%s\n", field); // type of record
// skip any number of lines until we get to "FORMAT". This handles
// the %COMMENT lines that may or may not be present
while (strncmp(buf, "%FORMAT", 7)) {
fgets(buf, 85, file);
}
if (!strcmp(field, "ATOM_NAME")) {
if (!parse_parm7_atoms(buf, prm->Natom, atoms, file)) break;
} else if (!strcmp(field, "CHARGE")) {
*optflags |= MOLFILE_CHARGE;
if (!parse_parm7_charge(buf, prm->Natom, atoms, file)) break;
} else if (!strcmp(field, "MASS")) {
*optflags |= MOLFILE_MASS;
if (!parse_parm7_mass(buf, prm->Natom, atoms, file)) break;
} else if (!strcmp(field, "AMBER_ATOM_TYPE")) {
if (!parse_parm7_atype(buf, prm->Natom, atoms, file)) break;
} else if (!strcmp(field, "RESIDUE_LABEL")) {
resnames = new char[4*prm->Nres];
if (!parse_parm7_resnames(buf, prm->Nres, resnames, file)) break;
} else if (!strcmp(field, "RESIDUE_POINTER")) {
if (!resnames) {
fprintf(stderr,
"parm7plugin) Cannot parse RESIDUE_POINTER before RESIDUE_LABEL\n");
continue;
}
if (!parse_parm7_respointers(buf, prm->Natom, atoms,
prm->Nres, resnames, file))
break;
// XXX: we could count the bonded parameters and assign bond types.
} else if (!strcmp(field, "BONDS_WITHOUT_HYDROGEN")) {
if (!parse_parm7_bonds(buf, prm->Nbona, p->from+p->nbonds,
p->to+p->nbonds, file)) break;
p->nbonds += prm->Nbona;
} else if (!strcmp(field, "BONDS_INC_HYDROGEN")) {
if (!parse_parm7_bonds(buf, prm->Nbonh, p->from+p->nbonds,
p->to+p->nbonds, file)) break;
p->nbonds += prm->Nbonh;
}
}
// unused items
for (int i=0; i<prm->Natom; i++) {
atoms[i].chain[0] = '\0';
atoms[i].segid[0] = '\0';
}
delete [] resnames;
return MOLFILE_SUCCESS;
}
static int read_parm7_bonds(void *v, int *nbonds, int **fromptr, int **toptr,
float **bondorderptr, int **bondtype,
int *nbondtypes, char ***bondtypename){
parmdata *p = (parmdata *)v;
*nbonds = p->nbonds;
*fromptr = p->from;
*toptr = p->to;
*bondorderptr = NULL; // parm files don't contain bond order information
*bondtype = NULL;
*nbondtypes = 0;
*bondtypename = NULL;
return MOLFILE_SUCCESS;
}
static void close_parm7_read(void *mydata) {
parmdata *p = (parmdata *)mydata;
close_parm7_file(p->fd, p->popn);
delete p->prm;
delete [] p->from;
delete [] p->to;
delete p;
}
/*
* Initialization stuff down here
*/
static molfile_plugin_t plugin;
VMDPLUGIN_API int VMDPLUGIN_init(){
memset(&plugin, 0, sizeof(molfile_plugin_t));
plugin.abiversion = vmdplugin_ABIVERSION;
plugin.type = MOLFILE_PLUGIN_TYPE;
plugin.name = "parm7";
plugin.prettyname = "AMBER7 Parm";
plugin.author = "Brian Bennion, Justin Gullingsrud, John Stone";
plugin.majorv = 0;
plugin.minorv = 15;
plugin.is_reentrant = VMDPLUGIN_THREADUNSAFE;
plugin.filename_extension = "prmtop,parm7";
plugin.open_file_read = open_parm7_read;
plugin.read_structure = read_parm7_structure;
plugin.read_bonds = read_parm7_bonds;
plugin.close_file_read = close_parm7_read;
return VMDPLUGIN_SUCCESS;
}
VMDPLUGIN_API int VMDPLUGIN_register(void *v, vmdplugin_register_cb cb) {
(*cb)(v,(vmdplugin_t *)&plugin);
return VMDPLUGIN_SUCCESS;
}
VMDPLUGIN_API int VMDPLUGIN_fini(){
return VMDPLUGIN_SUCCESS;
}