diff --git a/src/EnsembleOut_Multi.cpp b/src/EnsembleOut_Multi.cpp index a460cbb761..b6390c9336 100644 --- a/src/EnsembleOut_Multi.cpp +++ b/src/EnsembleOut_Multi.cpp @@ -121,12 +121,15 @@ int EnsembleOut_Multi::InitEnsembleWrite(std::string const& tnameIn, void EnsembleOut_Multi::EndEnsemble() { //if (TrajIsOpen()) { for (IOarrayType::const_iterator tio = ioarray_.begin(); tio != ioarray_.end(); ++tio) + { # ifdef MPI if (trajComm_.Size() > 1) (*tio)->parallelCloseTraj(); else # endif (*tio)->closeTraj(); + (*tio)->PrintWarnings( fileNames_[tio-ioarray_.begin()] ); + } // SetTrajIsOpen( false ); //} } diff --git a/src/EnsembleOut_Single.cpp b/src/EnsembleOut_Single.cpp index b031bd2f74..c0cd306999 100644 --- a/src/EnsembleOut_Single.cpp +++ b/src/EnsembleOut_Single.cpp @@ -25,6 +25,7 @@ int EnsembleOut_Single::InitEnsembleWrite(std::string const& tnameIn, mprinterr("Internal Error: InitTrajWrite: No filename given.\n"); return 1; } + fname_ = tnameIn; // Require that ensemble size is set. ensembleSize_ = ensembleSizeIn; if (ensembleSize_ < 1) { @@ -74,7 +75,10 @@ int EnsembleOut_Single::InitEnsembleWrite(std::string const& tnameIn, // EnsembleOut_Single::EndEnsemble() void EnsembleOut_Single::EndEnsemble() { //if (TrajIsOpen()) { - if (eio_ != 0) eio_->closeTraj(); // Handle no init case + if (eio_ != 0) { + eio_->closeTraj(); // Handle no init case + eio_->PrintWarnings(fname_); + } // SetTrajIsOpen(false); //} } diff --git a/src/EnsembleOut_Single.h b/src/EnsembleOut_Single.h index 90be4146e3..c4a35ef101 100644 --- a/src/EnsembleOut_Single.h +++ b/src/EnsembleOut_Single.h @@ -19,6 +19,7 @@ class EnsembleOut_Single : public EnsembleOut { private: TrajectoryIO* eio_; // TODO Make EnsembleIO int ensembleSize_; + std::string fname_; }; #endif #endif diff --git a/src/Traj_AmberCoord.cpp b/src/Traj_AmberCoord.cpp index c780d46d9f..2fa5e3c860 100644 --- a/src/Traj_AmberCoord.cpp +++ b/src/Traj_AmberCoord.cpp @@ -168,7 +168,7 @@ int Traj_AmberCoord::writeFrame(int set, Frame const& frameOut) { if (numBoxCoords_ != 0) { if (!frameOut.BoxCrd().Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as Amber ASCII trajectory.\n", set+1); + incrementXalignWarnCount(set, "Amber ASCII trajectory"); file_.DoubleToBuffer(frameOut.BoxCrd().XyzPtr(), numBoxCoords_, outfmt_); } diff --git a/src/Traj_AmberNetcdf.cpp b/src/Traj_AmberNetcdf.cpp index 5716939f61..41466afda8 100644 --- a/src/Traj_AmberNetcdf.cpp +++ b/src/Traj_AmberNetcdf.cpp @@ -447,7 +447,7 @@ int Traj_AmberNetcdf::writeFrame(int set, Frame const& frameOut) { // Write box if (cellLengthVID_ != -1) { if (!frameOut.BoxCrd().Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as Amber NetCDF trajectory.\n", set+1); + incrementXalignWarnCount(set, "Amber NetCDF trajectory"); count_[1] = 3; count_[2] = 0; if (NC::CheckErr(nc_put_vara_double(ncid_, cellLengthVID_, start_, count_, diff --git a/src/Traj_AmberRestart.cpp b/src/Traj_AmberRestart.cpp index febe546f11..e4660b2712 100644 --- a/src/Traj_AmberRestart.cpp +++ b/src/Traj_AmberRestart.cpp @@ -344,7 +344,7 @@ int Traj_AmberRestart::writeFrame(int set, Frame const& frameOut) { // Write box to buffer if (numBoxCoords_!=0) { if (!frameOut.BoxCrd().Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as Amber ASCII restart.\n", set+1); + incrementXalignWarnCount(set, "Amber ASCII restart"); file_.DoubleToBuffer(frameOut.BoxCrd().XyzPtr(), numBoxCoords_, "%12.7f"); } diff --git a/src/Traj_AmberRestartNC.cpp b/src/Traj_AmberRestartNC.cpp index 02c7a8fe8e..71cb719606 100644 --- a/src/Traj_AmberRestartNC.cpp +++ b/src/Traj_AmberRestartNC.cpp @@ -294,7 +294,7 @@ int Traj_AmberRestartNC::writeFrame(int set, Frame const& frameOut) { // write box if (cellLengthVID_ != -1) { if (!frameOut.BoxCrd().Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as Amber NetCDF restart.\n", set+1); + incrementXalignWarnCount(set, "Amber NetCDF restart"); count_[0] = 3; count_[1] = 0; if (NC::CheckErr(nc_put_vara_double(ncid_,cellLengthVID_,start_,count_,frameOut.BoxCrd().XyzPtr()))) diff --git a/src/Traj_CharmmDcd.cpp b/src/Traj_CharmmDcd.cpp index 2607f7a0fd..bcb3fb0f49 100644 --- a/src/Traj_CharmmDcd.cpp +++ b/src/Traj_CharmmDcd.cpp @@ -375,8 +375,7 @@ int Traj_CharmmDcd::readDcdHeader() { if (charmmCellType_ != UNKNOWN) { // Box info type was specified by option. if (buffer.i[19] >= 22 && charmmCellType_ != SHAPE) - mprintf("Warning: CHARMM version is >= 22 but 'shape' not specified.\n" - "Warning: Assuming box info is stored as unit cell and not shape matrix.\n"); + mprintf("Warning: CHARMM version is >= 22 but an option other than 'shape' was specified.\n"); } } else boxBytes_ = 0; @@ -470,6 +469,7 @@ int Traj_CharmmDcd::setupBox(double* boxtmp) { file_.Read(boxtmp, sizeof(double)*6); if (isBigEndian_) endian_swap8(boxtmp,6); if ( ReadBlock(-1) < 0) return 1; + if (debug_ > 0) mprintf("DEBUG: Raw box values: %g %g %g %g %g %g\n", boxtmp[0], boxtmp[1], boxtmp[2], boxtmp[3], boxtmp[4], boxtmp[5]); // Test shape matrix if (charmmCellType_ == UNKNOWN || charmmCellType_ == SHAPE) { int nIssues = 0; @@ -478,6 +478,31 @@ int Traj_CharmmDcd::setupBox(double* boxtmp) { for (int i = 0; i < 6; i++) shape[i] = 0; Box::CheckType check; testBox.SetupFromShapeMatrix( boxtmp, check ); + // NAMD stores a pseudo-shape matrix that fails for non-orthogonal cells. + // Check if a non-orthogonal cell has angles close to but not quite 90 deg. + Box::CellShapeType boxShape = testBox.CellShape(); + if (boxShape != Box::CUBIC && boxShape != Box::TETRAGONAL && boxShape != Box::ORTHORHOMBIC) { + if (debug_ > 0) testBox.PrintDebug("DCD Shape Matrix Check"); // DEBUG + double deltaA = fabs( 90.0 - testBox.Param(Box::ALPHA) ); + double deltaB = fabs( 90.0 - testBox.Param(Box::BETA) ); + double deltaG = fabs( 90.0 - testBox.Param(Box::GAMMA) ); + if ( deltaA > Constants::SMALL && deltaA < 1.0 && + deltaB > Constants::SMALL && deltaB < 1.0 && + deltaG > Constants::SMALL && deltaG < 1.0 ) + { + if (charmmCellType_ != UNKNOWN) { + mprintf("Warning: Cell is non-orthogonal but all angles from the symmetric shape\n" + "Warning: matrix are close to 90 deg (%g %g %g).\n", + testBox.Param(Box::ALPHA), testBox.Param(Box::BETA), testBox.Param(Box::GAMMA)); + mprintf("Warning: If this trajectory is from NAMD with a non-orthogonal cell\n" + "Warning: the 'namdcell' option must be used since NAMD does not store\n" + "Warning: the actual symmetric shape matrix.\n"); + } else { + // User has not specified box; this is likely a NAMD DCD with non-orthogonal cell + check = Box::BOX_IS_SKEWED; + } + } + } if (check != Box::BOX_OK) { nIssues = 1; } else { @@ -513,6 +538,14 @@ int Traj_CharmmDcd::setupBox(double* boxtmp) { } // Test NAMD unit cell if (charmmCellType_ == UNKNOWN || charmmCellType_ == NAMD) { + //mprintf("DEBUG: NAMD unit cell test, celltype %i\n", (int)charmmCellType_); + // Expect that values are stored as X, gamma, Y, beta, alpha, Z + // 0 1 2 3 4 5 + // Will need to resort them as expected by Box (X Y Z alpha beta gamma) + double newbox[6]; + newbox[0] = boxtmp[0]; + newbox[1] = boxtmp[2]; + newbox[2] = boxtmp[5]; // Since NAMD stores the box angles as cos(angle), determine if the angle values are bounded between -1 and 1. if ( boxtmp[4] >= -1 && boxtmp[4] <= 1 && boxtmp[3] >= -1 && boxtmp[3] <= 1 && @@ -521,9 +554,23 @@ int Traj_CharmmDcd::setupBox(double* boxtmp) { if (charmmCellType_ == UNKNOWN) mprintf("\tNAMD unit cell detected.\n"); charmmCellType_ = NAMD; + // Convert the angles back to degrees + newbox[3] = CosRadToDeg( boxtmp[4] ); + newbox[4] = CosRadToDeg( boxtmp[3] ); + newbox[5] = CosRadToDeg( boxtmp[1] ); + if (debug_ > 0) mprintf("DEBUG: angles in degrees: %g %g %g\n", newbox[3], newbox[4], newbox[5]); } else if (charmmCellType_ == NAMD) { mprintf("Warning: NAMD unit cell specified but cos(angle) values not bounded by -1, 1\n", "Warning: Values: %g %g %g\n", boxtmp[4], boxtmp[3], boxtmp[1]); + // Assume the angles are already in degrees + newbox[3] = boxtmp[4]; + newbox[4] = boxtmp[3]; + newbox[5] = boxtmp[1]; + } + if (charmmCellType_ == NAMD) { + // Set with re-ordered (and possibly converted) values + for (int i = 0; i < 6; i++) + boxtmp[i] = newbox[i]; } } // Test CHARMM unit cell @@ -539,7 +586,7 @@ int Traj_CharmmDcd::setupBox(double* boxtmp) { charmmCellType_ = CHARMM; } else if (charmmCellType_ == CHARMM) { mprintf("Warning: CHARMM unit cell specified but bad box values detected.\n" - "Warning: Box values : %g %g %g %g %g %g\n", + "Warning: Box values (XYZ, ABG) : %g %g %g Ang., %g %g %g deg.\n", boxtmp[0], boxtmp[1], boxtmp[2], boxtmp[3], boxtmp[4], boxtmp[5]); } } @@ -565,6 +612,7 @@ int Traj_CharmmDcd::ReadBox(double* boxtmp) { if (isBigEndian_) endian_swap8(boxtmp,6); if ( ReadBlock(-1) < 0) return 1; if (charmmCellType_ == NAMD) { + // Expect that values are stored as X, gamma, Y, beta, alpha, Z // Box lengths double box[6]; box[0] = boxtmp[0]; @@ -870,7 +918,7 @@ int Traj_CharmmDcd::writeFrame(int set, Frame const& frameOut) { double boxtmp[6]; if (charmmCellType_ == SHAPE) { if (!frameOut.BoxCrd().Is_Symmetric()) - mprintf("Warning: Set %i; unit cell is not symmetric. Box cannot be properly stored as Charmm DCD.\n", set+1); + incrementSymmetricWarnCount(set, "Charmm DCD"); //frameOut.BoxCrd().GetSymmetricShapeMatrix( boxtmp ); Matrix_3x3 const& ucell = frameOut.BoxCrd().UnitCell(); boxtmp[0] = ucell[0]; // XX @@ -881,7 +929,7 @@ int Traj_CharmmDcd::writeFrame(int set, Frame const& frameOut) { boxtmp[5] = ucell[8]; // ZZ } else { if (!frameOut.BoxCrd().Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as Charmm DCD.\n", set+1); + incrementXalignWarnCount(set, "Charmm DCD"); if (charmmCellType_ == NAMD) { /* The format for the 'box' array used in cpptraj is not the same as the * one used for NAMD dcd files. Refer to the reading routine above diff --git a/src/Traj_NcEnsemble.cpp b/src/Traj_NcEnsemble.cpp index cd35c30ad9..07aaeedaf3 100644 --- a/src/Traj_NcEnsemble.cpp +++ b/src/Traj_NcEnsemble.cpp @@ -388,7 +388,7 @@ int Traj_NcEnsemble::writeArray(int set, FramePtrArray const& Farray) { // Write box if (cellLengthVID_ != -1) { if (!frm->BoxCrd().Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as Amber NetCDF ensemble.\n", set+1); + incrementXalignWarnCount(set,"Amber NetCDF ensemble"); count_[2] = 3; # ifdef HAS_PNETCDF if (ncmpi_put_vara_double_all(ncid_,cellLengthVID_,start_,count_,frm->BoxCrd().XyzPtr())) diff --git a/src/Traj_PDBfile.cpp b/src/Traj_PDBfile.cpp index 7c5092e016..4ca55da02f 100644 --- a/src/Traj_PDBfile.cpp +++ b/src/Traj_PDBfile.cpp @@ -837,7 +837,7 @@ void Traj_PDBfile::WriteBonds() { void Traj_PDBfile::writeBox(int set, Box const& box) { if (write_cryst1_) { if (!box.Is_X_Aligned()) - mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored in PDB CRYST1.\n", set+1); + incrementXalignWarnCount(set, "PDB CRYST1"); file_.WriteCRYST1( box.XyzPtr(), space_group_.c_str() ); } } diff --git a/src/TrajectoryIO.cpp b/src/TrajectoryIO.cpp index 866452ca53..beec301a54 100644 --- a/src/TrajectoryIO.cpp +++ b/src/TrajectoryIO.cpp @@ -1,4 +1,49 @@ #include "TrajectoryIO.h" +#include "CpptrajStdio.h" + +/** CONSTRUCTOR */ +TrajectoryIO::TrajectoryIO() : + debug_(0), + nwarn_cell_not_xaligned_(0), + nwarn_cell_not_symmetric_(0) +{} + +/** Increment count of frames where it is an issue that the + * unit cell is not X-aligned. Print a warning only the + * first time. + */ +void TrajectoryIO::incrementXalignWarnCount(int set, const char* desc) { + if (nwarn_cell_not_xaligned_ == 0 || debug_ > 0) + mprintf("Warning: Set %i; unit cell is not X-aligned. Box cannot be properly stored as %s.\n", set+1, desc); + nwarn_cell_not_xaligned_++; +} + +/** Increment count of frames where it is an issue that the + * unit cell is not symmetric. Print a warning only the + * first time. + */ +void TrajectoryIO::incrementSymmetricWarnCount(int set, const char* desc) { + if (nwarn_cell_not_symmetric_ == 0 || debug_ > 0) + mprintf("Warning: Set %i; unit cell is not symmetric. Box cannot be properly stored as %s.\n", set+1, desc); + nwarn_cell_not_symmetric_++; +} + +/** Print any warnings. Ideally called just before or just after closeTraj() */ +void TrajectoryIO::PrintWarnings(std::string const& fname) { + if (nwarn_cell_not_xaligned_ > 0) { + mprintf("Warning: %s: unit cell was not X-aligned for %u frames.\n", fname.c_str(), nwarn_cell_not_xaligned_); + mprintf("Warning: This trajectory format expects unit cells to be X-aligned,\n" + "Warning: so the unit cell orientation may not be correct.\n"); + } + if (nwarn_cell_not_symmetric_ > 0) { + mprintf("Warning: %s: unit cell axes were not symmetric for %u frames.\n", fname.c_str(), nwarn_cell_not_symmetric_); + mprintf("Warning: This trajectory format expects unit cell info to be symmetric,\n" + "Warning: so the unit cell orientation may not be correct.\n"); + } + nwarn_cell_not_xaligned_ = 0; + nwarn_cell_not_symmetric_ = 0; +} + #ifdef MPI /** Broadcast trajectory IO info from master. */ int TrajectoryIO::BroadcastTrajIO(Parallel::Comm const& commIn) { diff --git a/src/TrajectoryIO.h b/src/TrajectoryIO.h index 03d337fe5b..ce3c0fc060 100644 --- a/src/TrajectoryIO.h +++ b/src/TrajectoryIO.h @@ -26,8 +26,10 @@ class FrameArray; */ class TrajectoryIO : public BaseIOtype { public: - TrajectoryIO() : debug_(0) {} - virtual ~TrajectoryIO() {} // virtual since this class is inherited. + /// CONSTRUCTOR + TrajectoryIO(); + /// DESTRUCTOR - virtual since this class is inherited. + virtual ~TrajectoryIO() {} // -----------===== Inherited functions =====----------- /// \return true if file format matches trajectory type. virtual bool ID_TrajFormat(CpptrajFile&) = 0; @@ -105,6 +107,9 @@ class TrajectoryIO : public BaseIOtype { virtual void parallelCloseTraj() { return ; } # endif // ----------------------------------------------------- + /// Print any warnings. Resets warning counts. + void PrintWarnings(std::string const&); + CoordinateInfo const& CoordInfo() const { return coordInfo_; } std::string const& Title() const { return title_; } @@ -112,6 +117,11 @@ class TrajectoryIO : public BaseIOtype { void SetTitle(std::string const& tIn) { title_ = tIn; } protected: void SetCoordInfo(CoordinateInfo const& cIn) { coordInfo_ = cIn; } + /// Increment X-align warn count + void incrementXalignWarnCount(int, const char*); + /// Increment symmetric warn count + void incrementSymmetricWarnCount(int, const char*); + int debug_; ///< Trajectory debug level. # ifdef MPI /// Broadcast coordinate info etc. to non-master processes @@ -120,5 +130,7 @@ class TrajectoryIO : public BaseIOtype { private: CoordinateInfo coordInfo_; ///< Metadata associated with coordinate Frame std::string title_; ///< Set to trajectory title. + unsigned int nwarn_cell_not_xaligned_; ///< Count of frames where unit cell is not X-aligned + unsigned int nwarn_cell_not_symmetric_; ///< Count of frames where unit cell is not symmetric }; #endif diff --git a/src/Trajout_Single.cpp b/src/Trajout_Single.cpp index d845a9ff9f..f796975c08 100644 --- a/src/Trajout_Single.cpp +++ b/src/Trajout_Single.cpp @@ -103,6 +103,7 @@ void Trajout_Single::EndTraj() { else # endif trajio_->closeTraj(); + trajio_->PrintWarnings(traj_.Filename().Base()); } // SetTrajIsOpen(false); //} diff --git a/src/Version.h b/src/Version.h index ecf451fc42..504555216d 100644 --- a/src/Version.h +++ b/src/Version.h @@ -12,7 +12,7 @@ * Whenever a number that precedes is incremented, all subsequent * numbers should be reset to 0. */ -#define CPPTRAJ_INTERNAL_VERSION "V6.25.3" +#define CPPTRAJ_INTERNAL_VERSION "V6.26.0" /// PYTRAJ relies on this #define CPPTRAJ_VERSION_STRING CPPTRAJ_INTERNAL_VERSION #endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 3b4437d1a7..c7a8ebf68d 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -495,7 +495,7 @@ Traj_SQM.o : Traj_SQM.cpp ArgList.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Bo Traj_Tinker.o : Traj_Tinker.cpp Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h Frame.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TinkerFile.h Topology.h Traj_Tinker.h TrajectoryIO.h TypeNameHolder.h Unit.h Vec3.h Traj_XYZ.o : Traj_XYZ.cpp ArgList.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h Frame.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Segment.h StringRoutines.h SymbolExporting.h TextFormat.h Topology.h Traj_XYZ.h TrajectoryIO.h TypeNameHolder.h Unit.h Vec3.h TrajectoryFile.o : TrajectoryFile.cpp Atom.h BaseIOtype.h Box.h BufferedFrame.h BufferedLine.h CIFfile.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h FramePtrArray.h Matrix_3x3.h Mol2File.h NC_Routines.h NameType.h NetcdfFile.h PDBfile.h Parallel.h ReplicaDimArray.h Residue.h SDFfile.h SymbolExporting.h TextFormat.h TinkerFile.h Traj_AmberCoord.h Traj_AmberNetcdf.h Traj_AmberRestart.h Traj_AmberRestartNC.h Traj_Binpos.h Traj_CIF.h Traj_CharmmCor.h Traj_CharmmDcd.h Traj_CharmmRestart.h Traj_Conflib.h Traj_DTR.h Traj_GmxDump.h Traj_GmxTng.h Traj_GmxTrX.h Traj_GmxXtc.h Traj_Gro.h Traj_H5.h Traj_H5MD.h Traj_Mol2File.h Traj_NcEnsemble.h Traj_PDBfile.h Traj_SDF.h Traj_SQM.h Traj_Tinker.h Traj_XYZ.h TrajectoryFile.h TrajectoryIO.h Vec3.h -TrajectoryIO.o : TrajectoryIO.cpp BaseIOtype.h Box.h CoordinateInfo.h FramePtrArray.h Matrix_3x3.h Parallel.h ReplicaDimArray.h TrajectoryIO.h Vec3.h +TrajectoryIO.o : TrajectoryIO.cpp BaseIOtype.h Box.h CoordinateInfo.h CpptrajStdio.h FramePtrArray.h Matrix_3x3.h Parallel.h ReplicaDimArray.h TrajectoryIO.h Vec3.h TrajinList.o : TrajinList.cpp ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_RemLog.h Dimension.h EnsembleIn.h EnsembleIn_Multi.h EnsembleIn_Single.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajIOarray.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h Trajin_Multi.h Trajin_Single.h TypeNameHolder.h Unit.h Vec3.h Trajin_Multi.o : Trajin_Multi.cpp ArgList.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h StringRoutines.h SymbolExporting.h Topology.h TrajFrameCounter.h TrajIOarray.h TrajectoryIO.h Trajin.h Trajin_Multi.h TypeNameHolder.h Unit.h Vec3.h Trajin_Single.o : Trajin_Single.cpp ArgList.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajStdio.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h Trajin_Single.h TypeNameHolder.h Unit.h Vec3.h