static void read_stx_conf(const char *infile, t_topology *top, rvec x[], rvec *v, int *ePBC, matrix box) { FILE *in; t_trxframe fr; int ftp; char g96_line[STRLEN+1]; if (top->atoms.nr == 0) { fprintf(stderr, "Warning: Number of atoms in %s is 0\n", infile); } else if (top->atoms.atom == NULL) { gmx_mem("Uninitialized array atom"); } if (ePBC) { *ePBC = -1; } ftp = fn2ftp(infile); switch (ftp) { case efGRO: gmx_gro_read_conf(infile, top, x, v, box); break; case efG96: fr.title = NULL; fr.natoms = top->atoms.nr; fr.atoms = &top->atoms; fr.x = x; fr.v = v; fr.f = NULL; in = gmx_fio_fopen(infile, "r"); read_g96_conf(in, infile, &fr, &top->symtab, g96_line); gmx_fio_fclose(in); copy_mat(fr.box, box); top->name = put_symtab(&top->symtab, fr.title); sfree(const_cast<char *>(fr.title)); break; case efPDB: case efBRK: case efENT: gmx_pdb_read_conf(infile, top, x, ePBC, box); break; case efESP: gmx_espresso_read_conf(infile, top, x, v, box); break; default: gmx_incons("Not supported in read_stx_conf"); } }
void get_stx_coordnum(const char *infile, int *natoms) { FILE *in; int ftp, tpxver, tpxgen; t_trxframe fr; char g96_line[STRLEN+1]; ftp = fn2ftp(infile); range_check(ftp, 0, efNR); switch (ftp) { case efGRO: get_coordnum(infile, natoms); break; case efG96: in = gmx_fio_fopen(infile, "r"); fr.title = NULL; fr.natoms = -1; fr.atoms = NULL; fr.x = NULL; fr.v = NULL; fr.f = NULL; *natoms = read_g96_conf(in, infile, &fr, g96_line); gmx_fio_fclose(in); break; case efPDB: case efBRK: case efENT: in = gmx_fio_fopen(infile, "r"); get_pdb_coordnum(in, natoms); gmx_fio_fclose(in); break; case efESP: *natoms = get_espresso_coordnum(infile); break; case efTPA: case efTPB: case efTPR: { t_tpxheader tpx; read_tpxheader(infile, &tpx, TRUE, &tpxver, &tpxgen); *natoms = tpx.natoms; break; } default: gmx_fatal(FARGS, "File type %s not supported in get_stx_coordnum", ftp2ext(ftp)); } }
static void get_stx_coordnum(const char *infile, int *natoms) { FILE *in; int ftp; t_trxframe fr; char g96_line[STRLEN+1]; ftp = fn2ftp(infile); range_check(ftp, 0, efNR); switch (ftp) { case efGRO: get_coordnum(infile, natoms); break; case efG96: { in = gmx_fio_fopen(infile, "r"); fr.title = NULL; fr.natoms = -1; fr.atoms = NULL; fr.x = NULL; fr.v = NULL; fr.f = NULL; *natoms = read_g96_conf(in, infile, &fr, NULL, g96_line); sfree(const_cast<char *>(fr.title)); gmx_fio_fclose(in); break; } case efPDB: case efBRK: case efENT: in = gmx_fio_fopen(infile, "r"); get_pdb_coordnum(in, natoms); gmx_fio_fclose(in); break; case efESP: *natoms = get_espresso_coordnum(infile); break; default: gmx_fatal(FARGS, "File type %s not supported in get_stx_coordnum", ftp2ext(ftp)); } }
bool read_first_frame(const gmx_output_env_t *oenv, t_trxstatus **status, const char *fn, t_trxframe *fr, int flags) { t_fileio *fio = nullptr; gmx_bool bFirst, bOK; int ftp = fn2ftp(fn); clear_trxframe(fr, TRUE); bFirst = TRUE; snew((*status), 1); status_init( *status ); initcount(*status); (*status)->flags = flags; if (efTNG == ftp) { /* Special treatment for TNG files */ gmx_tng_open(fn, 'r', &(*status)->tng); } else { fio = (*status)->fio = gmx_fio_open(fn, "r"); } switch (ftp) { case efTRR: break; case efCPT: read_checkpoint_trxframe(fio, fr); bFirst = FALSE; break; case efG96: { /* Can not rewind a compressed file, so open it twice */ if (!(*status)->persistent_line) { /* allocate the persistent line */ snew((*status)->persistent_line, STRLEN+1); } t_symtab *symtab = nullptr; read_g96_conf(gmx_fio_getfp(fio), fn, nullptr, fr, symtab, (*status)->persistent_line); gmx_fio_close(fio); clear_trxframe(fr, FALSE); if (flags & (TRX_READ_X | TRX_NEED_X)) { snew(fr->x, fr->natoms); } if (flags & (TRX_READ_V | TRX_NEED_V)) { snew(fr->v, fr->natoms); } (*status)->fio = gmx_fio_open(fn, "r"); break; } case efXTC: if (read_first_xtc(fio, &fr->natoms, &fr->step, &fr->time, fr->box, &fr->x, &fr->prec, &bOK) == 0) { GMX_RELEASE_ASSERT(!bOK, "Inconsistent results - OK status from read_first_xtc, but 0 atom coords read"); fr->not_ok = DATA_NOT_OK; } if (fr->not_ok) { fr->natoms = 0; printincomp(*status, fr); } else { fr->bPrec = (fr->prec > 0); fr->bStep = TRUE; fr->bTime = TRUE; fr->bX = TRUE; fr->bBox = TRUE; printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; case efTNG: fr->step = -1; if (!gmx_read_next_tng_frame((*status)->tng, fr, nullptr, 0)) { fr->not_ok = DATA_NOT_OK; fr->natoms = 0; printincomp(*status, fr); } else { printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; case efPDB: pdb_first_x(*status, gmx_fio_getfp(fio), fr); if (fr->natoms) { printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; case efGRO: if (gro_first_x_or_v(gmx_fio_getfp(fio), fr)) { printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; default: #if GMX_USE_PLUGINS fprintf(stderr, "The file format of %s is not a known trajectory format to GROMACS.\n" "Please make sure that the file is a trajectory!\n" "GROMACS will now assume it to be a trajectory and will try to open it using the VMD plug-ins.\n" "This will only work in case the VMD plugins are found and it is a trajectory format supported by VMD.\n", fn); gmx_fio_fp_close(fio); /*only close the file without removing FIO entry*/ if (!read_first_vmd_frame(fn, &(*status)->vmdplugin, fr)) { gmx_fatal(FARGS, "Not supported in read_first_frame: %s", fn); } #else gmx_fatal(FARGS, "Not supported in read_first_frame: %s. Please make sure that the file is a trajectory.\n" "GROMACS is not compiled with plug-in support. Thus it cannot read non-GROMACS trajectory formats using the VMD plug-ins.\n" "Please compile with plug-in support if you want to read non-GROMACS trajectory formats.\n", fn); #endif break; } (*status)->tf = fr->time; /* Return FALSE if we read a frame that's past the set ending time. */ if (!bFirst && (!(flags & TRX_DONT_SKIP) && check_times(fr->time) > 0)) { (*status)->t0 = fr->time; return FALSE; } if (bFirst || (!(flags & TRX_DONT_SKIP) && check_times(fr->time) < 0)) { /* Read a frame when no frame was read or the first was skipped */ if (!read_next_frame(oenv, *status, fr)) { return FALSE; } } (*status)->t0 = fr->time; /* We need the number of atoms for random-access XTC searching, even when * we don't have access to the actual frame data. */ (*status)->natoms = fr->natoms; return (fr->natoms > 0); }
bool read_next_frame(const gmx_output_env_t *oenv, t_trxstatus *status, t_trxframe *fr) { real pt; int ct; gmx_bool bOK, bMissingData = FALSE, bSkip = FALSE; bool bRet = false; int ftp; pt = status->tf; do { clear_trxframe(fr, FALSE); if (status->tng) { /* Special treatment for TNG files */ ftp = efTNG; } else { ftp = gmx_fio_getftp(status->fio); } switch (ftp) { case efTRR: bRet = gmx_next_frame(status, fr); break; case efCPT: /* Checkpoint files can not contain mulitple frames */ break; case efG96: { t_symtab *symtab = nullptr; read_g96_conf(gmx_fio_getfp(status->fio), nullptr, nullptr, fr, symtab, status->persistent_line); bRet = (fr->natoms > 0); break; } case efXTC: if (bTimeSet(TBEGIN) && (status->tf < rTimeValue(TBEGIN))) { if (xtc_seek_time(status->fio, rTimeValue(TBEGIN), fr->natoms, TRUE)) { gmx_fatal(FARGS, "Specified frame (time %f) doesn't exist or file corrupt/inconsistent.", rTimeValue(TBEGIN)); } initcount(status); } bRet = read_next_xtc(status->fio, fr->natoms, &fr->step, &fr->time, fr->box, fr->x, &fr->prec, &bOK); fr->bPrec = (bRet && fr->prec > 0); fr->bStep = bRet; fr->bTime = bRet; fr->bX = bRet; fr->bBox = bRet; if (!bOK) { /* Actually the header could also be not ok, but from bOK from read_next_xtc this can't be distinguished */ fr->not_ok = DATA_NOT_OK; } break; case efTNG: bRet = gmx_read_next_tng_frame(status->tng, fr, nullptr, 0); break; case efPDB: bRet = pdb_next_x(status, gmx_fio_getfp(status->fio), fr); break; case efGRO: bRet = gro_next_x_or_v(gmx_fio_getfp(status->fio), fr); break; default: #if GMX_USE_PLUGINS bRet = read_next_vmd_frame(status->vmdplugin, fr); #else gmx_fatal(FARGS, "DEATH HORROR in read_next_frame ftp=%s,status=%s", ftp2ext(gmx_fio_getftp(status->fio)), gmx_fio_getname(status->fio)); #endif } status->tf = fr->time; if (bRet) { bMissingData = (((status->flags & TRX_NEED_X) && !fr->bX) || ((status->flags & TRX_NEED_V) && !fr->bV) || ((status->flags & TRX_NEED_F) && !fr->bF)); bSkip = FALSE; if (!bMissingData) { ct = check_times2(fr->time, status->t0, fr->bDouble); if (ct == 0 || ((status->flags & TRX_DONT_SKIP) && ct < 0)) { printcount(status, oenv, fr->time, FALSE); } else if (ct > 0) { bRet = false; } else { printcount(status, oenv, fr->time, TRUE); bSkip = TRUE; } } } } while (bRet && (bMissingData || bSkip)); if (!bRet) { printlast(status, oenv, pt); if (fr->not_ok) { printincomp(status, fr); } } return bRet; }
gmx_bool read_next_frame(const output_env_t oenv, t_trxstatus *status, t_trxframe *fr) { real pt; int ct; gmx_bool bOK, bRet, bMissingData = FALSE, bSkip = FALSE; int dummy = 0; int ftp; bRet = FALSE; pt = fr->tf; do { clear_trxframe(fr, FALSE); fr->tppf = fr->tpf; fr->tpf = fr->tf; if (status->tng) { /* Special treatment for TNG files */ ftp = efTNG; } else { ftp = gmx_fio_getftp(status->fio); } switch (ftp) { case efTRR: bRet = gmx_next_frame(status, fr); break; case efCPT: /* Checkpoint files can not contain mulitple frames */ break; case efG96: read_g96_conf(gmx_fio_getfp(status->fio), NULL, fr, status->persistent_line); bRet = (fr->natoms > 0); break; case efXTC: /* B. Hess 2005-4-20 * Sometimes is off by one frame * and sometimes reports frame not present/file not seekable */ /* DvdS 2005-05-31: this has been fixed along with the increased * accuracy of the control over -b and -e options. */ if (bTimeSet(TBEGIN) && (fr->tf < rTimeValue(TBEGIN))) { if (xtc_seek_time(status->fio, rTimeValue(TBEGIN), fr->natoms, TRUE)) { gmx_fatal(FARGS, "Specified frame (time %f) doesn't exist or file corrupt/inconsistent.", rTimeValue(TBEGIN)); } initcount(status); } bRet = read_next_xtc(status->fio, fr->natoms, &fr->step, &fr->time, fr->box, fr->x, &fr->prec, &bOK); fr->bPrec = (bRet && fr->prec > 0); fr->bStep = bRet; fr->bTime = bRet; fr->bX = bRet; fr->bBox = bRet; if (!bOK) { /* Actually the header could also be not ok, but from bOK from read_next_xtc this can't be distinguished */ fr->not_ok = DATA_NOT_OK; } break; case efTNG: bRet = gmx_read_next_tng_frame(status->tng, fr, NULL, 0); break; case efPDB: bRet = pdb_next_x(status, gmx_fio_getfp(status->fio), fr); break; case efGRO: bRet = gro_next_x_or_v(gmx_fio_getfp(status->fio), fr); break; default: #ifdef GMX_USE_PLUGINS bRet = read_next_vmd_frame(fr); #else gmx_fatal(FARGS, "DEATH HORROR in read_next_frame ftp=%s,status=%s", ftp2ext(gmx_fio_getftp(status->fio)), gmx_fio_getname(status->fio)); #endif } fr->tf = fr->time; if (bRet) { bMissingData = (((fr->flags & TRX_NEED_X) && !fr->bX) || ((fr->flags & TRX_NEED_V) && !fr->bV) || ((fr->flags & TRX_NEED_F) && !fr->bF)); bSkip = FALSE; if (!bMissingData) { ct = check_times2(fr->time, fr->t0, fr->bDouble); if (ct == 0 || ((fr->flags & TRX_DONT_SKIP) && ct < 0)) { printcount(status, oenv, fr->time, FALSE); } else if (ct > 0) { bRet = FALSE; } else { printcount(status, oenv, fr->time, TRUE); bSkip = TRUE; } } } } while (bRet && (bMissingData || bSkip)); if (!bRet) { printlast(status, oenv, pt); if (fr->not_ok) { printincomp(status, fr); } } return bRet; }
int read_first_frame(const output_env_t oenv, t_trxstatus **status, const char *fn, t_trxframe *fr, int flags) { t_fileio *fio; gmx_bool bFirst, bOK; int dummy = 0; clear_trxframe(fr, TRUE); fr->flags = flags; bFirst = TRUE; snew((*status), 1); status_init( *status ); (*status)->nxframe = 1; initcount(*status); fio = (*status)->fio = gmx_fio_open(fn, "r"); switch (gmx_fio_getftp(fio)) { case efTRJ: case efTRR: break; case efCPT: read_checkpoint_trxframe(fio, fr); bFirst = FALSE; break; case efG96: /* Can not rewind a compressed file, so open it twice */ if (!(*status)->persistent_line) { /* allocate the persistent line */ snew((*status)->persistent_line, STRLEN+1); } read_g96_conf(gmx_fio_getfp(fio), fn, fr, (*status)->persistent_line); gmx_fio_close(fio); clear_trxframe(fr, FALSE); if (flags & (TRX_READ_X | TRX_NEED_X)) { snew(fr->x, fr->natoms); } if (flags & (TRX_READ_V | TRX_NEED_V)) { snew(fr->v, fr->natoms); } fio = (*status)->fio = gmx_fio_open(fn, "r"); break; case efG87: fr->natoms = xyz_first_x(*status, gmx_fio_getfp(fio), oenv, &fr->time, &fr->x, fr->box); if (fr->natoms) { fr->bTime = TRUE; fr->bX = TRUE; fr->bBox = TRUE; printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; case efXTC: if (read_first_xtc(fio, &fr->natoms, &fr->step, &fr->time, fr->box, &fr->x, &fr->prec, &bOK) == 0) { if (bOK) { gmx_fatal(FARGS, "No XTC!\n"); } else { fr->not_ok = DATA_NOT_OK; } } if (fr->not_ok) { fr->natoms = 0; printincomp(*status, fr); } else { fr->bPrec = (fr->prec > 0); fr->bStep = TRUE; fr->bTime = TRUE; fr->bX = TRUE; fr->bBox = TRUE; printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; case efPDB: pdb_first_x(*status, gmx_fio_getfp(fio), fr); if (fr->natoms) { printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; case efGRO: if (gro_first_x_or_v(gmx_fio_getfp(fio), fr)) { printcount(*status, oenv, fr->time, FALSE); } bFirst = FALSE; break; default: #ifdef GMX_USE_PLUGINS fprintf(stderr, "The file format of %s is not a known trajectory format to GROMACS.\n" "Please make sure that the file is a trajectory!\n" "GROMACS will now assume it to be a trajectory and will try to open it using the VMD plug-ins.\n" "This will only work in case the VMD plugins are found and it is a trajectory format supported by VMD.\n", fn); gmx_fio_fp_close(fio); /*only close the file without removing FIO entry*/ if (!read_first_vmd_frame(fn, fr)) { gmx_fatal(FARGS, "Not supported in read_first_frame: %s", fn); } #else gmx_fatal(FARGS, "Not supported in read_first_frame: %s. Please make sure that the file is a trajectory.\n" "GROMACS is not compiled with plug-in support. Thus it cannot read non-GROMACS trajectory formats using the VMD plug-ins.\n" "Please compile with plug-in support if you want to read non-GROMACS trajectory formats.\n", fn); #endif break; } /* Return FALSE if we read a frame that's past the set ending time. */ if (!bFirst && (!(fr->flags & TRX_DONT_SKIP) && check_times(fr->time) > 0)) { fr->t0 = fr->time; return FALSE; } if (bFirst || (!(fr->flags & TRX_DONT_SKIP) && check_times(fr->time) < 0)) { /* Read a frame when no frame was read or the first was skipped */ if (!read_next_frame(oenv, *status, fr)) { return FALSE; } } fr->t0 = fr->time; return (fr->natoms > 0); }
int read_first_frame(const output_env_t oenv,t_trxstatus **status, const char *fn,t_trxframe *fr,int flags) { t_fileio *fio; gmx_bool bFirst,bOK; int dummy=0; clear_trxframe(fr,TRUE); fr->flags = flags; bFirst = TRUE; snew((*status), 1); status_init( *status ); (*status)->nxframe=1; initcount(*status); fio = (*status)->fio =gmx_fio_open(fn,"r"); switch (gmx_fio_getftp(fio)) { case efTRJ: case efTRR: break; case efCPT: read_checkpoint_trxframe(fio,fr); bFirst = FALSE; break; case efG96: /* Can not rewind a compressed file, so open it twice */ read_g96_conf(gmx_fio_getfp(fio),fn,fr); gmx_fio_close(fio); clear_trxframe(fr,FALSE); if (flags & (TRX_READ_X | TRX_NEED_X)) snew(fr->x,fr->natoms); if (flags & (TRX_READ_V | TRX_NEED_V)) snew(fr->v,fr->natoms); fio = (*status)->fio =gmx_fio_open(fn,"r"); break; case efG87: fr->natoms=xyz_first_x(*status, gmx_fio_getfp(fio),oenv,&fr->time, &fr->x,fr->box); if (fr->natoms) { fr->bTime = TRUE; fr->bX = TRUE; fr->bBox = TRUE; printcount(*status,oenv,fr->time,FALSE); } bFirst = FALSE; break; case efXTC: if (read_first_xtc(fio,&fr->natoms,&fr->step,&fr->time,fr->box,&fr->x, &fr->prec,&bOK) == 0) { if (bOK) { gmx_fatal(FARGS,"No XTC!\n"); } else { fr->not_ok = DATA_NOT_OK; } } if (fr->not_ok) { fr->natoms = 0; printincomp(*status,fr); } else { fr->bPrec = (fr->prec > 0); fr->bStep = TRUE; fr->bTime = TRUE; fr->bX = TRUE; fr->bBox = TRUE; printcount(*status,oenv,fr->time,FALSE); } bFirst = FALSE; break; case efPDB: pdb_first_x(*status, gmx_fio_getfp(fio),fr); if (fr->natoms) printcount(*status,oenv,fr->time,FALSE); bFirst = FALSE; break; case efGRO: if (gro_first_x_or_v(gmx_fio_getfp(fio),fr)) printcount(*status,oenv,fr->time,FALSE); bFirst = FALSE; break; default: #ifdef GMX_DLOPEN gmx_fio_fp_close(fio); /*only close the file without removing FIO entry*/ if (!read_first_vmd_frame(&dummy,fn,fr,flags)) { gmx_fatal(FARGS,"Not supported in read_first_frame: %s",fn); } #else gmx_fatal(FARGS,"Not supported in read_first_frame: %s",fn); #endif break; } /* Return FALSE if we read a frame that's past the set ending time. */ if (!bFirst && (!(fr->flags & TRX_DONT_SKIP) && check_times(fr->time) > 0)) { fr->t0 = fr->time; return FALSE; } if (bFirst || (!(fr->flags & TRX_DONT_SKIP) && check_times(fr->time) < 0)) /* Read a frame when no frame was read or the first was skipped */ if (!read_next_frame(oenv,*status,fr)) return FALSE; fr->t0 = fr->time; return (fr->natoms > 0); }
void read_stx_conf(const char *infile, char *title, t_atoms *atoms, rvec x[], rvec *v, int *ePBC, matrix box) { FILE *in; char buf[256]; gmx_mtop_t *mtop; t_topology top; t_trxframe fr; int i, ftp, natoms; real d; char g96_line[STRLEN+1]; if (atoms->nr == 0) { fprintf(stderr, "Warning: Number of atoms in %s is 0\n", infile); } else if (atoms->atom == NULL) { gmx_mem("Uninitialized array atom"); } if (ePBC) { *ePBC = -1; } ftp = fn2ftp(infile); switch (ftp) { case efGRO: read_whole_conf(infile, title, atoms, x, v, box); break; case efG96: fr.title = NULL; fr.natoms = atoms->nr; fr.atoms = atoms; fr.x = x; fr.v = v; fr.f = NULL; in = gmx_fio_fopen(infile, "r"); read_g96_conf(in, infile, &fr, g96_line); gmx_fio_fclose(in); copy_mat(fr.box, box); strncpy(title, fr.title, STRLEN); break; case efPDB: case efBRK: case efENT: read_pdb_conf(infile, title, atoms, x, ePBC, box, TRUE, NULL); break; case efESP: read_espresso_conf(infile, atoms, x, v, box); break; case efTPR: case efTPB: case efTPA: snew(mtop, 1); i = read_tpx(infile, NULL, box, &natoms, x, v, NULL, mtop); if (ePBC) { *ePBC = i; } strcpy(title, *(mtop->name)); /* Free possibly allocated memory */ done_atom(atoms); *atoms = gmx_mtop_global_atoms(mtop); top = gmx_mtop_t_to_t_topology(mtop); tpx_make_chain_identifiers(atoms, &top.mols); sfree(mtop); /* The strings in the symtab are still in use in the returned t_atoms * structure, so we should not free them. But there is no place to put the * symbols; the only choice is to leak the memory... * So we clear the symbol table before freeing the topology structure. */ free_symtab(&top.symtab); done_top(&top); break; default: gmx_incons("Not supported in read_stx_conf"); } }
void read_stx_conf(char *infile, char *title,t_atoms *atoms, rvec x[],rvec *v,int *ePBC,matrix box) { FILE *in; char buf[256]; gmx_mtop_t *mtop; t_topology top; t_trxframe fr; int i,ftp,natoms,i1; real d,r1,r2; if (atoms->nr == 0) fprintf(stderr,"Warning: Number of atoms in %s is 0\n",infile); else if (atoms->atom == NULL) gmx_mem("Uninitialized array atom"); if (ePBC) *ePBC = -1; ftp=fn2ftp(infile); switch (ftp) { case efGRO: read_whole_conf(infile, title, atoms, x, v, box); break; case efG96: fr.title = title; fr.natoms = atoms->nr; fr.atoms = atoms; fr.x = x; fr.v = v; fr.f = NULL; in = gmx_fio_fopen(infile,"r"); read_g96_conf(in, infile, &fr); gmx_fio_fclose(in); copy_mat(fr.box,box); break; case efPDB: case efBRK: case efENT: read_pdb_conf(infile, title, atoms, x, ePBC, box, TRUE, NULL); break; case efESP: read_espresso_conf(infile,atoms,x,v,box); break; case efTPR: case efTPB: case efTPA: snew(mtop,1); i = read_tpx(infile,&i1,&r1,&r2,NULL,box,&natoms,x,v,NULL,mtop); if (ePBC) *ePBC = i; strcpy(title,*(mtop->name)); /* Free possibly allocated memory */ done_atom(atoms); *atoms = gmx_mtop_global_atoms(mtop); top = gmx_mtop_t_to_t_topology(mtop); tpx_make_chain_identifiers(atoms,&top.mols); sfree(mtop); done_top(&top); break; default: gmx_incons("Not supported in read_stx_conf"); } }