From 8d1a163badad0427e410110ce8eb79a03884800a Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 2 Oct 2024 11:30:09 -0400 Subject: [PATCH] Implement ability to calculate vector magnitude in 'vectormath' command. (#1105) * Start code for reading vector magnitudes * Actually read the vector magnitudes * Add magnitude mode to vectormath for calculating vector magnitude * Add vectormath magnitude test * Update help text * Update manual text * Update documentation files * 6.29.3. Revision bump for adding 'magnitude' keyword to 'readdata vector' and 'vectormath'. --- doc/CpptrajManual.pdf | Bin 1130358 -> 1130047 bytes doc/DocumentChecksums.txt | 2 +- doc/cpptraj.lyx | 28 ++++- src/Analysis_VectorMath.cpp | 138 +++++++++++++++++------- src/Analysis_VectorMath.h | 3 +- src/DataIO_Std.cpp | 81 ++++++++++---- src/DataIO_Std.h | 1 + src/Version.h | 2 +- test/Test_VectorMath/Magnitude.dat.save | 11 ++ test/Test_VectorMath/RunTest.sh | 26 +++-- 10 files changed, 222 insertions(+), 70 deletions(-) create mode 100644 test/Test_VectorMath/Magnitude.dat.save diff --git a/doc/CpptrajManual.pdf b/doc/CpptrajManual.pdf index 46ba898f3a2d4a45721b8156fcba00e56e49d91e..70719f82c0332119e8cd8a993ba05c9378ea3e3e 100644 GIT binary patch delta 46281 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 delta 46589 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 IB`K8u1G*2zfB*mh diff --git a/doc/DocumentChecksums.txt b/doc/DocumentChecksums.txt index b8633da4e1..60e6cefb03 100644 --- a/doc/DocumentChecksums.txt +++ b/doc/DocumentChecksums.txt @@ -1,3 +1,3 @@ b37726e7a841f6fc695ecd7fb040ffbf CpptrajDevelopmentGuide.lyx -c9b19c2bade122b63363f364f86a0a69 cpptraj.lyx +736ee725ca9cc67d349f67d714f41c20 cpptraj.lyx 07c4039e732fc2eb1df0c1e0863cb949 CpptrajManual.lyx diff --git a/doc/cpptraj.lyx b/doc/cpptraj.lyx index 54b064c15d..a97dd7af40 100644 --- a/doc/cpptraj.lyx +++ b/doc/cpptraj.lyx @@ -5640,7 +5640,7 @@ Read \end_layout \begin_layout LyX-Code - [vector] | + [vector [magnitude]] | \end_layout \begin_layout LyX-Code @@ -5737,7 +5737,7 @@ nosquare2d Read data as XYZ matrix (i.e. \begin_layout Description vector Read data as vector. If indices are present they will be skipped. - Assume first 3 columns after the index volumn are vector X, + Assume first 3 columns after the index column are vector X, Y, and Z, and (if present) the next 3 columns contain vector origin X, @@ -5745,6 +5745,14 @@ vector Read data as vector. and Z. \end_layout +\begin_deeper +\begin_layout Description +magnitude If specified, + assume vector file last column contains vector magnitudes; + read these into a set with Aspect 'Mag'. +\end_layout + +\end_deeper \begin_layout Description mat3x3 Read data as 3x3 matrix. If indices are present they will be skipped. @@ -55687,7 +55695,7 @@ vectormath vec1 vec2 [out ] [norm] [name // std::min, std::max +#include // sqrt #include "Analysis_VectorMath.h" #include "CpptrajStdio.h" #include "Constants.h" @@ -7,7 +8,7 @@ /// Strings corresponding to modes, used in output. const char* Analysis_VectorMath::ModeString[] = { - "Dot product", "Angle from dot product", "Cross product" }; + "Dot product", "Angle from dot product", "Cross product", "Magnitude" }; // CONSTRUCTOR Analysis_VectorMath::Analysis_VectorMath() : @@ -17,46 +18,24 @@ Analysis_VectorMath::Analysis_VectorMath() : void Analysis_VectorMath::Help() const { mprintf("\tvec1 vec2 [out ] [norm] [name ]\n" - "\t[ dotproduct | dotangle | crossproduct ]\n" + "\t[ dotproduct | dotangle | crossproduct | magnitude ]\n" " Calculate dot product, angle from dot product (degrees), or cross product\n" " for specified vectors. Either vec1 or vec2 can be size 1, otherwise they\n" - " must both be the same size.\n"); + " must both be the same size. If 'magnitude' is specified, just calculate\n" + " the magnitudes of the vectors selected by 'vec1' (no need to specify\n" + " 'vec2').\n"); } // Analysis_VectorMath::Setup() Analysis::RetType Analysis_VectorMath::Setup(ArgList& analyzeArgs, AnalysisSetup& setup, int debugIn) { - // Get Vectors - DataSetList vsets1 = setup.DSL().SelectGroupSets( analyzeArgs.GetStringKey("vec1"), - DataSet::VECTOR_1D ); - if (vsets1.empty()) { - mprinterr("Error: 'vec1' not found.\n"); - return Analysis::ERR; - } - DataSetList vsets2 = setup.DSL().SelectGroupSets( analyzeArgs.GetStringKey("vec2"), - DataSet::VECTOR_1D ); - if (vsets2.empty()) { - mprinterr("Error: 'vec2' not found.\n"); - return Analysis::ERR; - } - - if (vsets1.size() != vsets2.size()) { - mprinterr("Error: 'vec1' (%zu) and 'vec2' (%zu) do not select the same number of sets.\n", - vsets1.size(), vsets2.size()); - return Analysis::ERR; - } - - for (DataSetList::const_iterator it = vsets1.begin(); it != vsets1.end(); ++it) - vinfo1_.push_back( static_cast( *it ) ); - for (DataSetList::const_iterator it = vsets2.begin(); it != vsets2.end(); ++it) - vinfo2_.push_back( static_cast( *it ) ); - std::string setname = analyzeArgs.GetStringKey("name"); norm_ = analyzeArgs.hasKey("norm"); // Check for dotproduct/crossproduct keywords. Default is dotproduct. mode_ = DOTPRODUCT; DataSet::DataType dtype = DataSet::DOUBLE; const char* dname = "Dot"; + bool requires_two_vecs = true; if (analyzeArgs.hasKey("dotproduct")) { mode_ = DOTPRODUCT; } else if (analyzeArgs.hasKey("dotangle")) { @@ -67,7 +46,47 @@ Analysis::RetType Analysis_VectorMath::Setup(ArgList& analyzeArgs, AnalysisSetup mode_ = CROSSPRODUCT; dtype = DataSet::VECTOR; dname = "Cross"; + } else if (analyzeArgs.hasKey("magnitude")) { + mode_ = MAGNITUDE; + dname = "Mag"; + requires_two_vecs = false; + if (norm_) { + mprintf("Warning: 'norm' does not make sense with 'magnitude', ignoring.\n"); + norm_ = false; + } } + + // Get Vectors + DataSetList vsets1 = setup.DSL().SelectGroupSets( analyzeArgs.GetStringKey("vec1"), + DataSet::VECTOR_1D ); + if (vsets1.empty()) { + mprinterr("Error: 'vec1' not found.\n"); + return Analysis::ERR; + } + + DataSetList vsets2; + if (requires_two_vecs) { + vsets2 = setup.DSL().SelectGroupSets( analyzeArgs.GetStringKey("vec2"), + DataSet::VECTOR_1D ); + if (vsets2.empty()) { + mprinterr("Error: 'vec2' not found.\n"); + return Analysis::ERR; + } + + if (vsets1.size() != vsets2.size()) { + mprinterr("Error: 'vec1' (%zu) and 'vec2' (%zu) do not select the same number of sets.\n", + vsets1.size(), vsets2.size()); + return Analysis::ERR; + } + } + + for (DataSetList::const_iterator it = vsets1.begin(); it != vsets1.end(); ++it) + vinfo1_.push_back( static_cast( *it ) ); + if (requires_two_vecs) { + for (DataSetList::const_iterator it = vsets2.begin(); it != vsets2.end(); ++it) + vinfo2_.push_back( static_cast( *it ) ); + } + // Set up output file in DataFileList if necessary DataFile* outfile = setup.DFL().AddDataFile( analyzeArgs.GetStringKey("out"), analyzeArgs ); // Set up output data sets based on mode @@ -89,12 +108,22 @@ Analysis::RetType Analysis_VectorMath::Setup(ArgList& analyzeArgs, AnalysisSetup // Print Status mprintf(" VECTORMATH:"); - if (vinfo1_.size() == 1) - mprintf(" Calculating %s of vectors %s and %s\n", ModeString[mode_], vinfo1_[0]->legend(), vinfo2_[0]->legend()); - else { - mprintf(" Calculating %s of:\n", ModeString[mode_]); - for (unsigned int ii = 0; ii < vinfo1_.size(); ii++) - mprintf("\t %s and %s\n", vinfo1_[ii]->legend(), vinfo2_[ii]->legend()); + if (requires_two_vecs) { + if (vinfo1_.size() == 1) + mprintf(" Calculating %s of vectors %s and %s\n", ModeString[mode_], vinfo1_[0]->legend(), vinfo2_[0]->legend()); + else { + mprintf(" Calculating %s of:\n", ModeString[mode_]); + for (unsigned int ii = 0; ii < vinfo1_.size(); ii++) + mprintf("\t %s and %s\n", vinfo1_[ii]->legend(), vinfo2_[ii]->legend()); + } + } else { + if (vinfo1_.size() == 1) + mprintf(" Calculating %s of vector %s\n", ModeString[mode_], vinfo1_[0]->legend()); + else { + mprintf(" Calculating %s of:\n", ModeString[mode_]); + for (DVarray::const_iterator it = vinfo1_.begin(); it != vinfo1_.end(); ++it) + mprintf("\t %s\n", (*it)->legend()); + } } if (norm_) mprintf("\tVectors will be normalized.\n"); if (outfile != 0) @@ -103,6 +132,19 @@ Analysis::RetType Analysis_VectorMath::Setup(ArgList& analyzeArgs, AnalysisSetup return Analysis::OK; } +/** Calculate the magnitude of each vector. */ +int Analysis_VectorMath::Magnitude(DataSet* Dout, DataSet_Vector const& V1) +const +{ + DataSet_double& Out = static_cast( *Dout ); + Out.Resize( V1.Size() ); + for (unsigned int idx = 0; idx < V1.Size(); idx++) + { + Out[idx] = sqrt( V1[idx].Magnitude2() ); + } + return 0; +} + // Analysis_VectorMath::DotProduct() int Analysis_VectorMath::DotProduct(DataSet* Dout, DataSet_Vector& V1, DataSet_Vector& V2, unsigned int vmax, unsigned int v1inc, unsigned int v2inc) @@ -182,10 +224,30 @@ const // Analysis_VectorMath::Analyze() Analysis::RetType Analysis_VectorMath::Analyze() { - for (unsigned int ii = 0; ii < vinfo1_.size(); ii++) - { - int err = DoMath( DataOut_[ii], *(vinfo1_[ii]), *(vinfo2_[ii]) ); - if (err != 0) return Analysis::ERR; + if (vinfo2_.empty()) { + // Single set ops + for (unsigned int ii = 0; ii < vinfo1_.size(); ii++) + { + if (vinfo1_[ii]->Size() < 1) { + mprintf("Warning: Vector set '%s' is empty.\n", vinfo1_[ii]->legend()); + continue; + } + int err = 1; + if (mode_ == MAGNITUDE) + err = Magnitude( DataOut_[ii], *(vinfo1_[ii]) ); + if (err != 0) { + mprinterr("Error: A problem occurred when performing vector math for set '%s'\n", + vinfo1_[ii]->legend()); + return Analysis::ERR; + } + } + } else { + // Two set ops + for (unsigned int ii = 0; ii < vinfo1_.size(); ii++) + { + int err = DoMath( DataOut_[ii], *(vinfo1_[ii]), *(vinfo2_[ii]) ); + if (err != 0) return Analysis::ERR; + } } return Analysis::OK; } diff --git a/src/Analysis_VectorMath.h b/src/Analysis_VectorMath.h index 27365d568f..2db995b74b 100644 --- a/src/Analysis_VectorMath.h +++ b/src/Analysis_VectorMath.h @@ -11,9 +11,10 @@ class Analysis_VectorMath : public Analysis { Analysis::RetType Setup(ArgList&, AnalysisSetup&, int); Analysis::RetType Analyze(); private: - enum ModeType { DOTPRODUCT = 0, DOTANGLE, CROSSPRODUCT }; + enum ModeType { DOTPRODUCT = 0, DOTANGLE, CROSSPRODUCT, MAGNITUDE }; static const char* ModeString[]; + int Magnitude(DataSet*, DataSet_Vector const&) const; int DotProduct(DataSet*, DataSet_Vector&, DataSet_Vector&, unsigned int, unsigned int, unsigned int) const; int CrossProduct(DataSet*, DataSet_Vector&, DataSet_Vector&, diff --git a/src/DataIO_Std.cpp b/src/DataIO_Std.cpp index eb4d73be79..8f9fe8695d 100644 --- a/src/DataIO_Std.cpp +++ b/src/DataIO_Std.cpp @@ -32,7 +32,8 @@ DataIO_Std::DataIO_Std() : indexcol_(-1), isInverted_(false), hasXcolumn_(true), - writeHeader_(true), + writeHeader_(true), + read_vector_magnitude_(false), square2d_(true), sparse_(false), originSpecified_(false), @@ -92,6 +93,7 @@ void DataIO_Std::ReadHelp() { "\t\tprec {dbl|flt*} : Grid precision; double or float (default float).\n" "\t\tbin {center|corner*} : Coords specify bin centers or corners (default corners).\n" "\tvector : Read data as vector: VX VY VZ [OX OY OZ]\n" + "\t\tmagnitude : Assume vector data final column contains vector magnitude.\n" "\tmat3x3 : Read data as 3x3 matrices: M(1,1) M(1,2) ... M(3,2) M(3,3)\n"); } @@ -158,6 +160,11 @@ int DataIO_Std::processReadArgs(ArgList& argIn) { } } } + // Options for vector + if (mode_ == READVEC) { + if (argIn.hasKey("magnitude")) + read_vector_magnitude_ = true; + } // Options for 2d if (mode_ == READ2D) { if (argIn.hasKey("square2d")) square2d_ = true; @@ -853,6 +860,17 @@ int DataIO_Std::Read_Vector(std::string const& fname, return 1; } } + DataSet* magset = 0; + if (read_vector_magnitude_) { + magset = datasetlist.CheckForSet( MetaData(dsname, "Mag") ); + if (magset != 0) { + mprintf("\tAppening vector magnitude data to set '%s'\n", magset->legend()); + if (magset->Type() != DataSet::DOUBLE) { + mprinterr("Error: Cannot append magnitude data to set '%s', wrong type.\n", magset->legend()); + return 1; + } + } + } // Buffer file BufferedLine buffer; if (buffer.OpenFileRead( fname )) return 1; @@ -865,24 +883,40 @@ int DataIO_Std::Read_Vector(std::string const& fname, // 9 (VXYZ OXYZ VXYZ+OXYZ) values, optionally with indices. int ntokens = buffer.TokenizeLine( SEPARATORS ); int ncols = ntokens; // Number of columns of vector data. - int nv = 0; // Number of columns to actually read from (3 or 6). + int nexpected = 0; // Number of columns expected to actually read from (3 or 6). bool hasIndex; if (ntokens < 1) { mprinterr("Error: Could not tokenize line.\n"); return 1; } - if (ncols == 3 || ncols == 6 || ncols == 9) - hasIndex = false; - else if (ncols == 4 || ncols == 7 || ncols == 10) { - hasIndex = true; - mprintf("Warning: Not reading vector data indices.\n"); + // Try to determine what data is present based on the number of columns + if (read_vector_magnitude_) { + mprintf("\tAssuming final column contains vector magnitude data.\n"); + if (ncols == 4 || ncols == 7 || ncols == 10) + hasIndex = false; + else if (ncols == 5 || ncols == 8 || ncols == 11) { + hasIndex = true; + mprintf("Warning: Not reading vector data indices.\n"); + } else { + mprinterr("Error: Expected 3, 6, or 9 columns of vector data plus 1 column\n" + "Error: of magnitude data, got %i.\n", ncols); + return 1; + } } else { - mprinterr("Error: Expected 3, 6, or 9 columns of vector data, got %i.\n", ncols); - return 1; + if (ncols == 3 || ncols == 6 || ncols == 9) + hasIndex = false; + else if (ncols == 4 || ncols == 7 || ncols == 10) { + hasIndex = true; + mprintf("Warning: Not reading vector data indices.\n"); + } else { + mprinterr("Error: Expected 3, 6, or 9 columns of vector data, got %i.\n", ncols); + mprinterr("Error: If vector data contains a magnitude column, specify 'magnitude'.\n"); + return 1; + } } bool hasOrigins; if (ncols >= 6) { - nv = 6; + nexpected = 6; mprintf("\tReading vector X Y Z and origin X Y Z values.\n"); hasOrigins = true; // If set already exists, see if it doesnt have origins. @@ -903,7 +937,7 @@ int DataIO_Std::Read_Vector(std::string const& fname, delete oldSet; } } else { - nv = 3; + nexpected = 3; mprintf("\tReading vector X Y Z values.\n"); hasOrigins = false; // If set already exists, see if it has origins. @@ -923,26 +957,37 @@ int DataIO_Std::Read_Vector(std::string const& fname, ds = datasetlist.AddSet(dtype, dsname); if (ds == 0) return 1; } + if (read_vector_magnitude_ && magset == 0) { + magset = datasetlist.AddSet(DataSet::DOUBLE, MetaData(dsname, "Mag")); + if (magset == 0) return 1; + } // Read vector data double vec[6]; std::fill(vec, vec+6, 0.0); + double vmag = 0; + // +1 expected column if reading magnitudes + if (magset != 0) + nexpected++; size_t ndata = ds->Size(); while (linebuffer != 0) { if (hasIndex) - ntokens = sscanf(linebuffer, "%*f %lf %lf %lf %lf %lf %lf", - vec, vec+1, vec+2, vec+3, vec+4, vec+5); + ntokens = sscanf(linebuffer, "%*f %lf %lf %lf %lf %lf %lf %lf", + vec, vec+1, vec+2, vec+3, vec+4, vec+5, &vmag); else - ntokens = sscanf(linebuffer, "%lf %lf %lf %lf %lf %lf", - vec, vec+1, vec+2, vec+3, vec+4, vec+5); - if (ntokens != nv) { + ntokens = sscanf(linebuffer, "%lf %lf %lf %lf %lf %lf %lf", + vec, vec+1, vec+2, vec+3, vec+4, vec+5, &vmag); + if (ntokens != nexpected) { mprinterr("Error: In vector file, line %i: expected %i values, got %i\n", - buffer.LineNumber(), nv, ntokens); + buffer.LineNumber(), nexpected, ntokens); break; } if (hasOrigins) - ds->Add( ndata++, vec ); + ds->Add( ndata, vec ); else ((DataSet_Vector*)ds)->AddVxyz( Vec3(vec) ); // TODO: Remove if DataSet_Vector is split to with/without origins + if (magset != 0) + magset->Add(ndata, &vmag); + ndata++; linebuffer = buffer.Line(); } return 0; diff --git a/src/DataIO_Std.h b/src/DataIO_Std.h index fdd80552db..bfb6f5d5d9 100644 --- a/src/DataIO_Std.h +++ b/src/DataIO_Std.h @@ -51,6 +51,7 @@ class DataIO_Std : public DataIO { bool isInverted_; ///< For 1D writes invert X/Y. bool hasXcolumn_; bool writeHeader_; + bool read_vector_magnitude_; ///< For vector reads, assume final column contains magnitude bool square2d_; bool sparse_; ///< 3d writes, only write voxels with value > cut_ bool originSpecified_; ///< 3d reads, true if origin specified diff --git a/src/Version.h b/src/Version.h index df86dd421c..2de71ea96e 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.29.2" +#define CPPTRAJ_INTERNAL_VERSION "V6.29.3" /// PYTRAJ relies on this #define CPPTRAJ_VERSION_STRING CPPTRAJ_INTERNAL_VERSION #endif diff --git a/test/Test_VectorMath/Magnitude.dat.save b/test/Test_VectorMath/Magnitude.dat.save new file mode 100644 index 0000000000..ea7784bea4 --- /dev/null +++ b/test/Test_VectorMath/Magnitude.dat.save @@ -0,0 +1,11 @@ +#Frame V1Mag + 1 12.0310 + 2 6.1779 + 3 5.1423 + 4 6.9181 + 5 9.0597 + 6 10.2285 + 7 7.1507 + 8 3.8188 + 9 4.4247 + 10 4.6969 diff --git a/test/Test_VectorMath/RunTest.sh b/test/Test_VectorMath/RunTest.sh index 7c2f05de38..0b538247ae 100755 --- a/test/Test_VectorMath/RunTest.sh +++ b/test/Test_VectorMath/RunTest.sh @@ -2,15 +2,18 @@ . ../MasterTest.sh -CleanFiles vectors.dat dotproduct.dat corr.in v1init_dot_v1.dat +CleanFiles vectors.dat dotproduct.dat corr.in v1init_dot_v1.dat Magnitude.dat INPUT="corr.in" TOP=../tz2.parm7 -TESTNAME='Vector dot/cross product test' -Requires netcdf +TESTNAME='Vector math tests' + # Dot/cross products -cat > corr.in < corr.in < corr.in <