static int pdb_first_x(t_trxstatus *status, FILE *fp, t_trxframe *fr) { initcount(status); fprintf(stderr,"Reading frames from pdb file"); frewind(fp); get_pdb_coordnum(fp, &fr->natoms); if (fr->natoms==0) gmx_fatal(FARGS,"\nNo coordinates in pdb file\n"); frewind(fp); snew(fr->x,fr->natoms); pdb_next_x(status, fp, fr); return fr->natoms; }
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; }