From c2c6029c2c7b05cfd4aa5a538a561e0146e61165 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Jan 2021 13:55:29 -0500 Subject: [PATCH 01/21] Add Non square matrix write test --- test/Test_ReadData/RunTest.sh | 21 ++++- test/Test_ReadData/matrix.dat.save | 144 +++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 test/Test_ReadData/matrix.dat.save diff --git a/test/Test_ReadData/RunTest.sh b/test/Test_ReadData/RunTest.sh index a69409d36d..7d713e1ffb 100755 --- a/test/Test_ReadData/RunTest.sh +++ b/test/Test_ReadData/RunTest.sh @@ -5,7 +5,7 @@ CleanFiles vector.in v6and7.dat rex-d.dat MD.ene.dat out.dx out.dat \ truncoct.dat out?.dx append.dx append.dat temp.dat \ truncsparse.dat temp2.dat truncoct.dat.save sparse.dat \ - xyz.dat v7and6.dat + xyz.dat v7and6.dat matrix.dat cpptraj.matrix.dat TESTNAME='Read data tests' @@ -134,6 +134,25 @@ EOF RunCpptraj "$UNITNAME" DoTest xyz.dat.save xyz.dat +# Non-square matrix write +UNITNAME='Write non-square matrix' +cat > vector.in < vector.in < Date: Thu, 28 Jan 2021 16:01:21 -0500 Subject: [PATCH 02/21] Start adding matrix read of XYZ type --- src/DataIO_Std.cpp | 122 ++++++++++++++++++++++++++++++++++++++++++++- src/DataIO_Std.h | 1 + 2 files changed, 122 insertions(+), 1 deletion(-) diff --git a/src/DataIO_Std.cpp b/src/DataIO_Std.cpp index 5236045c37..dbc69481b9 100644 --- a/src/DataIO_Std.cpp +++ b/src/DataIO_Std.cpp @@ -3,6 +3,7 @@ #include // strchr #include // isdigit, isalpha #include // std::max +#include // For reading in potentially sparse matrix #include // modf TODO put function in StringRoutines? #include "DataIO_Std.h" #include "CpptrajStdio.h" @@ -135,6 +136,12 @@ int DataIO_Std::processReadArgs(ArgList& argIn) { // Column user args start from 1 strCols_.ShiftBy(-1); } + // Options for 2d + if (mode_ == READ2D) { + square2d_ = true; + if (argIn.hasKey("nosquare2d")) + square2d_ = false; + } // Options for 3d if (mode_ == READ3D) { if (Get3Double(argIn.GetStringKey("origin"), origin_, originSpecified_)) return 1; @@ -188,7 +195,12 @@ int DataIO_Std::ReadData(FileName const& fname, if (err == IS_ASCII_CMATRIX) err = ReadCmatrix(fname, dsl, dsname); break; - case READ2D: err = Read_2D(fname.Full(), dsl, dsname); break; + case READ2D: + if (square2d_) + err = Read_2D(fname.Full(), dsl, dsname); + else + err = Read_2D_XYZ(fname, dsl, dsname); + break; case READ3D: err = Read_3D(fname.Full(), dsl, dsname); break; case READVEC: err = Read_Vector(fname.Full(), dsl, dsname); break; case READMAT3X3: err = Read_Mat3x3(fname.Full(), dsl, dsname); break; @@ -526,6 +538,114 @@ int DataIO_Std::Read_2D(std::string const& fname, return 0; } +// DataIO_Std::Read_2D_XYZ() +/* Read matrix of format */ +int DataIO_Std::Read_2D_XYZ(FileName const& fname, + DataSetList& datasetlist, std::string const& dsname) +{ + // Buffer file + BufferedLine buffer; + if (buffer.OpenFileRead( fname )) return 1; + mprintf("\tData will be read as a 2D XYZ matrix.\n"); + // Skip comments + const char* linebuffer = buffer.Line(); + while (linebuffer != 0 && linebuffer[0] == '#') + linebuffer = buffer.Line(); + // To allow for sparse matrix, read in indices and values first. Then + // put into a matrix. + int maxcol = -1; + int maxrow = -1; + typedef std::pair Ipair; + typedef std::map MatrixMap; + MatrixMap matrixMap; + + int err = 0; + while (linebuffer != 0) { + // Skip comments + if (linebuffer[0] != '#') { + int ntokens = buffer.TokenizeLine( SEPARATORS ); + if (ntokens < 3) { + mprintf("Warning: In 2D file, less than 3 columns at line %i, skipping.\n", buffer.LineNumber()); + } else { + int ix, iy; + double dval; + // X + std::string Str( buffer.NextToken() ); + if (validInteger( Str )) + ix = convertToInteger( Str ); + else if (validDouble( Str )) { + mprintf("Warning: Line %i X value %s is not an integer.\n", buffer.LineNumber(), Str.c_str()); + ix = (int)convertToDouble( Str ); + } else { + mprinterr("Error: Line %i X value %s does not appear to be a valid number.\n", buffer.LineNumber(), Str.c_str()); + err = 1; + break; + } + // Y + Str = std::string( buffer.NextToken() ); + if (validInteger( Str )) + iy = convertToInteger( Str ); + else if (validDouble( Str )) { + mprintf("Warning: Line %i Y value %s is not an integer.\n", buffer.LineNumber(), Str.c_str()); + iy = (int)convertToDouble( Str ); + } else { + mprinterr("Error: Line %i Y value %s does not appear to be a valid number.\n", buffer.LineNumber(), Str.c_str()); + err = 1; + break; + } + // Value + Str = std::string( buffer.NextToken() ); + if (validDouble( Str )) { + dval = convertToDouble( Str ); + } else { + mprinterr("Error: Line %i Z value does not appear to be a valid number.\n", buffer.LineNumber(), Str.c_str()); + err = 1; + break; + } + // Add to map + Ipair idx(ix, iy); + MatrixMap::iterator it = matrixMap.lower_bound( idx ); + if (it == matrixMap.end() || it->first != idx) { + matrixMap.insert(it, std::pair(idx, dval)); + } else { + mprinterr("Error: Line %i duplicate matrix indices found: %i %i\n", buffer.LineNumber(), ix, iy); + } + } // END if ntokens < 3 + } // END if linebuffer[0] != # + linebuffer = buffer.Line(); + } // END loop over file + mprintf("\tRead in %zu values for matrix.\n", matrixMap.size()); + + int ncols = -1; + int nrows = 0; + std::vector matrixArray; + while (linebuffer != 0) { + int ntokens = buffer.TokenizeLine( SEPARATORS ); + if (ncols < 0) { + ncols = ntokens; + if (ntokens < 1) { + mprinterr("Error: Could not tokenize line.\n"); + return 1; + } + } else if (ncols != ntokens) { + mprinterr("Error: In 2D file, number of columns changes from %i to %i at line %i\n", + ncols, ntokens, buffer.LineNumber()); + return 1; + } + for (int i = 0; i < ntokens; i++) + matrixArray.push_back( atof( buffer.NextToken() ) ); + nrows++; + linebuffer = buffer.Line(); + } + if (ncols < 0) { + mprinterr("Error: No data detected in %s\n", buffer.Filename().full()); + return 1; + } + if ( DetermineMatrixType( matrixArray, nrows, ncols, datasetlist, dsname )==0 ) return 1; + + return 0; +} + // DataIO_Std::Read_3D() int DataIO_Std::Read_3D(std::string const& fname, DataSetList& datasetlist, std::string const& dsname) diff --git a/src/DataIO_Std.h b/src/DataIO_Std.h index 9a655fb4ee..087be23cca 100644 --- a/src/DataIO_Std.h +++ b/src/DataIO_Std.h @@ -25,6 +25,7 @@ class DataIO_Std : public DataIO { int Read_1D(std::string const&,DataSetList&,std::string const&); int ReadCmatrix(FileName const&, DataSetList&, std::string const&); int Read_2D(std::string const&,DataSetList&,std::string const&); + int Read_2D_XYZ(FileName const&,DataSetList&,std::string const&); int Read_3D(std::string const&,DataSetList&,std::string const&); int Read_Vector(std::string const&,DataSetList&,std::string const&); int Read_Mat3x3(std::string const&,DataSetList&,std::string const&); From 217584bb51b38606342e7bf77d366d30d4d03b0a Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Jan 2021 19:21:10 -0500 Subject: [PATCH 03/21] Finish nosquare2d matrix read --- src/DataIO_Std.cpp | 96 +++++++++++++++++++++++++++++----------------- src/cpptrajdepend | 2 +- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/src/DataIO_Std.cpp b/src/DataIO_Std.cpp index dbc69481b9..7473cdd36a 100644 --- a/src/DataIO_Std.cpp +++ b/src/DataIO_Std.cpp @@ -17,6 +17,8 @@ #include "DataSet_Vector.h" // For reading TODO remove dependency? #include "DataSet_Mat3x3.h" // For reading TODO remove dependency? #include "DataSet_2D.h" +#include "DataSet_MatrixFlt.h" +#include "DataSet_MatrixDbl.h" #include "DataSet_3D.h" #include "DataSet_Cmatrix_MEM.h" @@ -136,6 +138,19 @@ int DataIO_Std::processReadArgs(ArgList& argIn) { // Column user args start from 1 strCols_.ShiftBy(-1); } + // Precision + // TODO precision for 1d too + if (mode_ == READ2D || mode_ == READ3D) { + std::string precKey = argIn.GetStringKey("prec"); + if (!precKey.empty()) { + if (precKey == "flt") prec_ = FLOAT; + else if (precKey == "dbl") prec_ = DOUBLE; + else { + mprinterr("Error: Expected only 'flt' or 'dbl' for keyword 'prec'\n"); + return 1; + } + } + } // Options for 2d if (mode_ == READ2D) { square2d_ = true; @@ -158,16 +173,7 @@ int DataIO_Std::processReadArgs(ArgList& argIn) { dims_[1] = oArg.getNextInteger(dims_[1]); dims_[2] = oArg.getNextInteger(dims_[2]); } - // TODO precision for 1d and 2d too - std::string precKey = argIn.GetStringKey("prec"); - if (!precKey.empty()) { - if (precKey == "flt") prec_ = FLOAT; - else if (precKey == "dbl") prec_ = DOUBLE; - else { - mprinterr("Error: Expected only 'flt' or 'dbl' for keyword 'prec'\n"); - return 1; - } - } + std::string binKey = argIn.GetStringKey("bin"); if (!binKey.empty()) { if (binKey == "center") binCorners_ = false; @@ -567,8 +573,9 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, if (ntokens < 3) { mprintf("Warning: In 2D file, less than 3 columns at line %i, skipping.\n", buffer.LineNumber()); } else { - int ix, iy; - double dval; + int ix = -1; + int iy = -1; + double dval = 0; // X std::string Str( buffer.NextToken() ); if (validInteger( Str )) @@ -581,6 +588,7 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, err = 1; break; } + maxcol = std::max(ix, maxcol); // Y Str = std::string( buffer.NextToken() ); if (validInteger( Str )) @@ -593,6 +601,7 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, err = 1; break; } + maxrow = std::max(iy, maxrow); // Value Str = std::string( buffer.NextToken() ); if (validDouble( Str )) { @@ -614,34 +623,49 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, } // END if linebuffer[0] != # linebuffer = buffer.Line(); } // END loop over file - mprintf("\tRead in %zu values for matrix.\n", matrixMap.size()); + if (err != 0) { + mprinterr("Error: Could not read matrix from %s\n", fname.full()); + return 1; + } + mprintf("\tRead in %zu values for matrix.\n", matrixMap.size()); + mprintf("\tMax col = %i, max row = %i\n", maxcol, maxrow); + if (maxcol < 1 || maxrow < 1) { + mprinterr("Error: One or more dimensions is empty.\n"); + return 1; + } - int ncols = -1; - int nrows = 0; - std::vector matrixArray; - while (linebuffer != 0) { - int ntokens = buffer.TokenizeLine( SEPARATORS ); - if (ncols < 0) { - ncols = ntokens; - if (ntokens < 1) { - mprinterr("Error: Could not tokenize line.\n"); - return 1; - } - } else if (ncols != ntokens) { - mprinterr("Error: In 2D file, number of columns changes from %i to %i at line %i\n", - ncols, ntokens, buffer.LineNumber()); - return 1; - } - for (int i = 0; i < ntokens; i++) - matrixArray.push_back( atof( buffer.NextToken() ) ); - nrows++; - linebuffer = buffer.Line(); + // Allocate set + DataSet::DataType dtype; + if (prec_ == FLOAT) { + mprintf("\tMatrix is single precision.\n"); + dtype = DataSet::MATRIX_FLT; + } else { + mprintf("\tMatrix is double precision.\n"); + dtype = DataSet::MATRIX_DBL; } - if (ncols < 0) { - mprinterr("Error: No data detected in %s\n", buffer.Filename().full()); + DataSet* ds = datasetlist.AddSet(dtype, dsname, "Mat"); + if (ds == 0) { + mprinterr("Error: Could not allocate dataset for 2D xyz matrix.\n"); + return 1; + } + // TODO check symmetric, upper triangle, etc + DataSet_2D& mat = static_cast( *ds ); + if (mat.Allocate2D(maxcol, maxrow)) { + mprinterr("Error: Could not allocate memory for 2D xyz matrix.\n"); + return 1; + } + if (dtype == DataSet::MATRIX_FLT) { + DataSet_MatrixFlt& fmat = static_cast( *ds ); + for (MatrixMap::const_iterator it = matrixMap.begin(); it != matrixMap.end(); ++it) + fmat.SetElement( it->first.first-1, it->first.second-1, it->second ); + } else if (dtype == DataSet::MATRIX_DBL) { + DataSet_MatrixDbl& dmat = static_cast( *ds ); + for (MatrixMap::const_iterator it = matrixMap.begin(); it != matrixMap.end(); ++it) + dmat.SetElement( it->first.first-1, it->first.second-1, it->second ); + } else { + mprinterr("Internal Error: Unhandled matrix type during 2D xyz matrix read.\n"); return 1; } - if ( DetermineMatrixType( matrixArray, nrows, ncols, datasetlist, dsname )==0 ) return 1; return 0; } diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 2fb7096f93..bcb4039dda 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -190,7 +190,7 @@ DataIO_NC_Cmatrix.o : DataIO_NC_Cmatrix.cpp ArgList.h ArrayIterator.h Associated DataIO_OpenDx.o : DataIO_OpenDx.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_OpenDx.h DataSet.h DataSetList.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_GridDbl.h DataSet_GridFlt.h Dimension.h FileIO.h FileName.h Frame.h Grid.h GridBin.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h DataIO_Peaks.o : DataIO_Peaks.cpp ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_Peaks.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Vector_Scalar.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h DataIO_RemLog.o : DataIO_RemLog.cpp ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_RemLog.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_RemLog.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h -DataIO_Std.o : DataIO_Std.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h ClusterDist.h ClusterSieve.h ComplexArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_Std.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Cmatrix.h DataSet_Cmatrix_MEM.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mat3x3.h DataSet_Vector.h DataSet_double.h DataSet_float.h DataSet_integer.h DataSet_string.h Dimension.h FileIO.h FileName.h Frame.h GridBin.h Hungarian.h MapAtom.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h StringRoutines.h SymbolExporting.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h +DataIO_Std.o : DataIO_Std.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h ClusterDist.h ClusterSieve.h ComplexArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_Std.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Cmatrix.h DataSet_Cmatrix_MEM.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mat3x3.h DataSet_MatrixDbl.h DataSet_MatrixFlt.h DataSet_Vector.h DataSet_double.h DataSet_float.h DataSet_integer.h DataSet_string.h Dimension.h FileIO.h FileName.h Frame.h GridBin.h Hungarian.h MapAtom.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h StringRoutines.h SymbolExporting.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h DataIO_VecTraj.o : DataIO_VecTraj.cpp ActionFrameCounter.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h ComplexArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_VecTraj.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Vector.h Dimension.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ParmFile.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajectoryFile.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h DataIO_XVG.o : DataIO_XVG.cpp ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_XVG.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_double.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h DataIO_Xplor.o : DataIO_Xplor.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataIO.h DataIO_Xplor.h DataSet.h DataSetList.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_GridFlt.h Dimension.h FileIO.h FileName.h Frame.h Grid.h GridBin.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h From 0dea90bbb2bbfe4ddb9b191749ef9c0e603aa02e Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Jan 2021 19:22:59 -0500 Subject: [PATCH 04/21] nosquare2d matrix read and write test --- test/Test_ReadData/RunTest.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/Test_ReadData/RunTest.sh b/test/Test_ReadData/RunTest.sh index 7d713e1ffb..2f6d25a300 100755 --- a/test/Test_ReadData/RunTest.sh +++ b/test/Test_ReadData/RunTest.sh @@ -143,15 +143,17 @@ matrix name CA @CA byatom out matrix.dat nosquare2d run EOF RunCpptraj "$UNITNAME" +DoTest matrix.dat.save matrix.dat # Non-square matrix read UNITNAME='Read non-square matrix' cat > vector.in < Date: Fri, 29 Jan 2021 08:49:33 -0500 Subject: [PATCH 05/21] Add check for diagonal elements --- src/DataIO_Std.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/DataIO_Std.cpp b/src/DataIO_Std.cpp index 7473cdd36a..4a3e7ff24f 100644 --- a/src/DataIO_Std.cpp +++ b/src/DataIO_Std.cpp @@ -566,6 +566,7 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, MatrixMap matrixMap; int err = 0; + bool hasDiagonal = false; while (linebuffer != 0) { // Skip comments if (linebuffer[0] != '#') { @@ -602,10 +603,13 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, break; } maxrow = std::max(iy, maxrow); + // Check diagonal + if (ix == iy) hasDiagonal = true; // Value Str = std::string( buffer.NextToken() ); if (validDouble( Str )) { dval = convertToDouble( Str ); + //mprintf("DBG: %i %i %s\n", ix, iy, Str.c_str()); } else { mprinterr("Error: Line %i Z value does not appear to be a valid number.\n", buffer.LineNumber(), Str.c_str()); err = 1; @@ -633,6 +637,8 @@ int DataIO_Std::Read_2D_XYZ(FileName const& fname, mprinterr("Error: One or more dimensions is empty.\n"); return 1; } + if (hasDiagonal) + mprintf("\tMatrix has diagonal elements.\n"); // Allocate set DataSet::DataType dtype; From 793ec4356c7ad7dc54c2677d99f3d6da8552942d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 09:02:13 -0500 Subject: [PATCH 06/21] Start flatten command --- src/Exec_Flatten.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++ src/Exec_Flatten.h | 12 +++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/Exec_Flatten.cpp create mode 100644 src/Exec_Flatten.h diff --git a/src/Exec_Flatten.cpp b/src/Exec_Flatten.cpp new file mode 100644 index 0000000000..7540f5a1d2 --- /dev/null +++ b/src/Exec_Flatten.cpp @@ -0,0 +1,59 @@ +#include "Exec_Flatten.h" +#include "CpptrajStdio.h" +#include "DataSet_2D.h" +#include "DataSet_1D.h" + +// Exec_Flatten::Help() +void Exec_Flatten::Help() const +{ + +} + +// Exec_Flatten::Execute() +Exec::RetType Exec_Flatten::Execute(CpptrajState& State, ArgList& argIn) +{ + std::vector inpSets; + std::vector outSets; + + std::string dsname = argIn.GetStringKey("name"); + if (dsname.empty()) { + mprinterr("Error: Must specify output set name with 'name'\n"); + return CpptrajState::ERR; + } + mprintf("\tOutput set name: %s\n", dsname.c_str()); + + const char* modeStr[] = {"sum", "avg"}; + enum ModeType { SUM = 0, AVG }; + ModeType mode; + std::string modeArg = argIn.GetStringKey("mode"); + if (!modeArg.empty()) { + if (modeArg == "sum") + mode = SUM; + else if (modeArg == "avg") + mode = AVG; + else { + mprinterr("Error: Unrecognized keyword for 'mode': %s\n", modeArg.c_str()); + return CpptrajState::ERR; + } + } else + mode = SUM; + mprintf("\tFlatten mode: %s\n", modeStr[mode]); + + // Get input sets + std::string setarg = argIn.GetStringNext(); + while (!setarg.empty()) { + DataSetList dsl = State.DSL().GetMultipleSets( setarg ); + for (DataSetList::const_iterator ds = dsl.begin(); ds != dsl.end(); ++ds) + { + if ( (*ds)->Group() != DataSet::MATRIX_2D ) { + mprintf("Warning: Set '%s' is not a matrix, skipping.\n", (*ds)->legend()); + } else { + inpSets.push_back( (DataSet_2D*)(*ds) ); + } + } + setarg = argIn.GetStringNext(); + } + mprintf("\t%zu matrices to flatten.\n", inpSets.size()); + + return CpptrajState::OK; +} diff --git a/src/Exec_Flatten.h b/src/Exec_Flatten.h new file mode 100644 index 0000000000..46ee55c8a3 --- /dev/null +++ b/src/Exec_Flatten.h @@ -0,0 +1,12 @@ +#ifndef INC_EXEC_FLATTEN_H +#define INC_EXEC_FLATTEN_H +#include "Exec.h" +/// Flatten a 2D matrix to a 1D data set +class Exec_Flatten : public Exec { + public: + Exec_Flatten() : Exec(GENERAL) {} + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Exec_Flatten(); } + RetType Execute(CpptrajState&, ArgList&); +}; +#endif From 57cd9a00fc2a3f3194c929a12dfdba418804866b Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 09:25:53 -0500 Subject: [PATCH 07/21] Finish up flatten --- src/Exec_Flatten.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/Exec_Flatten.cpp b/src/Exec_Flatten.cpp index 7540f5a1d2..82a4173ac1 100644 --- a/src/Exec_Flatten.cpp +++ b/src/Exec_Flatten.cpp @@ -2,6 +2,8 @@ #include "CpptrajStdio.h" #include "DataSet_2D.h" #include "DataSet_1D.h" +#include "OnlineVarT.h" +#include // std::max // Exec_Flatten::Help() void Exec_Flatten::Help() const @@ -54,6 +56,75 @@ Exec::RetType Exec_Flatten::Execute(CpptrajState& State, ArgList& argIn) setarg = argIn.GetStringNext(); } mprintf("\t%zu matrices to flatten.\n", inpSets.size()); + if (inpSets.empty()) return CpptrajState::OK; + // Set up output sets. + if (inpSets.size() == 1) { + DataSet* ds = State.DSL().AddSet( DataSet::DOUBLE, dsname ); + if (ds == 0) return CpptrajState::ERR; + outSets.push_back( (DataSet_1D*)ds ); + } else { + int idx = 1; + for (std::vector::const_iterator it = inpSets.begin(); it != inpSets.end(); ++it) + { + MetaData md(dsname, idx); + DataSet* ds = State.DSL().AddSet( DataSet::DOUBLE, md ); + if (ds == 0) return CpptrajState::ERR; + outSets.push_back( (DataSet_1D*)ds ); + idx++; + } + } + + // Flatten + std::vector sumArray; + std::vector< Stats > avgArray; + + for (unsigned int idx = 0; idx != inpSets.size(); idx++) { + DataSet_2D const& Mat = static_cast( *(inpSets[idx]) ); + DataSet_1D& Out = static_cast( *(outSets[idx]) ); + // Determine max size for Out and allocate + unsigned int maxSize = std::max(Mat.Ncols(), Mat.Nrows()); + mprintf("\tMatrix: %s, %i columns, %i rows. Output: %u elements\n", Mat.legend(), Mat.Ncols(), Mat.Nrows(), maxSize); + Out.Allocate( DataSet::SizeArray(1, maxSize) ); + // Allocate temp array + if (mode == SUM) { + sumArray.clear(); + sumArray.resize( maxSize, 0.0 ); + } else { + avgArray.clear(); + avgArray.resize( maxSize, Stats() ); + } + // Loop over array. + for (unsigned int row = 0; row != Mat.Nrows(); row++) { + for (unsigned int col = 0; col != Mat.Ncols(); col++) { + double dval = Mat.GetElement(col, row); + mprintf("DBG: %8u %8u %12.4f\n", col, row, dval); + // Divide element between row and col + double halfVal = dval / 2.0; + // Operation + if (mode == SUM) { + sumArray[row] += halfVal; + sumArray[col] += halfVal; + } else { + avgArray[row].accumulate( halfVal ); + avgArray[col].accumulate( halfVal ); + } + } // END loop over columns + } // END loop over rows + // Fill in final values TODO make Resize a DataSet_1D function + if (mode == SUM) { + int jdx = 0; + for (std::vector::const_iterator it = sumArray.begin(); it != sumArray.end(); ++it) { + double val = *it; + Out.Add(jdx++, &val); + } + } else { + int jdx = 0; + for (std::vector< Stats >::const_iterator it = avgArray.begin(); it != avgArray.end(); ++it) { + double val = it->mean(); + Out.Add(jdx++, &val ); + } + } + } // END loop over input sets return CpptrajState::OK; } From b55f3ed46905c02cf2446d94e363492353725242 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 09:27:54 -0500 Subject: [PATCH 08/21] Add help --- src/Exec_Flatten.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Exec_Flatten.cpp b/src/Exec_Flatten.cpp index 82a4173ac1..c32cacf12e 100644 --- a/src/Exec_Flatten.cpp +++ b/src/Exec_Flatten.cpp @@ -8,7 +8,10 @@ // Exec_Flatten::Help() void Exec_Flatten::Help() const { - + mprintf("\tname [mode {sum|avg}] \n" + " Flatten 1 or more matrices into 1D array(s) by summing or\n" + " averaging elements.\n" + ); } // Exec_Flatten::Execute() From 17150a03dd54fbd130c455788902656dda6d3bcf Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 09:35:04 -0500 Subject: [PATCH 09/21] Enable flatten command --- src/Command.cpp | 2 ++ src/cpptrajdepend | 3 ++- src/cpptrajfiles | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Command.cpp b/src/Command.cpp index c5308bac79..83dcd13e34 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -20,6 +20,7 @@ #include "Exec_DataFile.h" #include "Exec_DataFilter.h" #include "Exec_DataSetCmd.h" +#include "Exec_Flatten.h" #include "Exec_GenerateAmberRst.h" #include "Exec_Help.h" #include "Exec_ParallelAnalysis.h" @@ -216,6 +217,7 @@ void Command::Init() { Command::AddCmd( new Exec_DataFilter(), Cmd::EXE, 1, "datafilter" ); Command::AddCmd( new Exec_DataSetCmd(), Cmd::EXE, 1, "dataset" ); Command::AddCmd( new Exec_EnsFileExt(), Cmd::EXE, 1, "ensextension" ); + Command::AddCmd( new Exec_Flatten(), Cmd::EXE, 1, "flatten" ); Command::AddCmd( new Exec_GenerateAmberRst(),Cmd::EXE, 1, "rst" ); Command::AddCmd( new Exec_Help(), Cmd::EXE, 1, "help" ); Command::AddCmd( new Exec_ListAll(), Cmd::EXE, 1, "list" ); diff --git a/src/cpptrajdepend b/src/cpptrajdepend index bcb4039dda..3bfd4c6b62 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -159,7 +159,7 @@ Cluster_ReadInfo.o : Cluster_ReadInfo.cpp ArgList.h ArrayIterator.h AssociatedDa Cmd.o : Cmd.cpp Cmd.h DispatchObject.h CmdInput.o : CmdInput.cpp CmdInput.h StringRoutines.h CmdList.o : CmdList.cpp Cmd.h CmdList.h DispatchObject.h -Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h ActionTopWriter.h Action_Align.h Action_Angle.h Action_AreaPerMol.h Action_AtomMap.h Action_AtomicCorr.h Action_AtomicFluct.h Action_AutoImage.h Action_Average.h Action_Bounds.h Action_Box.h Action_Center.h Action_Channel.h Action_CheckChirality.h Action_CheckStructure.h Action_Closest.h Action_ClusterDihedral.h Action_Contacts.h Action_CreateCrd.h Action_CreateReservoir.h Action_DNAionTracker.h Action_DSSP.h Action_Density.h Action_Diffusion.h Action_Dihedral.h Action_DihedralRMS.h Action_Dipole.h Action_DistRmsd.h Action_Distance.h Action_Energy.h Action_Esander.h Action_FilterByData.h Action_FixAtomOrder.h Action_FixImagedBonds.h Action_GIST.h Action_Grid.h Action_GridFreeEnergy.h Action_HydrogenBond.h Action_Image.h Action_InfraredSpectrum.h Action_Jcoupling.h Action_LESsplit.h Action_LIE.h Action_LipidOrder.h Action_MakeStructure.h Action_Mask.h Action_Matrix.h Action_MinImage.h Action_Molsurf.h Action_MultiDihedral.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_Time.h Action_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Action_XtalSymm.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_ConstantPHStats.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_EvalPlateau.h Analysis_FFT.h Analysis_HausdorffDistance.h Analysis_Hist.h Analysis_IRED.h Analysis_Integrate.h Analysis_KDE.h Analysis_Lifetime.h Analysis_LowestCurve.h Analysis_Matrix.h Analysis_MeltCurve.h Analysis_Modes.h Analysis_MultiHist.h Analysis_Multicurve.h Analysis_Overlap.h Analysis_PhiPsi.h Analysis_Regression.h Analysis_RemLog.h Analysis_Rms2d.h Analysis_RmsAvgCorr.h Analysis_Rotdif.h Analysis_RunningAvg.h Analysis_Slope.h Analysis_Spline.h Analysis_State.h Analysis_Statistics.h Analysis_TI.h Analysis_Timecorr.h Analysis_VectorMath.h Analysis_Wavelet.h ArgList.h Array1D.h ArrayIterator.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h AxisType.h BaseIOtype.h Box.h BoxArgs.h BufferedLine.h CharMask.h ClusterDist.h ClusterList.h ClusterMap.h ClusterNode.h ClusterSieve.h Cmd.h CmdInput.h CmdList.h Command.h CompactFrameArray.h ComplexArray.h Constants.h Constraints.h ControlBlock.h ControlBlock_For.h CoordinateInfo.h Corr.h Cph.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Cmatrix.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h DataSet_GridFlt.h DataSet_Mat3x3.h DataSet_MatrixDbl.h DataSet_MatrixFlt.h DataSet_Mesh.h DataSet_Modes.h DataSet_RemLog.h DataSet_Vector.h DataSet_double.h DataSet_float.h DataSet_integer.h DataSet_integer_mem.h DataSet_pH.h DataSet_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOutList.h ExclusionArray.h Exec.h Exec_AddMissingRes.h Exec_Analyze.h Exec_Calc.h Exec_CatCrd.h Exec_Change.h Exec_ClusterMap.h Exec_CombineCoords.h Exec_Commands.h Exec_CompareTop.h Exec_CrdAction.h Exec_CrdOut.h Exec_CreateSet.h Exec_DataFile.h Exec_DataFilter.h Exec_DataSetCmd.h Exec_Emin.h Exec_GenerateAmberRst.h Exec_Graft.h Exec_Help.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParallelAnalysis.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrepareForLeap.h Exec_PrintData.h Exec_ReadData.h Exec_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_Set.h Exec_Show.h Exec_SortEnsembleData.h Exec_SplitCoords.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageOption.h ImageTypes.h InputTrajCommon.h MapAtom.h MaskArray.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h NetcdfFile.h OnlineVarT.h OutputTrajCommon.h PDBfile.h PairList.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h PubFFT.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h Spline.h SplineFxnTable.h StructureCheck.h SymbolExporting.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h cuda_kernels/GistCudaSetup.cuh molsurf.h +Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h ActionTopWriter.h Action_Align.h Action_Angle.h Action_AreaPerMol.h Action_AtomMap.h Action_AtomicCorr.h Action_AtomicFluct.h Action_AutoImage.h Action_Average.h Action_Bounds.h Action_Box.h Action_Center.h Action_Channel.h Action_CheckChirality.h Action_CheckStructure.h Action_Closest.h Action_ClusterDihedral.h Action_Contacts.h Action_CreateCrd.h Action_CreateReservoir.h Action_DNAionTracker.h Action_DSSP.h Action_Density.h Action_Diffusion.h Action_Dihedral.h Action_DihedralRMS.h Action_Dipole.h Action_DistRmsd.h Action_Distance.h Action_Energy.h Action_Esander.h Action_FilterByData.h Action_FixAtomOrder.h Action_FixImagedBonds.h Action_GIST.h Action_Grid.h Action_GridFreeEnergy.h Action_HydrogenBond.h Action_Image.h Action_InfraredSpectrum.h Action_Jcoupling.h Action_LESsplit.h Action_LIE.h Action_LipidOrder.h Action_MakeStructure.h Action_Mask.h Action_Matrix.h Action_MinImage.h Action_Molsurf.h Action_MultiDihedral.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_Time.h Action_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Action_XtalSymm.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_ConstantPHStats.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_EvalPlateau.h Analysis_FFT.h Analysis_HausdorffDistance.h Analysis_Hist.h Analysis_IRED.h Analysis_Integrate.h Analysis_KDE.h Analysis_Lifetime.h Analysis_LowestCurve.h Analysis_Matrix.h Analysis_MeltCurve.h Analysis_Modes.h Analysis_MultiHist.h Analysis_Multicurve.h Analysis_Overlap.h Analysis_PhiPsi.h Analysis_Regression.h Analysis_RemLog.h Analysis_Rms2d.h Analysis_RmsAvgCorr.h Analysis_Rotdif.h Analysis_RunningAvg.h Analysis_Slope.h Analysis_Spline.h Analysis_State.h Analysis_Statistics.h Analysis_TI.h Analysis_Timecorr.h Analysis_VectorMath.h Analysis_Wavelet.h ArgList.h Array1D.h ArrayIterator.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h AxisType.h BaseIOtype.h Box.h BoxArgs.h BufferedLine.h CharMask.h ClusterDist.h ClusterList.h ClusterMap.h ClusterNode.h ClusterSieve.h Cmd.h CmdInput.h CmdList.h Command.h CompactFrameArray.h ComplexArray.h Constants.h Constraints.h ControlBlock.h ControlBlock_For.h CoordinateInfo.h Corr.h Cph.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Cmatrix.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h DataSet_GridFlt.h DataSet_Mat3x3.h DataSet_MatrixDbl.h DataSet_MatrixFlt.h DataSet_Mesh.h DataSet_Modes.h DataSet_RemLog.h DataSet_Vector.h DataSet_double.h DataSet_float.h DataSet_integer.h DataSet_integer_mem.h DataSet_pH.h DataSet_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOutList.h ExclusionArray.h Exec.h Exec_AddMissingRes.h Exec_Analyze.h Exec_Calc.h Exec_CatCrd.h Exec_Change.h Exec_ClusterMap.h Exec_CombineCoords.h Exec_Commands.h Exec_CompareTop.h Exec_CrdAction.h Exec_CrdOut.h Exec_CreateSet.h Exec_DataFile.h Exec_DataFilter.h Exec_DataSetCmd.h Exec_Emin.h Exec_Flatten.h Exec_GenerateAmberRst.h Exec_Graft.h Exec_Help.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParallelAnalysis.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrepareForLeap.h Exec_PrintData.h Exec_ReadData.h Exec_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_Set.h Exec_Show.h Exec_SortEnsembleData.h Exec_SplitCoords.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageOption.h ImageTypes.h InputTrajCommon.h MapAtom.h MaskArray.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h NetcdfFile.h OnlineVarT.h OutputTrajCommon.h PDBfile.h PairList.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h PubFFT.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h Spline.h SplineFxnTable.h StructureCheck.h SymbolExporting.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h cuda_kernels/GistCudaSetup.cuh molsurf.h CompactFrameArray.o : CompactFrameArray.cpp Box.h CompactFrameArray.h CoordinateInfo.h CpptrajStdio.h Matrix_3x3.h Parallel.h ReplicaDimArray.h Vec3.h ComplexArray.o : ComplexArray.cpp ArrayIterator.h ComplexArray.h Constraints.o : Constraints.cpp ArgList.h Atom.h AtomMask.h AtomType.h Box.h CharMask.h Constants.h Constraints.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.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 TypeNameHolder.h Unit.h Vec3.h @@ -262,6 +262,7 @@ Exec_DataFile.o : Exec_DataFile.cpp Action.h ActionList.h ActionState.h Analysis Exec_DataFilter.o : Exec_DataFilter.cpp Action.h ActionList.h ActionState.h Action_FilterByData.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h Array1D.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_double.h DataSet_integer.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_DataFilter.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 ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_DataSetCmd.o : Exec_DataSetCmd.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h ComplexArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixDbl.h DataSet_Mesh.h DataSet_Vector.h DataSet_string.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_DataSetCmd.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h Spline.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_Emin.o : Exec_Emin.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h CharMask.h Constants.h Constraints.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnergyArray.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_Emin.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MdOpts.h MetaData.h Minimize_SteepestDescent.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h PotentialFunction.h PotentialTerm.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h +Exec_Flatten.o : Exec_Flatten.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_Flatten.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OnlineVarT.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_GenerateAmberRst.o : Exec_GenerateAmberRst.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h DistRoutines.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_GenerateAmberRst.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h ImageOption.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_Graft.o : Exec_Graft.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_Graft.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 ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_Help.o : Exec_Help.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Cmd.h CmdList.h Command.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_Help.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 ParmFile.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index 999ce5a507..2047c673e3 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -262,6 +262,7 @@ COMMON_SOURCES= \ Exec_DataFilter.cpp \ Exec_DataSetCmd.cpp \ Exec_Emin.cpp \ + Exec_Flatten.cpp \ Exec_GenerateAmberRst.cpp \ Exec_Graft.cpp \ Exec_Help.cpp \ From 49b0a853e7f84c68c73f46e61f6ddf3959c1ae8c Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 10:38:05 -0500 Subject: [PATCH 10/21] Do not divide diagonal element in half --- src/Exec_Flatten.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Exec_Flatten.cpp b/src/Exec_Flatten.cpp index c32cacf12e..e9a4c0c5fe 100644 --- a/src/Exec_Flatten.cpp +++ b/src/Exec_Flatten.cpp @@ -101,16 +101,28 @@ Exec::RetType Exec_Flatten::Execute(CpptrajState& State, ArgList& argIn) for (unsigned int row = 0; row != Mat.Nrows(); row++) { for (unsigned int col = 0; col != Mat.Ncols(); col++) { double dval = Mat.GetElement(col, row); - mprintf("DBG: %8u %8u %12.4f\n", col, row, dval); - // Divide element between row and col - double halfVal = dval / 2.0; - // Operation - if (mode == SUM) { - sumArray[row] += halfVal; - sumArray[col] += halfVal; + //mprintf("DBG: %8u %8u %12.4f\n", col, row, dval); + // Diagonal element gets full interaction + if (row == col) { + //if (col == 0) mprintf("DBG: Diag Elt 0 %12.4f\n", dval); + if (mode == SUM) + sumArray[row] += dval; + else + avgArray[row].accumulate( dval ); } else { - avgArray[row].accumulate( halfVal ); - avgArray[col].accumulate( halfVal ); + // Off-diagonal element: divide element between row and col + double halfVal = dval / 2.0; + //mprintf("DBG0: %8u %12.4f\n", col, halfVal); + //mprintf("DBG1: %8u %12.4f\n", row, halfVal); + //if (col == 0 || row == 0) mprintf("DBG: Elt 0 %12.4f\n", halfVal); + // Operation + if (mode == SUM) { + sumArray[row] += halfVal; + sumArray[col] += halfVal; + } else { + avgArray[row].accumulate( halfVal ); + avgArray[col].accumulate( halfVal ); + } } } // END loop over columns } // END loop over rows From 7092f80588aba09b544e2439402727ec66dd5f1e Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 10:39:47 -0500 Subject: [PATCH 11/21] Add flatten test --- test/Test_Flatten/RunTest.sh | 18 ++++++++++++++++++ test/Test_Flatten/flatten.dat.save | 7 +++++++ 2 files changed, 25 insertions(+) create mode 100755 test/Test_Flatten/RunTest.sh create mode 100644 test/Test_Flatten/flatten.dat.save diff --git a/test/Test_Flatten/RunTest.sh b/test/Test_Flatten/RunTest.sh new file mode 100755 index 0000000000..db6c381ad1 --- /dev/null +++ b/test/Test_Flatten/RunTest.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +. ../MasterTest.sh + +CleanFiles cpptraj.in flatten.dat + +INPUT='-i cpptraj.in' + +cat > cpptraj.in < Date: Fri, 29 Jan 2021 10:41:00 -0500 Subject: [PATCH 12/21] Add flatten test to Makefile --- test/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Makefile b/test/Makefile index 29a80bfcb6..be14162b5c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -474,6 +474,9 @@ test.evalplateau: test.graft: @-cd Test_Graft && ./RunTest.sh $(OPT) +test.flatten: + @-cd Test_Flatten && ./RunTest.sh $(OPT) + # Every test target should go here. COMPLETETESTS=test.general \ test.strip \ @@ -625,7 +628,8 @@ COMPLETETESTS=test.general \ test.diagmatrix \ test.emin \ test.evalplateau \ - test.graft + test.graft \ + test.flatten test.all: $(MAKE) test.complete summary From d59420e554ff8adab3c9a1092f263b6e25855555 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 10:48:23 -0500 Subject: [PATCH 13/21] Ad manual entry for "flatten" --- doc/cpptraj.lyx | 165 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/doc/cpptraj.lyx b/doc/cpptraj.lyx index 9c2d7b97f2..6f9f3841c3 100644 --- a/doc/cpptraj.lyx +++ b/doc/cpptraj.lyx @@ -9747,6 +9747,171 @@ exit | quit Exit normally. \end_layout +\begin_layout Subsection +flatten +\end_layout + +\begin_layout LyX-Code +flatten name [mode {sum|avg}] +\end_layout + +\begin_deeper +\begin_layout Description +name +\begin_inset space ~ +\end_inset + + Name of +\begin_inset Quotes eld +\end_inset + +flattened +\begin_inset Quotes erd +\end_inset + + 1D output set(s). +\end_layout + +\begin_layout Description +mode +\begin_inset space ~ +\end_inset + +{sum|avg} If sum, matrix elements will be summed. + If avg, matrix elements will be averaged. +\end_layout + +\begin_layout Description + Specify matrices to +\begin_inset Quotes eld +\end_inset + +flatten +\begin_inset Quotes erd +\end_inset + +. +\end_layout + +\begin_layout Standard +DataSets Created +\end_layout + +\begin_layout Description + Flattened 1D set if only one input matrix. +\end_layout + +\begin_layout Description +: Flattened 1D sets when more than one input matrix; index starts + from 1. +\end_layout + +\end_deeper +\begin_layout Standard +Flatten 1 or more matrices into 1D array(s) by summing or averaging elements. + For example, given a matrix with values like this: +\end_layout + +\begin_layout LyX-Code +X Y Value +\end_layout + +\begin_layout LyX-Code +1 3 5.0 +\end_layout + +\begin_layout LyX-Code +1 4 4.0 +\end_layout + +\begin_layout LyX-Code +2 3 2.0 +\end_layout + +\begin_layout Standard +The +\begin_inset Quotes eld +\end_inset + +flattened +\begin_inset Quotes erd +\end_inset + + 1D array with mode SUM would be determined as follows: +\end_layout + +\begin_layout LyX-Code +Element 1 = (5.0/2) + (4.0/2) = 4.5 +\end_layout + +\begin_layout LyX-Code +Element 2 = (2.0/2) = 1.0 +\end_layout + +\begin_layout LyX-Code +Element 3 = (5.0/2) + (2.0/2) = 3.5 +\end_layout + +\begin_layout LyX-Code +Element 4 = (4.0/2) = 2.0 +\end_layout + +\begin_layout Standard +And the final 1D array would look like so: +\end_layout + +\begin_layout LyX-Code +Index Value +\end_layout + +\begin_layout LyX-Code +1 4.5 +\end_layout + +\begin_layout LyX-Code +2 1.0 +\end_layout + +\begin_layout LyX-Code +3 3.5 +\end_layout + +\begin_layout LyX-Code +4 2.0 +\end_layout + \begin_layout Subsection go | run \end_layout From a4d99bfe0909f40802d7c160c00dcd5903806859 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 29 Jan 2021 13:36:30 -0500 Subject: [PATCH 14/21] Add square matrix read write test --- src/DataIO_Std.cpp | 78 +++++++++++++++++------------------ test/Test_ReadData/RunTest.sh | 13 +++++- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/src/DataIO_Std.cpp b/src/DataIO_Std.cpp index 4a3e7ff24f..5a957059a4 100644 --- a/src/DataIO_Std.cpp +++ b/src/DataIO_Std.cpp @@ -32,7 +32,7 @@ DataIO_Std::DataIO_Std() : isInverted_(false), hasXcolumn_(true), writeHeader_(true), - square2d_(false), + square2d_(true), sparse_(false), originSpecified_(false), deltaSpecified_(false), @@ -50,6 +50,27 @@ static void PrintColumnError(int idx) { mprinterr("Error: Number of columns in file changes at line %i.\n", idx); } +const char* DataIO_Std::SEPARATORS = " ,\t"; // whitespace, comma, or tab-delimited + +// DataIO_Std::Get3Double() +int DataIO_Std::Get3Double(std::string const& key, Vec3& vec, bool& specified) +{ + specified = false; + if (!key.empty()) { + ArgList oArg(key, ","); + if (oArg.Nargs() != 3) { + mprinterr("Error: Expected 3 comma-separated values for '%s'\n", key.c_str()); + return 1; + } + vec[0] = oArg.getNextDouble(vec[0]); + vec[1] = oArg.getNextDouble(vec[1]); + vec[2] = oArg.getNextDouble(vec[2]); + specified = true; + } + return 0; +} + +/** Data read options. */ void DataIO_Std::ReadHelp() { mprintf("\tread1d: Read data as 1D data sets (default).\n" "\t\tindex : (1D) Use column # (starting from 1) as index (X) column.\n" @@ -70,25 +91,6 @@ void DataIO_Std::ReadHelp() { } -const char* DataIO_Std::SEPARATORS = " ,\t"; // whitespace, comma, or tab-delimited - -// DataIO_Std::Get3Double() -int DataIO_Std::Get3Double(std::string const& key, Vec3& vec, bool& specified) -{ - specified = false; - if (!key.empty()) { - ArgList oArg(key, ","); - if (oArg.Nargs() != 3) { - mprinterr("Error: Expected 3 comma-separated values for '%s'\n", key.c_str()); - return 1; - } - vec[0] = oArg.getNextDouble(vec[0]); - vec[1] = oArg.getNextDouble(vec[1]); - vec[2] = oArg.getNextDouble(vec[2]); - specified = true; - } - return 0; -} // DataIO_Std::processReadArgs() int DataIO_Std::processReadArgs(ArgList& argIn) { @@ -153,9 +155,8 @@ int DataIO_Std::processReadArgs(ArgList& argIn) { } // Options for 2d if (mode_ == READ2D) { - square2d_ = true; - if (argIn.hasKey("nosquare2d")) - square2d_ = false; + if (argIn.hasKey("square2d")) square2d_ = true; + if (argIn.hasKey("nosquare2d")) square2d_ = false; } // Options for 3d if (mode_ == READ3D) { @@ -1001,6 +1002,7 @@ void DataIO_Std::WriteHelp() { mprintf("\theader : Print header line.\n" "\tnoheader : Do not print header line.\n" "\tinvert : Flip X/Y axes (1D).\n" + "\tnoinvert : Do not flip X/Y axes(1D).\n" "\tgroupby : (1D) group data sets by .\n" "\t\tname : Group by name.\n" "\t\taspect : Group by aspect.\n" @@ -1018,8 +1020,6 @@ void DataIO_Std::WriteHelp() { // DataIO_Std::processWriteArgs() int DataIO_Std::processWriteArgs(ArgList &argIn) { - if (!isInverted_ && argIn.hasKey("invert")) - isInverted_ = true; std::string grouparg = argIn.GetStringKey("groupby"); if (!grouparg.empty()) { if (group_ != BY_NAME && grouparg == "name") @@ -1036,22 +1036,18 @@ int DataIO_Std::processWriteArgs(ArgList &argIn) { mprintf("Warning: Unrecognized arg for 'groupby' (%s), ignoring.\n", grouparg.c_str()); } } - if (hasXcolumn_ && argIn.hasKey("noxcol")) - hasXcolumn_ = false; - if (!hasXcolumn_ && argIn.hasKey("xcol")) - hasXcolumn_ = true; - if (writeHeader_ && argIn.hasKey("noheader")) - writeHeader_ = false; - if (!writeHeader_ && argIn.hasKey("header")) - writeHeader_ = true; - if (!square2d_ && argIn.hasKey("square2d")) - square2d_ = true; - else if (square2d_ && argIn.hasKey("nosquare2d")) - square2d_ = false; - if (!sparse_ && argIn.hasKey("sparse")) - sparse_ = true; - else if (sparse_ && argIn.hasKey("nosparse")) - sparse_ = false; + + if (argIn.hasKey("invert")) isInverted_ = true; + if (argIn.hasKey("noinvert")) isInverted_ = false; + if (argIn.hasKey("xcol")) hasXcolumn_ = true; + if (argIn.hasKey("noxcol")) hasXcolumn_ = false; + if (argIn.hasKey("header")) writeHeader_ = true; + if (argIn.hasKey("noheader")) writeHeader_ = false; + if (argIn.hasKey("square2d")) square2d_ = true; + if (argIn.hasKey("nosquare2d")) square2d_ = false; + if (argIn.hasKey("sparse")) sparse_ = true; + if (argIn.hasKey("nosparse")) sparse_ = false; + if (sparse_) cut_ = argIn.getKeyDouble("cut", cut_); return 0; diff --git a/test/Test_ReadData/RunTest.sh b/test/Test_ReadData/RunTest.sh index 2f6d25a300..6559ac3335 100755 --- a/test/Test_ReadData/RunTest.sh +++ b/test/Test_ReadData/RunTest.sh @@ -5,7 +5,8 @@ CleanFiles vector.in v6and7.dat rex-d.dat MD.ene.dat out.dx out.dat \ truncoct.dat out?.dx append.dx append.dat temp.dat \ truncsparse.dat temp2.dat truncoct.dat.save sparse.dat \ - xyz.dat v7and6.dat matrix.dat cpptraj.matrix.dat + xyz.dat v7and6.dat matrix.dat cpptraj.matrix.dat \ + square.matrix.dat TESTNAME='Read data tests' @@ -155,6 +156,16 @@ EOF RunCpptraj "$UNITNAME" DoTest matrix.dat.save cpptraj.matrix.dat +# Square matrix read/write +UNITNAME='Read square matrix' +cat > vector.in < Date: Fri, 29 Jan 2021 14:07:20 -0500 Subject: [PATCH 15/21] Update help, add some options --- src/DataIO_Grace.cpp | 4 ++++ src/DataIO_Std.cpp | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/DataIO_Grace.cpp b/src/DataIO_Grace.cpp index 2ecbdb3eec..4159aec088 100644 --- a/src/DataIO_Grace.cpp +++ b/src/DataIO_Grace.cpp @@ -120,14 +120,18 @@ int DataIO_Grace::ReadData(FileName const& fname, // ----------------------------------------------------------------------------- void DataIO_Grace::WriteHelp() { mprintf("\tinvert : Flip X/Y axes.\n" + "\tnoinvert : Do not flip X/Y axes.\n" "\txydy : Make consecutive sets into XYDY sets.\n" + "\tnoxydy : Do not make consecutive sets into XYDY sets.\n" "\t