int Parm_CharmmPsf::FindTag(char* tag, const char* target, int tgtsize, CpptrajFile& infile) { int nval = 0; while (strncmp(tag,target,tgtsize)!=0) { const char* buffer = infile.NextLine(); if ( buffer == 0 ) return 0; sscanf(buffer,"%i %10s",&nval,tag); } return nval; }
bool Traj_CharmmCor::ID_TrajFormat(CpptrajFile& fileIn) { // File must already be set up for read. if (fileIn.OpenFile()) return false; bool isCor = false; const char* ptr = fileIn.NextLine(); // Must be at least 1 title line denoted with '*' if (ptr != 0 && *ptr == '*') { // Scan past all title lines while (ptr != 0 && *ptr == '*') ptr = fileIn.NextLine(); if (ptr != 0) { // Next line must be # atoms ONLY int ibuf[2]; if (sscanf(ptr, "%i %i", ibuf, ibuf+1) == 1) // make sure it was a valid integer isCor = (ibuf[0] > 0); } } fileIn.CloseFile(); return isCor; }
bool DataIO_XVG::ID_DataFormat(CpptrajFile& infile) { if (infile.OpenFile()) return false; const char* ptr = infile.NextLine(); while (ptr != 0 && ptr[0] == '#') { const char* cc = ptr; while (*cc != '\0') { if (*cc == 'G') { if ( cc[2] == 'R' && cc[4] == 'O' && cc[6] == 'M' && cc[8] == 'A' && cc[10] == 'A' && cc[12] == 'C' ) { infile.CloseFile(); mprintf("DEBUG:\tFound G R O M A C\n"); return true; } } ++cc; } ptr = infile.NextLine(); } infile.CloseFile(); return false; }
bool TinkerFile::ID_Tinker(CpptrajFile& fileIn) { // NOTE: ASSUME FILE SET UP FOR READ if (fileIn.OpenFile()) return false; ArgList firstLine( fileIn.NextLine() ); ArgList secondLine( fileIn.NextLine() ); ArgList thirdLine( fileIn.NextLine() ); fileIn.CloseFile(); // First line should have <natom> <title> only int natom = 0; std::string title; if ( SetNatomAndTitle(firstLine, natom, title) != 0 ) return false; //mprinterr("Past SetNatomAndTitle\n"); if (secondLine.Nargs() == 6) { bool isBoxLine = true; for (int i = 0; i < 6; i++) { // It is a box line if all 6 tokens are doubles try { convertToDouble( secondLine.GetStringNext() ); } catch (std::runtime_error e) { if (i != 1) return false; // We found a non-double on the second character -- it could be an atom // name. Check that the rest of the line matches an atom record isBoxLine = false; break; } } // If we are here it is not a box line, so make sure if (!isBoxLine) { return IsAtomLine(secondLine); } else { // our second line WAS a box, now check the 3rd line return IsAtomLine(thirdLine); } } // There is no box, check that the second line is an atom line return IsAtomLine(secondLine); }
/** Check for an integer (I5) followed by 0-2 scientific floats (E15.7) */ bool Traj_AmberRestart::ID_TrajFormat(CpptrajFile& fileIn) { // Assume file set up for read if (fileIn.OpenFile()) return false; bool isRestart = false; if ( fileIn.NextLine() !=0 ) { // Title const char* ptr = fileIn.NextLine(); // Natom [time [temp]] if (ptr != 0) { int i0; double D[3]; int nread = sscanf(ptr, "%5i%15lf%15lf%lf", &i0, D, D+1, D+2); if (nread > 0 && nread < 4) { // Read at least 3 12.7 coordinates from next line. ptr = fileIn.NextLine(); if (ptr != 0) { nread = sscanf(ptr, "%12lf%12lf%12lf", D, D+1, D+2); if (nread == 3) isRestart = true; } } } } fileIn.CloseFile(); return isRestart; }
bool SDFfile::ID_SDF(CpptrajFile& fileIn) { // NOTE: ASSUMES FILE IS ALREADY SETUP! if (fileIn.OpenFile()) return false; // Search for V2000 somewhere in line 4 const char* ptr = 0; for (int i = 0; i < 4; i++) if ( (ptr = fileIn.NextLine()) == 0 ) { fileIn.CloseFile(); return false; } fileIn.CloseFile(); std::string line( ptr ); // Line 4, Connection table if ( line.find( "V2000" ) != std::string::npos ) return true; return false; }
bool Traj_Gro::ID_TrajFormat(CpptrajFile& infile) { // Title line, atoms line, then resnum, resname, atomname, atomnum, X, Y, Z if (infile.OpenFile()) return false; int nread = 0; if (infile.NextLine() != 0) { // Title const char* ptr = infile.NextLine(); // Natom if (ptr != 0) { // Ensure only a single value on # atoms line std::string natom_str( ptr ); RemoveTrailingWhitespace( natom_str ); if (validInteger(natom_str)) { ptr = infile.NextLine(); // First atom if (ptr != 0) { char resnum[6], resname[6], atname[6], atnum[6]; float XYZ[3]; nread = sscanf(ptr, "%5c%5c%5c%5c%f %f %f", resnum, resname, atname, atnum, XYZ, XYZ+1, XYZ+2); } } } } infile.CloseFile(); return (nread == 7); }
// Traj_AmberCoord::ID_TrajFormat() bool Traj_AmberCoord::ID_TrajFormat(CpptrajFile& fileIn) { // File must already be set up for read if (fileIn.OpenFile()) return false; if (fileIn.NextLine()==0) return false; // Title std::string buffer2 = fileIn.GetLine(); // REMD header/coords fileIn.CloseFile(); // Check if second line contains REMD/HREMD, Amber Traj with REMD header if ( IsRemdHeader( buffer2.c_str() ) ) { if (debug_>0) mprintf(" AMBER TRAJECTORY with (H)REMD header.\n"); hasREMD_ = REMD_HEADER_SIZE + (size_t)fileIn.IsDos(); return true; } // Check if we can read at least 3 coords of width 8, Amber trajectory float TrajCoord[3]; if ( sscanf(buffer2.c_str(), "%8f%8f%8f", TrajCoord, TrajCoord+1, TrajCoord+2) == 3 ) { if (debug_>0) mprintf(" AMBER TRAJECTORY file\n"); return true; } return false; }
// Traj_AmberCoord::ID_TrajFormat() bool Traj_AmberCoord::ID_TrajFormat(CpptrajFile& fileIn) { // File must already be set up for read if (fileIn.OpenFile()) return false; if (fileIn.NextLine()==0) return false; // Title std::string buffer2 = fileIn.GetLine(); // REMD header/coords fileIn.CloseFile(); // Check if second line contains REMD/HREMD, Amber Traj with REMD header if ( IsRemdHeader( buffer2.c_str() ) ) { if (debug_>0) mprintf(" AMBER TRAJECTORY with (H)REMD header.\n"); headerSize_ = REMD_HEADER_SIZE + (size_t)fileIn.IsDos(); tStart_ = 33; // 42 - 8 - 1 tEnd_ = 41; // 42 - 1 return true; } // TODO: Read these in as indices instead of temperatures if ( IsRxsgldHeader( buffer2.c_str() ) ) { mprintf(" AMBER TRAJECTORY with RXSGLD header.\n"); headerSize_ = RXSGLD_HEADER_SIZE + (size_t)fileIn.IsDos(); tStart_ = 35; // 44 - 8 - 1 tEnd_ = 43; // 44 - 1 return true; } // Check if we can read 3, 6, 9, or 10 coords (corresponding to 1, 2, 3 or // > 3 atoms) of width 8; Amber trajectory. float TrajCoord[10]; int nscan = sscanf(buffer2.c_str(), "%8f%8f%8f%8f%8f%8f%8f%8f%8f%8f", TrajCoord, TrajCoord+1, TrajCoord+2, TrajCoord+3, TrajCoord+4, TrajCoord+5, TrajCoord+6, TrajCoord+7, TrajCoord+8, TrajCoord+9); if (nscan == 3 || nscan == 6 || nscan == 9 || nscan == 10) { if (debug_>0) mprintf(" AMBER TRAJECTORY file\n"); return true; } return false; }
/** Open the Charmm PSF file specified by filename and set up topology data. * Mask selection requires natom, nres, names, resnames, resnums. */ int Parm_CharmmPsf::ReadParm(FileName const& fname, Topology &parmOut) { const size_t TAGSIZE = 10; char tag[TAGSIZE]; tag[0]='\0'; CpptrajFile infile; if (infile.OpenRead(fname)) return 1; mprintf(" Reading Charmm PSF file %s as topology file.\n",infile.Filename().base()); // Read the first line, should contain PSF... const char* buffer = 0; if ( (buffer=infile.NextLine()) == 0 ) return 1; // Advance to <ntitle> !NTITLE int ntitle = FindTag(tag, "!NTITLE", 7, infile); // Only read in 1st title. Skip any asterisks. std::string psftitle; if (ntitle > 0) { buffer = infile.NextLine(); const char* ptr = buffer; while (*ptr != '\0' && (*ptr == ' ' || *ptr == '*')) ++ptr; psftitle.assign( ptr ); } parmOut.SetParmName( NoTrailingWhitespace(psftitle), infile.Filename() ); // Advance to <natom> !NATOM int natom = FindTag(tag, "!NATOM", 6, infile); if (debug_>0) mprintf("\tPSF: !NATOM tag found, natom=%i\n", natom); // If no atoms, probably issue with PSF file if (natom < 1) { mprinterr("Error: No atoms in PSF file.\n"); return 1; } // Read the next natom lines int psfresnum = 0; char psfresname[6]; char psfname[6]; char psftype[6]; double psfcharge; double psfmass; for (int atom=0; atom < natom; atom++) { if ( (buffer=infile.NextLine()) == 0 ) { mprinterr("Error: ReadParmPSF(): Reading atom %i\n",atom+1); return 1; } // Read line // ATOM# SEGID RES# RES ATNAME ATTYPE CHRG MASS (REST OF COLUMNS ARE LIKELY FOR CMAP AND CHEQ) sscanf(buffer,"%*i %*s %i %s %s %s %lf %lf",&psfresnum, psfresname, psfname, psftype, &psfcharge, &psfmass); parmOut.AddTopAtom( Atom( psfname, psfcharge, psfmass, psftype), Residue( psfresname, psfresnum, ' ', ' '), 0 ); } // END loop over atoms // Advance to <nbond> !NBOND int bondatoms[9]; int nbond = FindTag(tag, "!NBOND", 6, infile); if (nbond > 0) { if (debug_>0) mprintf("\tPSF: !NBOND tag found, nbond=%i\n", nbond); int nlines = nbond / 4; if ( (nbond % 4) != 0) nlines++; for (int bondline=0; bondline < nlines; bondline++) { if ( (buffer=infile.NextLine()) == 0 ) { mprinterr("Error: ReadParmPSF(): Reading bond line %i\n",bondline+1); return 1; } // Each line has 4 pairs of atom numbers int nbondsread = sscanf(buffer,"%i %i %i %i %i %i %i %i",bondatoms,bondatoms+1, bondatoms+2,bondatoms+3, bondatoms+4,bondatoms+5, bondatoms+6,bondatoms+7); // NOTE: Charmm atom nums start from 1 for (int bondidx=0; bondidx < nbondsread; bondidx+=2) parmOut.AddBond(bondatoms[bondidx]-1, bondatoms[bondidx+1]-1); } } else mprintf("Warning: PSF has no bonds.\n"); // Advance to <nangles> !NTHETA int nangle = FindTag(tag, "!NTHETA", 7, infile); if (nangle > 0) { if (debug_>0) mprintf("\tPSF: !NTHETA tag found, nangle=%i\n", nangle); int nlines = nangle / 3; if ( (nangle % 3) != 0) nlines++; for (int angleline=0; angleline < nlines; angleline++) { if ( (buffer=infile.NextLine()) == 0) { mprinterr("Error: Reading angle line %i\n", angleline+1); return 1; } // Each line has 3 groups of 3 atom numbers int nanglesread = sscanf(buffer,"%i %i %i %i %i %i %i %i %i",bondatoms,bondatoms+1, bondatoms+2,bondatoms+3, bondatoms+4,bondatoms+5, bondatoms+6,bondatoms+7, bondatoms+8); for (int angleidx=0; angleidx < nanglesread; angleidx += 3) parmOut.AddAngle( bondatoms[angleidx ]-1, bondatoms[angleidx+1]-1, bondatoms[angleidx+2]-1 ); } } else mprintf("Warning: PSF has no angles.\n"); // Advance to <ndihedrals> !NPHI int ndihedral = FindTag(tag, "!NPHI", 5, infile); if (ndihedral > 0) { if (debug_>0) mprintf("\tPSF: !NPHI tag found, ndihedral=%i\n", ndihedral); int nlines = ndihedral / 2; if ( (ndihedral % 2) != 0) nlines++; for (int dihline = 0; dihline < nlines; dihline++) { if ( (buffer=infile.NextLine()) == 0) { mprinterr("Error: Reading dihedral line %i\n", dihline+1); return 1; } // Each line has 2 groups of 4 atom numbers int ndihread = sscanf(buffer,"%i %i %i %i %i %i %i %i",bondatoms,bondatoms+1, bondatoms+2,bondatoms+3, bondatoms+4,bondatoms+5, bondatoms+6,bondatoms+7); for (int dihidx=0; dihidx < ndihread; dihidx += 4) parmOut.AddDihedral( bondatoms[dihidx ]-1, bondatoms[dihidx+1]-1, bondatoms[dihidx+2]-1, bondatoms[dihidx+3]-1 ); } } else mprintf("Warning: PSF has no dihedrals.\n"); mprintf("\tPSF contains %i atoms, %i residues.\n", parmOut.Natom(), parmOut.Nres()); infile.CloseFile(); return 0; }