diff --git a/modules/io/src/mol/dcd_io.cc b/modules/io/src/mol/dcd_io.cc index 29cbb7bd280b93437f00c072d5efba011846a19e..778e86ce41688edef0e13527696196b6a524b4c6 100644 --- a/modules/io/src/mol/dcd_io.cc +++ b/modules/io/src/mol/dcd_io.cc @@ -89,11 +89,10 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist2, if(gap_flag) ff.read(dummy,sizeof(dummy)); ff.read(header.hdrr,sizeof(char)*4); ff.read(reinterpret_cast<char*>(header.icntrl),sizeof(int)*20); - - if(header.icntrl[1]<0 || header.icntrl[1]>1e6) { + if(header.icntrl[1]<0 || header.icntrl[1]>1e8) { // nonsense atom count, try swapping swap_int(header.icntrl,20); - if(header.icntrl[1]<0 || header.icntrl[1]>1e6) { + if(header.icntrl[1]<0 || header.icntrl[1]>1e8) { throw(IOException("LoadCHARMMTraj: nonsense atom count in header")); } else { LOGN_MESSAGE("LoadCHARMMTraj: byte-swapping"); @@ -147,8 +146,17 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist2, std::vector<geom::Vec3> clist(header.t_atom_count); std::vector<float> xlist(header.t_atom_count); + size_t frame_size=0; + if (skip_flag) { + frame_size+=14*4; + } + if (gap_flag) { + frame_size+=6*sizeof(dummy); + } + frame_size+=3*sizeof(float)*xlist.size(); + int i=0; - for(;i<header.num;++i) { + for(;i<header.num;i+=stride) { if(skip_flag) ff.seekg(14*4,std::ios_base::cur); // read each frame if(!ff) { @@ -186,6 +194,8 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist2, cg.AddFrame(clist); + // skip frames (defined by stride) + if(stride>1) ff.seekg(frame_size*(stride-1),std::ios_base::cur); } ff.get();